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

NodeMailer连续2-3次调用返回421错误无法发送邮件如何解决?

问题原因

你接口返回的421是自定义错误码,实际SMTP服务商smtps.aruba.it返回的是550错误,明确说明你的IP连接被临时拒绝,结合代码和复现规律,具体原因有两个:

  1. 异步逻辑时序错误:transporter.sendMail是异步方法,你在调用该方法后同步执行了transporter.close(),不等邮件发送流程完成就强制断开连接,连续请求会产生大量异常断开的无效连接,触发SMTP服务端的临时限流封禁规则。
  2. 连接管理不当:如果你是在每次接口请求时都重新初始化transporter实例,短时间内发起多次请求会创建大量新的SMTP连接,超出Aruba SMTP服务的单IP短时间连接数限制,直接被服务端临时拒绝。
解决方案

你可以按照以下优先级修改代码调整逻辑:

  • 调整transporter.close()的执行时机,将其移动到sendMail的回调函数末尾,确保邮件发送流程完成后再释放连接:
transporter.sendMail(mailOptions, function (err, data) {
  if (err) {
    res.json({
      errorCode: 421,
      erroText: "Error occurs",
      error: err,
    });
  } else {
    res.json({
      errorCode: 200,
      status: "Appointment Created!",
    });
  }
  // 回调最后再关闭连接
  transporter.close();
});
  • 全局复用transporter实例,不用每次接口请求都重新创建。Nodemailer的transporter内置连接池能力,全局初始化一次即可自动管理连接复用,大幅减少新建连接的频次:
// 项目启动时全局初始化一次即可,不要放到接口处理逻辑里
const transporter = nodemailer.createTransport({
  pool: true, // 开启连接池
  maxConnections: 2, // 限制最大并发连接数,适配Aruba SMTP限制
  maxMessages: 10, // 单连接最多发送10封邮件后自动重建
  host: "smtps.aruba.it",
  logger: true,
  debug: true,
  secure: true,
  port: 465,
  auth: {
    user: "xxx@xxxxx.it",
    pass: "xxxxx",
  },
  tls: {
    minVersion: "TLSv1",
    ciphers: "HIGH:MEDIUM:!aNULL:!eNULL:@STRENGTH:!DH:!kEDH",
  },
});
  • 添加临时错误重试逻辑,针对550临时拒绝、EENVELOPE这类非致命错误,增加指数退避重试机制,重试2-3次后再返回错误,覆盖临时限流场景。
  • 如果业务发件量较大,确认Aruba SMTP的发件频率限制(默认一般为每分钟不超过10封,单日不超过1000封),超出限制可以申请提额,或者配置多个发件账号轮询发送。

内容的提问来源于stack exchange,提问作者joisberg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:06:03