使用 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 的转发设置中验证了帐户中的“”(我还在从转发设置中删除邮件 ID 后对其进行了测试),如下所述:- https://developers.google.com/gmail/api/guides/forwarding_settings “您必须在使用前创建转发地址。在某些情况下,用户还必须验证地址的所有权。 如果 Gmail 要求对转发地址进行用户验证,则该地址会以待处理状态返回。验证消息会自动发送到目标电子邮件地址。电子邮件地址的所有者必须完成验证过程才能使用它。 不需要验证的转发地址的验证状态为已接受。”

然后我在系统上运行脚本,然后它要求登录,所以我登录了帐户,然后脚本运行并且控制台产生了这个错误:-

googleapiclient.errors.HttpError: https://www.googleapis.com/gmail/v1/users/me/settings/forwardingAddresses?alt=json 返回“访问仅限于已被委派域范围权限的服务帐户”>

错误出现在这一行:- "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 服务帐户发送邮件时设置发件人名称

我们可以使用服务帐户访问 GMAIL API 吗?

Gmail API - PHP - 使用服务帐户发送电子邮件

NodeJS:无法使用服务帐户访问 Gmail API

如何向300多名用户大量添加Gmail API权限?

Gmail API 服务帐户请求 - 前提条件检查失败