Intereting Posts

Почему это почтовое сообщение не декодируется правильно?

У меня есть этот код. Это из примера 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 }