获取该人刚写的实际电子邮件,不包括任何引用的文本

问题描述 投票:17回答:7

网站上有两个预先存在的问题。一个用于Python,一个用于Java。

我希望能够完全相同(在PHP中)。我创建了一个邮件代理,通过电子邮件发送一个唯一的电子邮件地址,两个人可以在一起。然而,我发现的问题是,当一个人收到电子邮件并点击回复时,我正在努力准确地捕获他所写的文本并丢弃之前通信中的引用文本。

我正在尝试找到适用于HTML电子邮件和纯文本电子邮件的解决方案,因为我发送的都是。

如果有必要在电子邮件中插入一些<*****RESPOND ABOVE HERE*******>标签,我也有能力,这意味着我可以丢弃下面的所有内容。

你会推荐我做什么?始终将该标记添加到HTML副本和明文副本然后抓住它上面的所有内容?

然后,我仍然会知道每个邮件客户端如何创建响应。因为例如Gmail会这样做:

On Wed, Nov 2, 2011 at 10:34 AM, Message Platform <[email protected]> wrote:
## In replies all text above this line is added to your message conversation ##

有关最佳做法的任何建议或建议吗?

或者我应该抓住50个最受欢迎的邮件客户端,并开始为每个客户端创建自定义正则表达式。然后,对于每个客户端,还有一个bizallion不同的区域设置,因为我猜测用户的区域设置也会影响添加的内容。

或者,如果它包含日期,我应该只删除前一行吗?等等

php parsing email email-integration html-email
7个回答
9
投票

有许多库可以帮助您从消息中提取回复/签名:

我还读到MailGun提供的服务可以解析入站电子邮件并将其内容发布到您选择的URL。它会自动从您的电子邮件中删除引用的文本:http://blog.mailgun.com/handle-incoming-emails-like-a-pro-mailgun-api-2-0/

希望有所帮助!


21
投票

不幸的是,如果您想尝试精心清理电子邮件(删除不属于实际回复电子邮件本身的所有内容),那么您将面临一个受伤的世界。理想的方法是,按照你的建议,为每个流行的电子邮件客户端/服务编写正则表达式,但这是一个非常荒谬的工作量,我推荐being lazy and dumb

有趣的是,甚至Facebook engineers也遇到了这个问题,而Google has a patent则采用了“检测引用文本”的方法。

您可以找到三种可接受的解决方案:

不要管它

第一个解决方案是将所有内容留在消息中。大多数电子邮件客户端都这样做,似乎没有人抱怨。当然,如果他们有初始式的回复,在线消息系统(如Facebook的'消息')看起来很奇怪。使这项工作正常的一种偷偷摸摸的方法是使用任何引用的行折叠来呈现消息,并包含一个指向“展开引用文本”的小链接。

将回复与旧消息分开

正如您所提到的,第二种解决方案是在消息顶部放置一条描述性消息,例如--------- please reply above this line ----------,然后在处理回复时删除该行以及下面的任何内容。许多系统都是这样做的,这并不是世界上最糟糕的事情......但它确实使你的电子邮件看起来更“自动化”而且更不个人化(在我看来)。

剥离引用的文本

最后一个解决方案是简单地删除任何以>开头的新行,这可能是回复电子邮件中的引用行。大多数电子邮件客户端使用此方法指示引用文本。这里有一些正则表达式(在PHP中)可以做到这一点:

$clean_text = preg_replace('/(^\w.+:\n)?(^>.*(\n|$))+/mi', '', $message_body);

使用这种更简单的方法存在一些问题:

  • 许多电子邮件客户端也允许人们引用早期的电子邮件,并在>前面引用这些引用行,因此您将删除引号。
  • 通常情况下,引用的电子邮件上方有一行代码,例如On [date], [person] said。此行很难删除,因为它在不同的电子邮件客户端之间的格式不同,并且可能比您删除的引用文本上方的一行或两行更新。我在我的PHP Imap库中实现了这种检测方法,取得了一定的成功。

当然,测试是关键,对于您的特定系统,权衡可能是值得的。因人而异。


2
投票

可能有用:quotequail是一个Python库,可帮助识别电子邮件中的引用文本


1
投票

Afaik,(标准)电子邮件应通过在每行前面添加“>”来引用整个文本。您可以使用strstr()删除哪个。否则,您是否尝试将该Java示例移植到php?它只不过是正则表达式。

甚至像Github和Facebook这样的网页都有这个问题。


0
投票

只是一个想法:您拥有最初发送的文本,因此您可以查找并删除它以及回复中的其他周围噪音。这不是一件容易的事,因为邮件客户端应用程序会添加额外的换行符,HTML元素和“>”字符。

正则表达式肯定会更好,如果它的工作,因为它很简单,它完美地削减原始文本,但如果你发现它经常不起作用,那么这可以是一个后备方法。


0
投票

qazxsw poi提供回复提取(删除引用内容)以及签名提取作为基于云的服务。我还没有测试它,但看起来很有希望。


0
投票

我同意引用的文字或回复只是一个文本。所以没有准确的方法来获取它。无论如何你可以像这样使用regexp替换。

https://mailgun.com

测试$filteringMessage = preg_replace('/.*\n\n((^>+\s{1}.*$)+\n?)+/mi', '', $message);

© www.soinside.com 2019 - 2024. All rights reserved.