如何拆分包含回复的邮件正文(邮件线程)?
如何拆分包含回复的邮件正文(邮件线程)?
嘿,这个问题我太懂了!不同邮件服务商的回复格式真的五花八门,手动写正则去匹配简直是噩梦。好在有现成的Python库能帮咱们搞定这个事儿,下面给你分享两个实用的方案:
方案一:用专门的邮件回复解析库(推荐)
首推email-reply-parser,这个库专门用来处理邮件线程的拆分,能自动识别各种邮箱的回复格式(比如Gmail、Outlook、Yahoo这些主流平台都支持),帮你把每一条独立的回复提取出来。
步骤1:安装库
pip install email-reply-parser
步骤2:结合你的代码使用
把你已经解码好的body传入这个库的解析方法,就能轻松拆分出所有回复内容:
from email_reply_parser import EmailReplyParser # 假设你已经通过imap和email库拿到了解码后的body变量 parsed_thread = EmailReplyParser.parse(body) # 提取所有有效消息(过滤掉签名和空内容) messages = [ fragment.content.strip() for fragment in parsed_thread.fragments if not fragment.signature and fragment.content.strip() ] # 最终messages就是你想要的列表:["second reply", "first reply", "first message"]
这个库会自动处理分隔线、引用块、签名等元素,比手动处理靠谱太多。
方案二:手动处理(仅适合特定场景)
如果不想额外安装依赖,也可以针对常见的回复标记做简单拆分,但要注意这种方法通用性很差,只能适配特定格式的邮件:
# 针对你提供的邮件格式做手动拆分示例 def split_email_thread(body): # 先按分隔线拆分第一层级 parts = body.split("________________________________") cleaned_parts = [] for part in parts: # 找到"On ... wrote:"引用标记的位置,截取前面的内容 wrote_pos = part.find("On ") if wrote_pos != -1: cleaned_part = part[:wrote_pos].strip() else: cleaned_part = part.strip() if cleaned_part: cleaned_parts.append(cleaned_part) return cleaned_parts # 调用方法得到结果 messages = split_email_thread(body)
不过要提醒你:不同邮箱的引用格式差异很大,比如有的用>符号引用整段内容,有的用中文的“发自:”标记,手动处理很容易遗漏情况,所以还是优先用专门的库更稳妥。
备注:内容来源于stack exchange,提问作者mic
相关产品推荐
相关产品推荐

