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

标签 google-api gmail google-oauth google-iam

如何发送服务电子邮件

  • 来 self 的后端 smtp.google.comGmail API同时确保
  • 存储在后端服务器上的 secret 只能用于发送来自特定发件人的电子邮件?

目标

  • 从我的后端发送用户帐户激活电子邮件
  • 使用smtp.google.comGmail API (即没有自己的 SMTP 服务器)
  • 使用 OAuth2.0 进行身份验证(即不要启用“安全性较低的应用”)

当前状态

  • 实现了电子邮件发送部分
  • 为了测试,我创建了一个 noreply@**.** Google 套件帐户
  • 为了测试,我生成了一个 accessToken通过 OAuth2 Playground
  • 使用accessToken我可以通过 smtp.googl.com 发送电子邮件

问题

  • 谷歌 suggests使用service account为此
  • 但要从 <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e48a8bc9968194889da49cca9d" rel="noreferrer noopener nofollow">[email protected]</a> 发送电子邮件我必须启用域范围委派
  • 域范围授权允许模拟每个域帐户
  • 存储在后端的 secret 应该只允许从 no-reply@**.** 发送邮件

最佳答案

让我们从从我的服务器发送用户帐户激活电子邮件开始,我假设您有一个网络应用程序。该网络应用程序允许用户在您的系统中注册。现在,当用户在您的系统中注册时,您希望自动向他们发送一封帐户创建电子邮件。您的想法是使用 Google,而不是设置您自己的 smtp 服务器并从您自己的系统发送这些电子邮件。确实不是一个坏主意。

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

唯一的问题是服务帐户无法与普通 Gmail 帐户一起使用。要将服务帐户与 Gmail api 一起使用,您需要使用 Google Workspace 域帐户。然后,工作区域管理员将能够向服务帐户添加权限,使其充当域中的用户。在这种情况下,你的想法是不回复。

因此,您的工作区域帐户将有一个名为 no-reply 的用户。然后,域管理员将配置对服务帐户的域范围委派,允许其假装是称为 no-reply 的用户。出于所有意图和目的,服务帐户都是无回复用户。它将能够发送邮件,就像它们来自该用户一样。

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

看看下面的链接,它实际上是 Google 更好的示例之一,它展示了如何设置委托(delegate)。

Perform Google Workspace Domain-Wide Delegation of Authority

您可以在此处创建一个带有凭据的服务帐户,允许此帐户模拟其他用户(例如无回复用户),仅使用 Gmail API 并仅用它来发送电子邮件。

  • 文档有点过时,您可以跳过授予用户对此服务帐户的访问权限步骤,然后通过服务帐户编辑功能创建服务帐户 key : 管理 key
  • 在步骤域范围授权中,您需要 Google Admin不是上一步中的 Google Cloud Platform 管理控制台

只要记住交换有关的行

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 并仅允许服务帐户发送(而不是阅读)电子邮件

提示

在该链接的示例代码中

.setServiceAccountUser(userEmail)

userEmail 是您要在本例中模拟的用户的电子邮件地址 [email protected]

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

关于google-api - 如何在安全限制下通过 Gmail(机器-2-机器)发送服务电子邮件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71053311/

相关文章:

javascript - Google+ API 不返回 access_token Javascript

android - 来自谷歌排行榜的前 5 名

c# - 在应用程序启动时始终提示用户选择帐户

javascript - Gmail API User.Message 属性不起作用

php - Google Analytics API V4 不适用于 GA4 帐户

python - 未使用 Google Drive API 获取共享文件夹中的项目列表

java - 出现问题 com.sun.mail.smtp.SMTPSendFailedException : 530 5. 7.0 必须首先发出 STARTTLS 命令。 dg12sm142339333pac.47 - gsmtp

python - 使用 Google Gmail API 进行桌面应用程序

android - 错误 : Cannot attach empty file in GMAIL app using File provider

firebase - Google OAuth 刷新 token 未返回有效访问 token