You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Nodemailer通过Outlook账号发送邮件时持续出现421 Service not available错误的求助

Nodemailer通过Outlook账号发送邮件时持续出现421 Service not available错误的求助

Hey,我看你折腾这个421错误好一阵了,换端口甚至换Gmail都没解决,咱们来一步步捋清楚问题所在。

首先,这个421 Service not available错误通常和邮件服务器连接配置错误网络/防火墙拦截,或者过时的安全协议设置有关,先从你的代码配置入手排查:

你的代码里的几个明显问题

  1. 端口和加密配置不匹配
    Outlook/Hotmail的SMTP端口配置是有明确规则的:
  • 587端口时,secure要设为false(这个端口是通过STARTTLS来升级加密连接的)
  • 465端口时,secure才设为true(SSL加密直连)
    你现在用的是port:25+secure:true,25端口大多是明文/STARTTLS模式,而且很多ISP会拦截25端口防垃圾邮件,这大概率是连接失败的核心原因。
  1. 过时的SSLv3协议
    你设置了tls: { ciphers: "SSLv3" },但SSLv3已经是被淘汰的不安全协议,现代邮件服务器(包括Outlook和Gmail)都会直接拒绝使用SSLv3的连接请求,必须去掉这个配置。

  2. 参数缺失(次要但影响功能)
    你的函数OTP()里没有接收email参数,但sendMail里用到了to: email,这会导致后续发送时出现变量未定义的错误,得把参数补上。

修正后的代码示例

const nodemailer = require("nodemailer");

// 补上email参数,确保收件人地址能正确传入
module.exports = function OTP(email) {
  // Sends otp link and code to user
  return new Promise((resolve, reject) => {
    const transporter = nodemailer.createTransport({
      service: "hotmail",
      port: 587, // Outlook官方推荐的SMTP端口
      secure: false, // 587端口用STARTTLS,所以secure设为false
      auth: {
        user: process.env.EMAIL, // Outlook邮箱地址
        pass: process.env.EMAIL_PASSWORD, // 邮箱密码/应用专用密码(如果开了两步验证)
      },
      tls: {
        rejectUnauthorized: false, // 本地测试时可临时开启,生产环境建议关闭(确保证书合法)
        // 移除SSLv3的配置,使用默认的现代加密套件
      },
    });

    transporter.sendMail(
      {
        from: process.env.EMAIL,
        to: email,
        subject: "Test",
        text: "这里填写你的OTP内容",
      },
      (err, info) => {
        if (err) {
          console.log(err);
          return reject({ message: "An error has occurred" });
        } else return resolve({ message: "Email sent" });
      }
    );
  });
};

额外排查步骤

如果修正代码后还是报错,试试下面的方法:

  • 检查Outlook账号权限:如果你的账号开启了两步验证,必须使用应用专用密码(App Password)代替原密码登录;如果没开两步验证,确保账号允许SMTP客户端访问(Outlook默认是允许的,但可以去账号设置里确认)。
  • 排查网络问题:很多公司内网、校园网或者ISP会拦截SMTP端口(587/465),试试切换到手机热点网络测试,排除网络拦截的可能。
  • Gmail的额外配置:如果换Gmail测试,同样需要开启两步验证后用应用专用密码,或者在Google账号设置里临时开启“不太安全的应用访问”(不推荐长期使用,建议用OAuth2认证更安全)。
  • 验证环境变量:确认process.env.EMAILprocess.env.EMAIL_PASSWORD已经正确加载,没有拼写错误或者空值。

备注:内容来源于stack exchange,提问作者CODE101

火山引擎 最新活动