批量请求-SendAs电子邮件

时间:2019-02-25 14:26:06

标签: c# google-api-dotnet-client service-accounts gsuite

是否可以进行批量请求以从多个或所有用户获取SendAs电子邮件?

当前,我们正在使用具有用户模拟功能的服务帐户来遍历每个用户并获取SendAs电子邮件列表-很多请求。

  1. GmailService即服务-模拟为用户。
  2. service.Users.Settings.SendAs.List(“ me”)。Execute();

P.S。我在Google网上论坛中发布了此帖子,但刚刚读了一篇帖子,说该论坛现在为只读!奇怪的是,它允许我发表新的帖子(很明显,我以为必须批准该帖子)

谢谢!

    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 client access

1 个答案:

答案 0 :(得分:0)

批处理说明

首先,我要问您为什么使用批处理。如果您希望它可以节省配额使用量,则不会通过与普通api调用相同的配额使用量来进行批处理。批处理的唯一帮助将是发送更少的HTTP调用,并在此花费一些时间。

您的客户端建立的每个HTTP连接都会产生一定的开销。某些Google API支持批处理,以允许您的客户端将多个API调用放入单个HTTP请求中。

外部批处理请求的HTTP标头(诸如Content-Type之类的Content-标头除外)适用于批处理中的每个请求。如果在外部请求和单个调用中都指定了给定的HTTP标头,则单个调用标头的值将覆盖外部批处理请求标头的值。单个呼叫的标题仅适用于该呼叫。

例如,如果您为特定呼叫提供 Authorization标头,则该标头仅适用于该呼叫。如果为外部请求提供Authorization标头,则该标头适用于所有单个调用,除非它们用自己的Authorization标头覆盖它。

授权

当您授权给api时,该授权是针对单个用户的。

GmailService service = new GmailService(new BaseClientService.Initializer()
    {
        HttpClientInitializer = 
            Auth.GetServiceAccountAuthorization
                (scopes: Scopes, clientSecretFilePath: Constant.ClientSecretFilePath, impersonateAs: primaryEmailAddress)
    });

上述服务将只能访问一个用户数据来模拟您要模拟的用户。

答案

  

是否可以进行批量请求以从多个或所有用户获取SendAs电子邮件?

不,没有。从上面可以看到,批处理请求的授权标头涵盖了批处理中的所有项目。与GmailService一起为您的批处理请求创建的授权标头仅覆盖单个用户。