Question

J'ai ce code. Cela provient de l'exemple 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();
}

Ce que je peux obtenir, c’est le message, cela 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 succès.

Ceci est un exemple de ce que j'obtiens avec $ foundPart- > getContent ();

  

Hall = F3 heim = FAr

Il faut dire "Halló heimúr"

Ce que je voudrais, c'est juste une bibliothèque où je pourrais "cliquer sur un bouton, recevoir du bacon". en pratique. Ce que je veux dire, c’est que je veux simplement diriger la bibliothèque vers une boîte aux lettres POP3 et obtenir le courrier sous forme lisible (sans problème d’encodage) et les pièces jointes.

imap_mime_header_decode () me donne un tableau avec les mêmes données.
iconv_ mime_ decode () Fait la même chose

Est-ce que quelqu'un a une idée de la raison pour laquelle cela se produit ou d'une bibliothèque où je peux résumer ceci (PHP / Python ou Perl)

Était-ce utile?

La solution

Cela peut être dû au codage base64. Les documents Zend_Mail disent (sous 'encodage'):

  

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

Essayez quelque chose comme:

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

Lisez également: http://framework.zend.com/manual/en/zend. mail.encoding.html

J'espère que cela a aidé d'une certaine manière.

Autres conseils

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

$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
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top