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

时间:2012-05-16 10:35:06

标签: php regex email

--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. 如何使用正则表达式获取邮件文本/纯文本和text / html内容?
  2. 电子邮件只有1个内容正文吗?包含text / html和text / plain
  3. *这是一个片段,我目前做错了。

        $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]);
                }
            }
    

1 个答案:

答案 0 :(得分:4)

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

您的规则是:

  • 如果你得到一个双线换行符,那么正文开始 - 纯文本类型(因为没有标题来指示哪一个)。
  • 否则,继续直到你得到“boundary =”位,然后你记录边界并跳到“寻找边界”模式。
  • 然后,当您找到边界时,跳转到“寻找内容类型或双重换行”模式,并查找Content-Type(和note content-Type)或双重换行(标题已完成,身体接下来直到下一个边界)
  • 在阅读邮件正文时,您又回到“寻找边界”模式重复这个过程。

我很久以前记得的东西 - 所以下面可能不是100%准确,但我会提到以防万一。注意带有attachemnts的文件,因为你可以获得两个“边界”标记。但是一个边界是另一个边界,所以如果你遵循上面的规则(即抓住第一个边界并坚持下去)那么你应该没事。但是用一些附件来测试你的脚本:)


编辑:问题中提出的其他信息。电子邮件可以包含用户希望编码的“主体”。您可以使用普通的,HTML,UTF编码版本,RTF版本甚至摩尔斯电码版本(如果客户端知道如何处理“内容类型莫尔斯/代码”!)。有时你不会得到纯文本,但只有HTML版本(顽皮的用户)。有时HTML实际上没有内容类型声明(可能会也可能不会显示为HTML,具体取决于客户端)。边界也会分离附件。丰富的测试是来自Outlook的问题(尽管,公平地说,它通常被转换为HTML)。所以不,介于0和X体之间。