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

Nodemailer对接Google OAuth2发邮件生产环境报504 XOAUTH2不支持错误

排查及解决思路
  • 首先排查网络连通性:本地能正常访问Google服务不代表服务器可以,先在AlmaLinux服务器上执行telnet smtp.gmail.com 465或者nc -zv smtp.gmail.com 465验证是否能正常连通Gmail SMTP服务。如果连接失败,优先解决服务器的国际网络连通问题,可配置代理或使用邮件中转服务。
  • 检查环境变量配置:
    首先注意你的代码存在拼写错误:clientSecret对应的环境变量写的是process.env.GOOGLE_CLIENT_SECRECT,正确拼写应为GOOGLE_CLIENT_SECRET,确认服务器的环境变量键名和代码中的拼写完全一致。此外可在代码中临时打印所有OAuth相关配置的长度(避免明文泄露),确认环境变量被正确加载,没有空值。
  • 统一Nodemailer版本:确认生产环境安装的Nodemailer版本和本地开发环境一致,优先升级到最新版本修复已知兼容性问题,执行命令npm install nodemailer@latest重新安装。
  • 修复系统根证书问题:精简安装的AlmaLinux可能缺失根证书,导致TLS证书验证失败,触发认证机制回退。执行以下命令更新根证书库:
    yum install -y ca-certificates
    update-ca-trust force-enable
    update-ca-trust extract
    
    临时测试可将tls.rejectUnauthorized改为false验证是否是证书问题,但生产环境必须恢复为true,通过更新根证书解决问题。
  • 替换Gmail服务简写为显式SMTP配置:部分环境下service: "gmail"的内置配置解析异常,可替换为显式配置:
    const transporter = nodemailer.createTransport({
      host: "smtp.gmail.com",
      port: 465,
      secure: true,
      auth: {
        type: "OAuth2",
        user: "test@gmail.com", 
        clientId: process.env.GOOGLE_CLIENT_ID,
        clientSecret: process.env.GOOGLE_CLIENT_SECRET, // 修正拼写
        refreshToken: process.env.GOOGLE_REFRESH_TOKEN,
        accessToken: googleToken
      },
      tls: {
        rejectUnauthorized: true
      }
    })
    
  • 排查Google账号权限配置:确认服务器的出口IP没有被Google限制,OAuth同意屏幕的测试用户列表包含目标发件邮箱,Refresh Token没有过期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:06:00