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

服务器代码中Nodemailer突发ECONNREFUSED错误,独立运行正常求助

排查Nodemailer在服务器环境下出现ECONNREFUSED 127.0.0.1:587的问题

我之前碰到过几乎一模一样的情况,这种“本地跑完全正常、放到服务器上就报连接拒绝”的问题,大概率是本地和服务器的环境差异导致的,咱们一步步来排查:

先抓核心异常点:为啥连的是127.0.0.1?

你代码里明明指定了service: 'gmail',正常情况下Nodemailer应该自动连接smtp.gmail.com:587,但错误里显示连的是本地127.0.0.1,这是最关键的线索!

可能的原因1:服务器网络/防火墙拦截了出站请求

服务器的防火墙、安全组或者机房的网络策略,可能把587端口的出站请求给拦了,导致Nodemailer无法连接Gmail的SMTP服务器,转而 fallback 到本地?

  • 你可以在服务器上直接执行命令测试连通性:
    telnet smtp.gmail.com 587
    # 或者用curl
    curl smtp://smtp.gmail.com:587
    
    如果执行后显示无法连接,那肯定是网络层面的问题,得找运维开放587端口的出站权限,或者检查服务器的iptables/ufw规则。

可能的原因2:服务器环境里的配置被悄悄覆盖了

你说没改代码,但服务器环境里可能有环境变量、全局配置文件或者框架层面的设置,篡改了Nodemailer的transport配置:

  • 比如有没有在服务器的环境变量里设置了NODE_ENV=production,而对应的生产配置里不小心把邮件服务器改成了localhost?
  • 排查方法:在代码里加一行日志,打印实际运行时的配置:
    console.log('实际使用的邮件配置:', mailer.options);
    
    看看输出的配置是不是和你本地写的完全一致,有没有被替换。

可能的原因3:Gmail的安全策略限制了服务器IP

虽然本地能正常发送,但服务器的IP可能被Gmail判定为“可疑IP”,或者你的账号安全设置没到位:

  • 如果你的Gmail账号开了两步验证,绝对不能用普通密码,必须用Google生成的「应用专用密码(App Password)」;
  • 去Gmail的账号安全中心看看,有没有收到“异常登录”的提醒,把服务器的公网IP加到信任列表里;
  • 另外,Gmail现在默认禁用“不太安全的应用”访问,如果你没开两步验证,得先开启这个选项(不过更推荐用App Password)。

可能的原因4:服务器本地邮件服务的干扰

如果服务器上装了sendmail、postfix这类本地邮件服务,而且服务没正常运行,会不会导致Nodemailer错误地走本地通道?

  • 你可以暂时停止本地的邮件服务,再运行代码试试:
    # 以Ubuntu为例
    sudo systemctl stop postfix
    
    如果停止后能正常发送,说明本地服务干扰了Nodemailer的配置。

临时验证方案:手动指定SMTP参数

你可以把代码里的service: 'gmail'改成手动指定host和port,绕过Nodemailer的自动配置,看看能不能解决问题:

let mailer = {
  from: 'Company',
  options: {
    host: 'smtp.gmail.com',
    port: 587,
    secure: false, // 587用false,465用true
    auth: {
      user: 'example@gmail.com',
      pass: '你的应用专用密码'
    }
  }
}

总结一下:重点先排查服务器的网络连通性和实际运行时的配置,这两个是最常见的问题根源。

内容的提问来源于stack exchange,提问作者npr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:31:36