2009-05-07 3 views
3

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

Он должен сказать "Алло heimúr"

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

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

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

ответ

2

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

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

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

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

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

Надежда, что помогло как-то.

+0

imap_qprint() был трюком. Спасибо :) –

+2

Это не base64 закодировано. Он цитируется: http://en.wikipedia.org/wiki/Quoted-printable –

+0

Правильно, ответ не такой простой. Обратитесь к моему ответу за более полное решение. – Andrew

13

Я столкнулся с некоторыми подобными проблемами, изучая, как использовать 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

Ты мужчина! Это должен быть принятый ответ, так как он охватывает как кодировки base64, так и кавычки (в моем случае это был последний). –

Смежные вопросы