使用imap_fetchstructure定位HTML和纯文本

时间:2014-08-26 10:49:08

标签: php gmail imap

我想使用imap_fetchstructure找到html和/或纯文本。 我尝试了几种解决方案,但电子邮件并不总是具有相同的结构。 我实际上在使用:

$message=imap_fetchbody($inbox, $number, "1.2.1");
if ($message== "") { 
  $message =imap_fetchbody($inbox, $number, "1.1"); 
}
if ($message== "") {
    $message = imap_fetchbody($inbox, $number, "1"); 
} 
    $message = imap_qprint($body);

尝试时;结果有时是正确的,有时返回附件的内容取决于邮件服务器。 所以我想要一个基于Imap_fetchstructure的解决方案。

2 个答案:

答案 0 :(得分: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 = array("TEXT", "MULTIPART", "MESSAGE", "APPLICATION",
        "AUDIO", "IMAGE", "VIDEO", "OTHER");

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

答案 1 :(得分:0)

你可以这样使用来区分html和纯文本:

$inbox = imap_open($hostName,$userName,$pwd) or die('Cannot connect (Allow gmail IMAP): ' . imap_last_error());
$emails = imap_search($inbox,'UNSEEN');
if($emails){
    rsort($emails);
    foreach($emails as $email_number){
        $structure = imap_fetchstructure($inbox, $email_number);
        
        if(isset($structure->parts) && is_array($structure->parts) && isset($structure->parts[1])) {// IF HTML

            
            $part = $structure->parts[1];
            $receivedEmailContent = imap_fetchbody($inbox,$email_number,2);
            if($part->encoding == 3) {
                $receivedEmailContent = imap_base64($receivedEmailContent);
                
            } else if($part->encoding == 1) {
                $receivedEmailContent = imap_8bit($receivedEmailContent);
                
            } else {
                $receivedEmailContent = imap_qprint($receivedEmailContent);
            }

        }else{//IF NOT HTML
            $receivedEmailContent = imap_fetchbody($inbox,$email_number,1);
            
            if($structure->type == 0){
                $receivedEmailContent = imap_base64($receivedEmailContent);
            }else{
                $receivedEmailContent = imap_qprint($receivedEmailContent);
            }
        }

        $receivedEmailContent = strip_tags($receivedEmailContent);
        $header = imap_headerinfo ( $inbox, $email_number);
        $receivedEmailTitle = $header->subject;
        $receivedEmailSenderName = $header->from[0]->personal;
        $receivedEmailSenderEmail = $header->from[0]->mailbox . "@" . $header->from[0]->host;

          
    }
}
imap_close($inbox);