Pregunta

Tengo este código. Es del ejemplo de 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();
}

Lo que puedo obtener es el mensaje, que funciona bien. Pero intentar decodificar el mensaje en algo legible no funciona. He probado Zend_Mime, imap_mime e iconv sin suerte.

Este es un ejemplo de lo que obtengo con $foundPart->getContent();

  

Hall = F3 heim = FAr

Debería decir " Hall & # 243; heim & # 250; r "

Lo que me gustaría es una biblioteca en la que pueda "presionar un botón, recibir tocino" en la práctica. Lo que quiero decir es que solo quiero señalar la biblioteca a un buzón de correo electrónico POP3 y obtener el correo electrónico en forma legible (sin problemas de codificación) y los archivos adjuntos.

imap_mime_header_decode () Me da una matriz con los mismos datos.
iconv_ mime_ decode () Hace lo mismo

¿Alguien tiene alguna idea de por qué está sucediendo esto o alguna biblioteca en la que simplemente puedo abstraer esto (PHP / Python o Perl)

¿Fue útil?

Solución

Esto podría deberse a la codificación base64. Los documentos de Zend_Mail dicen (en 'codificación'):

  

... Todos los demás archivos adjuntos están codificados   a través de base64 si no hay otra codificación   dado en la llamada addAttachment () o   asignado al objeto de pieza MIME   más tarde.

Pruebe algo como:

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

Además, lea: http://framework.zend.com/manual/en/zend. mail.encoding.html

Espero que haya ayudado de alguna manera.

Otros consejos

Me encontré con algunos problemas similares mientras aprendía a usar Zend_Mail para leer correos electrónicos. Deberá agregar una lógica adicional que Zend_Mail no implemente, como decodificar correos electrónicos codificados y convertir el conjunto de caracteres. Esto es lo que estoy haciendo después de encontrar la parte de texto sin formato:

$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
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top