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関数で文字コードを設定する方法があります。スクリプトの先頭や共通関数ファイルに記述しても良いでしょう。
mb_internal_encoding("UTF-8"); $rc = mb_send_mail(…);
2. メールの言語(日本語) → mbstring.languageで設定
それでも文字化けする場合は、mbstring.languageという設定項目を確認しましょう。mb_send_mail関数を使って日本語のメールを送信する場合は「Japanese」に設定する必要があります。
mbstring.language = Japanese
mb_language関数を使うこともできます。
mb_language("Japanese");
※「mb_language(“ja“);」でも大丈夫です。
まぎらわしいですが、mb_language関数やmbstring.languageはメール送信に使う言語の設定であり、マルチバイト関数全般で使う文字コードの設定はmb_internal_encoding関数やphp.iniのmbstring.internal_encodingで行います。
3. 送信者名やCCで指定する日本語はmb_encode_mimeheader関数でエンコードする
送信するメールに送信者名やCCする人の名前を含める場合、次のように日本語をエンコードしないで実行すると、文字化けします。
<?php mb_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関数でエンコードします。
<?php mb_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の設定を同じにしてみてください。