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

基于Node.js搭建本地SMTP服务器无法投递邮件至真实邮箱的问题

问题分析与解决方案

你的核心问题是:用smtp-server搭建的本地SMTP服务器仅具备接收邮件的能力,没有配置中继转发逻辑——控制台显示"消息已接收并排队",只说明本地服务器收下了邮件,但不会自动把邮件发送到Gmail这类公网邮箱服务,邮件始终卡在本地队列里。

下面给出两种可行的解决思路:


思路1:给本地SMTP服务器添加中继转发功能

如果你必须保留本地服务器的接收环节,需要在收到邮件后,通过第三方SMTP服务(比如Gmail的SMTP)把邮件转发出去。

步骤与代码示例

  1. 确认你的网络环境允许对外发送邮件:家用宽带通常会封禁25端口,建议改用587端口;同时需要提前在Gmail开启两步验证,并生成应用专用密码(不能用普通登录密码)。
  2. 实现转发逻辑:
const { SMTPServer } = require('smtp-server');
const nodemailer = require('nodemailer');
const { simpleParser } = require('mailparser');

// 配置用于转发的第三方SMTP传输器
const relayTransporter = nodemailer.createTransport({
  host: 'smtp.gmail.com',
  port: 587,
  secure: false,
  auth: {
    user: '你的Gmail邮箱地址',
    pass: '你的Gmail应用专用密码'
  }
});

// 启动本地SMTP服务器
const server = new SMTPServer({
  authOptional: true, // 允许匿名发送到本地服务器,按需调整
  onData(stream, session, callback) {
    // 解析收到的邮件内容
    simpleParser(stream, async (err, parsedMail) => {
      if (err) {
        callback(err);
        return;
      }
      // 转发邮件到目标邮箱
      try {
        await relayTransporter.sendMail({
          from: parsedMail.from.text,
          to: parsedMail.to.text,
          subject: parsedMail.subject,
          text: parsedMail.text,
          html: parsedMail.html
        });
        callback(); // 通知服务器邮件处理完成
      } catch (relayErr) {
        callback(relayErr);
      }
    });
  }
});

server.listen(587); // 改用587端口避免ISP封禁

思路2:直接用Nodemailer连接第三方SMTP服务(更简单)

如果不需要本地接收环节,直接让Nodemailer把邮件发送到Gmail的SMTP服务器,跳过本地服务器,这是大多数场景的最优解。

代码示例

const nodemailer = require('nodemailer');

async function sendEmail() {
  // 配置Gmail的SMTP传输器
  const transporter = nodemailer.createTransport({
    host: 'smtp.gmail.com',
    port: 587,
    secure: false,
    auth: {
      user: '你的Gmail邮箱地址',
      pass: '你的Gmail应用专用密码'
    }
  });

  // 发送邮件
  const sendResult = await transporter.sendMail({
    from: '你的Gmail邮箱地址',
    to: '目标收件邮箱地址',
    subject: '测试邮件',
    text: '这是通过Nodemailer直接发送的测试邮件'
  });

  console.log('邮件已发送,消息ID:', sendResult.messageId);
}

sendEmail().catch(console.error);

额外注意事项

  • 邮件认证问题:即使你修改发件人为真实邮箱,本地服务器没有经过目标邮箱服务商的DKIM/SPF认证,邮件会被直接拦截或归入垃圾箱,必须通过服务商的SMTP接口发送才能确保送达。
  • 端口封禁:国内家用宽带普遍封禁25端口,优先使用587或465端口。
  • 队列处理:smtp-server默认不会自动重试失败的转发任务,若需要可靠的邮件投递,需自己实现队列存储(比如用数据库)和定时重试逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:22:40