如何在Node.js应用中无需LESS SECURED APPS使用Gmail并解决登录报错
解决Nodemailer调用Gmail时的535登录错误(无需启用Less Secure Apps)
核心方案:使用OAuth2认证
Google已逐步淘汰Less Secure Apps支持,OAuth2是当前官方推荐的安全认证方式,具体实现步骤如下:
1. 配置Google Cloud项目与Gmail API
- 登录Google Cloud控制台,创建新项目
- 在API库中搜索并启用「Gmail API」
- 进入「凭据」页面,创建「OAuth客户端ID」,应用类型选择「桌面应用」,设置重定向URI为
http://localhost:3000(或其他本地可访问地址) - 下载客户端配置文件,保存其中的
client_id、client_secret、redirect_uri
2. 获取授权令牌
运行以下临时脚本获取长期有效的refresh_token:
const { google } = require('googleapis'); const OAuth2 = google.auth.OAuth2; const oauth2Client = new OAuth2( '你的CLIENT_ID', '你的CLIENT_SECRET', 'http://localhost:3000' ); // 生成授权URL const authUrl = oauth2Client.generateAuthUrl({ access_type: 'offline', // 确保获取刷新令牌 scope: ['https://mail.google.com/'] // 全Gmail权限,保障发信权限充足 }); console.log('请访问下方URL完成授权:', authUrl); // 访问URL后,复制页面返回的授权码替换下方的CODE const code = '你的授权码'; // 交换获取令牌 oauth2Client.getToken(code, (err, tokens) => { if (err) return console.error('令牌获取失败:', err); console.log('保存以下令牌:', tokens); // 重点保存refresh_token,后续长期使用 });
执行脚本后,访问输出的URL完成账号授权,复制授权码替换代码中的占位符,运行即可得到包含refresh_token的令牌数据。
3. 修改Nodemailer代码适配OAuth2
替换原有createTransport的认证配置,改用OAuth2方式:
const shared = require("./../common/shared"); const config = require("./../config"); const nodemailer = require('nodemailer'); const { google } = require('googleapis'); class Sender { constructor(to, subject, content) { this.userId = shared.formatUserKeyLiteral(to); this.subject = subject; this.to = to; this.content = content; } async SEND(subject) { console.log('EMAIL'); // 初始化OAuth2客户端 const OAuth2 = google.auth.OAuth2; const oauth2Client = new OAuth2( '你的CLIENT_ID', '你的CLIENT_SECRET', 'http://localhost:3000' ); oauth2Client.setCredentials({ refresh_token: '你的REFRESH_TOKEN' }); // 获取临时访问令牌 const accessToken = await oauth2Client.getAccessToken(); const transporter = nodemailer.createTransport({ service: "gmail", host: "smtp.gmail.com", port: 587, secure: false, auth: { type: 'OAuth2', user: "greespiral@gmail.com", clientId: '你的CLIENT_ID', clientSecret: '你的CLIENT_SECRET', refreshToken: '你的REFRESH_TOKEN', accessToken: accessToken.token } }); transporter.verify(function (error, success) { if(error) { console.log("NOT PREPARE EMAIL !!!!" + error); } else { console.log('Server validation done and ready for messages.'); } }); const email = { from: 'greespiral@gmail.com', to: 'zlatnaspirala@gmail.com', subject: 'ROCKET', text: 'Now is the time for all good men to send Email via Node.js!' }; transporter.sendMail(email, function(error, success){ if (error) { console.log('>>>>>>>>>>>>>>>>>>>>' + error); } else { console.log('Nodemailer Email sent: ' + success.response); } }); } } module.exports = (to, subject, content) => { return new Sender(to, subject, content) }
关键注意事项
- 确保你的Google账号已开启两步验证(否则可能无法生成OAuth2令牌)
refresh_token只需获取一次,长期有效,需妥善保管避免泄露- 若仅需发信权限,可将权限范围改为
https://www.googleapis.com/auth/gmail.send,全权限配置稳定性更高
内容的提问来源于stack exchange,提问作者Nikola Lukic
相关产品推荐
相关产品推荐

