我正在使用 c# asp.net 创建一个基于 Web 的电子邮件客户端。
令人困惑的是,各种电子邮件客户端在通过电子邮件回复时似乎以多种不同的方式添加原始文本。
我想知道的是,如果有某种标准化的方式来消除这个过程的歧义?
谢谢你-西奥
我刚在想:
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;
}
不是真的,不。
Internet 消息的原始RFC讨论了in-reply-to
标头,但没有指定正文的格式。
正如您所发现的,不同的客户端以不同的方式添加原始文本,这意味着没有标准,再加上用户也会以不同的方式做事:
没有标准化的方法,但明智的启发式方法会让你保持一段距离。
一些算法根据行的初始字符对行进行分类,并通过将文本与标记文本的语料库进行比较,得出每行的统计概率 a) 与下一个/前一个是同一块的一部分,b ) 引用文本、签名、新文本等。
值得尝试一些最流行的电子邮件客户端,并创建和比较一些示例消息以了解它们之间的差异。Usenet 新闻组也可以帮助您建立一个合理的信息语料库来工作。HTML 电子邮件当然增加了额外的复杂性,尽管大多数兼容的邮件客户端也会包含相应的纯文本。不同的语言也会导致问题,因为可以解析“Paul 写:”的客户端可能会在“Pablo ha scritto:”处崩溃。
您可以尝试的一些启发式方法是
- 任意数量的 > 字符 - 寻找“写:”(这个要非常小心)
您也可以尝试将消息 ID 字段与回复字段相关联
最后,如果你找不到一个好的库来做这件事,是时候开始这个项目了。不再以 Cthulhu 方式解析电子邮件 :)