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

如何通过Gmail API获取邮件完整正文而非Snippet片段?

如何通过Gmail API获取邮件完整正文

要获取Gmail邮件的完整正文,你需要解析API返回的邮件payload结构,而不是仅依赖snippet字段。以下是具体的代码修改方案:

核心思路

Gmail API返回的邮件内容会以Base64 URL安全编码的形式存储在payload的parts字段中(可能是直接的文本部分,也可能嵌套在子parts里),需要递归提取并解码。

1. 新增正文提取辅助函数

这个函数会递归遍历邮件的结构,提取纯文本格式的完整正文(如需HTML格式,只需修改mimeType参数):

import base64

def extract_email_body(payload):
    # 处理无parts的简单邮件
    if 'body' in payload and payload['body'].get('data'):
        data = payload['body']['data']
        # 解码URL安全的Base64内容
        return base64.urlsafe_b64decode(data).decode('utf-8')
    
    # 递归处理嵌套的parts
    if '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 = extract_email_body(part)
                if body:
                    return body
    return None

2. 修改原代码的邮件处理逻辑

调整原代码中的循环部分,替换snippet的获取逻辑,改用上面的辅助函数提取完整正文:

# 原get_message_detail函数保留不变
def get_message_detail(service, message_id, format='raw', metadata_headers=[]):
    try:
        message_detail = service.users().messages().get(
            userId='me',
            id=message_id,
            format=format,
            metadataHeaders=metadata_headers
        ).execute()
        return message_detail
    except Exception as e:
        print(e)
        return None

# 处理邮件列表的逻辑修改
if email_messages is not None:
    for email_message in email_messages:
        messageId = email_message['threadId']
        messageSubject = '(No subject) ({0})'.format(messageId)
        from_name = 'Unknown Sender'

        # 获取完整邮件详情(format='full'会返回所有结构)
        messsageDetail = get_message_detail(
            gmail_service, email_message['id'], format='full'
        )
        messageDetailPayload = messsageDetail.get('payload')
        if not messageDetailPayload:
            continue

        # 提取主题
        for item in messageDetailPayload['headers']:
            if item['name'] == 'Subject' and item['value']:
                messageSubject = '{0} ({1})'.format(item['value'], messageId)
                break

        # 提取发件人
        for values in messageDetailPayload['headers']:
            if values['name'] == 'From':
                from_name = values['value']
                break

        # 提取完整正文
        full_body = extract_email_body(messageDetailPayload)
        # 打印结果
        print(f"主题: {messageSubject}")
        print(f"发件人: {from_name}")
        print(f"完整正文:\n{full_body}\n---")

关键说明

  • 使用format='full'调用API,确保返回邮件的完整结构,无需额外指定metadata_headers。
  • 必须使用base64.urlsafe_b64decode解码,因为Gmail采用的是URL安全的Base64编码,普通解码会报错。
  • 如果需要获取HTML格式的正文,将辅助函数中的text/plain替换为text/html即可。
  • 原代码中的嵌套循环逻辑已调整,避免不必要的重复遍历。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:55:22