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


Get the actual email message that the person just wrote, excluding any quoted text

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

    如何从电子邮件中删除引用的文本,只显示新的文本
  • Python只获取邮件文本的可靠方法,不包括以前的邮件

我希望能够做几乎完全相同(在PHP中)。我创建了一个邮件代理,其中两个人可以通过发送一个唯一的电子邮件地址来进行通信。然而,我发现的问题是,当一个人收到电子邮件并点击回复时,我很难准确地捕捉到他写的文本,并丢弃以前通信中引用的文本。

我试图找到一个解决方案,将工作为HTML电子邮件和明文电子邮件,因为我发送两者。

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

你有什么建议吗?总是将标签添加到HTML副本和纯文本副本中然后获取上面的所有内容?

我仍然需要知道每个邮件客户端如何创建响应。比如Gmail会这样做:

On Wed, Nov 2, 2011 at 10:34 AM, Message Platform <35227817-7cfa-46af-a190-390fa8d64a23@dev.example.com> wrote:
## In replies all text above this line is added to your message conversation ##

对最佳实践有什么建议或建议吗?

或者我应该抓住50个最流行的邮件客户端,并开始为每个客户端创建自定义正则表达式。然后,对于每个客户端,也有很多不同的语言环境设置,因为我猜用户的语言环境也会影响添加的内容。

或者我应该总是删除前一行,如果它包含一个日期?

不幸的是,如果你想一丝一丝地清理电子邮件(删除所有不属于实际回复电子邮件本身的内容),你将会受到伤害。理想的方式是,如你所建议的,为每个流行的电子邮件客户端/服务编写正则表达式,但这是一个相当荒谬的工作量,我建议懒惰和愚蠢的。

有趣的是,就连Facebook的工程师也在这个问题上遇到了麻烦,而谷歌有一项"检测引用文本"的方法专利。

你可能会发现有三种解决方案是可以接受的:

第一个解决方案是在消息中保留所有内容。大多数电子邮件客户端都这样做,而且似乎没有人抱怨。当然,在线消息系统(比如Facebook的"消息")如果有开场白式的回复,看起来就很奇怪了。有一种巧妙的方法可以让这一工作顺利进行,那就是将任何引用行都折叠起来,并包含一个"扩展引用文本"的小链接。

将回复从旧消息中分离

第二个解决方案,正如你提到的,是在你的消息的顶部放置一个描述信息,比如--------- please reply above this line ----------,然后在处理回复时去掉这条线和下面的任何内容。许多系统都这样做,这并不是世界上最糟糕的事情……但它确实使你的电子邮件看起来更"自动化",不那么个人化(在我看来)。

去掉引号

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

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

使用这个更简单的方法有一些问题:

  • 许多电子邮件客户端也允许人们引用早期的电子邮件,并以>开头的那些引用行,所以你将剥离引号。
  • 通常,在引用的电子邮件上方有一行On [date], [person] said之类的内容。这一行很难删除,因为它的格式在不同的电子邮件客户端之间是不一样的,而且它可能比你删除的引用文本高出一两行。我已经在我的PHP Imap库中实现了这种检测方法,并取得了一定的成功。

当然,测试是关键,对于您的特定系统,这种权衡可能是值得的。YMMV。

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

  • Ruby: https://github.com/github/email_reply_parser
  • Python: https://github.com/zapier/email-reply-parser或https://github.com/mailgun/talon
  • JavaScript: https://github.com/turt2live/node-email-reply-parser
  • Java: https://github.com/Driftt/EmailReplyParser
  • PHP: https://github.com/willdurand/EmailReplyParser

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

希望这对你有帮助!

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

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

甚至像Github和Facebook这样的页面也有这个问题。

只是一个想法:你有最初发送的文本,所以你可以寻找它,并从回复中删除它和额外的周围噪音。这并不简单,因为邮件客户端应用程序会添加额外的换行符、HTML元素和">"字符。

如果regex有效,它肯定是更好的,因为它很简单,它完美地剪切了原始文本,但如果你发现它经常不起作用,那么这可以是一个后备方法。

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

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

测试https://regex101.com/r/xO8nI1/2