Привет, ребята, я пытаюсь прочитать почтовый ящик для своего приложения – здесь я использую фреймворк zend. Проблема в том, что я не могу получить тело сообщения для определенных писем. Ниже приводится мой код относительно того, как я это делаю:
$mail = new Zend_Mail_Storage_Imap($mail_options); $all_messages = array(); $page = isset($_GET['page'])?$_GET['page']:1; $limit = isset($_GET['limit'])?$_GET['limit']:20; $offset = (($page-1)*$limit)+1; $end = ($page*$limit)>$c?$c:($page*$limit); for ($i=$offset;$i<=$end;$i++){ $h2t = new html2text(); $h2t->set_allowed_tags('<a>'); if(!$mail[$i]) break; else{ $one_message = $mail->getMessage($i); $one_message->id = $i; $one_message->UID = $mail->getUniqueId($i); $one_message->parts = array(); $one_message->body = ''; $count = 1; foreach (new RecursiveIteratorIterator($mail->getMessage($i)) as $ii=>$part) { try { $tpart = $part; //$tpart->_content = ''; $one_message->parts[$count] = $tpart; $count++; // check for html body if (strtok($part->contentType, ';') == 'text/html') { $b = $part->getContent(); if($part->contentTransferEncoding == 'quoted-printable') $b = quoted_printable_decode($b); $one_message->html_body = $b; $h2t->set_html($b); $one_message->body = $h2t->get_text(); } //check for text body if (strtok($part->contentType, ';') == 'text/plain') { $b = $part->getContent(); if($part->contentTransferEncoding == 'quoted-printable') $b = quoted_printable_decode($b); $one_message->text_body = $b; $one_message->body = $b;//$part->getContent(); } } catch (Zend_Mail_Exception $e) { // ignore } } $all_messages[] = $one_message; } }
Проблема в том, что случайным образом некоторые сообщения не возвращают даже текстовое тело или тело html. Несмотря на то, что если я проверю использование клиента webvmail, у этих писем есть тело сообщения. Чего мне здесь не хватает?
Вам нужно проверить, является ли почта первым сообщением, прежде чем перебирать детали. Если он не является многочастным, тогда тело будет отображаться через $mail->getContent()
вместо части. Основной пример:
if ($mail->isMultiPart()) { // Multipart messages handled here foreach() { // loop over parts } } else { // Non multipart messages handled here // default text_body $one_message->text_body = $mail->getContent(); if (strtok($msg->contentType, ';') == 'text/html') { // HTML email with no plain text alternative, set both values $one_message->body = $mail->getContent(); $one_message->text_body = strip_tags($mail->getContent()); } }