如何通过命令行使用XOAuth2认证Gmail SMTP并解决认证错误?
如何通过命令行使用XOAuth2认证Gmail SMTP发送邮件?
问题描述
已在OAuth同意屏幕中配置桌面客户端,用于测试Gmail API发信功能,但通过命令行使用XOAuth2认证Gmail SMTP时,出现如下错误:
AUTH LOGIN XOAUTH2 334 UGFzc3dvcmQ6 <base64 encoded string> 535-5.7.8 Username and Password not accepted. Learn more at 535 5.7.8 https://support.google.com/mail/?p=BadCredentials u12-20020a170902b28c00b0019c2b1c4db1sm2373754plr.239 - gsmtp
解决方案
1. 修正认证命令格式
Gmail SMTP的XOAuth2认证不需要AUTH LOGIN前缀,正确命令是直接发送AUTH XOAUTH2,后跟Base64编码的认证字符串——错误的命令格式是触发BadCredentials的核心原因之一。
2. 生成合规的XOAuth2认证字符串
认证字符串需遵循固定格式,再做Base64编码:
user=<你的Gmail邮箱地址>\x01auth=Bearer <有效的访问令牌>\x01\x01
- 替换
<你的Gmail邮箱地址>为实际邮箱(如example@gmail.com) - 替换
<有效的访问令牌>为拥有https://mail.google.com/权限的OAuth2访问令牌 - 使用
base64等命令行工具编码上述字符串,得到可用于SMTP认证的编码值
3. 获取符合权限要求的访问令牌
确保你的桌面客户端已申请https://mail.google.com/的API权限范围,并通过OAuth2授权流程获取访问令牌:
- 需引导用户完成登录授权,用授权码兑换访问令牌
- 访问令牌有有效期,过期后需用刷新令牌重新获取
4. 完整命令行SMTP交互示例
# 连接Gmail SMTP服务器 openssl s_client -connect smtp.gmail.com:587 -starttls smtp # 服务器响应后发送EHLO命令 EHLO yourdomain.com # 发起XOAuth2认证 AUTH XOAUTH2 <Base64编码的认证字符串> # 认证成功后发送邮件 MAIL FROM:<sender@gmail.com> RCPT TO:<recipient@gmail.com> DATA Subject: Test Email via XOAUTH2 From: Sender <sender@gmail.com> To: Recipient <recipient@gmail.com> This is a test email sent via Gmail SMTP with XOAUTH2 authentication. . QUIT
5. 常见问题排查
- 确认访问令牌未过期,且权限范围包含
https://mail.google.com/ - 检查Base64编码无额外换行或空格
- 确保OAuth同意屏幕已添加测试用户(测试阶段无需全量发布)
内容的提问来源于stack exchange,提问作者Meraj Hussain
相关产品推荐
相关产品推荐

