2016-09-26 45 views
1

我正在开发支持票证系统并决定实施电子邮件功能。如果创建了票证,则会通过电子邮件向客户发送详细信息。PHP邮件解析 - 排除签名

不过,我的问题自带的客户端响应此电子邮件。我如何去除除电子邮件的主要内容之外的所有内容?我不是在寻找一些神奇的方法来确切地知道身体是什么,如果他们不能得到帮助,一些额外的位是好的,但是什么是消除尽可能多的不必要信息的最好方法?

我倒是认为找出不同的电子邮件客户端如何格式化它们的回复信息,然后利用该代码删除任何不必要的信息检测不同的弦...例如Outlook 2013做了这样的事情;

My reply body. 

-----Original Message----- 
From: Some Guy [mailto:[email protected]] 
Sent: 14 September 2016 5:26 PM 
To: 'Ticket System' <[email protected]> 
Subject: RE: The Ticket [accountid][ticketid:6843] 

The original message body. 

所以我会删除“-----原始消息-----”下面的任何内容。

而雷鸟只是格式化这样的答复;

My reply body. 

On 23/09/2016 5:01 PM, Some Guy wrote: 
> The original message body. 

所以我不得不删除下面任何东西“在XX/XX/XXX X:xx月xx,...”等。但是这种方法并不十分可靠的一切,尤其是不未来的证明。

是否有你能想到的任何替代方案?否则,我只需将所有这些信息不必要地存储到数据库中。

+1

只要记住“原始信息”和“关于XX/XX/XXXX”是英文为您的样品集,但它们可以在*任何*语言和*任何*格式,包括不是那里。同样,请记住,您的受访者可能会发布帖子,底部帖子或联机发布回复。因为你不能确定*答复的地方,所以我建议存储所有内容,然后*可能*在你的显示器中使用一种启发式方法来勾画出可能的原始信息(顺便说一句,你可以用'diff ')。 – bishop

+0

@bishop非常真实,我没有想到这一点。 – Ridai

回答

2

我会在回复正文下方添加一个独特的边界。所以,你的回复原始消息将永远是这样的:

$unique_boundary = md5(time()); 

$raw_message = $your_reply . $unique_boundary . $the_rest; 

然后

$explode = explode($unique_boundary, $raw_message); 

,并在你的DB:

$reply = $explode[0]; 
$sql = "INSERT INTO email_table (message_content) VALUES ($reply)"; 

根据用户的反馈,将工作的解决方案无论在哪里你的答复空间出现在消息链:

$raw_message = $start_content . $unique_boundary . $your_reply . $unique_boundary . $the_rest; 

在这种情况下,您的回复不一定位于电子邮件链的顶部,您的回复将始终为$explode[1]

+0

一个好的建议,但只适用于被访者的顶级职位,而不是他的底线或内联职位。 – bishop

+0

我会如何将消息分割开始?例如。我只有$消息,其中(最有可能)包含第一个PHP生成的电子邮件(客户端正在回复)+他们的内联回复(唯一我想要的)被传递给一个PHP脚本(我工作的那个上)。不太确定如何分离$ your_reply和$ the_rest。 – Ridai

+0

如果我了解你(也许我不知道),那么你问你如何检索随机边界以实际爆炸?你可以将独特边界保存在数据库中作为另一个字段吗?否则,你可以想出一些疯狂的角色组合,例如** xR45_ + gH3241!@ ww **等等并将其作为应用程序或配置文件中定义的恒定边界 –