mb_send_mail()で文字化けしてしまう時の対処法


mb_send_mail()で文字化けが発生

Webページ制作でお問い合わせフォームを作成した際に、PHPのmb_send_mail()を使ってメール送信を実装した。
しかし、受信したメールを確認すると以下のキャプチャのように文字化けをしていた。

phpへはajaxでフォームデータを送信していて、その部分については問題がなかった。
php側でのcharset周りで問題があると考え、ひたすらwebで調べる→試すを行った。

ヘッダに Content-Type などを設定する必要があった

下の記述で文字化けは解決する的な記事が多く試したが、改善しなかった。

mb_language("Japanese");
mb_internal_encoding("UTF-8");

試行錯誤重ねるうちに、ヘッダにContent-Typeなどを設定して、mb_send_mail()の引数としてオプションパラメタにヘッダの情報を渡すと文字化けが解決した。

// ヘッダ情報設定
$headers = "MIME-Version: 1.0\r\n"
         . "Content-Transfer-Encoding: 7bit\r\n"
         . "Content-Type: text/plain; charset=ISO-2022-JP\r\n";

// メール送信
mb_send_mail( 'to', 'subject', 'body', $headers );

メールが文字化け

追記:メール送信/受信はできたが、受信したメールが文字化けしていることがあった。
下記の参考記事でもあるが、ヘッダで文字コード設定などして安心してmb_language("Japanese");mb_internal_encoding("UTF-8");の記述を消してしまった。

すると、サーバによって文字化けする場合が出てきた。

以下を再度記述することで解決できた。

mb_language("Japanese");
mb_internal_encoding("UTF-8");

参考:UTF-8で文字化け

php勉強しようかな

phpの経験がなく調べながら見よう見まねで実装していたが、基本的な書き方くらいはドットインストールで勉強しておこうと思う。

Laravelも人気のようだし、php案件はリモート可も多いと聞いたので、学習する価値はありそう。