You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 10:24:04