13

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

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

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

谢谢你-西奥

4

4 回答 4

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;
}
于 2010-03-22T10:07:41.040 回答
2

不是真的,不。

Internet 消息的原始RFC讨论了in-reply-to标头,但没有指定正文的格式。

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

  • 纯文本、“富文本”、HTML 都会有不同的方式将回复与原始内容分开
  • 在 Outlook 中,我可以在回复邮件时从以下选项中进行选择:
  • 不包括
  • 附加原始消息
  • 包括原始消息文本
  • 包括和缩进原始消息文本
  • 为原始消息的每一行添加前缀
  • 最重要的是,我经常发送和接收声明“在线响应”的回复,其中我的评论与原始消息混合在一起,因此原始消息无论如何都不再以其原始形式存在。
于 2010-03-15T13:06:15.953 回答
2

没有标准化的方法,但明智的启发式方法会让你保持一段距离。

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

值得尝试一些最流行的电子邮件客户端,并创建和比较一些示例消息以了解它们之间的差异。Usenet 新闻组也可以帮助您建立一个合理的信息语料库来工作。HTML 电子邮件当然增加了额外的复杂性,尽管大多数兼容的邮件客户端也会包含相应的纯文本。不同的语言也会导致问题,因为可以解析“Paul 写:”的客户端可能会在“Pablo ha scritto:”处崩溃。

于 2010-03-19T21:14:45.873 回答
1

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

- 任意数量的 > 字符 - 寻找“写:”(这个要非常小心)

您也可以尝试将消息 ID 字段与回复字段相关联

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

于 2010-03-21T20:29:38.710 回答