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")
核心修改说明
- 重构
get_emails:直接将原始邮件字节解析为email.message.Message对象,避免重复解析,简化流程 - 新增解码函数:处理带编码的邮件头,解决中文/特殊字符乱码问题
- 简化头访问:利用
msg对象的直接索引和遍历方法,替代复杂的解析工具 - 移除冗余依赖:删除未使用的
HeaderParser,减少代码冗余
内容的提问来源于stack exchange,提问作者Aaditya Jindal
相关产品推荐
相关产品推荐

