在 php 中解析原始电子邮件

2022-08-30 13:42:22

我正在寻找好的/工作的/易于使用的PHP代码,用于将原始电子邮件解析为多个部分。

我已经写了几个蛮力解决方案,但每次,一个小的更改/标头/空间/某些东西出现,我的整个解析器失败,项目崩溃。

在我被指向PEAR / PECL之前,我需要实际的代码。我的主机有一些糟糕的配置或其他东西,我似乎永远无法正确构建.so。如果我确实得到了.so made,那么path/environment/php.ini并不总是使它可用(apache vs cron vs CLI)。

哦,最后一件事,我正在解析原始电子邮件文本,而不是POP3,也不是IMAP。它通过.qmail电子邮件重定向被管道传输到PHP脚本中。

我不指望SOF为我写它,我正在寻找一些关于“正确”的提示/起点。这是我知道已经解决的“轮子”问题之一。


答案 1

你希望最后得到什么?身体,主题,发件人,附件?您应该花一些时间使用RFC2822来了解邮件的格式,但以下是格式良好的电子邮件的最简单规则:

HEADERS\n
\n
BODY

也就是说,第一个空行(双换行符)是 HEADERS 和 BODY 之间的分隔符。标题如下所示:

HSTRING:HTEXT

HSTRING 始终从行的开头开始,不包含任何空格或冒号。HTEXT 可以包含各种各样的文本,包括换行符,只要换行符后跟空格即可。

“BODY”实际上只是第一个双换行符后面的任何数据。(如果您通过SMTP传输邮件,则有不同的规则,但是通过管道处理它您不必担心)。

因此,在非常简单的1982 RFC822术语中,电子邮件如下所示:

HEADER: HEADER TEXT
HEADER: MORE HEADER TEXT
  INCLUDING A LINE CONTINUATION
HEADER: LAST HEADER

THIS IS ANY
ARBITRARY DATA
(FOR THE MOST PART)

不过,大多数现代电子邮件比这更复杂。标头可以编码为字符集或RFC2047哑剧单词,或者我现在没有想到的大量其他东西。这些天,这些身体真的很难滚动你自己的代码,如果你想让它们有意义的话。MUA生成的几乎所有电子邮件都将采用MIME编码。这可能是uuencoded文本,它可能是html,它可能是uuencoded excel电子表格。

我希望这有助于提供一个框架来理解一些非常基本的电子邮件桶。如果您提供有关您尝试使用数据执行的操作的更多背景信息,我(或其他人)可能能够提供更好的方向。


答案 2

尝试使用Plancake PHP电子邮件解析器:https://github.com/plancake/official-library-php-email-parser

我已经将它用于我的项目。它工作得很好,它只是一个类,它是开源的。


推荐