批量请求 - SendAs 电子邮件
Batch Request - SendAs Emails
有没有办法批量请求从多个或所有用户获取 SendAs 电子邮件?
目前我们正在使用带有用户模拟的服务帐户来遍历每个用户并获取 SendAs 电子邮件列表 - 很多请求。
- 作为服务的 GmailService - 这被模拟为用户。
- service.Users.Settings.SendAs.List("me").执行();
P.S。我在 google 组中 post 编辑了这个,但刚刚看到一个 post 说论坛现在是只读的!奇怪的是它允许我制作一个新的 post(显然我在想 post 必须被批准)
谢谢!
static string[] Scopes = { GmailService.Scope.MailGoogleCom,
GmailService.Scope.GmailSettingsBasic,
GmailService.Scope.GmailSettingsSharing,
GmailService.Scope.GmailModify};
/// <summary>
/// Gets default send as email address from user's gmail - throws error if valid domain is not used as default sendAs
/// </summary>
/// <param name="primaryEmailAddress">User's email address to use to impersonate</param>
/// <param name="excludedDomains">Domains to exclude in the results - example: @xyz.org</param>
/// <returns>default SendAs email address</returns>
public static string GetDefaultSendAs(string primaryEmailAddress, string[] excludedDomains)
{
string retVal = string.Empty;
GmailService service = new GmailService(new BaseClientService.Initializer()
{
HttpClientInitializer =
Auth.GetServiceAccountAuthorization
(scopes: Scopes, clientSecretFilePath: Constant.ClientSecretFilePath, impersonateAs: primaryEmailAddress)
});
var result = service.Users.Settings.SendAs.List("me").Execute();
SendAs s = result.SendAs.First(e => e.IsDefault == true);
bool incorrectSendAs = false;
if (s != null)
{
foreach (string domain in excludedDomains)
{
// Check if email ends with domain
if (s.SendAsEmail.ToLower().EndsWith("@" + domain.TrimStart('@'))) // removes @ and adds back - makes sure to domain start with @.
{
incorrectSendAs = true;
}
}
}
if (s != null && !incorrectSendAs)
retVal = s.SendAsEmail;
else
throw new Exception($"{primaryEmailAddress}, valid default SendAs email not set.");
System.Threading.Thread.Sleep(10);
return retVal;
}
授权码:
class Auth
{
internal static ServiceAccountCredential GetServiceAccountAuthorization(string[]scopes, string clientSecretFilePath, string impersonateAs = "admin@xyz.org")
{
ServiceAccountCredential retval;
if (impersonateAs == null || impersonateAs == string.Empty)
{
throw new Exception("Please provide user to impersonate");
}
else
{
using (var stream = new FileStream(clientSecretFilePath, FileMode.Open, FileAccess.Read))
{
retval = GoogleCredential.FromStream(stream)
.CreateScoped(scopes)
.CreateWithUser(impersonateAs)
.UnderlyingCredential as ServiceAccountCredential;
}
}
return retval;
}
API客户端访问:
批处理注意事项
首先我要问你为什么要使用批处理。如果您希望它会节省您的配额使用量,那么批处理不会受到与正常 api 调用相同的配额使用量的影响。批处理给你的唯一帮助是发送更少的 HTTP 调用,并在那里花费一点点。
您的客户端建立的每个 HTTP 连接都会产生一定的开销。一些 Google APIs 支持批处理,允许您的客户端将多个 API 调用放入单个 HTTP 请求中。
外部批请求的 HTTP headers,除了 Content-headers 例如 Content-Type,适用于批处理中的每个请求。如果您在外部请求和单个调用中都指定了给定的 HTTP header,则单个调用 header 的值将覆盖外部批处理请求 header 的值。单个调用的 headers 仅适用于该调用。
例如,如果您为特定调用提供 授权 header,则该 header 仅适用于该调用 。如果您为外部请求提供授权 header,则该 header 适用于所有单独的调用,除非他们用自己的授权 header 覆盖它。
授权
当您向 api 授权时,该授权是针对单个用户的。
GmailService service = new GmailService(new BaseClientService.Initializer()
{
HttpClientInitializer =
Auth.GetServiceAccountAuthorization
(scopes: Scopes, clientSecretFilePath: Constant.ClientSecretFilePath, impersonateAs: primaryEmailAddress)
});
上述服务将只能访问您正在模拟的用户的那个用户数据。
答案
Is there a way to do a batch request to get SendAs emails from multiple or all users?
不,没有。从上面可以看出,批处理请求的授权 header 涵盖批处理中的所有项目。为您的批量请求创建的与 GmailService 一起发送的授权 header 仅涵盖单个用户。
有没有办法批量请求从多个或所有用户获取 SendAs 电子邮件?
目前我们正在使用带有用户模拟的服务帐户来遍历每个用户并获取 SendAs 电子邮件列表 - 很多请求。
- 作为服务的 GmailService - 这被模拟为用户。
- service.Users.Settings.SendAs.List("me").执行();
P.S。我在 google 组中 post 编辑了这个,但刚刚看到一个 post 说论坛现在是只读的!奇怪的是它允许我制作一个新的 post(显然我在想 post 必须被批准)
谢谢!
static string[] Scopes = { GmailService.Scope.MailGoogleCom,
GmailService.Scope.GmailSettingsBasic,
GmailService.Scope.GmailSettingsSharing,
GmailService.Scope.GmailModify};
/// <summary>
/// Gets default send as email address from user's gmail - throws error if valid domain is not used as default sendAs
/// </summary>
/// <param name="primaryEmailAddress">User's email address to use to impersonate</param>
/// <param name="excludedDomains">Domains to exclude in the results - example: @xyz.org</param>
/// <returns>default SendAs email address</returns>
public static string GetDefaultSendAs(string primaryEmailAddress, string[] excludedDomains)
{
string retVal = string.Empty;
GmailService service = new GmailService(new BaseClientService.Initializer()
{
HttpClientInitializer =
Auth.GetServiceAccountAuthorization
(scopes: Scopes, clientSecretFilePath: Constant.ClientSecretFilePath, impersonateAs: primaryEmailAddress)
});
var result = service.Users.Settings.SendAs.List("me").Execute();
SendAs s = result.SendAs.First(e => e.IsDefault == true);
bool incorrectSendAs = false;
if (s != null)
{
foreach (string domain in excludedDomains)
{
// Check if email ends with domain
if (s.SendAsEmail.ToLower().EndsWith("@" + domain.TrimStart('@'))) // removes @ and adds back - makes sure to domain start with @.
{
incorrectSendAs = true;
}
}
}
if (s != null && !incorrectSendAs)
retVal = s.SendAsEmail;
else
throw new Exception($"{primaryEmailAddress}, valid default SendAs email not set.");
System.Threading.Thread.Sleep(10);
return retVal;
}
授权码:
class Auth
{
internal static ServiceAccountCredential GetServiceAccountAuthorization(string[]scopes, string clientSecretFilePath, string impersonateAs = "admin@xyz.org")
{
ServiceAccountCredential retval;
if (impersonateAs == null || impersonateAs == string.Empty)
{
throw new Exception("Please provide user to impersonate");
}
else
{
using (var stream = new FileStream(clientSecretFilePath, FileMode.Open, FileAccess.Read))
{
retval = GoogleCredential.FromStream(stream)
.CreateScoped(scopes)
.CreateWithUser(impersonateAs)
.UnderlyingCredential as ServiceAccountCredential;
}
}
return retval;
}
API客户端访问:
批处理注意事项
首先我要问你为什么要使用批处理。如果您希望它会节省您的配额使用量,那么批处理不会受到与正常 api 调用相同的配额使用量的影响。批处理给你的唯一帮助是发送更少的 HTTP 调用,并在那里花费一点点。
您的客户端建立的每个 HTTP 连接都会产生一定的开销。一些 Google APIs 支持批处理,允许您的客户端将多个 API 调用放入单个 HTTP 请求中。
外部批请求的 HTTP headers,除了 Content-headers 例如 Content-Type,适用于批处理中的每个请求。如果您在外部请求和单个调用中都指定了给定的 HTTP header,则单个调用 header 的值将覆盖外部批处理请求 header 的值。单个调用的 headers 仅适用于该调用。
例如,如果您为特定调用提供 授权 header,则该 header 仅适用于该调用 。如果您为外部请求提供授权 header,则该 header 适用于所有单独的调用,除非他们用自己的授权 header 覆盖它。
授权
当您向 api 授权时,该授权是针对单个用户的。
GmailService service = new GmailService(new BaseClientService.Initializer()
{
HttpClientInitializer =
Auth.GetServiceAccountAuthorization
(scopes: Scopes, clientSecretFilePath: Constant.ClientSecretFilePath, impersonateAs: primaryEmailAddress)
});
上述服务将只能访问您正在模拟的用户的那个用户数据。
答案
Is there a way to do a batch request to get SendAs emails from multiple or all users?
不,没有。从上面可以看出,批处理请求的授权 header 涵盖批处理中的所有项目。为您的批量请求创建的与 GmailService 一起发送的授权 header 仅涵盖单个用户。