Php 如何仅从imap_正文结果中提取HTML

Php 如何仅从imap_正文结果中提取HTML,php,html,imap,Php,Html,Imap,我只想从imap_主体结果中提取HTML内容。 imap机构提供邮件的逐字副本。 参数3,“截面”如下所示: 零件号。它是一个由句点分隔的整数字符串,根据IMAP4规范,句点索引到车身零件列表中 因此,要获取邮件的HTML部分,必须使用1.2选项作为第三个参数。像这样: $message = imap_fetchbody($inbox, $number, 1.2); 我找到了一个解决方案: function getBody($uid, $imap) { $body = $this-&g

我只想从imap_主体结果中提取HTML内容。 imap机构提供邮件的逐字副本。

参数3,“截面”如下所示:

零件号。它是一个由句点分隔的整数字符串,根据IMAP4规范,句点索引到车身零件列表中

因此,要获取邮件的HTML部分,必须使用1.2选项作为第三个参数。像这样:

$message = imap_fetchbody($inbox, $number, 1.2);

我找到了一个解决方案:

function getBody($uid, $imap)
{
    $body = $this->get_part($imap, $uid, "TEXT/HTML");
    // if HTML body is empty, try getting text body
    if ($body == "") {
        $body = $this->get_part($imap, $uid, "TEXT/PLAIN");
    }
    return $body;
}

function get_part($imap, $uid, $mimetype, $structure = false, $partNumber = false)
{
    if (!$structure) {
        $structure = imap_fetchstructure($imap, $uid, FT_UID);
    }
    if ($structure) {
        if ($mimetype == $this->get_mime_type($structure)) {
            if (!$partNumber) {
                $partNumber = 1;
            }
            $text = imap_fetchbody($imap, $uid, $partNumber, FT_UID);
            switch ($structure->encoding) {
                case 3:
                    return imap_base64($text);
                case 4:
                    return imap_qprint($text);
                default:
                    return $text;
            }
        }

        // multipart
        if ($structure->type == 1) {
            foreach ($structure->parts as $index => $subStruct) {
                $prefix = "";
                if ($partNumber) {
                    $prefix = $partNumber . ".";
                }
                $data = $this->get_part($imap, $uid, $mimetype, $subStruct, $prefix . ($index + 1));
                if ($data) {
                    return $data;
                }
            }
        }
    }
    return false;
}

function get_mime_type($structure)
{
    $primaryMimetype = ["TEXT", "MULTIPART", "MESSAGE", "APPLICATION", "AUDIO", "IMAGE", "VIDEO", "OTHER"];

    if ($structure->subtype) {
        return $primaryMimetype[(int)$structure->type] . "/" . $structure->subtype;
    }
    return "TEXT/PLAIN";
}

我没有足够的声誉来添加评论,但我只是想在@GunniH的回答中澄清,您对函数的调用应该如下所示:

$message=imap_fetchbody($inbox,$number,'1.2')

而不是这个

$message=imap\u fetchbody($inbox,$number,1.2)


最后一个参数应该是
字符串
,而不是
int

,这仅适用于消息遵循此结构的情况。许多电子邮件没有,如果包含附件,它们也不会遵循这种结构。最好的方法是解析bodystructure以找到所需的HTML部分。谢谢您的回答。不幸的是,我尝试了这个方法,但没有成功。@Max你能帮我找到一个身体结构的方法吗。
imap\u fetchbody($inbox,$number,2)为me1.2工作不是int而是float。但这两种输入都应该有效。
imap_fetchbody($inbox,$number,2)为我工作,
imap_fetchbody($inbox,$number,2)可能重复为megreat解决方案工作!完美地提供了HTML输出
function getBody($uid, $imap)
{
    $body = $this->get_part($imap, $uid, "TEXT/HTML");
    // if HTML body is empty, try getting text body
    if ($body == "") {
        $body = $this->get_part($imap, $uid, "TEXT/PLAIN");
    }
    return $body;
}

function get_part($imap, $uid, $mimetype, $structure = false, $partNumber = false)
{
    if (!$structure) {
        $structure = imap_fetchstructure($imap, $uid, FT_UID);
    }
    if ($structure) {
        if ($mimetype == $this->get_mime_type($structure)) {
            if (!$partNumber) {
                $partNumber = 1;
            }
            $text = imap_fetchbody($imap, $uid, $partNumber, FT_UID);
            switch ($structure->encoding) {
                case 3:
                    return imap_base64($text);
                case 4:
                    return imap_qprint($text);
                default:
                    return $text;
            }
        }

        // multipart
        if ($structure->type == 1) {
            foreach ($structure->parts as $index => $subStruct) {
                $prefix = "";
                if ($partNumber) {
                    $prefix = $partNumber . ".";
                }
                $data = $this->get_part($imap, $uid, $mimetype, $subStruct, $prefix . ($index + 1));
                if ($data) {
                    return $data;
                }
            }
        }
    }
    return false;
}

function get_mime_type($structure)
{
    $primaryMimetype = ["TEXT", "MULTIPART", "MESSAGE", "APPLICATION", "AUDIO", "IMAGE", "VIDEO", "OTHER"];

    if ($structure->subtype) {
        return $primaryMimetype[(int)$structure->type] . "/" . $structure->subtype;
    }
    return "TEXT/PLAIN";
}