気軽に読めるPHP入門書・PHPスクリプトが動かないときの原因と対策などを紹介します。

  1. PHP関数
  2. 14 view

mb_send_mail関数によるメールの文字化け(本文、送信者、CC)

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の設定を同じにしてみてください。

PHP関数の最近記事

  1. mb_send_mail関数でReturn-Pathを設定する方法

  2. is_numeric関数とis_int関数の違い

  3. PHPのdate関数の使用例

  4. isset関数とempty関数と「!」の違い

  5. 文字列を分割して配列を作成するexplode関数

関連記事

PAGE TOP