PHP - 过滤电子邮件正文,删除回复引用

11

我正在开发一个邮件管道脚本,需要保存只回复内容而不是原始引用的电子邮件。我正在使用一个mime解析器类(http://www.phpclasses.org/package/3169-PHP-Decode-MIME-e-mail-messages.html)从电子邮件中获取所需的所有信息:

Message ID: AANLkTimYRxMJwjLSdcDP5ksM=xxx@mail.gmail.com
Reply ID: 20110316205225.xxx@example.com

Subject: Re: MessageX
To:  q1-1234567890@example.com
From: Someone someone@someothersite.com

Body: Hello,
Blah Blah Blah
-Someone

On Wed, Mar 16, 2011 at 3:52 PM,  <q1-1234567890@example.com> wrote:
> Hello,
>
> Some other blah, blah, blah.
>
> Thank you,
> Me

在邮件正文部分,我得到了原始引用的邮件。如何过滤掉这部分内容?我知道邮件客户端经常在引用的内容旁边添加“>”,但我不确定这是否足够好。感谢您的帮助。


4
听起来你正在进行一种类似于客户支持的电子邮件回复系统。我经常在原始电子邮件中看到类似于“============= 在此线以上回复 ===============”的字符串,这样就可以轻松找到它,并剪切掉所有回复引用。显然,这可能根本不是你想要做的事情,但也可能是一个有效的选项。 - Blair McMillan
1个回答

11

这可能可以通过正则表达式完成。尝试:

$text = preg_replace('#(^\w.+:\n)?(^>.*(\n|$))+#mi', "", $text);

谢谢您的快速回答,目前它运行良好。是否存在任何可能导致其无法正常工作的情况? - davishmcclurg
有一些电子邮件客户端允许或在邮件中使用 > 符号。或者,如果您发送源代码或差异等内容,为了使其更加强健,您可以在正则表达式中将最后一个 + 替换为 {2,}。有了这个修改,它只会匹配至少两行连续的 >,这是引用部分的明确标志。 - mario
这个问题不可能有完美的解决方案。在电子邮件中,有可能(虽然不太可能)出现看起来像回复部分的内容。请考虑此代码片段的第10到13行(我修改了您的原始示例)。很可能会删除那些行。 - Mr. Llama
好的,我认为它运行得相当不错。一个问题:正则表达式中的#符号是什么作用?我找不到任何相关信息。非常感谢你的帮助。 - davishmcclurg
2
@davishmcclurg,# 只是正则表达式的替代分隔符。使用 #...*# 等同于 /...*/ - mario
@mario 这个完美地运作了,但你能展示更多针对不同流行电子邮件客户端的正则表达式吗?比如...雅虎、Rediff、Outlook等。 - TechCare99

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接