如何通过无人值守的REST服务安全使用Gmail账户发送邮件?
无人值守REST服务通过Google SMTP发邮件的安全实现方案
问题根源
你碰到的「Access blocked」错误,是因为误用了需要用户手动授权的OAuth2授权码流程——这个流程依赖浏览器交互,完全不适合无人值守的后台服务。针对服务器端无交互场景,Google提供了两种合规方案,下面具体说明:
方案1:服务账号+域范围委派(企业G Suite/Workspace账户首选)
这是Google官方推荐的企业级无交互认证方案,步骤如下:
- 登录Google Cloud控制台,创建服务账号并下载JSON格式的密钥文件。
- 登录Google Workspace管理后台,给该服务账号开启域范围委派,并添加
https://mail.google.com/的API权限。 - 在代码中加载服务账号密钥,模拟你的Workspace域内的目标邮箱账户生成OAuth2令牌,再通过MailKit完成SMTP认证发送。
C#示例代码:
// 加载服务账号密钥 var credential = GoogleCredential.FromFile("your-service-account-key.json") .CreateScoped(new[] { "https://mail.google.com/" }) .CreateWithUser("sender@your-domain.com"); // 指定要模拟的发件人邮箱 // 构建OAuth2认证机制 var oauth2 = new SaslMechanismOAuth2(credential.UserId, await credential.GetAccessTokenForRequestAsync()); // 发送邮件 using (var client = new SmtpClient()) { client.Connect("smtp.gmail.com", 587, SecureSocketOptions.StartTls); client.Authenticate(oauth2); client.Send(yourMimeMessage); client.Disconnect(true); }
方案2:应用专用密码(个人账户,需开启2FA)
如果是个人Google账户且已经开启两步验证,可以生成应用专用密码替代原密码:
- 登录Google账户安全设置,找到「应用专用密码」选项。
- 生成一个专用密码(注意只显示一次,务必保存)。
- 直接用这个密码作为SMTP的登录密码,结合你的邮箱地址进行Basic认证,无需OAuth2。
⚠️ 注意:未开启2FA的个人账户无法使用此方案,且这是个人账户的临时替代方案,企业场景优先选服务账号。
方案3:Google Workspace SMTP Relay(批量发送场景)
如果需要批量发送邮件,可配置Google Workspace的SMTP Relay服务:
- 在Workspace管理后台设置SMTP Relay,将你的服务器IP加入白名单。
- 直接通过该IP连接SMTP服务器,无需用户名密码(基于IP认证),或使用Workspace账户凭据认证。
重要提醒
- 「Less secure apps」设置已被Google彻底移除,不要再尝试寻找相关选项。
- 服务账号的域范围委派仅对Workspace/G Suite账户开放,个人账户无法使用。
- 所有方案必须确保密钥/密码的安全存储,避免硬编码在代码中。
内容的提问来源于stack exchange,提问作者AxD
相关产品推荐
相关产品推荐

