使用Google API发送邮件出现unauthorized_client错误如何解决?
问题原因与解决方案
这个报错的核心原因是你使用的服务账号未正确配置Google Workspace全域权限委派,或配置的权限范围不匹配。
发件人邮箱关联逻辑
你当前用的是服务账号模拟域内用户发信的模式,关联逻辑很明确:
- 代码中
credentials.with_subject(USER_EMAIL)已经指定了服务账号要冒充的域内用户身份,Gmail接口会以这个用户的身份执行发信操作 - 代码里的
gmail_from必须和USER_EMAIL完全一致,接口会校验二者匹配性,不一致会直接触发报错
全域委派配置操作步骤
官方说的「使用数字ID重新添加客户端」是服务账号调用Workspace API的必填配置,作用是给服务账号开通冒充域内用户调用接口的权限,具体操作如下:
- 首先确认你使用的是Google Workspace企业/教育版账号,个人普通Gmail账号不支持服务账号模拟发信,必须换普通OAuth2授权模式
- 第一步:进入Google Cloud控制台,找到你创建的服务账号,复制它的数字客户端ID(注意不是服务账号的邮箱地址,是一串纯数字ID)
- 第二步:使用Google Workspace管理员账号登录管理后台,依次进入「安全性」→「访问权限和数据控制」→「API控制」→「全域委派」页面
- 第三步:如果之前已经添加过该服务账号的相关条目,先删除原有旧条目
- 第四步:点击「新增」按钮,在客户端ID输入框粘贴刚才复制的数字ID,在OAuth范围输入框填写
https://www.googleapis.com/auth/gmail.send,确认保存 - 第五步:等待10~15分钟让配置生效,Google全域权限配置有延迟,刚配置完立即测试会依然报错
额外修正点
你当前代码里有一个低级错误会导致scope校验失败:SCOPES里的权限地址前面多了一个空格,改成如下内容即可:
SCOPES = ['https://www.googleapis.com/auth/gmail.send']
凭证使用说明
你当前的代码用的是服务账号凭证,不需要用到你创建的OAuth 2.0 Client IDs凭证,只要保证你从Google Cloud控制台下载的服务账号密钥文件命名为keys.json,和代码放在同一目录下即可。如果是个人Gmail用户,需要删掉服务账号相关的授权逻辑,改用OAuth 2.0 Client IDs走浏览器授权的流调用接口。
内容的提问来源于stack exchange,提问作者Soffamumie
相关产品推荐
相关产品推荐

