[PHP-users 33319] Re: (手がかり有り)この文字化けの対処方法をご提案願います。
池谷 美歌也
mikaya_ikeya @ pakureserve.jp
2008年 2月 21日 (木) 18:31:53 JST
ミカヤです。
これは他は同じコードで
> mail($to, $subject, $message, $headers);
の部分だけを
mb_send_mail($to, $subject, $message, $headers);
にすると文字化けするということでしょうか?
仮にそうだとするならですが、mb_send_mailを使う場合は
> $subject = mb_encode_mimeheader($subject, "ISO-2022-JP","B","\n");
この部分が原因のような気がします。
mb_send_mailで送信する場合は
$subject = mb_convert_encoding($subject, "ISO-2022-JP", "EUC-JP");
これだけでいいはずですがどうでしょう。
脳内作業だけで実際に確認したわけではないので的外れだったらすみません。
余談ですが、件名がどのように化けているのかを記述しておくと解決が早いかも。
> -----Original Message-----
> From: php-users-bounces @ php.gr.jp
> [mailto:php-users-bounces @ php.gr.jp] On Behalf Of kj
> Sent: Thursday, February 21, 2008 5:56 PM
> To: PHP-users ML
> Subject: [PHP-users 33318] Re: (手がかり有り)この文字化けの対処方法をご提案願います。
>
> sublime様、あさかわ様、goungoun様
>
> お世話になっております。門戸(kj)です。
>
> >なぜならば、mysqlのSET NAMESは
> >クライアント(この場合PHP)の、期待するコード(この場合
> >EUC-JP)を指定するためのものです。
>
> 大変失礼致しました。MySQLとやりとりするコードを
> PHPのコードであるEUC-JPにするのが目的なのに、
> 意味をよく調べないまま、MySQLのデフォルト文字セットを
> セットしていました。。。
>
> ということは私のソース(EUC-JP)はそこを直しますと、
>
> $enc_disp = "EUC-JP";
> $enc_db = "EUC-JP";
>
> (中略:DB接続)
>
> $sql = "SET NAMES ujis";//★utf-8から修正
> $res = mysql_query($sql);
>
> $sql = "INSERT INTO〜(中略)";
> $res = mysql_query(mb_convert_encoding($sql,
> "UTF-8","EUC-JP"), $conn) or die("
> 失敗");
> ↓
> $res = mysql_query($sql, $conn) or die("失敗");
>
> と、最後の行もmb_convert_encodingでutf-8にするのは
> 必要なくなるという理解でよろしいでしょうか。
>
>
> ・PHPスクリプトのソースの文字コードは?
> ・internal_encodingは?
> ・HTMLの文字コードは?(PHPからの出力)
> ・PHPスクリプトがPOST,GETで受け取る文字コードは?(PHPの入力)
> ・データベースの文字コードは?
> ・メールの文字コード(エンコード)は?
>
> ⇒まずはこれらをきちんと押さえます。
>
>
> さらにsublimeさまのアドバイスにもありましたとおりテストを行っていると、
> メールの件名(日本語、直打ち固定文字列)が
> mail関数だと文字化けせず、mb_send_mailですと文字化けする
> 症状にはまってしまいました。
>
> 色々調べて試してみたのですが、mail関数でしかうまくいきません。
> しかしこのままですと、理解していないまま「たまたま」
> うまくいっている状態になってしまいますので、
> 原因をご相談させて頂けたらと思います。
>
> (ソース)
> $from="(省略)";
> $to="(省略)";//EUC-JPのHTMLからPOSTされる。
> $subject="「○○診断」エントリー完了のお知らせです。";
>
> //元のエンコーディングを保存※1
> //$orgEncoding = mb_internal_encoding();
> //変換したい文字列のエンコーディングをセット※1
> //mb_internal_encoding("ISO-2022-JP");
>
> $subject=mb_encode_mimeheader($subject, "ISO-2022-JP","B","\n");
>
> //保存しておいたエンコーディングに戻す※1
> //mb_internal_encoding($orgEncoding);
>
> $headers = "From:$from\n";
> $headers .= "MIME-Version: 1.0\n";
> $headers .= "Content-Type: text/plain; charset=iso-2022-jp\n";
> $headers .= "Content-Transfer-Encoding: 7bit\n";
> $headers .= "X-Mailer: PHPWebMailer\n";
>
> $contents="ここにメール本文が来ます。";
> $message = mb_convert_encoding($contents,
> "ISO-2022-JP", "EUC-JP");
>
> //メール送信★mb_send_mailだとSubject(メール件名)のみ文字化け…
> mail($to, $subject, $message, $headers);
>
> 以上です。
>
> (補足)
> ・コメントアウトしている「※1」×3行は、
> 「mb_encode_mimeheaderを使う時はこれが必要」と書いてある
> サイトを見つけましたので、それに従ってみましたが、
> やっても文字化けは起こりました。
>
> ・smtpログは見てみましたが、
> 今回の「件名のみが文字化けする」という痕跡は
> 残っていないように思えます。(メールは無事届くからです。)
>
> 日本語の件名なので、できればたまたまうまくいっている
> mailよりは、きちんと何かを設定してmb_send_mailで
> 完成させた方がいいのではと思っているのですが、
> もし何かご意見などございましたら、お知恵を貸して頂けると嬉しいです。
>
> 門戸kj
>
> --------------------------------------
> Easy + Joy + Powerful = Yahoo! Bookmarks x Toolbar
> http://pr.mail.yahoo.co.jp/toolbar/
> _______________________________________________
> PHP-users mailing list PHP-users @ php.gr.jp
> http://ml.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://oldwww.php.gr.jp/php/novice.php3
>
PHP-users メーリングリストの案内