Почему это почтовое сообщение не расшифровывается правильно?
-
08-07-2019 - |
Вопрос
У меня есть этот код.Это из Zend Читает Почту пример.
$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();
Зал=F3 высота= Далеко
На нем должно быть написано "Привет, хеймур".
Чего бы я хотел, так это просто какой-нибудь библиотеки, где я мог бы "нажать кнопку, получить бекон" на практике.Я имею в виду, что я просто хочу указать библиотеке на почтовый ящик 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
}