尝试使用服务帐户读取 GMAIL 时出现错误代码 400

Posted

技术标签:

【中文标题】尝试使用服务帐户读取 GMAIL 时出现错误代码 400【英文标题】:error code 400 when trying to read GMAIL using a service account 【发布时间】:2021-01-01 04:38:13 【问题描述】:

我正在使用 Gmail 的 API 将邮件阅读到收件箱。 我在云开发人员组合中有一个项目。我使用我必须从中获取数据的收件箱的帐户登录。 我已经创建了一个没有任何角色等的服务帐户并下载了所需的密钥。 我使用以下方法构建了一个资源:

scopes = ["https://www.googleapis.com/auth/gmail.readonly"]
credentials = service_account.Credentials.from_service_account_files(path, scopes=scopes)
service = build(
   "gmail",
   "v1",
   credentials=credentials
)

这很好。但是当我尝试从收件箱中提取信息时:

responses = service.users().messages().list(userId="me").execute()

这给了我:

googleapiclient.errors.HttpError: <HttpError 400 when requesting <email> returned "Precondition check failed.">

我尝试将“我”更改为电子邮件,设置一些角色。我可以使用 OAuth 凭据而不是服务密钥来访问它。什么可能导致我的问题?

【问题讨论】:

您是否设置了 Gsuite 管理员 service-account#delegatingauthority?除此之外,me 无法正常工作,因为服务帐户没有您需要委派给 gsuite 域用户的 gmail 帐户。 尝试按照指南进行操作,但我使用的帐户不符合 GSuite 管理员资格,所以它不会让我授予它权限? 通过 gmail 使用服务帐户的唯一方法是使用 gsuite 域电子邮件帐户,它不能使用标准 gmail 帐户。 【参考方案1】:

我将尝试扩展 @DalmTo 在 cmets 中所说的内容。

服务帐号

Service accounts 是无需人工干预即可工作的特殊帐户,它们可以像在普通帐户中一样使用某些 google 的 API。有些 API(如 Gmail)无法作为服务帐户访问,因为这会导致问题,如垃圾邮件或问题。

但简而言之,服务帐户是完全独立的帐户,无需人工干预即可使用 API。


域范围委托

有时在具有企业行为的公司(域)中,应该对所有用户完成一些任务,备份所有驱动器文件,检查电子邮件中的垃圾邮件恶意内容或任何您能想象到的事情。为此服务帐户可以有一个特殊的行为to substitute an user。所以service account is delegated with the user access到域内的API。


回答您的问题

对于您的具体情况:

不能通过服务帐户使用 GMail API 如果您没有域开始,则您不能使用域范围授权

替代品

所以此时您的设置无法使用服务帐户,所以唯一的方法是使用您的常规帐户和常规OAuth authentication。

我不会详细介绍,因为这不是您要求的,但如果您不熟悉它,有一些方法可以使用refresh token,因此您只需在第一次授权您的应用程序并且每当refresh token 失效时。

【讨论】:

以上是关于尝试使用服务帐户读取 GMAIL 时出现错误代码 400的主要内容,如果未能解决你的问题,请参考以下文章

通过服务帐户设置 Gmail 委托时出现权限不足错误

使用 smptlib 登录我的 gmail 帐户时出现身份验证错误

尝试通过 Selenium 和 Python 使用 GeckoDriver Firefox 登录 Gmail 帐户时出现“此浏览器或应用程序可能不安全”错误

发布到 Gmail API 时出现 http 500 后端错误

尝试连接到 gmail IMAP 服务器时出现 javax.mail.MessagingException

访问 Gmail API 时出现错误请求