PHP
文字化け

PHPで文字コード「ISO-2022-JP」の機種依存文字を含めたメールを送信する

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に一時的に変換する必要がある。

この仕様を知らずに文字化け現象にハマってしまった:head_bandage:

サンプルコード

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 );

最後に文字コード・言語設定を元に戻すのを忘れないようにしましょ〜〜:rolling_eyes::rolling_eyes:

あとメールクライアントがブラウザでGmailだったりThunderbirdあたりだったら、文字コードの設定が甘くても自動的に変換してくれるのだが、少し古めのメールクライアントだったりすると文字化けすることが多いのでご注意