2009-05-07 11 views
3

私はこのコードを持っています。例は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(); 
} 

私が得ることができるメッセージは、うまくいきます。しかし、メッセージを読み込み可能なものにデコードしようとしても動作しません。私は運がないZend_Mime、imap_mime、iconvを試しました。私が望む何

これは私がそれは "ハローheimúrを" 言うべき$foundPart->getContent();

ホール= F3のハイム=遠く

と得るものの一例である

はいくつかありますライブラリーでは実際には "ボタンを押してベーコンを受け取る"ことができました。つまり、ライブラリをPOP3電子メールボックスに指定して、電子メールを読み取り可能な形式(エンコードの問題なし)で添付ファイルに添付したいだけです。

imap_mime_header_decode()同じデータを持つ配列を返します。
iconv_ mime_ decode()誰もがなぜこれが起こっている任意のアイデアや、この離れて(PHP/PythonやPerlの)私は抽象的なことができますいくつかのライブラリを持っています同じ

をい

答えて

2

これは、base64エンコードのものであってもよいです。 Zend_Mailを使用するドキュメントは、(「encoding」の下に)言う:

他のエンコーディングがaddAttachment()呼び出しまたはMIMEパートオブジェクト に割り当てられ で与えられた されていない場合は...他のすべての添付ファイルがBASE64経由 をコード化しています後で。

のようなものを試してみてください:

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

は、読み:何とか助け http://framework.zend.com/manual/en/zend.mail.encoding.html

希望を。

+0

imap_qprint()はトリックでした。ありがとう:) –

+2

それはbase64エンコードされていません。引用符で印刷できる: http://en.wikipedia.org/wiki/Quoted-printable –

+0

Pawelは正しいです、答えは簡単ではありません。より完全な解決策については私の答えを参照してください。 – Andrew

13

Zend_Mailを使って電子メールを読む方法を学びながら、同様の問題が発生しました。 Zend_Mailが実装していない、エンコードされた電子メールのデコードや文字セットの変換などのロジックを追加する必要があります。プレーンテキストの部分を見つけた後、私がやっていることは次のとおりです。

$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

あなたは男です!これは、base64と引用符で囲まれた印字可能なエンコーディング(私の場合は後者です)の両方をカバーするので、受け入れられた答えになるはずです。 –

関連する問題