首页 > 解决方案 > 使用 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()”

在每个场景中,我在同一行(即“结果”生成时)都遇到了相同的错误。我不知道我在哪里做错了什么,或者我忘记了中间的一些步骤。

标签: pythonapiemailgmail-api

解决方案


您需要一个具有域范围权限的服务帐户:

正如您收到的错误和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是您希望服务帐户模拟的电子邮件地址。

参考:


推荐阅读