如何在安全限制下通过 Gmail(机器 2 机器)发送服务电子邮件?
How to send service emails via Gmail (machine-2-machine) with secure restrictions?
如何发送服务邮件
- 从我的后端使用
smtp.google.com
或 Gmail API
,同时确保
- 存储在后端服务器上的秘密只能用于发送来自特定发件人的电子邮件?
目标
- 从我的后端发送用户帐户激活电子邮件
- 使用
smtp.google.com
或 Gmail API
(即没有自己的 SMTP 服务器)
- 使用 OAuth2.0 进行身份验证(即不要启用“不太安全的应用程序”)
当前状态
- 实现了邮件发送部分
- 为了测试,我创建了一个
noreply@**.**
Google 套件帐户
- 为了测试,我通过 OAuth2 Playground
生成了一个 accessToken
- 使用
accessToken
我可以通过 smtp.googl.com
发送电子邮件
问题
- Google suggests 为此使用
service account
- 但是要从
no-reply@x.y
发送电子邮件,我必须启用 域范围的委派
- 全域委派 允许模拟每个域帐户
- 存储在后端的秘密应该只允许从
no-reply@**.**
发送邮件
让我们从 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 key
:Manage 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 服务器可能更容易。
如何发送服务邮件
- 从我的后端使用
smtp.google.com
或Gmail API
,同时确保 - 存储在后端服务器上的秘密只能用于发送来自特定发件人的电子邮件?
目标
- 从我的后端发送用户帐户激活电子邮件
- 使用
smtp.google.com
或Gmail API
(即没有自己的 SMTP 服务器) - 使用 OAuth2.0 进行身份验证(即不要启用“不太安全的应用程序”)
当前状态
- 实现了邮件发送部分
- 为了测试,我创建了一个
noreply@**.**
Google 套件帐户 - 为了测试,我通过 OAuth2 Playground 生成了一个
- 使用
accessToken
我可以通过smtp.googl.com
发送电子邮件
accessToken
问题
- Google suggests 为此使用
service account
- 但是要从
no-reply@x.y
发送电子邮件,我必须启用 域范围的委派 - 全域委派 允许模拟每个域帐户
- 存储在后端的秘密应该只允许从
no-reply@**.**
发送邮件
让我们从 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 key
:Manage 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 服务器可能更容易。