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 extracttls.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
相关产品推荐
相关产品推荐

