Node.js中SMTP+Nodemailer本地正常生产环境无法发件求助
Node.js + Nodemailer 生产环境SMTP连接被拒绝(ECONNREFUSED)排查
我用Node.js结合Nodemailer模块实现用户注册后的验证邮件发送功能,本地localhost测试时代码能正常发件,但部署到生产服务器后完全无法运行。已联系主机服务商确认配置无误,报错信息如下:
{ Error: connect ECONNREFUSED 198.xx.xxx.xxx at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1107:14) errno: 'ECONNREFUSED', code: 'ESOCKET', syscall: 'connect', address: '198.xx.xxx.xxx', port: 465, command: 'CONN' }
附上实现代码:
const sendMsg = async (receiver, title, msg) => { // 定义SMTP服务器配置 var smtpTransport = nodemailer.createTransport({ host: "mail.privateemail.com", secure: true, port: 465, auth: { user: "myxxxxx@company.com", pass: "mypassword" } }); // 定义邮件参数 var mailOptions={ from: "My Company <myxxxxx@company.com>", to : receiver, subject : title, text : "", html : msg } // 发送邮件 var mailSent = await smtpTransport.sendMail(mailOptions) .then((response) => {return true;}) .catch(err => { console.log(err); return false;}); return mailSent };
排查方向和解决方法
检查生产服务器出站端口限制:本地能正常连接但生产环境不行,大概率是服务器防火墙或安全组封禁了465端口的出站请求。即使主机商称配置无误,也可以在生产服务器上执行
telnet mail.privateemail.com 465或nc -zv mail.privateemail.com 465命令验证端口连通性,若不通直接要求服务商开放该端口的出站权限。切换SMTP端口与安全配置:部分服务器对465端口管控严格,可尝试改用587端口并调整安全设置:
var smtpTransport = nodemailer.createTransport({ host: "mail.privateemail.com", secure: false, // 关闭强制SSL port: 587, requireTLS: true, // 自动启动TLS协商 auth: { user: "myxxxxx@company.com", pass: "mypassword" } });移除硬编码的敏感信息:虽然不是直接报错原因,但生产环境把邮箱密码硬编码在代码中存在安全风险,建议改用环境变量存储:
auth: { user: process.env.EMAIL_USER, pass: process.env.EMAIL_PASS }开启调试日志定位问题:在SMTP配置中添加调试参数,获取更详细的连接过程日志,便于精准排查:
var smtpTransport = nodemailer.createTransport({ host: "mail.privateemail.com", secure: true, port: 465, auth: { user: "myxxxxx@company.com", pass: "mypassword" }, debug: true, // 开启调试模式 logger: true // 打印详细日志 });
内容的提问来源于stack exchange,提问作者Vakindu
相关产品推荐
相关产品推荐

