我正在尝试运行gmail API以从特定用户处获取电子邮件。 但是我总是收到以下错误: googleapiclient.errors.HttpError:https://www.googleapis.com/gmail/v1/users/me/settings/filters?val = json返回“权限不足”>
我尝试了通过更改范围建议的所有不同选项,以便在gmail设置中启用安全性较低的应用程序。 最后一件事是我的代码可能是错误的:
from __future__ import print_function
from googleapiclient import discovery
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
# Setup the Gmail API
SCOPES = 'https://mail.google.com/'
store = file.Storage('credentials.json')
creds = store.get()
if not creds or creds.invalid:
flow = client.flow_from_clientsecrets('client_secret.json', SCOPES)
creds = tools.run_flow(flow, store)
service = build('gmail', 'v1', http=creds.authorize(Http()))
# Call the Gmail API
# results = service.users().labels().list(userId='me').execute()
# labels = results.get('labels', [])
# if not labels:
# print('No labels found.')
# else:
# print('Labels:')
# for label in labels:
# print(label['name'])
label_id = 'mine' # ID of user label to add
filter = {
'criteria': {
'from': 'string@test.com'
}#,
#'action': {
#'addLabelIds': [label_id],
#'removeLabelIds': ['INBOX']
#}
}
result = service.users().settings().filters().create(userId='me', body=filter).execute()
print ('Created filter: %s' % result.get('id'))
请帮帮我吗?
由于
答案 0 :(得分:2)
以上均未解决我将电子邮件从收件箱移至另一个“框/标签”的问题。我不确定gmail api是否会更改,但是我发现我必须做的就是将SCOPES行更改为所需的级别,即SCOPES = ['https://www.googleapis.com/auth/gmail.modify'],然后删除token.pickle文件(以该顺序)。在这两个更改之后,我重新运行了python脚本。这两个步骤使授权网页显示出来,反映出正在授予的新权限,因此在我确定后,重新创建了一个新的token.pickle文件。之后一切都按要求运行。不再出现403错误,电子邮件已移至目标框/标签。我发现凭据.json文件仅允许脚本访问电子邮件,但对电子邮件本身所采取的操作没有任何影响。
我发现Anton Odman撰写的标题为“ Gmail API及其文档入门指南”的文章是有关python和gmail api的最佳综合指南。
顺便说一句,另一个“陷阱”是创建的标签,不一定是标签ID。我建议运行https://stackoverflow.com/a/55713119/4495318中提到的代码,以确保获得正确的标签ID,除了系统生成的标签外,标签ID和标签名称似乎并不相同。
答案 1 :(得分:1)
只需从运行此脚本的文件夹中删除credentials.json文件,然后使用最终所需的范围列表重新运行脚本,例如SCOPES = ['https://www.googleapis.com/auth/gmail.send','https://www.googleapis.com/auth/gmail.labels'] 。在弹出的浏览器窗口中,授权所需gmail帐户的范围列表。那么你应该全力以赴。
背景故事:您可能通过第一次运行run_flow()时弹出的浏览器屏幕授权了较不宽容的范围(例如readonly)。这将在您运行脚本的文件夹中创建一个名为credentials.json的文件。根据上面的脚本,不会再次重新生成此credentials.json。它刚刚冻结了第一次范围。只是出于好奇,您可以打开并阅读credentials.json并查找关键字“范围”。当然,您无法手动在此文件中添加更多作用域,并期望更新的作用域可用。如果有的话,必须为不同的范围集重新生成。
无关警示性说明:如果可能的话,尽量避免过于宽松的范围https://mail.google.com/。)
答案 2 :(得分:0)
更改或添加SCOPES后,只需删除使用 file.Storage('credentials.json')创建的JSON文件,将对您有所帮助并再次运行该程序。