Почему это почтовое сообщение не декодируется правильно? - PullRequest
3 голосов
/ 07 мая 2009

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

Зал = F3 heim = FAr

Надо сказать «Halló heimúr»

То, что я хотел бы, это просто какая-нибудь библиотека, где я мог бы «нажимать кнопку, получать бекон» на практике. Я просто хочу указать библиотеке на почтовый ящик POP3 и получить письмо в удобочитаемой форме (без проблем с кодировкой) и вложения.

imap_mime_header_decode() Дает мне массив с теми же данными.
iconv_ mime_ decode() делает то же самое

Кто-нибудь знает, почему это происходит, или какую-то библиотеку, где я могу просто абстрагироваться (PHP / Python или Perl)

Ответы [ 2 ]

13 голосов
/ 12 июля 2011

Я столкнулся с некоторыми похожими проблемами, изучая, как использовать 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
}
2 голосов
/ 07 мая 2009

Это может быть из-за кодировки base64. Документы Zend_Mail говорят (в «кодировке»):

... Все остальные вложения закодированы через base64, если нет другой кодировки дано в вызове addAttachment () или присваивается объекту детали MIME позже.

Попробуйте что-то вроде:

echo base64_decode($foundPart->getContent());

Также читайте: http://framework.zend.com/manual/en/zend.mail.encoding.html

Надеюсь, это помогло.

...