使用 Google 应用服务帐户启用邮件转发

Enable mail forwarding using a Google Apps Service Account

2015 年 4 月 20 日,几个 Google 应用程序 API 将被停用,包括配置 API(gdata)。
在我的 Python 脚本中,我使用的是服务帐户和 OAuth 2.0,而不是 ClientLogin,替换 API:目录 API.
但是,我无法找到使用新的 API 启用邮件转发的方法,Google 的所有 Python 邮件转发文档都解释了如何使用 ClientLogin 来实现,它也将于 4 月 20 日停播。

相关信息:
我有一个服务帐户并按照本指南对其进行了适当授权:https://developers.google.com/api-client-library/python/auth/service-accounts
我的所有其他功能都与新的 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/#manage_forwarding_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')

我根据 Jay Lee 的回答更新了代码:

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 调用工作的那个相同,并且 "client" 实际上是一个 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 How do I authorize a gdata client without using the gdata oauth2 workflow?

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')

这应该是直接使用凭证对象的正确方法:

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')