使用 GmailAPI 在帐户设置中添加自动转发时出现问题
Posted
技术标签:
【中文标题】使用 GmailAPI 在帐户设置中添加自动转发时出现问题【英文标题】:Problem while using GmailAPI for adding auto-forwarding in account settings 【发布时间】:2020-11-19 21:52:54 【问题描述】:我想在我的应用程序中使用 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 的转发设置中验证了帐户中的“
然后我在系统上运行脚本,然后它要求登录,所以我登录了帐户,然后脚本运行并且控制台产生了这个错误:-
googleapiclient.errors.HttpError:
错误出现在这一行:- "create(userId='me', body=address).execute()"
在每个 senario 中,我在同一行(即“结果”生成时)都遇到了相同的错误。 我不知道我在哪里做错了什么,或者我忘记了中间的一些步骤。
【问题讨论】:
我已经发布了您的问题的答案。如果您需要任何关于此的其他指示,请告诉我。 【参考方案1】:您需要一个具有全域权限的服务帐号:
正如您遇到的错误和 updateAutoForwarding 明确指出的那样,您需要使用具有域范围权限的服务帐户才能更新自动转发设置:
此方法仅适用于已被授予域范围权限的服务帐户客户端。
重要提示:您需要成为域管理员才能向服务帐户授予域范围的权限。因此,如果您不是管理员,则无法通过 API 管理自动转发。
所以你必须创建一个服务帐户,授予它域范围的权限,并用它来模拟一个普通帐户:
查看this 了解服务帐户的概述:特别是this section 了解如何创建服务帐户,this one 了解委派域范围的权限。
成功设置服务帐户后,您必须将在代码中构建凭据的方式更改为如下所示:
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
是您希望服务帐户模拟的电子邮件地址。
参考:
Using OAuth 2.0 for Server to Server Applications【讨论】:
以上是关于使用 GmailAPI 在帐户设置中添加自动转发时出现问题的主要内容,如果未能解决你的问题,请参考以下文章
Gmail API - 从 g-suite 服务帐户发送邮件时设置发件人名称