【发布时间】:2011-04-15 03:22:26
【问题描述】:
我正在尝试编写定期接收电子邮件的应用程序。它将每封邮件写入数据库。但有时我会收到类似这样的“回复:”电子邮件:
新消息
2010年9月21日24:26有人写道(a):
|旧消息 |
格式取决于电子邮件提供商。
是否有任何库可以帮助从电子邮件中删除“重新”部分?也许 IMAP 服务器可以做到这一点?我有数据库中线程中所有以前的电子邮件,所以我可以拿它们并在新消息中搜索。
【问题讨论】:
我正在尝试编写定期接收电子邮件的应用程序。它将每封邮件写入数据库。但有时我会收到类似这样的“回复:”电子邮件:
新消息
2010年9月21日24:26有人写道(a):
|旧消息 |
格式取决于电子邮件提供商。
是否有任何库可以帮助从电子邮件中删除“重新”部分?也许 IMAP 服务器可以做到这一点?我有数据库中线程中所有以前的电子邮件,所以我可以拿它们并在新消息中搜索。
【问题讨论】:
From: <receipent> From: "NAME" <receipent> From: receipent
并且您必须省略下面这一行中的部分,但是仅检查这一点是不够的,因为通常 from 后面跟着 subject、cc、to 等,因此需要检查模式。我认为可能存在一些开源项目或文本库,但在谷歌上很难找到。
【讨论】:
我个人认为你在这里不走运,因为消息副本是正文的一部分。因此,为了删除它,您必须处理消息正文并为每种已知格式编写提取方法(显然问题是您无法知道所有可能的格式)。
那么,与其解析正文,为什么不将整个消息保存到数据库中呢?通常消息的大小不应该是现代 DBMS 的问题。如果确实有问题,您可以随时压缩主体并将其存储在 BLOB 中。
【讨论】:
如果您能够将回复 (RE:) 消息与作为回复的原始/上一条消息相关联,那么我认为您可以从数据库中获取原始/上一条消息的正文,然后从回复正文中删除该文本。但是,此方法不会 100% 准确,因为客户端可以将 HTML/Rich Text 电子邮件转换为纯文本,反之亦然。在任何这种情况下,这种方法可能都行不通。即便如此,这种技术还是通用的,并且可能在大多数情况下都有效。
此外,电子邮件提供商可能会在回复中引用消息的开头添加某些标头字段或前导码。在这种情况下,我认为没有任何“包罗万象”的解决方案。
我的建议是针对一些真正庞大的网络邮件提供商(Gmail、Yahoo、Microsoft 等),了解他们用于回复的格式并相应地解析邮件。此外,您还可以处理一些通用格式。例如,“>”字符通常用于回复中每行引用文本的开头。
如果您打算使用 C# 之类的语言进行开发,请为自己创建一个类似 IReplyFormat 的接口,并为每个提供者提供相应的实现,并且可能还有一些通用格式。
我认为您不会找到任何包罗万象/完美的解决方案来解决这个问题,因为有太多不同格式的邮件提供商。但是,我认为您至少可以找到一些技术,例如上面提到的技术,这些技术将多次为您工作,这是您目前所希望的最好的。
【讨论】:
我同意 Obalix 的观点。过滤掉回复太难了,所以必须保留整个消息。但是,当您向用户展示电子邮件时,您可以隐藏其中的某些部分。这些部分可以显示为可选的“单击此处查看完整消息”或类似内容。例如,过滤“>”字符的正则表达式看起来像@"^[ \f\t\v>]*"
【讨论】: