Извлечь основной текст из электронной почты PHP

В настоящее время я использую поток imap для получения писем из почтового ящика.

Все работает нормально, за исключением того, что я не знаю, как получить основной текст и заголовок электронного письма. Если я выполню imap_body($connection,$message), в текст будет включен эквивалент вложения электронной почты с основанием 64.

В настоящее время я использую эту функцию для получения вложений.

http://www.electrictoolbox.com/function-extract-email-attachments-php-imap/


person Lime    schedule 24.11.2010    source источник


Ответы (3)


Ну, с функцией php imap работать неинтересно. Пользователь на этой странице объясняет несоответствия с получением электронных писем: http://php.net/manual/en/function.imap-fetchbody.php#89002

Используя его полезную информацию, я создал надежный способ получения основного текста электронного письма.

$bodyText = imap_fetchbody($connection,$emailnumber,1.2);
if(!strlen($bodyText)>0){
    $bodyText = imap_fetchbody($connection,$emailnumber,1);
}
$subject = imap_headerinfo($connection,$i);
$subject = $subject->subject;

echo $subject."\n".$bodyText;
person Lime    schedule 25.11.2010
comment
Большое спасибо. Погуглив 4 часа, я нашел рабочий пример. - person Himanshu Yadav; 14.09.2012
comment
О чем это 1.2? - person pguardiario; 13.01.2014
comment
@pguardiario Я понятия не имею, хотя, если вы нажмете на ссылку выше, это может кому-то помочь. Я считаю, что нашел решение методом проб и ошибок. - person Lime; 14.01.2014
comment
@pguardiario Это часть документа MIME, состоящего из нескольких частей, которую вы хотите получить. Например. текст/обычный, текст/html... - person Alex W; 18.08.2015

Мое решение (работает со всеми типами и кодировками):

function format_html($str) {
    // Convertit tous les caractères éligibles en entités HTML en convertissant les codes ASCII 10 en $lf
    $str = htmlentities($str, ENT_COMPAT, "UTF-8");
    $str = str_replace(chr(10), "<br>", $str);
    return $str;
}


// Start

$obj_structure = imap_fetchstructure($imapLink, $obj_mail->msgno);

// Recherche de la section contenant le corps du message et extraction du contenu
$obj_section = $obj_structure;
$section = "1";
for ($i = 0 ; $i < 10 ; $i++) {
    if ($obj_section->type == 0) {
        break;
    } else {
        $obj_section = $obj_section->parts[0];
        $section.= ($i > 0 ? ".1" : "");
    }
}
$text = imap_fetchbody($imapLink, $obj_mail->msgno, $section);
// Décodage éventuel
if ($obj_section->encoding == 3) {
    $text = imap_base64($text);
} else if ($obj_section->encoding == 4) {
    $text = imap_qprint($text);
}
// Encodage éventuel
foreach ($obj_section->parameters as $obj_param) {
    if (($obj_param->attribute == "charset") && (mb_strtoupper($obj_param->value) != "UTF-8")) {
        $text = utf8_encode($text);
        break;
    }
}

// End
print format_html($text);
person Jerry    schedule 03.04.2017
comment
Этот должен быть принят. Работает для большего количества типов электронных писем, чем текущий принятый ответ. Спасибо! - person Parampal Pooni; 17.12.2020

Вы также можете попробовать эти

content-type:text/html

$message = imap_fetchbody($inbox,$email_number, 2);

content-type:plaintext/text

$message = imap_fetchbody($inbox,$email_number, 1);
person Kailas    schedule 21.08.2013