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 | <?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関数でエンコードします。
1 2 3 4 5 6 7 8 9 10 11 | <?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の設定を同じにしてみてください。