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

GMail SMTP XOAUTH2认证异常:已配置对应Scope仍报400错误

问题排查与解决方案

1. 替换占位邮箱为实际授权邮箱

你的代码中auth_token里的USER@gmail.com是占位符,必须替换成你实际进行OAuth授权的邮箱地址。SMTP服务器会验证令牌对应的用户与这里填写的用户是否一致,不替换会直接导致权限匹配失败。

修改后的代码片段:

# 替换成你真实的授权邮箱
auth_token = 'user=your-real-email@gmail.com\x01token=Bearer ' + creds.token + '\x01\x01'

2. 验证Access Token的受众(Audience)是否正确

Gmail SMTP的XOAUTH2认证要求Access Token的aud字段必须为https://mail.google.com/,但默认InstalledAppFlow生成的令牌受众可能是通用Google API端点(比如https://www.googleapis.com/),导致SMTP服务器不认可。

验证方法

解码你的creds.token(用JWT解析工具即可),查看aud字段的值。如果不是https://mail.google.com/,需要调整令牌生成逻辑。

解决办法

生成令牌时指定audience参数:

flow = google_auth_oauthlib.flow.InstalledAppFlow.from_client_secrets_file(
    'credentials.json',
    scopes=['https://mail.google.com/'],
    audience='https://mail.google.com/'
)
creds = flow.run_local_server(port=5000)

如果你的Google Cloud项目处于测试模式,只有添加到测试用户列表的邮箱才能使用生成的令牌。确保你用的授权邮箱已经加入测试用户,或者将项目发布为生产状态(需完成Google官方审核)。

4. 确保使用的是有效Access Token

确认你调用的是creds.token(Access Token)而非creds.id_token(ID Token)。ID Token仅用于身份验证,不具备SMTP操作权限,会触发权限验证失败。

5. 调整SMTP认证调用方式

你当前手动发送AUTH XOAUTH2命令可能存在格式或时机问题,可尝试两种优化方式:

方式一:使用标准login方法

import smtplib

with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp:
    smtp.set_debuglevel(2)
    # 直接传入邮箱和Access Token进行认证
    smtp.login('your-real-email@gmail.com', creds.token)
    smtp.noop()
    smtp.quit()

方式二:修正手动认证的参数传递

避免直接拼接命令字符串,分开传递命令和参数:

with SMTP('smtp.gmail.com', 587) as smtp:
    smtp.set_debuglevel(2)
    smtp.ehlo()
    smtp.starttls()
    # 分开传递命令与参数,避免拼接错误
    smtp.docmd('AUTH XOAUTH2', oauth2token)
    smtp.noop()
    smtp.quit()

内容的提问来源于stack exchange,提问作者Lea Horn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 07:53:28