Включить пересылку почты с помощью аккаунта Служб Google
20 апреля 2015 г. прекращается работа нескольких API Служб Google, в том числе API предоставления (gdata).
В моих скриптах Python я использую учетную запись службы и OAuth 2.0 вместо ClientLogin и API замены: API каталогов.
Однако я не могу найти способ включить пересылку почты с помощью нового API, и вся документация Google по Python для пересылки почты объясняет, как это сделать с помощью ClientLogin, которая также прекращается 20 апреля.
Соответствующая информация:
У меня есть служебная учетная запись, и я соответствующим образом авторизовал ее в соответствии с этим руководством: https://developers.google.com/api-client-library/python/auth/service-accounts
Все остальные мои функции работают с новым API!
Я тщательно изучил документацию по API API (хотя не исключаю, что что-то пропустил): https://developers.google.com/resources/api-libraries/documentation/admin/directory_v1/python/latest/index.html
Единственная документация Google (которую я нашел) о реализации пересылки почты с помощью Python предлагает использовать ClientLogin, как упоминалось выше: https://developers.google.com/admin-sdk/email-settings/
Мой существующий рабочий код для пересылки почты (на основе этой документации):
client = gdata.apps.emailsettings.client.EmailSettingsClient(domain='mydomain.co')
client.ClientLogin(email=adminEmail, password=adminPass, source='apps')
client.UpdateForwarding(username=username, enable=True,
forward_to=forwardTo, action='ARCHIVE')
Мой обновленный код основан на ответе Джея Ли:
credentials = SignedJwtAssertionCredentials(serviceEmail, key, sub=adminEmail,
scope='https://apps-apis.google.com/a/feeds/emailsettings/2.0/ '+'other scopes')
client = gdata.apps.emailsettings.client.EmailSettingsClient(domain='mydomain.co')
client.additional_headers = {'Authorization': 'Bearer %s' % credentials.access_token}
client.UpdateForwarding(username=username, enable=True,
forward_to=forwardTo, action='ARCHIVE')
И я добавил новую область в свою учетную запись службы в:
Консоль администратора-> Безопасность-> Расширенные настройки-> Управление клиентским доступом API (в разделе Аутентификация)
* Примечание. Если вы используете другие области действия, вам необходимо ввести их все, поскольку они заменяют ваши предыдущие настройки.
Обновить:
Я думал, что у меня это работает, но я, возможно, закомментировал строку или проигнорировал. Когда я попробовал свой код позже в тот же день, когда все строки выполнялись правильно, он по-прежнему выдавал мне ошибку gdata.client.Unauthorized. Я попытался перезапустить свой сервер, чтобы вновь создать учетные данные, но это не помогло. Ошибка возникает, когда я пытаюсь сделать обновление переадресации вызова.
Я подтвердил, что access_token такой же, как тот, который работает для моих вызовов API Справочника, и что "клиент" на самом деле является объектом emailSettingsClient.
Полная ошибка, которую я получаю:
Еще одна попытка основана на следующем:
http://www.worldofchris.com/blog/2012/12/27/fun-with-oauth-gdata-google-apis-client-library-python/
https://groups.google.com/forum/m/#!msg/google-apps-developer-blog/1pGRCivuSUI/3EAIioKp0-wJ Как авторизовать клиент gdata без использования рабочего процесса gdata oauth2?
credentials = SignedJwtAssertionCredentials(serviceEmail, key, sub=adminEmail,
scope='https://apps-apis.google.com/a/feeds/emailsettings/2.0/ '+'other scopes')
auth = gdata.gauth.OAuth2Token(serviceEmail, key,
scope='https://apps-apis.google.com/a/feeds/emailsettings/2.0/',
access_token=credentials.access_token,
refresh_token=credentials.refresh_token,
user_agent='emailsettings/2.0')#I do not really understand this param
client = gdata.apps.emailsettings.client.EmailSettingsClient(domain='mydomain.co')
#Also tried with (domain='mydomain.co', auth_token = credentials.access_token)
client.additional_headers = {'Authorization': 'Bearer %s' % credentials.access_token}
auth.authorize(client)
client.UpdateForwarding(username=username, enable=True,
forward_to=forwardTo, action='ARCHIVE')
2 ответа
Это должен быть правильный способ непосредственного использования объекта учетных данных:
import gdata.gauth
credentials = SignedJwtAssertionCredentials(serviceEmail,
key,
sub=adminEmail,
scope=scopes)
client = gdata.apps.emailsettings.client.EmailSettingsClient(domain='mydomain.co')
client.auth_token = gdata.gauth.OAuth2TokenFromCredentials(credentials)
client.UpdateForwarding(username=username, enable=True,
forward_to=forwardTo, action='ARCHIVE')
Было несколько вещей, которые мне нужно было поменять на мое последнее обновление, чтобы мой код работал: мне нужно было использовать user_agent=credentials.user_agent
, удалить client.additional_headers
и я использовал client_id и client_secret из учетных данных вместо того, чтобы передавать их самому себе (не уверен, что это была проблема типа переменной).
Окончательный рабочий код:
credentials = SignedJwtAssertionCredentials(serviceEmail, key, sub=adminEmail,
scope='https://apps-apis.google.com/a/feeds/emailsettings/2.0/ '+'other scopes')
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)
client = gdata.apps.emailsettings.client.EmailSettingsClient(domain='mydomain.co')
auth.authorize(client)
client.UpdateForwarding(username=username, enable=True,
forward_to=forwardTo, action='ARCHIVE')