Python Gmail API-快速访问发送/收到的每封电子邮件的日期

Python Gmail API-快速访问发送/收到的每封电子邮件的日期,python,gmail,gmail-api,gmail-imap,email-analytics,Python,Gmail,Gmail Api,Gmail Imap,Email Analytics,我试图分析我的25k+电子邮件,类似于这里的帖子: 虽然上面提到的脚本使用IMAP,但为了提高安全性,我正在尝试使用Gmail API实现它。我正在使用Python(和Pandas进行数据分析),但问题更普遍地适用于Gmail API的使用 从文档中,我可以通过以下方式阅读电子邮件: msgs = service.users().messages().list(userId='me', maxResults=500).execute() 然后使用循环访问数据: for msg in msgs[

我试图分析我的25k+电子邮件,类似于这里的帖子:

虽然上面提到的脚本使用IMAP,但为了提高安全性,我正在尝试使用Gmail API实现它。我正在使用Python(和Pandas进行数据分析),但问题更普遍地适用于Gmail API的使用

从文档中,我可以通过以下方式阅读电子邮件:

msgs = service.users().messages().list(userId='me', maxResults=500).execute()
然后使用循环访问数据:

for msg in msgs['messages']:
    m_id = msg['id'] # get id of individual message
    message = service.users().messages().get(userId='me', id=m_id).execute()
    payload = message['payload'] 
    header = payload['headers']

    for item in header:
        if item['name'] == 'Date':
           date = item['value']
           ** DATA STORAGE FUNCTIONS ETC **
但这显然非常缓慢。除了在每封邮件上循环外,我还必须多次调用list()API调用来循环浏览所有电子邮件

是否有更高性能的方法来实现这一点?e、 g.要求API仅返回数据,而不是所有不需要的消息信息

谢谢


参考:

您可以对邮件进行批处理。将get()操作分为批处理,请参阅:

您最多可以将100个请求放入一个批处理中

请注意,“一组批处理在一起的n个请求作为n个请求而不是一个请求计入您的使用限制。”因此,您可能需要进行一些调整以保持低于请求速率限制

下面是一个粗略的Python示例,它将获取由id列表给出的消息
id\u list

msgs = []
def fetch(rid, response, exception):
    if exception is not None:
        print exception
    else:
        msgs.append(response)

# Make a batch request
batch = gmail.new_batch_http_request()
for message_id in id_list:
    t = gmail.users().messages().get(userId='me', id=message_id, format=fmt)
    batch.add(t, callback=fetch)

batch.execute(http=http)

您可以将消息批处理。get()操作分为批处理,请参阅:

您最多可以将100个请求放入一个批处理中

请注意,“一组批处理在一起的n个请求作为n个请求而不是一个请求计入您的使用限制。”因此,您可能需要进行一些调整以保持低于请求速率限制

下面是一个粗略的Python示例,它将获取由id列表给出的消息
id\u list

msgs = []
def fetch(rid, response, exception):
    if exception is not None:
        print exception
    else:
        msgs.append(response)

# Make a batch request
batch = gmail.new_batch_http_request()
for message_id in id_list:
    t = gmail.users().messages().get(userId='me', id=message_id, format=fmt)
    batch.add(t, callback=fetch)

batch.execute(http=http)

非常感谢你的帮助!批次听起来像我要找的。但这仍然会得到整个消息,然后我循环遍历所有消息以提取数据。您是否知道一种只返回特定数据的方法/更有效地执行此操作?另外,我想我仍然需要在批处理调用之前使用list/list\u next来获取消息ID?干杯你想要什么“特定数据”?(是的,您可以使用list()获取mesage ID列表,然后使用get()获取详细信息)。这将忽略消息正文等,避免浪费数据传输。非常感谢您的帮助!批次听起来像我要找的。但这仍然会得到整个消息,然后我循环遍历所有消息以提取数据。您是否知道一种只返回特定数据的方法/更有效地执行此操作?另外,我想我仍然需要在批处理调用之前使用list/list\u next来获取消息ID?干杯你想要什么“特定数据”?(是的,您可以使用list()获取mesage ID列表,然后使用get()获取详细信息)。这样就可以忽略消息体等,避免浪费数据传输。