Perché questo messaggio non viene decodificato correttamente?
-
08-07-2019 - |
Domanda
Ho questo codice. Viene dall'esempio 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();
}
Quello che posso ottenere è il messaggio, che funziona benissimo. Ma provare a decodificare il messaggio in qualcosa di leggibile non funziona. Ho provato Zend_Mime, imap_mime e iconv senza fortuna.
Questo è un esempio di ciò che ottengo con $foundPart->getContent();
Hall = F3 heim = FAr
Dovrebbe essere indicato " Hall & # 243; heim & # 250; r "
Quello che vorrei è solo una libreria in cui potrei " pulsante, ricevere pancetta " in pratica. Voglio dire, voglio solo indirizzare la libreria verso una casella di posta elettronica POP3 e ottenere l'e-mail in forma leggibile (senza problemi di codifica) e gli allegati.
imap_mime_header_decode ()
Mi dà un array con gli stessi dati.
iconv_ mime_ decode ()
Fa lo stesso
Qualcuno ha idea del perché questo stia accadendo o di qualche libreria in cui posso semplicemente sottrarlo (PHP / Python o Perl)
Soluzione
Ciò potrebbe essere dovuto alla codifica base64. I documenti di Zend_Mail dicono (sotto "codifica"):
... Tutti gli altri allegati sono codificati tramite base64 se non è presente alcuna altra codifica indicato nella chiamata addAttachment () o assegnato all'oggetto parte MIME più tardi.
Prova qualcosa del tipo:
echo base64_decode($foundPart->getContent());
Leggi anche: http://framework.zend.com/manual/en/zend. mail.encoding.html
Spero che abbia aiutato in qualche modo.
Altri suggerimenti
Ho riscontrato alcuni problemi simili durante l'apprendimento di come utilizzare Zend_Mail per leggere le e-mail. Dovrai aggiungere una logica aggiuntiva che Zend_Mail non implementa, come la decodifica delle email codificate e la conversione del set di caratteri. Ecco cosa sto facendo dopo aver trovato la parte in testo semplice:
$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
}