如何通过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
相关产品推荐
相关产品推荐

