Por que esta mensagem de email não decodificar corretamente?
-
08-07-2019 - |
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)
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
}