geeklogハックその2
COM_mailという関数があり、これでメールを出そうとする場合、ヘッダの日本語が文字化け(UTF-8でBASE64)してしまう。COM_mailはprivate/system/custom/custom_mail.phpのCUSTOM_mailからメールを出すようで、ここでの変換に問題があるようだ。
PHPマニュアルによると、
string mb_encode_mimeheader ( string str [, string charset [, string transfer_encoding [, string linefeed]]] )
mb_encode_mimeheader() は、MIME ヘッダ エンコーディング方式によって文字列 str をエンコードします。この関数は、ASCII 表現の文字列を返します。
charset は、str の文字セット名です。デフォルトは、現在の NLS 設定 (mbstring.language)によって決まります。
ということ。ただし、こちらの環境では、mbstring.languageは”"japanese"と指定しているんで、結局internal_encodingの値が採用されているような気がする。
てなわけで、private/system/custom/custom_mail.phpを以下のように変更。
--- custom_mail.php.org 2006-09-05 16:08:24.000000000 +0900 +++ custom_mail.php 2006-10-17 17:57:11.000000000 +0900 @@ -57,7 +57,7 @@ mb_detect_encoding($name,"EUC-JP,UTF-8,JIS,SJIS")); //@@@@@2006005 元に戻す, 20051111 update -----> //$name = "=?iso-2022-jp?B?" . base64_encode($name) . "?="; - $name = mb_encode_mimeheader($name); + $name = mb_encode_mimeheader($name, 'ISO-2022-JP'); //@@@@@2006005, 20051111 update <----- $from=$name." ".$address; //@@@@ 2006/05/12 mystral_kk added --> @@ -75,7 +75,7 @@ mb_detect_encoding($name,"EUC-JP,UTF-8,JIS,SJIS")); //@@@@@20060905 元に戻す 20051111 update -----> //$name = "=?iso-2022-jp?B?" . base64_encode($name) . "?="; - $name = mb_encode_mimeheader($name); + $name = mb_encode_mimeheader($name, 'ISO-2022-JP'); //@@@@@20060905 元に戻す 20051111 update <----- $to=$name." ".$address; } @@ -85,7 +85,7 @@ mb_detect_encoding($subject,"EUC-JP,UTF-8,JIS,SJIS")); //@@@@@20060905 元に戻す 20051111 update -----> //$subject = "=?iso-2022-jp?B?" . base64_encode($subject) . "?="."\r\n"; - $subject = mb_encode_mimeheader($subject); + $subject = mb_encode_mimeheader($subject, 'ISO-2022-JP'); //@@@@@20060905 元に戻す 20051111 update <----- $message = mb_convert_encoding($message, "JIS", mb_detect_encoding($message,"EUC-JP,UTF-8,JIS,SJIS"));
それにしてもこのファイル、なんでShift_JISなんだろ?