Gmail API 读取所有邮件而不是未读邮件
Gmail API reads all messages instead of the UNREAD ones
我正在尝试使用以下代码从 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 returns 100 条消息 ID 和名为 nextPageToken
的下一页的 ID。我们使用此令牌来获取接下来的 100 个消息 ID,依此类推。如果没有下一页,它就没有令牌,因此我的最后 4 行代码检查它是否存在。如果它不存在,它将标志设置为 0 并且 while 循环完成。
问题
The above code fetches ALL the messages (READ and 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 则它会正确提取它们。但是,如果未读消息 >100,则它会提取所有消息 (READ+UNREAD)
我调查了 this Whosebug answer,但也没有帮助。
让我困扰的是您的代码只在第一个 API 调用中过滤您的消息。
因此,如果不过滤消息,您会收到所有消息(READ 或 UNREAD)。除了第一个电话(只有你在过滤)。
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
我正在尝试使用以下代码从 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 returns 100 条消息 ID 和名为 nextPageToken
的下一页的 ID。我们使用此令牌来获取接下来的 100 个消息 ID,依此类推。如果没有下一页,它就没有令牌,因此我的最后 4 行代码检查它是否存在。如果它不存在,它将标志设置为 0 并且 while 循环完成。
问题
The above code fetches ALL the messages (READ and 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 则它会正确提取它们。但是,如果未读消息 >100,则它会提取所有消息 (READ+UNREAD)
我调查了 this Whosebug answer,但也没有帮助。
让我困扰的是您的代码只在第一个 API 调用中过滤您的消息。
因此,如果不过滤消息,您会收到所有消息(READ 或 UNREAD)。除了第一个电话(只有你在过滤)。
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