2009-05-07 6 views
3

J'ai ce code. C'est à partir de l'exemple Zend Reading Mail.Pourquoi ce message électronique ne décode-t-il pas correctement?

$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(); 
} 

Ce que je peux obtenir est le message, qui fonctionne bien. Mais essayer de décoder le message en quelque chose de lisible ne fonctionne pas. J'ai essayé Zend_Mime, imap_mime et iconv sans chance.

Voici un exemple de ce que je reçois avec $foundPart->getContent();

Salle = F3 heim = FAr

Il faut dire "Halló heimúr"

Ce que je veux est que quelques-uns bibliothèque où je pouvais "appuyer sur le bouton, recevoir du bacon" dans la pratique. Ce que je veux dire, c'est que je veux juste pointer la bibliothèque vers une boîte email POP3 et obtenir l'email sous une forme lisible (sans aucun problème d'encodage) et les pièces jointes.

imap_mime_header_decode() Donne-moi un tableau avec les mêmes données.
iconv_ mime_ decode() Est-ce que le même

Est-ce que quelqu'un a une idée pourquoi cela se passe ou une bibliothèque où je peux juste abstraite cette distance (PHP/Python ou Perl)

Répondre

2

Cela pourrait être dû au fait de l'encodage base64. Les Zend_Mail docs disent (sous 'encoding'):

... Toutes les autres pièces jointes sont encodées via base64 si aucun autre encodage est donné dans l'appel addAttachment() ou attribué à l'objet partiel MIME plus tard.

Essayez quelque chose comme:

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

Aussi, lisez: http://framework.zend.com/manual/en/zend.mail.encoding.html

espoir qui a contribué en quelque sorte.

+0

imap_qprint() était l'astuce. Merci :) –

+2

Ce n'est pas codé en base64. C'est Coté-imprimable: http://en.wikipedia.org/wiki/Quoted-printable –

+0

Pawel a raison, la réponse n'est pas si simple. Reportez-vous à ma réponse pour une solution plus complète. – Andrew

13

J'ai rencontré des problèmes similaires tout en apprenant à utiliser Zend_Mail pour lire des emails. Vous devrez ajouter une logique supplémentaire que Zend_Mail n'implémente pas, comme le décodage des e-mails encodés et la conversion du jeu de caractères. Voici ce que je fais après avoir trouvé la partie texte:

$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

Vous êtes l'homme! Cela devrait être la réponse acceptée, car elle couvre à la fois les encodages base64 et quoted-printable (dans mon cas c'était le dernier). –

Questions connexes