You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:07:02