如何使用Python调用Gmail API获取Gmail账号下所有邮件的message ID
解决方案
核心优化逻辑
- 采用
while循环处理分页逻辑,无需为每页单独定义变量,只要接口返回nextPageToken就自动请求下一页,直到没有后续分页为止 - 修正原代码中重复请求的问题:单次
list接口调用可同时获取当前页邮件列表和下一页分页令牌,无需同一分页参数请求两次浪费配额 - 用统一列表存储全量邮件数据,方便后续统一处理
重构后完整代码
from __future__ import print_function import os.path from googleapiclient.discovery import build from google_auth_oauthlib.flow import InstalledAppFlow from google.auth.transport.requests import Request from google.oauth2.credentials import Credentials # 如果修改权限范围,需要删除本地已生成的token.json文件 SCOPES = ['https://www.googleapis.com/auth/gmail.readonly'] def main(): """Gmail API获取全量邮件ID""" creds = None user_id = "me" # 读取本地已授权凭证 if os.path.exists('token.json'): creds = Credentials.from_authorized_user_file('token.json', SCOPES) # 凭证无效时重新授权 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) # 保存授权凭证供下次使用 with open('token.json', 'w') as token: token.write(creds.to_json()) service = build('gmail', 'v1', credentials=creds) # 分页获取所有邮件 all_messages = [] page_token = None while True: # 发起单次请求同时拿当前页数据和下一页令牌 res = service.users().messages().list(userId=user_id, pageToken=page_token).execute() # 把当前页的邮件数据加入总列表 current_messages = res.get('messages', []) all_messages.extend(current_messages) # 检查是否还有下一页 page_token = res.get('nextPageToken') if not page_token: break # 可选:打印当前进度 print(f"已获取{len(all_messages)}条邮件ID,继续加载下一页...") # 提取所有message ID(如果只需要ID的话) all_msg_ids = [msg['id'] for msg in all_messages] # 输出结果验证 print(f"共获取到{len(all_msg_ids)}条邮件ID,前10条为:") print(all_msg_ids[:10]) if __name__ == '__main__': main()
使用说明
运行代码后会自动遍历所有分页,所有邮件ID最终存储在all_msg_ids变量中,你可以根据自己的需求后续处理该列表即可。
内容的提问来源于stack exchange,提问作者emmalynnh
相关产品推荐
相关产品推荐

