谷歌停用低安全应用访问后如何用Nodemailer对接Gmail发信
问题背景
谷歌已全面停用所有Gmail账号的「Less secure app access(低安全应用访问)」权限,新注册Gmail账号无该权限的开启入口,原有直接使用账号登录密码对接Nodemailer发信的代码会出现鉴权失败问题。
谷歌低安全应用访问停用提示页
最低成本解决方案:2步验证+应用专用密码
该方案不需要大幅改动现有Nodemailer代码,个人Gmail账号可直接配置,稳定性和官方原生账号密码鉴权一致。
配置步骤
- 开启账号2步验证
登录对应Gmail账号,进入谷歌账号管理的「安全性」板块,在「登录Google」分类下找到「2步验证」入口,按照页面指引完成手机号校验、备用验证方式配置,正式开启2步验证。
注意:新注册Gmail账号存在默认风控期,若找不到2步验证入口或开启时报错,先完成手机号、备用邮箱绑定,等待24小时风控解除后再操作即可。 - 生成应用专用密码
2步验证开启成功后,「安全性」板块会显示「应用专用密码」入口(原低安全应用访问的位置)。进入该页面,在应用选择下拉框中选择「其他(自定义名称)」,输入自定义标识例如Nodemailer发信服务后点击生成,页面会弹出16位长度的应用专用密码,第一时间复制保存,关闭弹窗后谷歌不会二次展示该密码。 - 修改Nodemailer配置
原有代码逻辑不需要调整,仅需要把auth.pass字段的原有账号登录密码,替换为刚才生成的16位应用专用密码即可,密码字符串里的空格可以直接删除,不影响鉴权。修正后的可运行代码如下:
const nodemailer = require('nodemailer') let transporter = nodemailer.createTransport({ service: 'gmail', auth: { user: "myemail@gmail.com", // 替换为你的发信Gmail地址 pass: "xxxxxxxxxxxxxxxx", // 替换为你生成的16位应用专用密码,不要填原账号密码 }, }); let mailOptions = { from: 'myemail@gmail.com', // from地址必须和上面auth.user的邮箱完全一致,否则会被拦截 to: "akabir247@gmail.com", subject: `The subject goes here`, html: `The body of the email goes here in HTML`, }; transporter.sendMail(mailOptions, function (err, info) { if (err) { console.log(err) } else { console.log(info) } });
常见问题排查
- 报535鉴权错误:先确认2步验证已经正式生效(部分账号开启后需要等待10-15分钟权限同步),重新生成新的应用专用密码替换旧密码即可,不要使用账号原登录密码
- 发信被拦截:检查
mailOptions.from字段是否和auth.user配置的邮箱完全一致,不要填其他地址作为发件人 - 找不到应用专用密码入口:确认账号不是谷歌Workspace企业账号,企业账号需要管理员在管理后台开启「允许用户使用应用专用密码」的权限后,用户端才会显示对应入口
备选方案(适合复杂业务场景)
如果业务场景不适合开启2步验证,可以改用官方Gmail API配合OAuth2.0鉴权对接Nodemailer,该方案不需要使用密码,安全性更高,但配置流程需要在谷歌云控制台创建项目、申请Gmail发信权限、获取clientId/refreshToken等参数,配置成本远高于应用专用密码方案,个人非商用场景不推荐。
内容的提问来源于stack exchange,提问作者Moon Cake
相关产品推荐
相关产品推荐

