解析电子邮件文本回复/转发

时间:2010-03-11 11:11:04

标签: c# asp.net .net-2.0 pop3

我正在使用c#asp.net创建基于Web的电子邮件客户端。

令人困惑的是,各种电子邮件客户端似乎在通过电子邮件回复时以不同的方式添加原始文本。

我想知道的是,如果有某种标准化的方法,那么消除这个过程的歧义?

谢谢 -Theo

4 个答案:

答案 0 :(得分:3)

我在想:

public String cleanMsgBody(String oBody, out Boolean isReply) 
{
    isReply = false;

    Regex rx1 = new Regex("\n-----");
    Regex rx2 = new Regex("\n([^\n]+):([ \t\r\n\v\f]+)>");
    Regex rx3 = new Regex("([0-9]+)/([0-9]+)/([0-9]+)([^\n]+)<([^\n]+)>");

    String txtBody = oBody;

    while (txtBody.Contains("\n\n")) txtBody = txtBody.Replace("\n\n", "\n");
    while (new Regex("\n ").IsMatch(txtBody)) txtBody = (new Regex("\n ")).Replace(txtBody, "\n");
    while (txtBody.Contains("  ")) txtBody = txtBody.Replace("  ", " ");

    if (isReply = (isReply || rx1.IsMatch(txtBody)))
        txtBody = rx1.Split(txtBody)[0]; // Maybe a loop through would be better
    if (isReply = (isReply || rx2.IsMatch(txtBody)))
        txtBody = rx2.Split(txtBody)[0]; // Maybe a loop through would be better
    if (isReply = (isReply || rx3.IsMatch(txtBody))) 
        txtBody = rx3.Split(txtBody)[0]; // Maybe a loop through would be better

    return txtBody;
}

答案 1 :(得分:2)

不是,不。

原始RFC for Internet Message讨论in-reply-to标题,但未指定正文的格式。

正如您所发现的,不同的客户以不同的方式添加原始文本,这意味着没有标准,再加上用户也会以不同的方式做事:

  • 纯文本,“富文本”,HTML都有不同的方式将回复与原始
  • 分开
  • 在Outlook中,我可以在回复邮件时选择以下选项:
    • 不包括
    • 附上原始信息
    • 包含原始讯息文字
    • 包含并缩进原始讯息文字
    • 为原始邮件的每一行添加前缀
  • 最重要的是,我经常发送和接收回复,说明我的评论与原始邮件混合在一起的“在线回复”,因此原始邮件不再以其原始格式存在。

答案 2 :(得分:2)

没有标准化的方法,但合理的启发式方法会让你有一个良好的距离。

Some algorithms根据行的初始字符对行进行分类,并将文本与标记文本的语料库进行比较,得出每行的统计概率a)与同一块的一部分。下一个/上一个和b)引用文本,签名,新文本等

值得尝试一些most popular e-mail clients并创建和比较一些示例消息以查看差异是什么。 Usenet newsgroups也可以帮助您构建合理的消息语料库。 HTML电子邮件当然会增加额外的复杂程度,尽管大多数兼容的邮件客户端也会包含相应的纯文本。不同的语言也会引起问题,因为可以解析“保罗写道:”的客户可能会在“Pablo ha scritto:”中堕落。

答案 3 :(得分:1)

您可以尝试的一些启发式方法

- 任意数量的&gt;人物 - 寻找“写道:”(非常小心这个)

您也可以尝试将消息ID字段与In Reply To字段

相关联

最后,如果你找不到一个好的图书馆来做这个,现在是时候开始这个项目了。不再用Cthulhu方式解析电子邮件:)