python - 使用 GmailAPI 在帐户设置中添加自动转发时出现问题
问题描述
我想在我的应用程序中使用 gmailAPI 来使用自动转发功能,因为我是 API 新手,所以我按照 python 中的快速入门指南中给出的步骤进行操作,我按照以下步骤进行操作
首先我去了:- https://developers.google.com/gmail/api/quickstart/python?authuser=0并按照那里的所有步骤打开gmail API并将credentials.JSON文件复制到工作目录和在系统上安装 python 包并复制代码。然后我将范围编辑为:- https://www.googleapis.com/auth/gmail.settings.sharing 以便转发设置可用。然后我使用:- https://developers.google.com/gmail/api/guides/forwarding_settings编辑了代码 ,最终代码如下所示:-
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
SCOPES = ['https://www.googleapis.com/auth/gmail.settings.sharing']
def main():
"""Shows basic usage of the Gmail API.
Lists the user's Gmail labels.
"""
creds = None
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
service = build('gmail', 'v1', credentials=creds)
address = { 'forwardingEmail': '<forwarding_mailid>' }
result = service.users().settings().forwardingAddresses().\
create(userId='me', body=address).execute()
if result.get('verificationStatus') == 'accepted':
body = {
'emailAddress': result.get('forwardingEmail'),
'enabled': True,
'disposition': 'trash'
}
result = service.users().settings().\
updateAutoForwarding(userId='me', body=body).execute()
if __name__ == '__main__':
main()
它说还应该验证转发邮件,所以我在 gmail 的转发设置中验证了帐户中的“<forwarding_mailid>”(我还在从转发设置中删除邮件 ID 后对其进行了测试),如:- https:// developers.google.com/gmail/api/guides/forwarding_settings “您必须在使用前创建转发地址。在某些情况下,用户还必须验证地址的所有权。如果 Gmail 要求用户验证转发地址,则地址返回状态为pending,验证信息会自动发送到目标邮箱,邮箱的所有者必须完成验证后才能使用,不需要验证的转发地址的验证状态为已接受。 "
然后我在系统上运行脚本然后它要求登录所以我登录帐户然后脚本运行并且控制台产生了这个错误: -
googleapiclient.errors.HttpError: <HttpError 403 when requesting https://www.googleapis.com/gmail/v1/users/me/settings/forwardingAddresses?alt=json返回“访问仅限于已在域范围内委派的服务帐户权威">
错误在这一行:-“create(userId='me', body=address).execute()”
在每个场景中,我在同一行(即“结果”生成时)都遇到了相同的错误。我不知道我在哪里做错了什么,或者我忘记了中间的一些步骤。
解决方案
您需要一个具有域范围权限的服务帐户:
正如您收到的错误和updateAutoForwarding明确指出的那样,您需要使用具有域范围权限的服务帐户来更新自动转发设置:
此方法仅适用于已被委派域范围权限的服务帐户客户端。
重要提示:您需要成为域管理员才能向服务帐户授予域范围的权限。因此,如果您不是管理员,则无法通过 API 管理自动转发。
所以你必须创建一个服务帐户,授予它域范围的权限,并使用它来模拟一个普通帐户:
creds = service_account.Credentials.from_service_account_file('credentials.json', scopes=SCOPES)
creds = creds.with_subject('impersonated_account@your_domain.com')
credentials.json
服务帐户的下载JSON
文件在哪里,并且impersonated_account@your_domain.com
是您希望服务帐户模拟的电子邮件地址。
参考:
推荐阅读
- qt - Qt 如何在 Linux 中以编程方式正确连接手机(蓝牙 A2DP、AVRCP、HSP、HFP)
- javascript - 在 D3 X 轴图上放置自定义标签
- r - rollapplyr 按日期关联的缺失记录
- ios - 为什么我的应用因应用内购买而被拒绝?
- angularjs - 在带有 Typescript 的 AngularJS 中使用 templateURL 的函数
- javascript - 从构造函数中创建构造函数
- android - 使用后台任务实现点赞按钮
- android - 关于后台服务
- android - 改造 Okhttp 使用拦截器发送动态请求标头?
- scala - 如何使用正则表达式格式化 RDD,然后将其存储到 spark 中的 mongoDB