PHPファイルはUTF-8だけれどもメールはISO-2022-JPで送ろうと思ったら文字化け問題で少しハマったので備忘録がてらに公開
今回ハマった原因というのはmb_encode_mimeheader
関数。
マニュアルにもあるようにmb_encode_mimeheader
関数を使うときの第一関数は…、
エンコードする文字列。
mb_internal_encoding()
と同じエンコーディングにしなければいけません。
http://php.net/manual/ja/function.mb-encode-mimeheader.php
ということなので一度mb_internal_encoding
関数でファイル内の設定をUTF-8からISO-2022-JPに一時的に変換する必要がある。
この仕様を知らずに文字化け現象にハマってしまった
サンプルコード
SendMail.php(UTF-8)
<?php
/*
* このコードの文字コード・言語の設定を取得
*/
$original_encoding = mb_internal_encoding();
$original_language = mb_language();
/*
* メール送信処理開始
*/
mb_language( 'Japanese' );
mb_internal_encoding("ISO-2022-JP-MS"); // ここからISO-2022-JP-MS
$to = mb_encode_mimeheader(mb_convert_encoding("㈱イーグルジャンプ","ISO-2022-JP-MS",$original_encoding), 'ISO-2022-JP-MS')." <to@example.com>";
$subject = mb_encode_mimeheader(mb_convert_encoding("進捗どうですか♪","ISO-2022-JP-MS",$original_encoding), 'ISO-2022-JP-MS');
$body = mb_convert_encoding("進捗だめです( ^ω^)", 'ISO-2022-JP-MS',$original_encoding);
$headers = "From: ".mb_encode_mimeheader(mb_convert_encoding("おじさん","ISO-2022-JP-MS"))." <from@example.com> \n";
$headers .= "Content-Type: text/plain; charset=ISO-2022-JP\n";
$params = "-f return@example.com";
if(mail($to, $subject,$body, $headers,$params)){
echo "Success!";
}else{
echo "Fail!";
}
/*
* 文字コード・言語設定を元に戻す
*/
mb_internal_encoding( $original_encoding );
mb_language( $original_language );
最後に文字コード・言語設定を元に戻すのを忘れないようにしましょ〜〜
あとメールクライアントがブラウザでGmailだったりThunderbirdあたりだったら、文字コードの設定が甘くても自動的に変換してくれるのだが、少し古めのメールクライアントだったりすると文字化けすることが多いのでご注意