Pergunta

Eu tenho esse código. É a partir da Zend Reading Correio exemplo.

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

O que pode obter é a mensagem, que funciona bem. Mas tentar decodificar a mensagem em algo legível não funciona. Eu tentei Zend_Mime, imap_mime e iconv sem sorte.

Este é um exemplo do que eu recebo com $foundPart->getContent();

Salão = F3 heim = FAR

Ele deve dizer "olá heimúr"

O que eu gostaria é apenas alguma biblioteca onde eu poderia "botão, recebe o bacon" na prática. O que quero dizer é, eu só quero apontar a biblioteca para uma caixa de e-mail POP3 e obter o e-mail de forma legível (sem quaisquer problemas de codificação) e os anexos.

imap_mime_header_decode() me dá uma matriz com os mesmos dados.
iconv_ mime_ decode() faz o mesmo

Alguém tem alguma idéia de por que isso está acontecendo ou alguma biblioteca onde eu posso apenas o abstrato esta longe (PHP / Python ou Perl)

Foi útil?

Solução

Isto poderia ser por causa de codificação base64. Os docs Zend_Mail dizer (em 'codificar'):

... Todos os outros anexos são codificados base64 via se nenhuma outra codificação está dada na chamada AddAttachment () ou atribuído à parte objeto MIME mais tarde.

Tente algo como:

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

Além disso, leia: http://framework.zend.com/manual/en/zend. mail.encoding.html

Hope que ajudou de alguma forma.

Outras dicas

Eu tive alguns problemas semelhantes ao mesmo tempo aprender como usar Zend_Mail para ler e-mails. Você vai precisar adicionar lógica adicional que Zend_Mail não implementa, como decodificação e-mails codificados, e convertendo o conjunto de caracteres. Aqui está o que eu estou fazendo depois de encontrar a parte de texto simples:

$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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top