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

NodeMailer本地正常,部署服务器后OAuth2验证失败(535错误)

解决NodeMailer OAuth2部署服务器后535登录失败问题

代码层面修复

  • 异步获取AccessToken
    OAuth2_client.getAccessToken()是异步方法,直接赋值会得到Promise对象而非有效token,需改用异步处理:
// 调整AccessToken获取逻辑,放在async函数内
const accessTokenResponse = await OAuth2_client.getAccessToken();
const accessToken = accessTokenResponse.token;
  • 修正SMTP配置冲突
    端口587对应secure: false(使用STARTTLS协议),465端口才需要设secure: true,配置错误会导致认证失败:
let transporter = nodemailer.createTransport({
  service: "gmail",
  port: 587,
  secure: false, // 此处修正为false
  auth: {
    type: "OAuth2",
    user: USER,
    clientId: CLIENT_ID_NodeMailer,
    clientSecret: CLIENT_SECRET_NodeMailer,
    refreshToken: REFRESH_TOKEN,
    accessToken: accessToken
  }
});
  • 清理回调与Promise混用问题
    sendMail同时使用async/await和回调函数会导致逻辑混乱,移除回调,统一用Promise处理:
verifyEmail: async function verifyUserEmail(name, userEmail, token) {
  try {
    const info = await transporter.sendMail({
      from: `LinkCollect ${USER}`,
      to: userEmail,
      subject: "邮箱验证",
      text: `HELLO ${name}`,
      html: `<h2>HELLO ${name}</h2>
            <h3>感谢使用我们的服务,请验证您的邮箱</h3>
            <a href="${BACKEND_BASE_URL}/api/v1/user/verify-email?token=${token}">验证账号</a>
          `
    });
    console.log("邮件发送成功:", info);
    transporter.close();
  } catch (error) {
    console.error("邮件发送失败:", error);
  }
}

服务器环境排查

  • 确认环境变量一致性
    检查服务器上的CLIENT_ID_NodeMailer、CLIENT_SECRET_NodeMailer、REFRESH_TOKEN、USER等环境变量,确保和本地测试时完全一致,无拼写错误或值被篡改。

  • Google账号与OAuth配置检查

    • 确保OAuth2客户端ID/密钥来自已发布的OAuth consent screen(测试版仅允许添加指定测试用户,发布后才能面向所有用户)。
    • 若曾使用应用密码,需确认账号已开启两步验证,且应用密码是正确生成的;同时检查Google账号安全日志,确认服务器IP未被拦截,必要时手动允许该IP访问。
  • 服务器网络验证
    确认服务器防火墙/安全组未拦截587端口的出站流量,可通过telnet smtp.gmail.com 587测试连通性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:45:38