使用Nodemailer通过SMTP发邮件提示连接超时该如何排查?
问题原因及解决方案
- 端口封禁问题:这是最常见的触发原因。绝大多数家用网络运营商、云服务厂商默认会封禁25端口的出站连接,用来遏制垃圾邮件发送。第三方测试站点可以正常使用,是因为其服务器网络没有对25端口做出站限制,而你本地运行代码的设备、或者部署代码的服务器所处的网络封禁了25端口,导致连接超时。
- 异步逻辑问题:你的代码使用了async函数包裹逻辑,但
transporter.verify和transporter.sendMail都采用了回调写法,没有做异步等待,极端情况下会出现函数提前退出、请求逻辑还未完成的问题,建议改成async/await写法更稳妥。 - 配置冗余问题:你的传输器配置中重复定义了两次
pool: true,虽然不会直接触发连接失败,但建议删除重复配置避免未知异常。 - TLS匹配问题:部分SMTP服务器在25端口下要求强制开启STARTTLS加密升级,你可以补充TLS相关配置适配服务器要求,测试阶段可以先添加
tls: {rejectUnauthorized: false}跳过证书校验排查问题,生产环境请替换为合法证书校验配置。
修复后参考代码
const nodemailer = require("nodemailer"); async function main() { let transporter = nodemailer.createTransport({ host: '213.55.96.132', port: 25, auth: { user: "user@ethionet.et", pass: "drafgthsjaid321##" }, pool: true, logger: true, debug: true, secure: false, // 新增TLS配置适配服务器要求 tls: { rejectUnauthorized: false } }) // 改成await写法统一处理异步逻辑 try { await transporter.verify(); console.log('Server is ready to take our messages'); let mailOptions = { from: "user@ethionet.et", to: ["someemail@gmail.com"], subject: 'Test email', text: `Hello world` }; await transporter.sendMail(mailOptions); console.log("Email sent successfully"); } catch (err) { console.log("Error: ", err); } } main().catch(console.error);
排查建议
如果修改代码后仍然超时,可以尝试更换SMTP端口为服务商提供的替代端口(比如587、465),同时调整secure配置:465端口设secure: true,587端口保持secure: false即可。如果还是连接失败,直接联系你的网络服务商确认是否开放25端口的出站权限。
内容的提问来源于stack exchange,提问作者m.prime
相关产品推荐
相关产品推荐

