亚马逊EC2上的Node.js应用发送邮件报ETIMEDOUT连接超时错误
你遇到的ETIMEDOUT CONN错误是SMTP连接建立阶段超时,本地运行正常、代码此前在EC2也可正常运行,可直接排除代码逻辑和配置本身的正确性问题,按以下优先级排查即可:
1. 先验证EC2实例出口网络连通性
登录你的EC2实例,直接用系统命令测试到SMTP服务器465端口的连通性,确认网络层面是否能通:
# 用telnet测试 telnet <你的SMTP服务器域名/IP> 465 # 或用nc测试 nc -zv <你的SMTP服务器域名/IP> 465
如果命令执行后提示连接超时/失败,说明是EC2层面的网络拦截,和业务代码无关。
2. 检查EC2安全组出站规则
确认你的EC2实例关联的安全组出站规则开放了TCP 465端口的访问权限:要么允许到所有地址(0.0.0.0/0)的465端口流量,要么明确允许到你所用SMTP服务器IP的465端口流量。安全组规则被误改是这类问题的常见诱因。
3. 排查AWS EC2邮件端口默认限制
AWS默认会限制EC2实例对公网25、465、587这类常用邮件端口的出站流量,用于防范垃圾邮件风险。如果之前运行正常突然被限制,大概率是你的EC2公网IP被AWS判定存在异常发信行为,触发了端口封禁。
你可以直接提交AWS工单申请解除对应EC2实例的邮件端口限制,申请时说明你的合法发信场景,一般1-2个工作日即可生效。
4. 确认SMTP服务商侧的IP封禁
你所用的邮件服务提供商也有可能把你的EC2公网IP加入了黑名单,触发原因包括短时间发信量超过阈值、该IP此前有不良发信记录等。你可以联系邮件服务商确认你的EC2公网IP是否在封禁列表中,是的话走官方解封流程即可。
5. 临时验证方案
你可以先将发信端口切换为587(需你的SMTP服务商支持),同时调整nodemailer配置为标准写法,测试是否能连通:
let transporter = nodemailer.createTransport({ host: mailConfig.host, port: 587, secure: false, // 587端口对应false,使用STARTTLS加密 auth: { user: mailConfig.user, pass: mailConfig.pass }, tls: { rejectUnauthorized: false } });
注:你原配置中的secure: "SSL/TLS"写法不规范,nodemailer的secure参数仅接收布尔值,465端口对应secure: true,该写法虽然部分版本兼容,但建议改为标准写法避免潜在问题。
内容的提问来源于stack exchange,提问作者Adison Candido

