Node.js Express中使用Nodemailer发Gmail邮件报535认证错误
Nodemailer对接Gmail SMTP报535认证错误解决方案
问题成因
触发这个报错有三个直接原因:
- 旧版谷歌账号「低安全性应用访问权限」入口2022年已全量下线,直接使用账号登录密码做SMTP认证的方案完全失效
- 代码中SMTP认证的
user字段未填写完整邮箱地址,仅写了邮箱前缀 - 发信配置中
from字段直接使用表单提交的用户邮箱,触发Gmail发件人身份校验拦截,Gmail不允许使用未完成认证的第三方邮箱作为发件人
操作步骤
- 开启谷歌账号两步验证
进入谷歌账号安全设置页,找到「两步验证」选项,按照提示完成手机号或身份验证器绑定,必须先开启两步验证才能生成后续需要的应用专用密码。 - 生成应用专用密码
两步验证开启成功后,在同一安全设置页找到「应用专用密码」入口,应用类型选择「邮件」,设备选择当前使用的开发设备,点击生成后会得到一串16位长度的随机密码,复制保存好,这个密码只会展示一次。 - 修正SMTP传输器配置
替换原有transporter配置,注意user填写完整邮箱地址,pass填写刚才生成的16位应用专用密码,不要填原账号登录密码:
const transporter = nodemailer.createTransport({ service: 'gmail', auth: { user: 'tr8622043@gmail.com', pass: '你复制的16位应用专用密码' } });
- 修正发件人配置
from字段必须和SMTP认证用的邮箱保持一致,用户提交的联系邮箱可以放到replyTo字段,不影响后续直接回复用户邮件,修正后的mailOptions参考:
const mailOptions = { from: 'tr8622043@gmail.com', replyTo: req.body.email, to: 'tr8622043@gmail.com', subject: `Message from ${req.body.email} : ${req.body.subject} `, text: req.body.message }
避坑提示
- 本地开发环境如果挂了网络代理,需要额外给transporter配置代理参数,否则会出现SMTP连接超时问题
- 应用专用密码如果遗失不需要找回,直接在谷歌账号安全页删除旧的应用密码,重新生成新的即可
- 不要把邮箱地址、应用专用密码硬编码在业务代码中,建议存到环境变量里,避免提交到代码仓库造成凭证泄露
内容的提问来源于stack exchange,提问作者Trisha
相关产品推荐
相关产品推荐

