PHPのmb_send_mail関数やmail関数で文字化けに悩んでいませんか?
正直、色々な原因があるので特効薬のような対処法はありませんが、確認するべきポイントがありますので、見直してみてはいかがでしょうか?
目次
mail関数を使ってみる
$to = 'atesaki@example.com';
$subject = "テストの題名";
$body = "テストメール確認用の本文です";
$from = 'sasidasi@example.com';
mb_send_mail($email, $subject, $body,"From:".$from);
この記述で文字化けを起こしてしまうようなケースを例に、対処方法を検討してみたいと思います。
mail関数の文字化け対処方法
日本語を宣言してみる
mb_language("japanese");
mb_internal_encoding("EUC-JP");
「mb_language」を使って日本語を指定し内部エンコーディングを指定する。
「mb_internal_encoding」」でエンコーディングを指定する。
自動判別による文字コードミスを減らす為にも明示すると文字化けが解消する場合があります。
半角カナの取り扱いを見直す
$body = mb_convert_kana($body, "KVa");
含まれる「半角カナ」は文字化けの原因になることもまります。
「mb_convert_kana」で全角カナに変換しついでに全角英数を半角英数に変換したりしてみましょう。
差出人の日本語にも注意する
$from = mb_encode_mimeheader(mb_convert_encoding("山田 太郎","JIS","EUC-JP"))."";
差出人に日本語を含ませる場合には、日本語のメールで一般的なJISを指定します。
ヘッダー部分は文字コードによっても繊細に左右されてしまう部分です。
そもそもなぜJISなのかと言うと、欧米規格のサーバを経由すると1ビット分破棄されるという事態になる可能性があります。それが文字化けの原因となります。JISやISO-2022-JPといった指定はそれを避ける為に指定することになります。
mail関数でSubject件名が文字化け
mail関数で件名のみの文字化けが発生する場合には文字コードの自動判別に失敗している可能性があります。
$subject = base64_encode($subject);
$subject = '=?ISO-2022-JP?B?' . $subject . '?=';
「base64_encode」でバイナリデータが生き残るようにします。JIS指定の「ISO-2022-JP」を指定します。
文字化けしないmail関数を使う
mb_language("japanese");
mb_internal_encoding("EUC-JP");
$to = 'atesaki@example.com';
$subject = "テストの題名";
$body = "テストメール確認用の本文です";
$encoding = mb_detect_encoding($body, "SJIS,EUC-JP,JIS,UTF-8");
if ($encoding != "JIS") {
$subject = mb_convert_encoding($subject, "JIS", $encoding);
$body = mb_convert_encoding($body, "JIS", $encoding);
}
$subject = base64_encode($subject);
$subject = '=?ISO-2022-JP?B?' . $subject . '?=';
$body = mb_convert_kana($body, "KVa");
$from = mb_encode_mimeheader(mb_convert_encoding("山田 太郎","JIS","EUC-JP"))."<sasidasi@example.com>";
mb_send_mail($to, $subject, $body,"From:".$from);
まとめ
日本語の取り扱いは慣れがどうしても必要になりますよね。
PHPに限らず文字化けした時は文字コードやエンコーディング周りの見直しが癖にはなっているのですが、メールに関してはさらに予備知識も必要になったりと、覚えることが多い部分です。
文字化けにハマってしまった時の絶望感はなんとも言えない無念さですね。
今日も知識欲は止まらない。