从回复电子邮件中删除先前部分

7
我正在尝试编写一个定期接收电子邮件的应用程序。它将每封邮件写入数据库。但有时我会收到像这样的“Re:”电子邮件:

新消息

在2010年9月21日24:26,有人写道(a):

| 旧消息 |

格式取决于电子邮件提供商。

是否有任何库可以帮助从电子邮件消息中删除'Re'部分?也许IMAP服务器可以做到这一点?我已经在数据库中拥有所有先前的邮件线程,因此我可以获取它们并在新邮件中搜索。

4个回答

4
如果您能将回复(RE:)消息与其所回复的原始/先前消息关联起来,那么我认为您可以从数据库中获取原始/先前消息的正文文本,然后从回复的正文中删除该文本。但是,这种方法不会100%准确,因为客户端可能会将HTML / Rich Text电子邮件转换为纯文本,反之亦然。在任何这样的情况下,这种方法可能都不起作用。即便如此,这种技术通常都是通用的且可行的。
此外,电子邮件提供商可能会在回复中引用的消息开头添加某些标题字段或导言。在这种情况下,我认为没有“万无一失”的解决方案。
我的建议是针对一些非常大的网络邮件提供商(如Gmail,Yahoo,Microsoft等),学习他们用于回复的格式,并相应地解析消息。此外,您还可以处理一些通用格式。例如,在回复中,每行引用文本的开头通常使用'>'字符。
如果您要使用类似C#的语言进行开发,请创建一个名为IReplyFormat的接口,其中包含每个提供程序的相应实现,以及可能的一些通用格式。
我认为您不会找到任何“万无一失”/完美的解决方案,因为有太多的邮件提供商使用了太多不同的格式。但是,我认为您至少可以找到一些技术,例如上面提到的技术,这些技术在大多数情况下都会对您有用,这是您目前能希望的最好结果。

1

个人认为你在这里运气不佳,因为消息副本是正文的一部分。因此,为了删除它,您将需要处理消息正文,并为每种已知格式编写提取方法(显然问题在于您无法知道所有可能的格式)。

所以,为什么不将整个消息持久化到数据库中,而不是解析正文呢?通常情况下,现代DBMS应该不会出现消息大小的问题。如果确实存在问题,您可以始终压缩正文并将其存储在BLOB中。


1
我不同意,大多数情况下大小并不是限制,但我们需要在视图中仅显示消息而不是回复。 - Akash Kava
我同意你的观点,复制的文本只是杂乱无章的东西,然而,我们必须做出一个权衡:1. 开发一个过滤器,只能捕捉部分杂乱内容,并有可能误删相关内容 - 因此,这样的风险很可能会导致高昂的成本。- 或者 - 2. 忍受这些杂乱内容,以更低的风险交付项目。-- 但正如我所说,这是一个权衡! - AxelEckenberger

0
  1. 没有 IMAP 服务器会删除任何内容
  2. 这样的库不存在,因为没有标准,每个电子邮件提供商都有不同的做法,例如 Gmail 等已经开发了自己的工具
  3. 你必须寻找模式,它们通常以收件人作为发送者的标题开头,比如...
From: <receipent>
From: "NAME" <receipent>
From: receipent

你需要省略掉下面这行的部分,但仅仅检查这一点是不够的,因为通常 from 后面会跟着主语、抄送人、收件人等,所以需要检查模式。我认为可能存在一些开源项目或文本库,但在谷歌上找到它们太困难了。


0

我同意Obalix的观点。过滤回复太难了,所以必须保留整个消息。但是,当您向用户呈现电子邮件时,可以隐藏其中的某些部分。这些部分可以用可选的“单击此处查看完整消息”或类似选项显示。例如,用于过滤'>'字符的正则表达式应该类似于@"^[ \f\t\v>]*"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接