You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 12:45:01