フォームに入力された内容をPHPのmb_send_mailでメールの送信をしようと、以下のようなスクリプトで送信したらmb_encode_mimeheaderで指定した文字が文字化けしました。
<?php mb_language("Ja") ; $to = mb_encode_mimeheader("A様","iso-2022-jp")."<a@aaa.com>"; $subject = "◯◯の件について"; $subject = mb_convert_encoding($subject,"iso-2022-jp","auto"); $content = "A様\nこの度はありがとうございました。\nBより"; $content = mb_convert_encoding($content,"iso-2022-jp","auto"); $from = "From:".mb_encode_mimeheader("差出人B","iso-2022-jp")."<b@bbb.com>"; mb_send_mail($to,$subject,$content,$from); ?>
これで送信したら、以下のようなメールが届きました。
From: 綏??坂査鐚 <b@bbb.com>
To: 鐚≧? <a@aaa.com>
件名: ◯◯の件について
本文:
A様
この度はありがとうございました。
Bより
原因
サーバーの内部エンコーディングとmb_encode_mimeheaderで使う文字は同じエンコーディング同士じゃないと文字化けするようです。今回の環境では以下のエンコーディングとなっています。
- 内部エンコーディング:EUC-JP
- フォームの入力値:UTF-8
- メール送信:ISO-2022-JP
対処方法
- 内部エンコーディング:EUC-JP
- フォームの入力値:EUC-JP
- メール送信:ISO-2022-JP
となるように、mb_encode_mimeheaderに使う文字列を内部エンコーディングに合わせて『EUC-JP』にしてみました。
<?php mb_language("Ja") ; $to = mb_convert_encoding("A様","euc-jp","auto"); $to = mb_encode_mimeheader($to,"iso-2022-jp")."<a@aaa.com>"; $subject = "◯◯の件について"; $subject = mb_convert_encoding($subject,"iso-2022-jp","auto"); $content = "A様\nこの度はありがとうございました。\nBより"; $content = mb_convert_encoding($content,"iso-2022-jp","auto"); $from = mb_convert_encoding("差出人B","euc-jp","auto"); $from = "From:".mb_encode_mimeheader($from,"iso-2022-jp")."<b@bbb.com>"; mb_send_mail($to,$subject,$content,$from); ?>
すると正常なメールが届きました。
From: 差出人B <b@bbb.com>
To: A様<a@aaa.com>
件名: ◯◯の件について
本文:
A様
この度はありがとうございました。
Bより