使用带有 Python 和 Oauth 身份验证的 Gmail API 发送自动电子邮件

Sending automated emails using Gmail API with Python and Oauth authentication

我有一个使用 SendGrid API 发送电子邮件的 Python 代码,但现在我想迁移到 Google 以发送商务电子邮件。它还在 Docker 个容器中运行。

我遵循 Gmail Python Quickstart 以便在我的 python 代码中使用 Gmail API,问题是在尝试发送电子邮件时,它显示授权 link在 docker 日志中以获取令牌等

有没有一种方法可以在后台完成授权而无需任何进一步的交互,或者像 SendGrid 一样使用 API 密钥以编程方式验证您的应用程序?

我是服务商,想自动发送重设密码links、确认码等邮件;代码部署在 Linux 主机上。我可以访问工作区帐户并且我已经验证了我的域。

您关注的 tutorial 是为已安装的应用程序设计的。因此 InstalledAppFlow

它在文件顶部说明。

Authorization credentials for a desktop application. To learn how to create credentials for a desktop application, refer to Create credentials.

这意味着当您的代码 运行s 将在机器上弹出同意屏幕时,代码 运行ning 在这种情况下 docker.

flow = InstalledAppFlow.from_client_secrets_file(
            'credentials.json', SCOPES)

您需要做的是使用 Web 应用程序创建它,以便您的用户可以同意您的应用程序访问他们的数据和他们的 Gmail 帐户。

自动发送电子邮件服务帐户选项。

您不清楚您是为谁发送电子邮件。当您使用发送网格时,它对我来说意味着这是某种自动化系统。这意味着您正在尝试代表您控制的 gmail 帐户发送电子邮件。

在这种情况下,您通常希望使用服务帐户。服务帐户允许 google api 之间的服务器到服务器交互。但是,如果这是一个 google 工作区 gmail 帐户,则服务帐户只能与 gmail 一起使用,并且您可以设置 domain wide delegation.

文档中有一个示例,只需将其更改为 gmail 范围,关键点是 create_delegated,它必须是您域中的用户。

from googleapiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials

# Email of the Service Account
SERVICE_ACCOUNT_EMAIL = '<some-id>@developer.gserviceaccount.com'

# Path to the Service Account's Private Key file
SERVICE_ACCOUNT_PKCS12_FILE_PATH = '/path/to/<public_key_fingerprint>-privatekey.p12'

def create_directory_service(user_email):
    """Build and returns an Admin SDK Directory service object authorized with the service accounts
    that act on behalf of the given user.

    Args:
      user_email: The email of the user. Needs permissions to access the Admin APIs.
    Returns:
      Admin SDK directory service object.
    """

    credentials = ServiceAccountCredentials.from_p12_keyfile(
        SERVICE_ACCOUNT_EMAIL,
        SERVICE_ACCOUNT_PKCS12_FILE_PATH,
        'notasecret',
        scopes=['https://www.googleapis.com/auth/admin.directory.user'])

    credentials = credentials.create_delegated(user_email)

    return build('admin', 'directory_v1', credentials=credentials)

标准 gmail 解决方案

你可以做的是 运行 你的应用一次,然后当你将它放在 docker 容器中时,确保你包含创建的 token.json 文件,这就是文件其中包含授予应用程序访问您帐户的凭据。

如果您打开它,您会在其中找到一个访问令牌和一个刷新令牌。刷新令牌将使您的应用能够在需要时请求新的访问令牌。