Nodemailer配置Google OAuth时refresh token每7天过期的解决方法
核心原因
你遇到的refresh token7天过期问题和Nodemailer代码逻辑无关,是Google Cloud OAuth应用的配置问题:如果你的OAuth同意屏幕处于测试发布状态,Google会给所有测试用户的授权返回有效期仅7天的refresh token,到期自动失效。
解决步骤
- 第一步:修改OAuth应用发布状态
打开对应OAuth凭据所属的Google Cloud项目,进入「OAuth同意屏幕」配置页,把当前的测试中发布状态切换为生产中并确认。如果你的应用仅个人/内部使用,不需要提交Google的应用审核流程,切换状态后首次授权会弹出未验证应用提示,点选高级-继续授权即可正常使用,功能不受任何限制。 - 第二步:重新申请长期有效的refresh token
状态切换为生产后,之前测试阶段拿到的旧refresh token依然是7天有效期,必须重新走OAuth授权流程获取新token。发起授权请求时必须携带两个参数:access_type=offline:要求Google返回可用于长期刷新访问凭证的refresh tokenprompt=consent:强制弹出授权确认页,避免Google因历史授权记录不返回新的refresh token
授权scope需要包含Gmail邮件发送对应的权限,比如https://mail.google.com/。
- 第三步:优化Nodemailer配置
你现有配置里手动传入accessToken是多余操作,Nodemailer内置的OAuth2逻辑会自动携带refreshToken、clientId、clientSecret向Google接口刷新有效的accessToken,不需要你手动生成、维护短期的accessToken,调整后的配置如下:
const transporter = nodemailer.createTransport({ service: 'gmail', auth: { type: 'OAuth2', user: process.env.GA_MAIL, clientId: process.env.GA_CLIENT_ID, clientSecret: process.env.GA_CLIENT_SECRET, refreshToken: process.env.GA_REFRESH_TOKEN, // 替换为新申请的长期有效refresh token }, });
注意事项:如果后续refresh token意外失效,优先排查两种情况:一是你在Google账号的第三方应用授权管理页手动撤销了该应用的访问权限,二是你修改了对应Google账号的登录密码,这两种操作都会让已签发的refresh token直接作废。
内容的提问来源于stack exchange,提问作者markcalendario
相关产品推荐
相关产品推荐

