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

如何使用Gmail API在Python中打印Gmail邮件正文?

解决Gmail API获取邮件正文的问题

Gmail API返回的邮件正文以Base64URL编码形式存储,且邮件结构分两种情况:单部分简单邮件(正文直接在payload['body']中)、多部分复杂邮件(正文嵌套在payload['parts']的子项里)。你需要遍历结构找到text/plain类型的内容,再解码得到明文。

以下是修改后的完整代码,包含发件人、主题和文本正文的获取逻辑:

import base64
from googleapiclient.discovery import build

service = build('gmail', 'v1', credentials=creds)
results = service.users().messages().list(userId='me', labelIds=['INBOX'], q="from:specific email, is:unread").execute()

messages = results.get('messages', [])

if not messages:
    print("You have no New Messages.")
else:
    message_count = 0
    for message in messages: 
        msg = service.users().messages().get(userId='me', id=message['id']).execute()
        message_count += 1
        
        # 获取发件人和主题
        email_data = msg['payload']['headers']
        from_name = next(j['value'] for j in email_data if j["name"] == "From")
        subject = next(j['value'] for j in email_data if j["name"] == "Subject")
        print(f"发件人: {from_name}")
        print(f"主题: {subject}")
        
        # 定义递归获取正文的函数
        def get_message_body(payload):
            # 处理单部分邮件
            if 'body' in payload and payload['body'].get('data'):
                data = payload['body']['data']
                return base64.urlsafe_b64decode(data).decode('utf-8')
            # 处理多部分邮件,遍历parts找text/plain类型
            elif 'parts' in payload:
                for part in payload['parts']:
                    if part['mimeType'] == 'text/plain':
                        data = part['body']['data']
                        return base64.urlsafe_b64decode(data).decode('utf-8')
                    # 递归查找嵌套的子parts
                    elif 'parts' in part:
                        body = get_message_body(part)
                        if body:
                            return body
            return "无法获取邮件正文"
        
        # 获取并打印正文
        body = get_message_body(msg['payload'])
        print(f"正文:\n{body}\n" + "-"*50)

关键细节说明:

  1. Base64URL解码:Gmail返回的正文是URL安全的Base64编码,必须用base64.urlsafe_b64decode()解码,再转成UTF-8字符串才能正常显示。
  2. 多结构适配:
    • 普通纯文本邮件直接读取payload['body']['data']即可。
    • 带HTML版本或附件的邮件,需要遍历payload['parts'],定位mimeType为text/plain的部分,这部分存储的是纯文本正文。
  3. 递归处理嵌套:部分复杂邮件的parts会嵌套子结构,递归函数能确保深入找到目标内容。

若之前尝试相关方案失败,大概率是没处理嵌套的子parts,或是误用了普通Base64解码而非URL安全版本。

内容的提问来源于stack exchange,提问作者OrbitDuster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:06:24