如何在Node.js中使用Nodemailer通过Gmail发送邮件
问题原因
Google已正式下线Gmail账户中「允许低安全性应用访问」的配置开关,直接使用账号登录明文密码通过Nodemailer调用Gmail SMTP发信的请求,会被安全系统判定为低安全性应用访问直接拦截,这是现有代码无法正常发信的核心原因。
解决步骤
- 开启Gmail账户两步验证
这是生成应用专用密码的强制前置条件。注意:没有开启两步验证的账号,安全设置页不会展示应用专用密码的生成选项,不要浪费时间在未开两步验证的账号里找对应入口。直接进入Gmail账户的安全设置页,按照页面引导完成手机校验等步骤即可开启。 - 生成应用专用密码
两步验证开启完成后,在同一安全设置页找到「应用专用密码」配置项,应用类型选择「邮件」,设备选项选择当前运行Node.js服务的对应设备,确认后会生成一串16位长度的授权密码,这串密码仅用于第三方邮件客户端登录,不会替代你的账号原登录密码。 - 调整代码配置
将Nodemailer配置中auth字段下的pass值,替换为上一步生成的16位应用专用密码即可,其余配置无需改动,调整后的参考代码如下:
const nodemailer = require('nodemailer'); let mailTransporter = nodemailer.createTransport({ service: 'gmail', auth: { user: 'xyz@gmail.com', // 这里替换为你生成的16位应用专用密码,不要填原账号登录密码 pass: '你的16位应用专用密码' } }); let mailDetails = { from: 'xyz@gmail.com', to: 'abc@gmail.com', subject: 'Test mail', text: 'Node.js testing mail for GeeksforGeeks' }; mailTransporter.sendMail(mailDetails, function(err, data) { if(err) { // 建议打印完整err信息方便定位具体问题 console.log('Error Occurs', err); } else { console.log('Email sent successfully'); } });
常见问题排查
- 替换密码后仍报鉴权错误:先确认生成应用专用密码时选择的应用类型为「邮件」,类型选错会导致鉴权失败;同时检查复制的16位密码是否带有前后空格、漏写字符。
- 报网络连接超时:先确认当前运行环境可以正常连通Gmail的SMTP服务,国内网络环境下经常会出现跨境网络拦截导致连接失败的问题。
- 短时间发信后被拦截:Gmail对个人账号的SMTP发信有频率限制,短时间发送大量邮件会触发临时风控,暂停发信等待1小时左右即可恢复。
内容的提问来源于stack exchange,提问作者codeVibek
相关产品推荐
相关产品推荐

