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

如何拆分包含回复的邮件正文(邮件线程)?

如何拆分包含回复的邮件正文(邮件线程)?

嘿,这个问题我太懂了!不同邮件服务商的回复格式真的五花八门,手动写正则去匹配简直是噩梦。好在有现成的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 07:18:03