我正在使用c#asp.net创建基于Web的电子邮件客户端。
令人困惑的是,各种电子邮件客户端似乎在通过电子邮件回复时以不同的方式添加原始文本。
我想知道的是,如果有某种标准化的方法,那么消除这个过程的歧义?
谢谢 -Theo
答案 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
标题,但未指定正文的格式。
正如您所发现的,不同的客户以不同的方式添加原始文本,这意味着没有标准,再加上用户也会以不同的方式做事:
答案 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方式解析电子邮件:)