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

