使用gmail.send和gmail.readonly OAuth2.0 scope发送Gmail遇认证错误
使用Limilabs Mail.dll OAuth2.0调用Gmail SMTP发送邮件,切换细粒度Scope后出现认证错误
问题描述
使用Limilabs Mail.dll的LoginOAUTH2方法操作Gmail已有2年,此前采用mail.google.com全局Scope获取令牌,一切正常。因谷歌审核要求,改用仅满足收发需求的gmail.send和gmail.readonly Scope,已成功获取令牌,但调用SMTP发送邮件时出现「Username and Password not accepted」认证错误,相同代码搭配原Scope仍可正常运行。
相关代码片段:
// server="smtp.gmail.com", token 为OAuth2返回的令牌 public Smtp NewConnection(string server, string token, string useremail, string serviceProvider) { var smtp = new Smtp(); smtp.ConnectSSL(server); smtp.LoginOAUTH2(useremail, token); return smtp; }
解决方案
1. 验证令牌的Scope与受众(Audience)
使用本地JWT解析工具查看令牌内容:
- 确认
scope字段包含完整URI格式的https://www.googleapis.com/auth/gmail.send(避免使用简写的gmail.send) - 确认
aud字段值为https://mail.google.com/——Gmail SMTP服务要求令牌的受众必须指向自身,若令牌受众为Gmail API端点,则无法通过SMTP认证。
2. 规范OAuth2授权流程的Scope参数
在获取授权码/令牌的请求中,直接传递完整URI格式的Scope参数:
https://www.googleapis.com/auth/gmail.send https://www.googleapis.com/auth/gmail.readonly
避免依赖客户端自动转换简写Scope,减少歧义。
3. 升级Limilabs Mail.dll到最新版本
旧版本Mail.dll可能对细粒度Gmail Scope的支持不完善,升级后重新测试认证流程。
4. 确认刷新令牌的Scope继承性
若使用刷新令牌获取新访问令牌,需确保初始授权时已包含gmail.send Scope——刷新令牌会继承初始授权的权限范围,若初始授权缺失该Scope,刷新后的令牌也会无对应权限。
内容的提问来源于stack exchange,提问作者Sudeep Shrestha
相关产品推荐
相关产品推荐

