Gmail设置API后端错误 - Python

时间:2016-07-26 18:27:20

标签: python google-app-engine gmail-api google-admin-sdk google-admin-settings-api

上个月,我完成了一个使用Python的GAE应用程序,该应用程序广泛使用各种Google API来管理谷歌管理员在公司域内的谷歌资源。该应用程序已完成!!!,但本月谷歌宣布不再支持我目前正在实施的EmailSettings API,并且电子邮件设置将迁移到Gmail API;到目前为止,他们已经迁移了一些设置(即发送 - 别名,转发,休假响应者和签名)。在谷歌整理的迁移文档中,他们指出了两个API之间的主要差异,以及有关如何迁移它的模糊参考。无论如何,我目前正在尝试使用服务帐户实现新的API来修改发送设置。以下是我为服务帐户创建服务的方式(再次,这是Python):

scopes = ['https://mail.google.com/', 'https://www.googleapis.com/auth/gmail.settings.basic', 'https://www.googleapis.com/auth/gmail.settings.sharing']

email = "username@domain.bla"
credentials = oauth2.service_account.build_credentials(scope=scopes, user=me)       
http = httplib2.Http()
credentials.authorize(http)
service = google_api_helper.build("gmail", "v1", credentials)    
body = {'emailAddress':'anotheruser@domain.bla'}

service_2.users().settings().updateAutoForwarding(userId="me", body=body).execute()  

在这个特定的例子中,我正在尝试更新AutoForwarding设置,但它与某些send-as设置的情况和错误相同。我遇到的问题如下;对于谷歌称之为“微妙的设置”,我需要使用范围:“https://www.googleapis.com/auth/gmail.settings.sharing”,需要创建一个服务帐户才能使用它。

每当我尝试使用它时,我收到500错误消息:

  

HttpError:https://www.googleapis.com/gmail/v1/users/me/settings/autoForwarding ?alt = json   返回“后端错误”>

如果我正在验证域范围内对服务帐户的访问权限,为什么我收到此错误,这是API错误还是我目前正在实施oauth2身份验证的方式?我尝试了几种实现但没有成功:

使用应用程序默认身份验证:

credentials = GoogleCredentials.get_application_default()
httpauth = credentials.authorize(Http())
service = build("gmail", "v1", http=http_auth)
aliases_2 = service.users().settings().sendAs().list(userId="username@domain.bla").execute()

使用更新的oauth2client库和本地json文件:

 credentials_new = ServiceAccountCredentials.from_json_keyfile_name("app/service_account_key.json", scopes)
 delegated_credentials = credentials_new.create_delegated(sub="username@domain.bla")
 http_auth = delegated_credentials.authorize(Http())
 service = build("gmail", "v1", http=http_auth) 

使用过时的oauth2client库并使用SignedJwtAssertionCredentials函数,该函数在库的新实现中不再受支持:

credentials = SignedJwtAssertionCredentials(str(settings['oauth2_service_account']['client_email']).encode('utf-8'), settings['oauth2_service_account']['private_key'], scope=scopes, sub="username@domain.bla")
auth2token = OAuth2TokenFromCredentials(credentials) 
# With this implementation i was able to provide the google admin account which is supposed to have super admin access to the "sub" parameter, this used to work for the EmailSettings API, but for this new implementation you need to pass the email of the user you are trying to gain access to.
# build service
# call API

通过所有3个实现,我能够调用基本范围,但每当我尝试对settings.sharing范围内的任何设置进行任何更改时,都会收到后端错误消息。这让我发疯,我刚刚完成了这个应用!!!!如果您有任何想法或者之前遇到过这个问题,请告诉我!!!!!     ...

1 个答案:

答案 0 :(得分:0)

更新:截至2016-08-11,此问题应该修复。

截至2016-07-27,授权后端存在导致此错误的错误,但它似乎只会影响某些域/用户。我们正在努力修复。请为this issue加注星标以获取更新。