Пакетный запрос - SendAs E-mail - PullRequest
       65

Пакетный запрос - SendAs E-mail

0 голосов
/ 25 февраля 2019

Есть ли способ сделать пакетный запрос для получения писем SendAs от нескольких или всех пользователей?

В настоящее время мы используем служебную учетную запись с олицетворением пользователя, чтобы просмотреть каждого пользователя и получить список рассылки SendAs -много запросов.

  1. GmailService как служба - это олицетворение пользователя.
  2. service.Users.Settings.SendAs.List ("me"). Execute ();

PS Я опубликовал это в группе 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 голосов
/ 26 февраля 2019

Примечание по дозированию

Сначала я собираюсь спросить, почему вы используете дозирование.Если вы надеетесь, что это сэкономит вас на использовании квоты, то на пакетирование влияет то же использование квоты, что и на обычные вызовы API.Единственная помощь, которую вам даст пакет, - отправлять меньше HTTP-звонков и тратить немного.

Каждое HTTP-соединение, которое устанавливает ваш клиент, приводит к определенным накладным расходам.Некоторые API Google поддерживают пакетную обработку, чтобы позволить вашему клиенту поместить несколько вызовов API в один HTTP-запрос.

Применяются заголовки HTTP для внешнего пакетного запроса, за исключением заголовков содержимого, таких как Content-Type.на каждый запрос в партии.Если вы задаете данный заголовок HTTP как во внешнем запросе, так и в отдельном вызове, то значение отдельного заголовка вызова переопределяет значение заголовка внешнего пакетного запроса.Заголовки для отдельного вызова применяются только к этому вызову.

Например, если вы предоставляете Заголовок авторизации для определенного вызова, то этот заголовок применяется только к этому вызову .Если вы предоставляете заголовок авторизации для внешнего запроса, то этот заголовок применяется ко всем отдельным вызовам, если они не переопределяют его с собственными заголовками авторизации.

Авторизация

Когда вы авторизуетесь к API, эта авторизация для одного пользователя.

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

Вышеуказанная служба будет иметь доступ только к тому, что один пользователь будет выдавать себя за другого пользователя.

Anwser

Есть ли способ сделать пакетный запрос для получения писем SendAs от нескольких или всех пользователей?

Нет, там нет.Как видно из приведенного выше, заголовок авторизации запроса на пакет охватывает все элементы в пакете.Заголовок авторизации, созданный с помощью GmailService для вашего пакетного запроса, будет охватывать только одного пользователя.

...