使用Nodemailer调用Gmail SMTP发送邮件时遭遇连接超时错误(connect ETIMEDOUT)求助
Nodemailer调用Gmail SMTP发送邮件时遭遇连接超时错误(connect ETIMEDOUT)求助
遇到这种连接超时的问题真的挺闹心的,我之前也碰到过类似情况,结合你提供的代码和配置,给你几个实用的排查和解决方向:
检查环境变量的类型转换
你代码里直接使用process.env.SMTP_PORT,但环境变量默认是字符串类型,而Nodemailer的port参数需要数字类型。如果端口被解析成字符串,可能会导致连接异常。建议修改为:port: Number(process.env.SMTP_PORT),排查网络与防火墙限制
连接超时(ETIMEDOUT)绝大多数是网络层面的问题:- 先在终端用
telnet smtp.gmail.com 587测试端口连通性,如果连不上,说明你的机器/服务器的防火墙拦截了587端口,或者ISP屏蔽了Gmail的SMTP服务。可以尝试换网络环境(比如手机热点),或者联系运维开放对应端口。 - 也有可能是DNS解析问题,试试直接用Gmail SMTP的IP地址替换
smtp.gmail.com(可以通过nslookup smtp.gmail.com获取)。
- 先在终端用
添加调试与TLS配置
开启Nodemailer的调试模式,同时临时关闭TLS证书验证(仅用于排查,生产环境不建议),能帮你定位具体的连接问题:const transporter = nodemailer.createTransport({ host: process.env.SMTP_HOST, port: Number(process.env.SMTP_PORT), secure: false, debug: true, // 开启调试模式,查看完整连接日志 tls: { rejectUnauthorized: false // 临时关闭证书验证,排查是否是证书问题 }, auth: { user: process.env.SMTP_MAIL, pass: process.env.SMTP_PASSWORD, }, });运行后查看控制台的调试日志,就能知道是DNS解析失败、TCP握手超时还是其他环节出了问题。
再次确认应用密码的有效性
虽然你已经使用了应用密码,但再仔细核对几点:- 应用密码是在开启Google账号2FA之后生成的,未开启2FA无法生成有效应用密码。
- 生成应用密码时,选择的应用类型是「邮件」,而不是其他类型(选「其他」也可以,但要确保生成过程正确)。
- 检查Google账号是否有异常登录记录,或者被限制了第三方邮件客户端的访问。
尝试切换SMTP端口
如果587端口一直无法连通,可以试试Gmail的465端口,对应的配置要修改secure为true:const transporter = nodemailer.createTransport({ host: process.env.SMTP_HOST, port: 465, secure: true, auth: { user: process.env.SMTP_MAIL, pass: process.env.SMTP_PASSWORD, }, });
另外,你的/sendEmail接口里没有给客户端返回响应,建议在回调里补充:
transporter.sendMail(mailOptions, function (error, info) { if (error) { console.log(error); res.status(500).json({ success: false, message: "邮件发送失败" }); } else { console.log("Email sent successfully!"); res.status(200).json({ success: true, message: "邮件发送成功" }); } });
备注:内容来源于stack exchange,提问作者Talha Zahid
相关产品推荐
相关产品推荐

