Node.js本地可正常发邮件,后端部署时遇535邮箱密码验证失败
问题:本地可正常发邮件,部署到服务器后出现535-5.7.8认证失败错误
我的Node.js代码在localhost环境能正常发送邮件,但部署到后端服务器时,弹出「535-5.7.8 Username and Password not accepted」错误,提示邮箱和密码无效。相关代码如下:
const nodemailer = require("nodemailer"); const sendEmail = async (subject, message, send_to, sent_from, reply_to) => { // Create Email Transporter const transporter = nodemailer.createTransport({ host: process.env.EMAIL_HOST, port: 465, secure: true, auth: { user: process.env.EMAIL_USER, pass: process.env.EMAIL_PASS, }, }); // Options for sending email const options = { from: sent_from, to: send_to, reply_to: reply_to, subject: subject, html: message, }; // Check email sent successfully or not transporter.sendMail(options, function (err, info) { if (err) { console.log(err); } else { console.log(info); } }); }; module.exports = sendEmail;
解决方案
检查服务器环境变量配置
本地的.env文件已经配好EMAIL_USER和EMAIL_PASS,但部署到服务器后,必须确认服务器上的环境变量是正确设置的——没有拼写错误、多余空格,密码要用原始明文(别填加密后的)。可以临时在代码里打印这两个变量的值,确认没问题后再删掉打印代码。开启邮箱第三方应用权限
大部分邮箱服务商(比如Gmail、QQ邮箱、163邮箱)默认会拒绝非官方客户端的登录请求,得手动开启「POP3/SMTP服务」,并且用专用授权码代替登录密码:- Gmail:先开启两步验证,再生成应用专用密码;别用已淘汰的“不太安全的应用访问”选项。
- QQ/163邮箱:在邮箱设置里开启SMTP服务,获取授权码,把
EMAIL_PASS的值换成这个授权码。
排查服务器IP是否被拉黑
有些服务器的IP可能被邮箱服务商归到了垃圾IP池,导致认证失败。可以试试换服务器IP,或者联系邮箱服务商申诉解除限制;也可以直接改用SendGrid、Mailgun这类第三方邮件服务,跳过个人邮箱SMTP的限制。核对SMTP配置参数
确认服务器上的EMAIL_HOST是否正确,比如Gmail是smtp.gmail.com,QQ邮箱是smtp.qq.com。你代码里用的端口465搭配secure: true是对的,不用改。优化代码的错误捕获逻辑
你的函数声明是async,但sendMail用的是回调函数,改成await方式能更清晰地捕获错误,方便排查问题:
try { const info = await transporter.sendMail(options); console.log(info); } catch (err) { console.error(err); }
内容的提问来源于stack exchange,提问作者SUBASISH MULA
相关产品推荐
相关产品推荐

