У меня есть этот код. Это из примера Zend Reading Mail .
$message = $mail->getMessage(1); // output first text/plain part $foundPart = null; foreach (new RecursiveIteratorIterator($mail->getMessage(1)) as $part) { try { if (strtok($part->contentType, ';') == 'text/plain') { $foundPart = $part; break; } } catch (Zend_Mail_Exception $e) { // ignore } } if (!$foundPart) { echo 'no plain text part found'; } else { echo $foundPart->getContent(); }
То, что я могу получить, – это сообщение, которое прекрасно работает. Но попытка декодировать сообщение во что-то читаемое не работает. Я не пробовал Zend_Mime, imap_mime и iconv.
Это пример того, что я получаю с помощью $foundPart->getContent();
Hall = F3 heim = FAr
Он должен сказать: «Halló heimúr»
То, что я хотел бы, это просто библиотека, где я мог бы «нажимать кнопку, получать бекон» на практике. Я имею в виду, я просто хочу указать библиотеку в поле электронной почты POP3 и получить электронное письмо в удобочитаемой форме (без каких-либо проблем с кодировкой) и вложения.
imap_mime_header_decode()
Дает мне массив с теми же данными.
iconv_ mime_ decode()
Делает то же самое
Кто-нибудь знает, почему это происходит или какая-то библиотека, где я могу просто отвлечь это (PHP / Python или Perl)
Это может быть из-за кодировки base64. Документы Zend_Mail говорят (под «кодировкой»):
… Все другие вложения закодированы через base64, если в вызове addAttachment () не назначена другая кодировка или назначена для объекта части MIME позже.
Попробуйте что-нибудь вроде:
echo base64_decode($foundPart->getContent());
Также читайте: http://framework.zend.com/manual/en/zend.mail.encoding.html
Надеюсь, что это помогло.
Я столкнулся с некоторыми подобными проблемами, изучая, как использовать Zend_Mail для чтения электронных писем. Вам нужно будет добавить дополнительную логику, которую Zend_Mail не реализует, например, декодирование закодированных электронных писем и преобразование набора символов. Вот что я делаю после поиска части обычного текста:
$content = $foundPart->getContent(); switch ($foundPart->contentTransferEncoding) { case 'base64': $content = base64_decode($content); break; case 'quoted-printable': $content = quoted_printable_decode($content); break; } //find the charset preg_match('/charset="(.+)"$/', $foundPart->contentType, $matches); $charset = $matches[1]; if ($charset == 'iso-8859-1') { $content = utf8_encode($content); //convert to utf8 }