部署至Heroku后Nodemailer无法发送邮件的问题咨询
问题原因判断
你当前遇到的问题不属于核心代码逻辑问题,本地运行正常已经验证了业务代码的正确性,问题出在Gmail安全策略限制和Heroku部署配置两个层面,具体排查和解决方法如下:
1 Gmail安全策略限制原因及修复
Google默认会拦截来自非常用登录环境、低安全性应用的登录请求,Heroku的服务器IP不在你常用登录IP范围内,会被Gmail直接拦截验证请求,你当前使用的明文账号密码登录方式本身也已经被Gmail官方限制使用。
解决步骤:
- 登录你的Google账号,开启账号两步验证
- 在Google账号的「安全性」板块,生成专门的应用专用密码(16位无空格字符串)
- 不要将账号密码硬编码在代码中,改为读取环境变量,代码修改如下:
smtpTrans = nodemailer.createTransport({ service: 'gmail', auth: { user: process.env.GMAIL_USER, pass: process.env.GMAIL_PASS } });
2 Heroku部署配置原因及修复
如果你直接将账号密码写死在代码里,大概率是部署时没有替换成真实值,即使你写了真实值,硬编码敏感信息也容易触发Gmail的安全拦截,另外如果已经改成环境变量读取,你没有在Heroku后台配置对应变量也会导致验证失败。
解决步骤:
- 进入Heroku对应应用的「Settings」页面,找到「Config Vars」配置板块
- 新增两个配置项:
GMAIL_USER填你的Gmail账号,GMAIL_PASS填之前生成的应用专用密码 - 给邮件发送逻辑添加错误捕获,方便后续排查问题,代码修改如下:
smtpTrans.sendMail(mailOpts, function(error, info){ if (error) { console.log('邮件发送失败:', error); // 部署后可执行 heroku logs --tail 命令查看具体报错信息 } else { console.log('邮件发送成功:', info.response); } });
可选优化方案
如果上述操作完成后还是有问题,可以改用Gmail官方的OAuth2验证方式对接Nodemailer,无需暴露账号密码,安全性和适配性更高。
内容的提问来源于stack exchange,提问作者Adar Maori
相关产品推荐
相关产品推荐

