PHPで構築されたメールシステムで、UTF-8にて格納されたデータを取得して
メールデータを作成する部分があります。
以下のように件名や差出人・宛先をISO-2022-JPにエンコードするのですが、
何故か宛先名(name)のみがISO-8859-1(latin1)にエンコードされてしまいます。
//Subject
$subject = mb_convert_encoding($subject, "ISO-2022-JP", "UTF-8");
//FROM
$from_data['name'] = mb_convert_encoding($from_data['name'], "ISO-2022-JP", "UTF-8");
//TO・CC・BCC
foreach($send_data as $type => $data){
for($i=0; $i<count($data[$type]); $i++){
$send_data[$type][$i]['name'] = mb_convert_encoding($send_data[$type][$i]['name'], "ISO-2022-JP", "UTF-8");
}
}
最終的に生成されたメールのヘッダはコメントに記したとおりです。
宛先部分のみがループ処理を挟んでいますが(ToやCc、Bccで複数あり得るので…)、
そのあたりが怪しいのでしょうか?
上記ソースから心当たりがあれば、ご教示いただけると幸いです。
よろしくお願いいたします。
なお、PHPは5.2.13、データベースはMySQL5.1.50を使用しています。
無事に解決したという事で良かったです。
$send_data = array( "TO"=>array( 0=>array( "name"=>"副管理人","email"=>"member@mail.example.jp" ) ), "CC"=>array( 0=>array( "name"=>"メンバー1", "email"=>"member001@mail.example.jp" ), 1=>array( "name"=>"メンバー2", "email"=>"member002@mail.example.jp" ), 2=>array( "name"=>"メンバー3", "email"=>"member003@mail.example.jp" ) ), "BCC"=>array( ) );
$send_dataが上記のようになっている場合、次の処理を行うと「count($data[$type])」でカウントが0になってしまいますので、forの中が処理されません。
foreach($send_data as $type => $data){ for($i=0; $i<count($data[$type]); $i++){
「foreach($send_data as $type => $data)」としていますので、「count($send_data[$type])」あるいは「count($data)」に変更すると、正しい個数を取得できます。
ちょっとややこしいですね・・・
echo "<pre>\$data:"; print_r($data); echo "</pre>\n";
上記のように出力して確認すると、目的の値にアクセスできているか、若干分かりやすくなると思います。
motokun44さんがコメントで指摘していますが、「mb_send_mail()」を使用する場合は、「mb_encode_mimeheader()」だけ使用すれば良いようです。
http://www.asahi-net.or.jp/~wv7y-kmr/memo/php_mbstring.html#mb_s...
※mail関数を使用する場合は、「mb_convert_encoding()」も必要です。
mimeheader抜けてませんか?
//Subject $subject = mb_convert_encoding($subject, "ISO-2022-JP", "UTF-8"); $subject = mb_encode_mimeheader($subject,"ISO-2022-JP");
差出人や件名はISO-2022-JPになっているのですが…
From: =?ISO-2022-JP?B?GyRCJFUkQSRvJC0bKEI=?= <hoge@hoge.jp>
Sender: hoge@hoge.jp
To: =?ISO-8859-1?Q?=E3=83=9D=E3=82=B9=E3=83=88=E3=83=9E=E3=82=B9=E3=82=BF=E3=83=BC?=
<hogehoge@hogehoge.jp>
Cc: =?ISO-8859-1?Q?=E3=83=9D=E3=82=B9=E3=83=88=E3=83=9E=E3=82=B9=E3=82=BF=E3=83=BC?=
<hogehoge@hoge.jp>
Bcc:
Subject: =?ISO-2022-JP?B?GyRCJV0lOSVIJV4lOSU/ITwbKEI=?=
$send_data = array("TO"=>array(0=>array("name"=>"副管理人","email"=>"member@mail.example.jp")),"CC"=>array(0=>array("name"=>"メンバー1","email"=>"member001@mail.example.jp"),1=>array("name"=>"メンバー2","email"=>"member002@mail.example.jp"),2=>array("name"=>"メンバー3","email"=>"member003@mail.example.jp")),"BCC"=>array());
上記のようになっているのでしたら、「count($data[$type])」を「count($send_data[$type])」あるいは「count($data)」に変更して試してみてください。
※書き直して再コメントしています。
$send_dataはおっしゃるとおりの内容です。
2の方のご指摘を受け、配列の要素取得を見直したところ、
正しく取得できればエンコードも正常になることを確認しました。
そして、ご教示いただいた修正を実施したところ、
正常動作いたしました。
本当にありがとうございます。
もしこのコメントをご覧になったら、
是非上記内容を回答として記入してください。
どういう感じになっているんでしょうか…全文ないと判断できないかも。
普通にmimeheaderが入ってないだけかなと思ったんだけど違うのかな…($subjectじゃなくてこっちでしたね…)
//TO・CC・BCC
foreach($send_data as $type => $data){
for($i=0; $i<count($data[$type]); $i++){
$send_data[$type][$i]['name'] = mb_convert_encoding($send_data[$type][$i]['name'], "ISO-2022-JP", "UTF-8");
$send_data[$type][$i]['name'] = mb_encode_mimeheader($send_data[$type][$i]['name'] = ,"ISO-2022-JP");
}
mb_encode_mimeheader() を使うなら、あらかじめmb_convert_encoding()でJIS変換する必要は無いんじゃないですか。
ほとんど追加情報はありませんが、お言葉に甘えて回答させていただきました。
mimeheaderも同様のループ処理を行っていたため、
結果として対象の文字列に処理がかからなかったということでした。
補足のコメントありがとうございました。
>motokun44さん
なるほど…。
rouge 2008さんが挙げてくださったリンク先その他の情報を読んで、
もっとよく勉強して構成を再考してみます。
ご指摘ありがとうございました。
拙作フォームメール http://webmastertool.jp/f2m_php/f2mail.html では mail() を使っていますが 「mb_encode_mimeheader()だけ」で正常に動作しています。
「mb_internal_encoding()」を指定していれば、「mb_encode_mimeheader()」だけでも文字化けしませんでした。
本文でエンコードが必要になる事か、あるいは、入力側の文字コードとPHPの文字コードが違う場合か何かと勘違いしていたのかもしれません。(^^;