PHPのmb_send_mail関数やmail関数で文字化け問題を解消する


PHPのmb_send_mail関数やmail関数で文字化けに悩んでいませんか?
正直、色々な原因があるので特効薬のような対処法はありませんが、確認するべきポイントがありますので、見直してみてはいかがでしょうか?

SPONSORED LINK

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"))."<sasidasi@example.com>";

差出人に日本語を含ませる場合には、日本語のメールで一般的な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に限らず文字化けした時は文字コードやエンコーディング周りの見直しが癖にはなっているのですが、メールに関してはさらに予備知識も必要になったりと、覚えることが多い部分です。
文字化けにハマってしまった時の絶望感はなんとも言えない無念さですね。

今日も知識欲は止まらない。

関連トピック

PHPのdate関数で「年」が文字化けした時の対処方法

PHPのエラーについて「PHP date 年 文字化け」です。 PHPで日付を表示する時に欠かせないdate関数ですが「Y年」が文字化

PHPで画像ダウンロードのボタンでリンクする方法

PHPを利用して画像をダウンロードさせるボタンを作成する方法メモです。 リンクボタンをクリックすると保存ダイアログが表示されて、ダウン

JavaScriptでUA判別してスマホとタブレットを振り分ける方法

JavaScriptを使用してUAでiPhoneやAndroidのスマホを判定したり、増加傾向にあるタブレットを判別する方法メモ。 U

MySQLでTAG機能としてタグ付けを実装するデータベース設計を考える

ブログなどでも「タグ機能」って便利ですよね。カテゴライズとはまた違うタグ機能をMySQLを使って設計する時に、どのように実装するかを検討

PHPで配列のエラー「Cannot use string offset as an array」がでる場合の対処法

PHPで「Cannot use string offset as an array」が出たら確認したいポイントをまとめました。 このエ

SDカードに「XAMPP Portable」をインストールしてPHP開発環境ゲット!

PHP開発環境として何年かぶりにXAMPPの導入を決めたんですが、XAMPPの開発環境自体をクラウドで同期できないかというトリッキーな方

PHPエラー対処方法「malformed header from script. Bad header=No recipient addresses found i」

PHPからメールを送信する際に「malformed header from script. Bad header=No recipien

インデントはタブとスペースのどっちを使うべきなのか?

コーディングをする皆様。インデントを今日もせっせと打っていらっしゃりますか? さて、そのインデントを打つ時にタブ派とスペース派に分かれ

公開日:2011/07/17