Управление подписями Gmail с помощью учетной записи службы Python

Я хочу редактировать подписи пользователей в домене приложений Google. Я планирую использовать служебную учетную запись. Учетная запись службы делегируется всему домену. У меня это работает с API Gmail для отправки и получения электронной почты, но сигнатуры изменяются с использованием другого API. Согласно https://developers.google.com/admin-sdk/email-settings/ этот API-интерфейс представляет собой Admin SDK, который я включил через консоль разработчика Google.

Я пытаюсь использовать библиотеку gdata.apps.emailsettings.client (которая не поддерживает Python 3.x)

Создание учетных данных работает, но когда я пытаюсь сделать

gmail_client.RetrieveSignature(username)

Я получаю gdata.client.Unauthorized: Unauthorized - Сервер ответил: 401.

# python 2.7 from macports    
def setup_gmail_client_new_api():
        client_email = '...3@developer.gserviceaccount.com'

        key_path = 'VCI-EMAIL-INTEGRATION-f493528321ba.json'
        sender = 'tim@vci.com.au'
        API_scope = 'https://apps-apis.google.com/a/feeds/emailsettings/2.0/'
                                            filename=key_path, scopes=API_scope)
        credentials = ServiceAccountCredentials.from_json_keyfile_name(key_path, scopes=API_scope)
        return credentials


    if __name__ == "__main__":
        credentials = setup_gmail_client_new_api()
        client = gdata.apps.emailsettings.client.EmailSettingsClient(domain='vci.com.au')

        auth = gdata.gauth.OAuth2Token(
            credentials.client_id,#serviceEmail
            credentials.client_secret,#private key
            scope='https://apps-apis.google.com/a/feeds/emailsettings/2.0/',
            access_token=credentials.access_token,
            refresh_token=credentials.refresh_token,
            user_agent=credentials.user_agent)

        auth.authorize(client)
        result = retrieve_sig(client,"tim")
        print (result)

попытка получить подпись:

gdata.client.Unauthorized: Unauthorized - Server responded with: 401,

учетная запись службы имеет делегирование по всему домену. В панели управления безопасностью домена приложений Google (управление доступом клиентов API) у идентификатора службы есть разрешение для "Настройки электронной почты (чтение / запись) https://apps-apis.google.com/a/feeds/emailsettings/2.0/".

2 ответа

Решение

Правильно. Я надеюсь, что этот пост экономит часы работы.

Ключевая недостающая точка, которая не была задокументирована очень хорошо (хорошо, совсем нет, но, возможно, я пропустил это). Вам нужно использовать Delegated_credentials и авторизовать email_settings_client с этим объектом.

  1. Следуйте примечаниям oauth2, чтобы создать служебную учетную запись и скачать личный ключ JSON как обычно. Вы делаете это на консоли разработчика. Учетная запись службы не связана ни с одним доменом, это просто учетные данные.
  2. В вашем домене приложений Google зайдите в раздел безопасность, расширенный доступ, API и т. Д. Шаги 1 и 2 в настоящее время документированы здесь: https://developers.google.com/identity/protocols/OAuth2ServiceAccount.

Теперь код Python. Я использовал 2.7, потому что я думаю, что gdata не совместима с v3.

Это минимальный пример.

from __future__ import print_function

import httplib2
from oauth2client.service_account import ServiceAccountCredentials
import gdata.apps.emailsettings.client
import gdata.gauth

def setup_credentials():
        key_path = '/Users/tim/Dropbox/pycharm_projects_27/gmail_admin/<blabla>.json'
        API_scopes =['https://apps-apis.google.com/a/feeds/emailsettings/2.0/']
        credentials = ServiceAccountCredentials.from_json_keyfile_name(key_path, scopes=API_scopes)
        return credentials

if __name__ == "__main__":
    credentials = setup_credentials()

    # pass the email address of a domain super-administrator
    delegated_credentials = credentials.create_delegated('tim@vci.com.au')
    http = httplib2.Http()
    #http = credentials.authorize(http)
    http = delegated_credentials.authorize(http)  #this is necessary


    url_get_sig = 'https://apps-apis.google.com/a/feeds/emailsettings/2.0/vci.com.au/tim/signature'
    r = http.request(url_get_sig,"GET")
    print (r)

    # now use the library
    client = gdata.apps.emailsettings.client.EmailSettingsClient(domain='vci.com.au')
    auth2token = gdata.gauth.OAuth2TokenFromCredentials(delegated_credentials)
    auth2token.authorize(client)
    r = client.retrieve_signature('tim')
    print (client)

это более богатый пример здесь: https://gist.github.com/timrichardson/a43462aedc0797ecb76c48deb9c96d36

API настроек электронной почты требует от вас аутентификации в качестве супер администратора, обычные пользователи не могут получить доступ к API. Таким образом, ваша учетная запись службы должна выступать в роли супер-администратора, а затем супер-администратора, вносящего изменения для пользователя, указанного в вызове API.

Другие вопросы по тегам