从其所有先前的消息和元数据(Sendgrid Parse API / PHP)中提取电子邮件消息本身?

时间:2013-02-17 00:10:17

标签: php regex parsing email sendgrid

我正在使用Sendgrid and their Parse API发送/接收电子邮件。 Parse API允许一个人的网络应用程序以$ _POST接收电子邮件,但问题是在$ _POST中我希望能够从之前的消息和链接的元数据中提取消息本身。

为了向您展示我在下图中的含义,我只想捕捉文字,“尝试从GMAIL发送12373到12373”而不是它下面的所有垃圾。如果那是不可能的,有没有人对如何解析电子邮件正文($_POST['text'])提出任何建议,以便我可以将邮件本身分开?

问题是根据电子邮件客户端(gmail,outlook等),我不清楚日期信息,在这种情况下:“2013年1月23日星期三......”,将允许遵循消息本身。如果所有电子邮件客户端都将日期放在消息下面,那么看起来我可以设计一个花哨的正则表达式来查找换行符后跟日期或其他内容。想法?

**Entire** Message body containing prior messages

4 个答案:

答案 0 :(得分:14)

您有几个选择:

1)插入分割电子邮件的令牌

您可以执行--- reply above this line ---之类的操作,然后删除该令牌下面的所有内容。

2)使用电子邮件回复解析库

有一个非常好的done by github,但它是红宝石。有php port虽然可能对您的需求有益:

完全正常工作的代码

<?php
  require_once 'application/third_party/EmailReplyParser-master/src/autoload.php';
  $email = new \EmailReplyParser\Email();
  $reply = $email->read($_POST['text']);            
  $message=$reply[0]->getContent();
  $message=preg_replace('~On(.*?)wrote:(.*?)$~si', '', $message); 
  //Last line is needed for some email clients, e.g., some university e-mails: foo@bar.edu but not Gmail or Hotmail, to get rid of "On Jan 23...wrote:" 
  //This failure to remove "On Jan 23...wrote:" is a known issue and is documented in their README

 ?>

答案 1 :(得分:1)

根本无法保证从电子邮件消息中解析引用的消息线程,因此您将找不到适用于所有情况的正则表达式或任何其他代码。没有标准来定义回复的格式,并且您已经观察到不同的邮件客户端使用不同的约定。事实上,许多人将允许用户编辑引用的文本。此外,用户可以粘贴不相关的邮件,有或没有标题,从而导致格式的混合和匹配。

如果您可以记录并保留所有邮件的发送和接收历史记录,那么您可以(通常但不总是)使用In-Reply-To标头(请参阅RFC-5322)来查找通过匹配它的Message-ID标头的先前消息,并在正文上执行diff并删除重复的文本运行。很明显,有些电子邮件系统会这样做以改进他们的演示文稿,但我不知道任何可用的开源代码。

答案 2 :(得分:0)

//剪切引用的文字,https://regex101.com/r/xO8nI1/5

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

答案 3 :(得分:0)

英语以外的其他语言的回复怎么样?我们提出了添加标记的解决方案,但不是为每个电子邮件翻译它(基于用户的语言),而是将一些不可见的字符放入其中(准确地说是零宽度空间employee = [{value: "5"}, {value: "10"}, {value: "15"}, {value: "25"}, {value: "75"} ] employee = {value: " "} pay= 'monthly' rupees = 10 amount = 0 calculateAmount(employee, pay, rupees) { if (pay == 'Year') { this.amount = rupees * 12 * employee }else if (pay == 'Quarter') { this.amount = rupees * 3 * employee } else { this.amount = rupees* employee } } )。基于“On ...”regexp它容易出错,它可以轻松地删除一些电子邮件内容。