使用Nodemailer发送Gmail时遭遇连接及认证错误求助
Nodemailer发送Gmail邮件报错解决指南
问题与错误分析
你当前的代码存在配置错误,导致出现两个典型问题:
错误1:本地连接被拒绝
Error: connect ECONNREFUSED 127.0.0.1:587 at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1494:16) { errno: -4078, code: 'ESOCKET', syscall: 'connect', address: '127.0.0.1', port: 587, command: 'CONN' }
原因:代码里使用了source: 'gmail'这个无效参数,Nodemailer无法识别Gmail的SMTP配置,默认尝试连接本地SMTP服务器(127.0.0.1:587),而本地未运行SMTP服务,因此连接被拒绝。
错误2:认证失败
修改host为拼写错误的spmt-gmail.com后出现:
Error: Invalid login: 535-5.7.8 Username and Password not accepted. Learn more at 535 5.7.8 https://support.google.com/mail/?p=BadCredentials je10-20020a170903264a00b001bc2831e1a9sm268100plb.90 - gsmtp at SMTPConnection._formatError (C:\Users\anshul\Desktop\full stack expense tracker\node_modules\nodemailer\lib\smtp-connection\index.js:790:19) at SMTPConnection._actionAUTHComplete (C:\Users\anshul\Desktop\full stack expense tracker\node_modules\nodemailer\lib\smtp-connection\index.js:1564:34) at SMTPConnection.<anonymous> (C:\Users\anshul\Desktop\full stack expense tracker\node_modules\nodemailer\lib\smtp-connection\index.js:546:26) at SMTPConnection._processResponse (C:\Users\anshul\Desktop\full stack expense tracker\node_modules\nodemailer\lib\smtp-connection\index.js:969:20) at SMTPConnection._onData (C:\Users\anshul\Desktop\full stack expense tracker\node_modules\nodemailer\lib\smtp-connection\index.js:755:14) at SMTPConnection._onSocketData (C:\Users\anshul\Desktop\full stack expense tracker\node_modules\nodemailer\lib\smtp-connection\index.js:193:44) at TLSSocket.emit (node:events:513:28) at addChunk (node:internal/streams/readable:324:12) at readableAddChunk (node:internal/streams/readable:297:9) at Readable.push (node:internal/streams/readable:234:10) at TLSWrap.onStreamRead (node:internal/stream_base_commons:190:23) { code: 'EAUTH', response: '535-5.7.8 Username and Password not accepted. Learn more at\n' + '535 5.7.8 https://support.google.com/mail/?p=BadCredentials je10-20020a170903264a00b001bc2831e1a9sm268100plb.90 - gsmtp', responseCode: 535, command: 'AUTH PLAIN' }
原因:1. SMTP地址拼写错误(正确应为smtp.gmail.com而非spmt-gmail.com);2. 可能存在应用密码配置或环境变量加载异常。
分步解决方案
1. 修正Nodemailer的Gmail配置
替换无效的source参数,改用正确的配置方式:
方式一:使用预设Gmail服务(推荐)
Nodemailer内置了Gmail的SMTP配置,直接使用service: 'gmail'即可:
const transporter = nodemailer.createTransport({ service: 'gmail', // 替换source为service auth: { user: process.env.EMAIL, pass: process.env.EMAIL_PASSWORD } });
方式二:手动配置SMTP参数
如果需要自定义配置,手动指定正确的SMTP地址、端口和安全设置:
const transporter = nodemailer.createTransport({ host: 'smtp.gmail.com', // 正确的Gmail SMTP服务器地址 port: 587, secure: false, // 587端口用TLS,设为false;若用465端口则设为true auth: { user: process.env.EMAIL, pass: process.env.EMAIL_PASSWORD } });
2. 确保应用密码与环境变量正确
- 验证应用密码有效性:
- 你的Google账号必须开启两步验证才能生成应用密码
- 应用密码是Google生成的16位字符串,不是你的账号登录密码,确认复制时无空格或遗漏
- 检查环境变量:
- 在代码中临时添加
console.log(process.env.EMAIL, process.env.EMAIL_PASSWORD),确认变量值是否正确加载 - 确保环境变量文件(如
.env)路径正确,且已通过dotenv等工具加载
- 在代码中临时添加
最终可运行代码示例
const transporter = nodemailer.createTransport({ service: 'gmail', auth: { user: process.env.EMAIL, pass: process.env.EMAIL_PASSWORD } }); const mailoptions = { from: `Anshul kumar <${process.env.EMAIL}>`, to: Email, subject: "重置你的密码", text: "你好,欢迎使用", html: `<a href="http://localhost:5000/password/resetpassword/${newid}">点击此链接重置你的密码</a>`, }; transporter.sendMail(mailoptions, (error, info) => { if (error) { console.error(error); res.status(500).json({ message: "无法发送邮件", success: false }); } else { res.status(200).json({ message: "邮件发送成功", success: true }); } });
内容的提问来源于stack exchange,提问作者ANSHUL KUMAR
相关产品推荐
相关产品推荐

