使用服务帐户从Gmail获取邮件



我正在使用Google Service帐户在没有UI接口的Gmail帐户中访问所有邮件,但是当我执行代码时,它会给我错误

googleapiclient.errors.httperror:https://www.googleapis.com/gmail/v1/users/me/labels?alt=json返回 "不良请求">

但是,当我从https://console.developers.google.com/apis/api/gmail/gmail.googleapis.com/quotas检查配额时所有请求都显示我确实使用了我的python代码,但是当我执行以下代码时,它总是返回 bad请求

import httplib2
from apiclient import discovery
from oauth2client.service_account import ServiceAccountCredentials

def get_credentials():
    scopes = ['https://mail.google.com/',
              'https://www.googleapis.com/auth/gmail.compose',
              'https://www.googleapis.com/auth/gmail.metadata',
              'https://www.googleapis.com/auth/gmail.readonly',
              'https://www.googleapis.com/auth/gmail.labels',
              'https://www.googleapis.com/auth/gmail.modify',
              'https://www.googleapis.com/auth/gmail.metadata',
              'https://www.googleapis.com/auth/gmail.settings.basic']
    credentials = ServiceAccountCredentials.from_json_keyfile_name(
        'client_secret.json', scopes=scopes)
    return credentials
def main():
    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    service = discovery.build('gmail', 'v1', http=http)
    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'])
if __name__ == '__main__':
    main()

自从这篇文章首次编写以来,已经发生了很多变化,

如果其他人仍在寻找答案。这是我今天的Gmail API的初始化过程。

from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
SCOPES = 'https://www.googleapis.com/auth/gmail.readonly'
def main():   
    # Setup for the Gmail API
    store = file.Storage('token.json')
    creds = store.get()
    if not creds or creds.invalid:
        flow = client.flow_from_clientsecrets('credentials.json', SCOPES)
        creds = tools.run_flow(flow, store)
    service = build('gmail', 'v1', http=creds.authorize(Http()))
    # Call the Gmail API to fetch INBOX
    results = service.users().labels().list().execute()

主要区别是使用访问令牌以及我的代码中的凭据。

最新更新