IS04へのメールが文字化けたがケアレスミスでした

Posted by yonezo in 日記 | Leave a comment
Pocket

phpでIS04にメールしようと思って半日調べまくって、なぜか文字化けしていて、
結果変数の記述ミスだったという日記をこれから書こうと思います。

とりあえず、iphone4とdocomoのGALAXY Sというスマートフォンには正常にメールできていました。
今回は絵文字は使わない予定なので、バイナリではありません。

で、auのIS04だけEZメールで送ると本文が文字化け。
いろいろやって解消されたソースは以下。

$message = "本文だよ。";
$subject = "件名だよ。";

$headers = "From: hoge@ex.com\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/plain;charset=ISO-2022-JP\r\n";
$headers .= "Content-Transfer-Encoding: 7bit";

$pos = 0;
$subject=mb_convert_encoding($subject,"JIS","UTF-8");
while ($pos < mb_strlen($subject, "JIS")){
	$output = mb_strimwidth($subject,$pos,36,"","JIS");
	$pos += mb_strlen($output, "JIS");
	$TempStr .=(($TempStr)?" ":"")."=?ISO-2022-JP?B?".base64_encode($output)."?=";
}
$subject=$TempStr;
$message = mb_convert_encoding(trim($message),'ISO-2022-JP',"UTF-8");
mb_language("ja");
mail($mail, $subject, $message,$headers);

mail()に渡している$headersですが、ヘッダを代入している部分の変数名を$headerにしていたため、文字化けしていました。
こんなんで、半日潰すとかもう自分をぶっ飛ばしたい気分ですよ。

あと、細かい事ですがmb_convert_encodingはちゃんと第3引数(この場合はUTF-8)まで指定してあげないとダメでした。
あと、分かると思いますが、$mailは送信先のメールアドレス文字列です。

とにかく、docomo、auへのメールはISO-2022-JPにエンコードせよ!って感じらしい。
なので、ここには書いてませんが送信元メールアドレスからキャリアなどを判別して処理を切り分けております。softbankには必要ないって事ですね。

ヘッダのContent-Transfer-Encoding:は今回テキストだけって事なので、7bitですが、バイナリの場合はBASE64なんだそうです。
絵文字とかですかね。

あと、完全に余談なんですが、Gmailとauのメールは送信先メールアドレスをMail_mimeDecodeで引っこ抜こうとすると、ちょっと形式が違うようです。
iphoneとかは「"xxx@xxx.ne.jp"<xxx@xxx.ne.jp >」こんな感じなんですが、
Gmailとauで確認した限り、単に「xxx@xxx.ne.jp」という感じで来るのです。

送信先メールアドレスを利用する場合は、ちょっと注意が必要かもねって事で。

なんか、サーバからメール送って、IS04で受信したメールのヘッダを見るためにSDカードにコピーして引っこ抜いてPCに挿してエディタで確認してって作業をやっていたら自転車に乗る時間が無くなったでござる。

まだまだ修行がタリン…。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です