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

如何在Nodemailer的createTransport中配置多主机及对应端口?

Nodemailer配置多邮件服务器的实现方案

嘿,我来帮你搞定这个问题~首先明确说:Nodemailer的单个createTransport调用里的transport对象,是不支持直接配置多个主机和对应端口的,因为它的设计逻辑是每个Transporter实例对应一套独立的邮件服务器配置。不过要实现多邮件服务器的需求,有两种很实用的方案:

方案一:创建多个Transporter实例

直接为每个邮件服务器单独创建Transporter实例,之后根据你的业务需求(比如轮询、指定发送、故障切换)选择对应的实例发送邮件。

示例代码:

// 先定义好所有邮件服务器的配置列表
const serverConfigs = [
  { host: "devint.test.com", port: 22, auth: { user: "test", pass: "test" } },
  { host: "prod.test.com", port: 25, auth: { user: "prod-user", pass: "prod-pass" } },
  { host: "backup.test.com", port: 465, auth: { user: "backup-user", pass: "backup-pass" } }
];

// 批量创建Transporter实例
const transporters = serverConfigs.map(config => nodemailer.createTransport(config));

使用的时候,比如想轮询发送,可以维护一个索引变量,每次发送时切换到下一个实例:

let currentIndex = 0;

async function sendWithRoundRobin(mailOptions) {
  try {
    await transporters[currentIndex].sendMail(mailOptions);
    console.log(`邮件通过 ${serverConfigs[currentIndex].host} 发送成功`);
  } catch (err) {
    console.error(`当前服务器发送失败,尝试下一个:`, err);
    // 切换到下一个索引,超出长度就回到0
    currentIndex = (currentIndex + 1) % transporters.length;
    // 递归重试(也可以根据需求调整重试逻辑)
    return sendWithRoundRobin(mailOptions);
  }
}

方案二:自定义故障切换逻辑

封装一个发送函数,当当前邮件服务器发送失败时,自动尝试下一个服务器,直到找到可用的或者全部失败。

示例代码:

async function sendEmailWithFallback(mailOptions) {
  // 定义所有邮件服务器配置
  const serverConfigs = [
    { host: "devint.test.com", port: 22, auth: { user: "test", pass: "test" } },
    { host: "backup.test.com", port: 25, auth: { user: "backup-user", pass: "backup-pass" } }
  ];

  // 遍历每个配置尝试发送
  for (const config of serverConfigs) {
    try {
      const transporter = nodemailer.createTransport(config);
      // 验证服务器连接(可选,提前确认可用性)
      await transporter.verify();
      // 发送邮件
      await transporter.sendMail(mailOptions);
      console.log(`邮件通过服务器 ${config.host} 发送成功`);
      return true;
    } catch (error) {
      console.error(`服务器 ${config.host} 不可用,尝试下一个:`, error.message);
    }
  }

  // 所有服务器都失败的情况
  console.error("所有邮件服务器均无法完成发送");
  return false;
}

// 调用示例
sendEmailWithFallback({
  from: 'your@example.com',
  to: 'recipient@example.com',
  subject: '多服务器测试邮件',
  text: '这是一封通过故障切换逻辑发送的邮件'
});

如果追求性能,也可以提前初始化好所有Transporter实例,避免每次发送时重复创建,逻辑和方案一类似,只是把创建实例的步骤提前即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:43:46