Nodemailer搭配Gmail SMTP部署到Heroku后无法发邮件如何解决?
原因说明
该报错是谷歌安全机制拦截了来自Heroku的登录请求导致:Heroku的出口IP为动态池,单次解锁CAPTCHA仅对当时请求的IP生效,IP更新后会再次被拦截;且2022年起谷歌已逐步停用普通账号的「低安全性应用」登录权限,原有配置方案已失效。
可落地解决方案
方案1:使用应用密码(配置成本最低)
- 为你的谷歌账号开启两步验证
- 进入账号安全设置页生成应用密码,应用类别选「邮件」,设备自定义为你的项目名
- 将Heroku环境变量中
DEMO_ACCOUNT_PASSWORD的值替换为生成的16位应用密码,重新部署即可正常使用。
方案2:切换为OAuth2认证
修改nodemailer传输配置,采用Gmail官方支持的OAuth2认证方式,不受IP变动影响:
const mail = nodemailer.createTransport({ service: "gmail", auth: { type: "OAuth2", user: "你的Gmail地址", clientId: "谷歌云控制台生成的客户端ID", clientSecret: "谷歌云控制台生成的客户端密钥", refreshToken: "OAuth2刷新令牌", accessToken: "OAuth2访问令牌" } });
你需要先在谷歌云控制台创建项目,开通Gmail API权限,生成对应OAuth2凭据即可使用。
方案3:使用专业邮件服务
生产环境建议切换为SendGrid、Mailgun等专门的事务性邮件服务,Heroku平台支持对应插件一键集成,发送稳定性更高,无需适配个人邮箱的安全限制。
内容的提问来源于stack exchange,提问作者user13152486
相关产品推荐
相关产品推荐

