如何在安全限制下通过 Gmail(机器 2 机器)发送服务电子邮件?

How to send service emails via Gmail (machine-2-machine) with secure restrictions?

如何发送服务邮件

目标

当前状态

问题

让我们从 send user account activation emails from my server 开始 我假设您有一个网络应用程序。此网络应用程序允许用户注册您的系统。现在,当用户在您的系统上注册时,您希望自动向他们发送一封帐户创建电子邮件。您的想法是使用 Google 而不是设置您自己的 smtp 服务器并从您自己的系统发送这些电子邮件。确实不错。

让我们考虑一下,电子邮件需要自动发送,因此您需要某种服务来发送它们。为此,您需要使用服务帐户。同样,使用预先授权的服务帐户是个好主意,您不需要用户来授权该应用程序。

唯一的问题是服务帐户不能与普通的 gmail 帐户一起使用。要在 Gmail api 中使用服务帐户,您需要使用 google 工作区域帐户。然后,工作区域管理员将能够向服务帐户添加权限,使其像域中的用户一样工作。在这种情况下,您的想法是 no-reply.

因此您的工作区域帐户将有一个名为 no-reply 的用户。然后,域管理员会将域范围的委派配置给服务帐户,使其假装它是名为 no-reply 的用户。对于所有密集用途,服务帐户是 no-reply 用户。它将能够像来自该用户一样发送邮件。

要使所有这些正常工作,您需要该用户的工作区帐户。

看看下面的 link,它实际上是 Google 的一个更好的例子,它展示了如何设置委托。

Perform Google Workspace Domain-Wide Delegation of Authority

这里你创建一个服务账户,允许这个账户冒充其他用户(例如no-reply用户),只使用GmailAPI 并且只用它来发送电子邮件。

  • 文档有点过时,您可以跳过步骤 Grant users access to this service account,然后通过服务帐户编辑功能创建 service account keyManage keys
  • 在步骤 Domain wide delegation 中,您需要 Google Admin 而不是 Google Cloud Platform Admin Console,如上一步

记得换掉关于

的那几行
https://www.googleapis.com/auth/admin.directory.user,
https://www.googleapis.com/auth/admin.directory.group

并使用

https://www.googleapis.com/auth/gmail.send

而不是因为您想要访问 Gmail API 并且只允许服务帐户发送(而不是阅读)电子邮件

小费

在示例代码中那个link

.setServiceAccountUser(userEmail)

userEmail 是您要在本例中模拟的用户的电子邮件地址 no-reply@x.y

所以我想我的意思是你想做的事情绝对是可能的,但是,设置你自己的 SMTP 服务器可能更容易。