mb_send_mail関数で送信したメールが文字化けする主な原因は次のようなものがあります。
- 内部処理で使う文字コードが設定されていない
- メールの言語(日本語)が設定されていない
- 送信者やCCの日本語がエンコードされていない
それぞれについて説明します。
この記事の内容
1. 内部処理で使う文字コード → mbstring.internal_encodingで設定
mb_send_mail関数で送信したメールが文字化けする場合は、php.iniのmbstring.internal_encodingの設定が原因かもしれません。たとえば、スクリプトの文字コードがUTF-8で、php.iniのmbstring.internal_encodingがEUC-JPの場合は、mb_send_mail関数で送信したメールは「???????」のように文字化けします。
解決方法として、php.iniのmbstring.internal_encodingの設定を変更するか、次のようにmb_send_mail関数(を含むマルチバイト関数)を使う前にmb_internal_encoding関数で文字コードを設定する方法があります。スクリプトの先頭や共通関数ファイルに記述しても良いでしょう。
1 2 | mb_internal_encoding("UTF-8");$rc = mb_send_mail(…); |
2. メールの言語(日本語) → mbstring.languageで設定
それでも文字化けする場合は、mbstring.languageという設定項目を確認しましょう。mb_send_mail関数を使って日本語のメールを送信する場合は「Japanese」に設定する必要があります。
1 | mbstring.language = Japanese |
mb_language関数を使うこともできます。
1 | mb_language("Japanese"); |
※「mb_language(“ja“);」でも大丈夫です。
まぎらわしいですが、mb_language関数やmbstring.languageはメール送信に使う言語の設定であり、マルチバイト関数全般で使う文字コードの設定はmb_internal_encoding関数やphp.iniのmbstring.internal_encodingで行います。
3. 送信者名やCCで指定する日本語はmb_encode_mimeheader関数でエンコードする
送信するメールに送信者名やCCする人の名前を含める場合、次のように日本語をエンコードしないで実行すると、文字化けします。
1 2 3 4 5 6 7 8 9 10 11 | <?phpmb_language("ja");mb_internal_encoding("UTF-8");$to = "xxxxx@xxxxx";$title = "テストメール";$body = "メール送信のテストです。";$header = "From: 西沢直木 <xxxxx@xxxxx>\n";$header .= "CC: 鈴木次郎 <xxxxx@xxxxx>\n";mb_send_mail($to, $title, $body, $header);?> |
送信者名の日本語が文字化けする
送信者名やCCで指定する日本語はmb_encode_mimeheader関数でエンコードします。
1 2 3 4 5 6 7 8 9 10 11 | <?phpmb_language("ja");mb_internal_encoding("UTF-8");$to = "xxxxx@xxxxx";$title = "テストメール";$body = "メール送信のテストです。";$header = "From:" . mb_encode_mimeheader("西沢直木") . "<xxxxx@xxxxx>\n";$header .= "CC:" . mb_encode_mimeheader("鈴木次郎") . "<xxxxx@xxxxx>\n";mb_send_mail($to, $title, $body, $header);?> |
文字化けが解消される
それでも文字化けする場合は、mb_encode_mimeheader関数で指定する文字列の文字コードと、mbstring.internal_encodingの設定を同じにしてみてください。