使用正则表达式从原始电子邮件中提取正文


extract body from raw email with regex

--047d7b33d6decd251504bfe78895
Content-Type: multipart/alternative; boundary=047d7b33d6decd250d04bfe78893
--047d7b33d6decd250d04bfe78893
Content-Type: text/plain; charset=UTF-8
twest
ini sebuah proiduct abru
awdawdawdawdwa
aw
awdawdaw
--047d7b33d6decd250d04bfe78893
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div class=3D"gmail_quote">twest=C2=A0<div><br></div><div>ini sebuah proidu=
ct abru</div><div><br></div><div>awdawdawdawdwa</div><div><br></div><div>aw=
</div><div>awdawdaw</div>
</div><br>
--047d7b33d6decd250d04bfe78893--
  1. 如何使用正则表达式获取邮件文本/纯文本和文本/HTML 内容?
  2. 电子邮件只有 1 个内容正文吗? 由文本/HTML 和文本/纯文本组成

*这是我目前做错了什么的片段。

    $parts = explode('--', $this->rawemail);
    $this->headers = imap_rfc822_parse_headers($this->rawemail);
    # var_dump($parts);
    # Process the parts
    foreach ($parts as $part) 
    {
        # Get Content text/plain
        if (preg_match('/Content-Type: text'/plain;/', $part)) 
        {
            $body_parts = preg_split('/'n'n/', $part);
            # If Above the newline (Headers)
            if ($body_parts[0]) 
            {
                # var_dump($body_parts[0]);
            }
            # If Below the newline (Data)
            if ($body_parts[1]) 
            {
                var_dump($body_parts[1]);
            }
        }
        # Get Content text/html
        if (preg_match('/Content-Type: text'/html;/', $part)) 
        {
            $body_parts = preg_split('/'n'n/', $part);
            # If Above the newline (Headers)
            if ($body_parts[0]) 
            {
                # var_dump($body_parts[0]);
            }
            # If Below the newline (Data)
            if ($body_parts[1]) 
            {
                var_dump($body_parts[1]);
            }
        }

我认为您最好一次浏览电子邮件行,因为在电子邮件形成中更关键的是换行符。

您的规则是:

  • 如果出现双换行符,则正文正在开始 - 纯文本类型(因为没有标题指示哪个(。
  • 否则,继续直到获得"边界
  • ="位,然后记录边界并跳入"查找边界"模式。
  • 然后,当您找到边界时,跳入"查找内容类型或双换行符"模式,并查找内容类型(和注释内容类型(或双换行符(标题已完成,正文紧随其后,直到下一个边界(
  • 在阅读消息正文时,您将返回到"查找边界"模式以重复该过程。

我记得很久以前的事情 - 所以以下内容可能不是 100% 准确的,但我会提到以防万一。小心带有附件的文件,因为您可以获得两个"边界"标记。但是一个边界在另一个边界内,所以如果你遵循上面的规则(即抓住第一个边界并坚持下去(,那么你应该没问题。但是使用一些附件测试您的脚本:)


编辑:问题中询问的其他信息。电子邮件可以具有用户希望编码的任意数量的"正文"。你可以有一个普通的,HTML,UTF编码版本,RTF版本,甚至是摩尔斯电码版本(如果客户端知道如何处理"内容类型莫尔斯/电码"!(。有时你不会得到纯文本,而只会得到HTML版本(顽皮的用户(。有时,HTML 实际上没有内容类型声明(根据客户端的不同,可能会也可能不会显示为 HTML(。边界也会分割附件。丰富的测试是Outlook的一个陷阱(尽管公平地说,它通常被转换为HTML(。所以不,有介于 0 和 X 实体之间的某个地方。