使用Nodemailer搭配Google应用密码发送邮件时遇连接超时问题
解决Nodemailer连接Gmail SMTP超时问题
针对你遇到的连接超时(ETIMEDOUT)问题,以下是排查和解决步骤:
1. 修正SMTP端口与加密参数的匹配错误
你第二个代码示例中存在配置矛盾:端口587需要使用secure: false(通过STARTTLS启用加密),而端口465才对应secure: true。错误的参数组合会直接导致连接失败。
修正后的手动配置代码:
const transporter = nodemailer.createTransport({ host: "smtp.gmail.com", port: 587, secure: false, // 587端口必须设为false auth: { user: process.env.GOOGLE_EMAIL, pass: process.env.GOOGLE_APP_PASSWORD }, // 可选:增加超时时间应对网络延迟 connectionTimeout: 10000, greetingTimeout: 10000 }); const mailOptions = { from: process.env.GOOGLE_EMAIL, to: "user@gmail.com", subject: 'Test Email', html: "<h1>Email is sent</h1>" }; transporter.sendMail(mailOptions, function (error, info) { if (error) { console.log(error); } else { console.log('Email sent: ' + info.response); } });
2. 验证服务器网络连通性
- 检查服务器防火墙、安全组是否放行587或465端口
- 在服务器上执行命令测试连通性:
如果无法连通,需要联系服务器提供商开放对应端口,或确认是否存在网络代理/IP封禁问题。telnet smtp.gmail.com 587 # 或用nc命令 nc -zv smtp.gmail.com 587
3. 确认Google应用密码有效性
- 确保你的Google账号已开启两步验证,未开启的话无法使用应用密码
- 重新生成应用密码时,选择「邮件」作为应用类型,复制密码时不要包含空格
- 检查环境变量
GOOGLE_APP_PASSWORD是否正确设置,没有拼写错误或多余字符
4. 优先使用Nodemailer内置的Gmail配置
你最初的代码使用service: 'gmail'是更可靠的方式,Nodemailer会自动处理正确的端口和加密参数,建议优先复用这个配置:
const transporter = nodemailer.createTransport({ service: 'gmail', auth: { user: process.env.GOOGLE_EMAIL, pass: process.env.GOOGLE_APP_PASSWORD }, connectionTimeout: 10000, greetingTimeout: 10000 });
内容的提问来源于stack exchange,提问作者brandon.c
相关产品推荐
相关产品推荐

