You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署至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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:15:02