4

私はこのコードを持っています。これは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 を試してみましたが、うまくいきませんでした。

これは私が得たものの例です$foundPart->getContent();

ホール=F3 ハイム=FAr

「Halló heimur」と表示されるはずです

私が欲しいのは、実際に「ボタンを押してベーコンを受け取る」ことができるライブラリです。私が言いたいのは、ライブラリを POP3 電子メール ボックスに向けて、電子メールを読み取り可能な形式 (エンコーディングの問題なし) で取得し、添付ファイルを取得したいということです。

imap_mime_header_decode()同じデータの配列をくれます。
iconv_ mime_ decode()同じです

なぜこれが起こっているのか、またはこれを抽象化できるライブラリ(PHP / PythonまたはPerl)を知っている人はいますか

4

2 に答える 2

14

電子メールを読むために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
}
于 2011-07-11T22:27:40.267 に答える
2

これは、base64 エンコーディングが原因である可能性があります。Zend_Mail のドキュメントには次のように書かれています (「エンコーディング」の下):

...その他のすべての添付ファイルは、addAttachment() 呼び出しで他のエンコーディングが指定されていないか、後で MIME パーツ オブジェクトに割り当てられていない場合、base64 でエンコードされます。

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

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

また、お読みください: http://framework.zend.com/manual/en/zend.mail.encoding.html

それが何らかの形で役に立ったことを願っています。

于 2009-05-07T12:24:02.957 に答える