【问题标题】:extract body from raw email with regex使用正则表达式从原始电子邮件中提取正文
【发布时间】:2012-05-16 10:35:06
【问题描述】:
--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/plain 和 text/html 内容?
  2. 电子邮件是否只有 1 个内容正文?由 text/html 和 text/plain 组成

*这是一个 sn-p 我目前做错了什么。

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

【问题讨论】:

标签: php regex email


【解决方案1】:

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

你的规则是:

  • 如果出现双换行符,则正文开始 - 纯文本类型(因为没有标题指示哪个)。
  • 否则,继续直到获得“boundary=”位,然后记录边界并跳入“寻找边界”模式。
  • 然后,当您找到边界时,跳入“寻找内容类型或双换行”模式,并寻找内容类型(并注意内容类型)或双换行(标题已完成,身体接下来直到下一个边界)
  • 在阅读邮件正文时,您将返回“寻找边界”模式以重复此过程。

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


编辑:问题中提出的附加信息。一封电子邮件可以包含用户希望编码的任意数量的“正文”。您可以拥有纯文本和 HTML、UTF 编码版本和 RTF 版本,甚至是摩尔斯电码版本(如果客户端知道如何处理“Content-Type Morse/Code”!)。有时你没有得到纯文本,而只有 HTML 版本(顽皮的用户)。有时 HTML 实际上没有内容类型声明(可能会或可能不会显示为 HTML,具体取决于客户端)。边界也分裂了附件。丰富的测试是 Outlook 的一个陷阱(虽然,公平地说,它通常被转换为 HTML)。所以不,介于 0 和 X 体之间。

【讨论】:

  • “我认为你最好一次走下电子邮件行,因为换行符在电子邮件形成中更为关键。” - 对于我试图找到 FROM 的情况: - 我用 RegEx 来思考它...逐行似乎更安全。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 2014-12-04
  • 2018-12-04
  • 2016-04-28
相关资源
最近更新 更多