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

Python3+imaplib+email库:如何解析并提取邮件头?

邮件头解析问题修复方案

你的代码已能成功获取邮件正文,但未利用email.message对象自带的邮件头解析能力,且导入的HeaderParser属于冗余操作——Python的email.message.Message类本身就提供了便捷的邮件头访问方法。以下是修正后的完整方案:

关键邮件头获取方法

  • 单个标准头获取:直接通过msg['Header-Name']调用,比如msg['From']、msg['Subject']、msg['Date']
  • 所有邮件头遍历:用msg.items()获取所有头的键值对
  • 编码头解码:针对带中文/特殊编码的主题等,用decode_header工具处理

修正后的完整代码

import imaplib
import email
from email.header import decode_header

def get_body(msg):
    if msg.is_multipart():
        return get_body(msg.get_payload(0))
    else:
        return msg.get_payload(None, True)

def search(key, value, con):
    result, data = con.search(None, key, f'"{value}"')
    return data

def get_emails(result_bytes, con):
    msgs = []
    for num in result_bytes[0].split():
        _, data = con.fetch(num, '(RFC822)')
        # 直接解析为email.message对象,简化后续处理
        msg = email.message_from_bytes(data[0][1])
        msgs.append(msg)
    return msgs

def decode_encoded_header(header_str):
    # 解码带编码的邮件头(如中文主题)
    decoded_parts = decode_header(header_str)
    header_content = []
    for part, encoding in decoded_parts:
        if isinstance(part, bytes):
            header_content.append(part.decode(encoding or 'utf-8'))
        else:
            header_content.append(part)
    return ''.join(header_content)

# 邮箱配置
user = <REDACTED>
password = <REDACTED>
imap_url = "imap.gmail.com"

# 连接并登录邮箱
con = imaplib.IMAP4_SSL(imap_url)
con.login(user, password)
con.select("INBOX")

# 获取指定发件人的邮件
target_sender = <REDACTED>
msgs = get_emails(search("FROM", target_sender, con), con)

# 遍历输出邮件头与正文
for idx, msg in enumerate(msgs, 1):
    print(f"=== 第 {idx} 封邮件 ===")
    # 基础邮件头
    print(f"发件人: {msg['From']}")
    print(f"收件人: {msg['To']}")
    print(f"发送日期: {msg['Date']}")
    # 解码主题
    decoded_subject = decode_encoded_header(msg['Subject'])
    print(f"主题: {decoded_subject}")
    # 可选:输出所有邮件头
    print("\n全部邮件头:")
    for header_name, header_value in msg.items():
        print(f"{header_name}: {header_value}")
    # 正文内容
    print("\n正文:")
    print(get_body(msg))
    print("\n" + "-"*50 + "\n")

核心修改说明

  1. 重构get_emails:直接将原始邮件字节解析为email.message.Message对象,避免重复解析,简化流程
  2. 新增解码函数:处理带编码的邮件头,解决中文/特殊字符乱码问题
  3. 简化头访问:利用msg对象的直接索引和遍历方法,替代复杂的解析工具
  4. 移除冗余依赖:删除未使用的HeaderParser,减少代码冗余

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:32:42