为基于Web的邮件列表存档编写Gmail样式“隐藏引用文本”

时间:2009-02-11 06:31:47

标签: regex email parsing

我正在研究一种以线程格式(以及其他内容)解析和显示电子邮件的Web应用程序。电子邮件可能来自任何数量的不同邮件客户端,可以是文本或HTML格式。

鉴于大多数人都倾向于发帖,我希望能够以类似于Gmail的方式隐藏电子邮件回复中的重复邮件(例如“显示引用的文字”)。

确定消息的哪一部分是回复有点挑战。就个人而言,我在回复时在引用文本的开头使用“>”分隔符。我创建了一个regexp,它查找这些行并在它们周围包装div,以允许一些JS隐藏或显示这个文本块。

然后我注意到Outlook默认情况下不使用“>”字符,它只是在回复上方添加了一个标题块,其中包含标题摘要(From,Subject,Date等)。回复没有动摇。我可以对此进行匹配并隐藏电子邮件的其余部分,并假设它是最高报价。

然后我查看了Thunderbird,它使用“&gt;”作为文本,<blockquote&gt;用于HTML邮件。我还没有看过Apple Mail的功能,Notes做了什么,或者其他数百万邮件客户端做了什么。

我会为每个客户编写一个特殊的案例正则表达式吗?还是有什么我想念的?

非常感谢任何建议,示例代码或指向第三方图书馆的指示!

4 个答案:

答案 0 :(得分:6)

复制gmail的方式很难,因为它不关心它是否是一个被引用的作品,如Zac所说,它似乎只关心差异。

实际上很难在100%的时间内做到这一点。纯文本电子邮件是“有损的”,它完全可以发送

> Here is my long line that is over 74 chars (email line length limit)

哪个可以编码为

> Here is my long line that is over 74 chars (email=
 line length limit)

然后解码

> Here is my long line that is over 74 chars (email
line length limit)

使其与内联回复无法区分。

这是电子邮件,因此变化比比皆是。电子邮件通常以74个字符进行换行,编码方案可能不同。它是一个真正的PITA。如果您可以访问HTML版本,那么您可能会更好地寻找报价标签等。另一个想法是解析纯文本和html版本以尝试确定边界。

此外,最好只计划特定的客户端黑客攻击。它们都在结构和标题内容中以不同方式构造mime消息。

编辑:我说这是根据编写电子邮件处理系统的经验以及看到有几个人尝试做你正在做的事情。它总是得到“好”的结果。

答案 1 :(得分:1)

据我所知,gmail不会打扰前缀行或节标题,除非忽略它们。如果文本行出现在线程中较早,然后重新出现,则认为它是引用的。因此,例如,如果您发送多条消息而不更改签名,则认为签名被引用。如果你已经处理了'&gt;'前缀,一个简单的差异应该做其余的大部分。没必要花哨。

答案 2 :(得分:0)

我认为我要做的第一件事就是去除所有空白区域,或者将每个单词之间的空格减少到1,以及两个块中的特殊字符,然后在新单词中查找旧空格。

答案 3 :(得分:0)

这是一个mozdev项目,对于偶然发现此页面寻找Thunderbird解决方案的其他人可能会有所帮助:

http://quotecollapse.mozdev.org/