使用Nodemailer通过Outlook账号发送邮件时持续出现421 Service not available错误的求助
Nodemailer通过Outlook账号发送邮件时持续出现421 Service not available错误的求助
Hey,我看你折腾这个421错误好一阵了,换端口甚至换Gmail都没解决,咱们来一步步捋清楚问题所在。
首先,这个421 Service not available错误通常和邮件服务器连接配置错误、网络/防火墙拦截,或者过时的安全协议设置有关,先从你的代码配置入手排查:
你的代码里的几个明显问题
- 端口和加密配置不匹配
Outlook/Hotmail的SMTP端口配置是有明确规则的:
- 用
587端口时,secure要设为false(这个端口是通过STARTTLS来升级加密连接的) - 用
465端口时,secure才设为true(SSL加密直连)
你现在用的是port:25+secure:true,25端口大多是明文/STARTTLS模式,而且很多ISP会拦截25端口防垃圾邮件,这大概率是连接失败的核心原因。
过时的SSLv3协议
你设置了tls: { ciphers: "SSLv3" },但SSLv3已经是被淘汰的不安全协议,现代邮件服务器(包括Outlook和Gmail)都会直接拒绝使用SSLv3的连接请求,必须去掉这个配置。参数缺失(次要但影响功能)
你的函数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.EMAIL和process.env.EMAIL_PASSWORD已经正确加载,没有拼写错误或者空值。
备注:内容来源于stack exchange,提问作者CODE101




