mb_encode_mimeheaderで文字化けするときの対処方法

目次

フォームに入力された内容を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: 綏??坂査鐚 <[email protected]>
To: 鐚≧? <[email protected]>
件名: ◯◯の件について
本文:
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 <[email protected]>
To: A様<[email protected]>
件名: ◯◯の件について
本文:
A様
この度はありがとうございました。
Bより

前へ

PHPでJavascriptを書き出しHTMLから読み込む

次へ

Windows 2012 Serverでtime.windows.comと時刻同期ができない。