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

error code 400 when trying to read GMAIL using a service account

我正在使用 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 凭据访问它,但不能使用服务密钥。是什么导致了我的问题?

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

服务帐户

Service accounts 是无需人工交互即可工作的特殊帐户,它们可以像您在普通账户。有一些 API(如 Gmail)无法作为服务帐户访问,因为这会导致问题,例如垃圾邮件或问题。

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


全域委派

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


回答您的问题

对于您的具体案例:

  • 无法通过服务帐户API使用 GMail
  • 如果您没有起始域
  • ,您不能使用域范围委派

备选方案

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

我不会详细介绍,因为这不是您所要求的,但如果您不熟悉它,可以使用 refresh token 的方法,因此您只需授权您的应用程序第一次和每当 refresh token 变得无效。