• 締切済み

PHPでメール受信時にVISTAからだと、文字化けします。

WEBでPHPを使って、メールを受信しています。 どうしてもVISTAのWindowsメールから来た物だけ文字化けします。 subjectは文字化けしません、本文だけです。 解決の糸口も見つかりません、宜しくお願いいたします。 mb_detect_encoding()で見てみると、[ASCII] になっています。 PHP Version 5.1.6で運用しています。 以下、ソースです。 mb_language("Japanese"); mb_internal_encoding("UTF-8"); /* POP3 サーバと接続 */ $mbox = @imap_open("{" . $mailserver . ":110/pop3/notls}INBOX", "username", "passwd"); if ($mbox && $i > 0) { $head = imap_header($mbox, $i); /* 本文のテキスト部分だけ */ $body = imap_fetchbody($mbox, $i,1); echo htmlspecialchars(mb_decode_mimeheader($head->subject)); echo htmlspecialchars(mb_decode_mimeheader($head->fromaddress)); echo htmlspecialchars(mb_convert_encoding($body, mb_internal_encoding(),mb_detect_encoding($body))); imap_close($mbox);

みんなの回答

  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.1

imap関数を使ったことがないので具体的な手法は提示できませんが、、 まず、imap_fetchbody関数は本文のデコードは行わないとマニュアルにあります。 ですので、メールヘッダのContent-Transfer-Encodingを調べて、特殊なエンコード(base64など)である場合には専用の関数でデコードする必要があるかと思います。 また、文字コードはPHPに自動判別させるのではなく、同じくメールヘッダのCharsetを調べた方が間違いないでしょう。

kiyomidesuyo
質問者

補足

アドバイスありがとうございます。 私が少ない知識の中で理解している事は、 imap_fetchbody() で、パーツに分解してくれます、 その中のテキスト部分が3番目の引数で[1]がテキスト部分です。 その後、 mb_convert_encodingで、(変換する文字列、変換後のエンコーディング、変換前の文字エンコーディング) と変換するので、ASCIIと出てはいますが そんなわけないだろうと、その部分に直接文字コードを入れてエンコーディングを色々試しました。 しかし、何も変換しなかったり、文字化けの仕方が変わったりでした。 何か追加のアドバイスが頂けたら幸いです、 宜しくお願いいたします。

関連するQ&A

専門家に質問してみよう