首页 > 解决方案 > 如何有效地使用 Gmail api 阅读所有邮件?

问题描述

我正在尝试通过收件箱使用 Gmail API 过滤来阅读用户的所有邮件。但是要阅读 16k+ 封邮件大约需要 2 小时。有什么有效的方法吗?

now = datetime.now()

timestamp = math.floor(datetime.timestamp(now))

count = 0
while True:
    results = service.users().messages().list(maxResults=50,userId='me',q='in:inbox before:{}'.format(timestamp)).execute()
    messages = results.get('messages')
    EmailRecepit=[]
    if messages==None:
        break
    for msg in messages:
        print("Count",count)
        count+=1
        # Get the message from its id

        txt = service.users().messages().get(userId='me', id=msg['id']).execute()
        try:
            # Get value of 'payload' from dictionary 'txt'
            payload = txt['payload']
            headers = payload['headers']
            attachment = payload['parts']
            for header in headers:  # getting the Sender
                if header['name'] == 'From':
                    msg_from = header['value']
                    name=sender_name(msg_from)#Sender Name Not email
            for a in attachment:
                if a.get('filename') != '' and len(a.get('filename')) != 0:
                    document = a.get('filename')
            if count % 50==0:
                timestamp = math.floor(datetime.timestamp(parser.parse(headers['Date']))

        except socket.error as error:
            pass
        except:
            pass

标签: pythonoauth-2.0gmail-api

解决方案


你执行的请求越少,你的代码就越高效

因此,您应该修改请求

service.users().messages().list(maxResults=50,userId='me',q='in:inbox before:{}'.format(timestamp)).execute()

通过增加每个请求的最大结果数,例如

指定:maxResults=500

但是,请注意,service.users().messages().get()在大量电子邮件上使用意味着大量请求,这不可避免地会使您的代码变慢。

service.users().messages().list考虑通过扩展查询来缩小检索结果的数量,q并仅检索您真正感兴趣的电子邮件。例如:仅包含附件的电子邮件,仅来自特定发件人或具有特定主题行的电子邮件。

如果您必须检索所有 16k 多封电子邮件 - 加快代码速度的唯一方法是使用批处理请求

例如,在这里查看如何在 Python 中实现对 Gmail API 的批处理请求的示例。请注意,如果您执行的请求过多,使用批处理请求仍会导致超出配额。


推荐阅读