NestJS与Nodemailer生产环境无法发送邮件问题求助
解决NestJS+Nodemailer生产模式下ECONNREFUSED 127.0.0.1:465问题
从错误信息判断,生产环境中你的邮件服务尝试连接本地127.0.0.1的465端口,而非服务商提供的SMTP服务器,这是核心矛盾点。以下是排查和修复步骤:
核对生产环境SMTP配置
确认Nodemailer的transporter配置里,host字段是服务商给出的SMTP地址(如smtp.xxx.com),绝对不能是localhost或127.0.0.1。开发模式正常说明本地配置正确,但生产环境大概率没同步正确的服务器地址。验证环境变量加载逻辑
如果你用环境变量管理配置(比如.env文件),要确保生产环境的配置加载无问题:- 检查生产环境是否存在
.env.prod或系统环境变量已设置正确的SMTP_HOST、SMTP_PORT等参数; - 确认NestJS的ConfigModule在生产模式下能正确读取这些变量,比如是否开启了
isGlobal: true,或者模块导入逻辑无误; - 可以临时在代码中添加日志(如
console.log(process.env.SMTP_HOST)),验证生产环境读取到的SMTP地址是否为服务商地址而非本地。
- 检查生产环境是否存在
确认SMTP加密配置匹配
465端口通常要求启用SSL加密,要保证transporter配置中secure: true。如果服务商指定用587端口(TLS协议),则设置port: 587、secure: false,同时开启requireTLS: true。测试服务器到SMTP服务器的网络连通性
在Ubuntu生产服务器上执行以下命令,测试能否连接服务商的SMTP服务器:telnet smtp.your-provider.com 465(替换为你的服务商SMTP地址)如果连接失败,说明存在网络阻断:
- 确认服务商是否需要将服务器IP加入白名单;
- 执行
nslookup smtp.your-provider.com检查DNS解析是否正常; - 排查服务器托管商的防火墙/安全组是否限制了出站465端口。
统一依赖版本
确保生产环境的Nodemailer版本和开发环境完全一致,避免版本差异导致的配置兼容问题。可以删除node_modules和package-lock.json后重新安装依赖,再编译部署。
内容的提问来源于stack exchange,提问作者Dickson Morales
相关产品推荐
相关产品推荐

