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



我正在使用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在评论中所说的内容。

服务帐户

服务帐户是在没有人工交互的情况下工作的特殊帐户,它们可以像在正常帐户中一样使用一些google的API。有些API(如Gmail(无法作为服务帐户访问,因为这会导致问题,如垃圾邮件或问题。

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


域范围委派

有时,在一个有企业行为的公司(域(中,应该对所有用户执行一些任务,备份所有驱动器文件,检查电子邮件中的垃圾邮件恶意内容,或者你能想象到的任何事情。对于,服务帐户可以有一种特殊的行为来替换用户。因此,服务帐户被委托给用户访问域内的API。


回答您的问题

对于您的特定情况:

  • 不能使用带有服务帐户的GMail API
  • 如果您没有域,则不能使用域范围委派

备选方案

因此,在这一点上,您的设置使服务帐户无法使用,因此唯一的方法是使用具有常规OAuth身份验证的常规帐户。

我不会详细介绍,因为这不是你所要求的,但如果你不熟悉它,有一些方法可以使用刷新令牌,所以你只需要在第一次以及refresh token无效时授权你的应用程序。

相关内容

最新更新