2009-05-07 7 views
3

Ich habe diesen Code. Es ist aus dem Zend Reading Mail Beispiel.Warum dekodiert diese Mail-Nachricht nicht korrekt?

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

Was ich bekommen kann, ist die Nachricht, die gut funktioniert. Aber versuchen, die Nachricht in etwas lesbares zu dekodieren, funktioniert nicht. Ich habe Zend_Mime, imap_mime und iconv ohne Erfolg ausprobiert.

Dies ist ein Beispiel dafür, was ich mit $foundPart->getContent();

Halle = F3 Heimer erhalten = FAr

It "Halló HEIMUR"

einige nur

Was will ich würde ist, sollte sagen Bibliothek wo ich in der Praxis "Knopf drücken, Speck bekommen" konnte. Was ich meine ist, ich möchte nur die Bibliothek auf eine POP3-E-Mail-Box verweisen und die E-Mail in lesbarer Form (ohne jegliche Verschlüsselungsprobleme) und die Anhänge erhalten.

imap_mime_header_decode() Gibt mir ein Array mit den gleichen Daten.
iconv_ mime_ decode() Hat die gleiche

Hat jemand eine Idee, warum dies geschieht oder eine Bibliothek, wo ich kann dies nur abstrahieren (PHP/Python oder Perl)

Antwort

2

Dies wegen der Base64-Codierung sein könnte. Die Zend_Mail docs sagen (unter ‚encoding‘):

... Alle anderen Vorsätzen über Base64 codiert werden, wenn keine andere Codierung im addAttachment() -Aufruf oder mit dem MIME Teil Objekt zugeordnet ist gegeben später.

Versuchen Sie so etwas wie:

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

Lesen Sie auch: http://framework.zend.com/manual/en/zend.mail.encoding.html

Hoffnung, die irgendwie geholfen.

+0

imap_qprint() war der Trick. Danke :) –

+2

Es ist nicht base64 codiert. Es ist im Zitieren-druckbar: http://en.wikipedia.org/wiki/Quoted-printable –

+0

Pawel hat Recht, die Antwort ist nicht so einfach. Siehe meine Antwort für eine vollständigere Lösung. – Andrew

13

Ich stieß auf einige ähnliche Probleme, während ich lernte, wie man Zend_Mail zum Lesen von E-Mails benutzt. Sie müssen zusätzliche Logik hinzufügen, die Zend_Mail nicht implementiert, z. B. das Entschlüsseln von verschlüsselten E-Mails und das Konvertieren des Zeichensatzes. Hier ist, was ich mache, nachdem ich den Klartextteil gefunden habe:

$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

Sie sind der Mann! Dies sollte die akzeptierte Antwort sein, da es sowohl base64 als auch quoted-printable encodings umfasst (in meinem Fall war es letzteres). –