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

Lay*_*yke 20 php email parsing email-integration html-email

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

我希望能够完全相同(在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 ##
Run Code Online (Sandbox Code Playgroud)

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

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

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

gee*_*guy 23

不幸的是,如果您想要尝试精心清理电子邮件(删除不属于实际回复电子邮件本身的所有内容),那么您将面临一个受伤的世界.在理想的方式是,正如你提到的,写了每个流行的电子邮件客户端/服务正则表达式,但这是工作的一个非常可笑的金额,我建议是懒惰和愚蠢了.

有趣的是,即使是Facebook工程师也遇到了这个问题的麻烦,谷歌也有一项关于"检测引用文本"方法的专利.

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

不要管它

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

将回复与旧消息分开

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

剥离引用的文本

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

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

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

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

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


Ped*_*dro 15

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

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

希望有所帮助!