我正在使用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
无效时授权你的应用程序。