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

PassportJS验证后Nodemailer切换Gmail账号发信报535错误如何解决

问题原因

核心原因是你当前的配置共用了同一个Refresh Token,OAuth2认证体系下Refresh Token是和单个Google账号绑定的,不能跨账号使用:

  • 你代码里写死的refreshToken是你在Google Cloud控制台配置的首个Gmail账号的专属凭证,用这个凭证给其他账号做发信认证必然会被校验拒绝
  • 额外可能的诱因:你的PassportJS授权配置没有包含Gmail发信所需的权限范围,或者测试用户未完成有效授权
排查解决步骤
  • 调整PassportJS OAuth授权的权限配置
    配置Google OAuth策略时,必须添加Gmail发信对应的权限范围,确保用户授权时同意你调用其账号的发信能力,必要权限范围为https://www.googleapis.com/auth/gmail.send。
  • 存储每个用户独立的授权凭证
    用户通过PassportJS完成Google授权登录时,Google会返回对应用户专属的accessToken和refreshToken,你需要将这两个凭证和用户账号绑定存储到你的数据库中,不要使用全局固定的Refresh Token。
  • 修改Nodemailer的认证配置
    发信时从数据库取出当前登录用户自己的Refresh Token填入配置,修改后的认证配置参考如下:
const auth = {
  type: 'oauth2',
  user: req.user.email,
  clientId: clientId,
  clientSecret: clientSecret,
  refreshToken: req.user.refreshToken, // 替换为当前用户专属的Refresh Token
  accessToken: req.user.accessToken // 补充用户的Access Token,Nodemailer会自动处理过期刷新
};
  • 验证授权状态
    如果修改后仍然报错,先确认测试用户确实已添加到Google Cloud控制台OAuth同意屏幕的测试用户列表中,再确认用户授权时没有取消Gmail相关的权限。
  • 上线适配
    如果你的应用需要对外提供服务,将OAuth同意屏幕从测试模式切换为发布模式即可,测试模式下仅列表内的用户可以授权,且授权凭证有效期仅为7天。

内容的提问来源于stack exchange,提问作者nessyou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:15:02