【问题标题】:Gmail API reads all messages instead of the UNREAD onesGmail API 读取所有邮件而不是未读邮件
【发布时间】:2020-04-28 10:54:25
【问题描述】:

我正在尝试使用以下代码从 gmail 帐户中获取所有 未读 邮件

msgs = service.users().messages().list(userId='me',q='in:inbox is:unread').execute()

flag=1
while flag==1:
    for i in range(0,len(msgs['messages'])):
        message = service.users().messages().get(userId='me', id=msgs['messages'][i]['id']).execute()
        print(message['snippet'])
    if 'nextPageToken' in msgs.keys():
            msgs = service.users().messages().list(userId='me',pageToken= msgs['nextPageToken']).execute()
    else:
        flag=0

以上代码的逻辑

API 返回 100 个消息 ID 和一个名为 nextPageToken 的下一页 ID。我们使用这个令牌来获取接下来的 100 个消息 ID,依此类推。如果没有下一页,它将没有令牌,因此我的最后 4 行代码检查它是否存在。如果不存在,则将标志设置为 0,while 循环完成。

问题

以上代码获取所有消息(READ 和 UNREAD)

尝试了其他方法

msgs = service.users().messages().list(userId='me',labelIds=['UNREAD']).execute()

msgs = service.users().messages().list(userId='me',q='in:inbox is:unread').execute()

可能的根本原因

我注意到如果未读消息 100,则它会拉取所有消息(READ+UNREAD)

我已经调查过this stackoverflow answer,但也没有用。

【问题讨论】:

    标签: python python-3.x gmail gmail-api


    【解决方案1】:

    你的代码让我困扰的是你只在第一次 API 调用中过滤你的消息。

    因此,如果不过滤消息,您会收到所有消息(READUNREAD)。除了第一次调用(只有你正在过滤)。

    msgs = service.users().messages().list(userId='me',q='in:inbox is:unread').execute()
    
    flag=1
    while flag==1:
        for i in range(0,len(msgs['messages'])):
            message = service.users().messages().get(userId='me', id=msgs['messages'][i]['id']).execute()
            print(message['snippet'])
        if 'nextPageToken' in msgs.keys():
                msgs = service.users().messages().list(userId='me',
                                                       q='in:inbox is:unread', # Add this to subsequent calls
                                                       pageToken= msgs['nextPageToken']
                                                      ).execute()
        else:
            flag=0
    

    看看the official documentation中的分页示例。在那里您可以看到查询是如何为每个调用(不仅仅是第一个调用)传递的。

     try:
        response = service.users().messages().list(userId=user_id,
                                                   q=query).execute()
        messages = []
        if 'messages' in response:
          messages.extend(response['messages'])
    
        while 'nextPageToken' in response:
          page_token = response['nextPageToken']
          response = service.users().messages().list(userId=user_id, q=query,
                                             pageToken=page_token).execute()
          messages.extend(response['messages'])
    
        return messages
      except errors.HttpError, error:
        print 'An error occurred: %s' % error
    

    【讨论】:

    • 是的,我在下半场错过了 page_token 属性。
    猜你喜欢
    • 2016-07-07
    • 2015-12-10
    • 2017-12-19
    • 2016-11-30
    • 2018-06-22
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多