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