Gmail API:如何获取邮件正文?

3
根据下面引用的文档,消息应包含一个消息部分,该消息部分应再包含一个消息部分正文。

https://developers.google.com/gmail/api/reference/rest/v1/users.messages#Message

当我运行下面的代码(这只是一个修改过的样本脚本,可以在这里找到,其中消息被替换为标签)时
from __future__ import print_function
import pickle
import os.path
import openpyxl
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://mail.google.com/']

def main():
    """Shows basic usage of the Gmail API.
    Lists the user's Gmail labels.
    """
    creds = None
    # The file token.pickle stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

    service = build('gmail', 'v1', credentials=creds)

    # Call the Gmail API
    results = service.users().messages().list(userId='me').execute()
    messages = results.get('messages', [])

    if not messages:
        print('No messages found.')
    else:
        print('Messages:')
        for message in messages:
            print(message)

if __name__ == '__main__':
    main()

我只得到了消息ID和线程ID,例如:

Messages:
{'id': '177045ba844e1991', 'threadId': '177045ba844e1991'}
{'id': '1770415ccdd222d7', 'threadId': '1770415ccdd222d7'}
{'id': '17703970573550eb', 'threadId': '17703970573550eb'}
{'id': '177031073928a223', 'threadId': '177031073928a223'}
{'id': '17702de505951773', 'threadId': '17702de505951773'}
{'id': '17702a3e6d1893de', 'threadId': '17702a3e6d1893de'}

我该如何使用这个API获取消息的实际正文内容?
1个回答

6

根据users.messages.list的文档说明

请注意,每个邮件资源仅包含idthreadId。可以使用messages.get方法获取其他邮件详细信息。

所以基本上这是一个两步操作:

  1. 使用list获取收件箱中的电子邮件。
  2. 使用get查看有关它们的信息。

大致如下所示:

results = service.users().messages().list(userId='me').execute()
messages = results.get('messages', [])
messages = [service.users().messages().get(userId='me', id=msg['id']).execute() for msg in messages]

如果你这样做,会遇到问题,因为这样会逐个发送请求。获取多个消息的方法是使用批量请求:

results = service.users().messages().list(userId='me').execute()
message_ids = results.get('messages', [])

messages = []
def add(id, msg, err):
    # id is given because this will not be called in the same order
    if err:
        print(err)
    else:
        messages.append(msg)

batch = service.new_batch_http_request()
for msg in message_ids:
    batch.add(service.users().messages().get(userId='me', id=msg['id']), add)
batch.execute()

关于批量请求的一个重要注意事项是,回调函数被调用的顺序可能与您开始时的顺序不同。

参考资料


你在for循环的主体中为什么将add传递给自身?另外,messages列表在哪里被使用了吗? - Stephen
1
代码示例应该放在main函数内部。add函数是一个回调函数。以batch = ...开头的代码位于add函数之外,只是main函数的一部分(因此实际上并没有使用自身)。生成的带有正文的消息将存储在messages中,可以根据需要进行使用。例如,您可以像在问题中那样打印它们(相同的6行代码应该能够工作)。 - Martí

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接