Mantis1.1.8の通知メールが文字化けする
問題
Mantis(バグトラッカー)を使いたいんだけど、環境が古くてphp4系なので、Mantis1.1.x系をインストールしました。
すると、通知のメールが文字化けしました。どうにかならない?
答え
原因は mysql_real_escape_string()関数でした(だと思う)。
Mantisは、メールに使う情報を、いったんデータベースにしまい、
送信処理はデータベースから読み出したデータをもとにメールを作っています。
この mysql_real_escape_string()関数、
MySQL接続のクライアント側の文字コードの設定の影響を受けるらしく(この環境ではujis)、
全体にUTF-8であるMantisにとっては具合が悪いようです。
思わぬところにバックスラッシュが入ります。
そして、特ににヘッダに使われる情報を格納した配列をserialize()して格納する一歩手前で、
mysql_real_escape_string() が登場。
mysql_real_escape_string() でエスケープのバックスラッシュがついた状態で serialize()。
↓
データベースに格納。
↓
送信処理がデータベースのデータを読み出す。
(エスケープ文字のバックスラッシュは付いてこない)
↓
unserialize()するとき、文字数などが変わっているので不整合がおき、正常に展開できない。
↓
メールのヘッダに使う情報がなくなる。文字コードの指定などがなくなる。件名のエンコードが変。
↓
受信した側で正しく表示できず文字化け。
mysql_real_escape_string() する順序がおかしいように思いますが、あまり手を入れたくない感じの箇所です。
で、どうすればいいのだ
mysql_real_escape_string() されているのは、通知メールの先頭についているプロジェクト名。
プロジェクト名をアルファベットのみにしてもらうことで、正常なメールが送信されるようになりました。
ソース、設定ファイルは修正しませんでした。
どうしてもプロジェクト名に日本語を入れたいときの日本語限定お手軽解決法
メールのヘッダの情報がなくなるので文字化けしたのですが、
768行目に以下のように追加して、メールを送信してみると、ちゃんとUTF-8のメールが届きました。
Subjectも本文も、UTF-8でエンコードされている。JISにしたければJISにもできるかもしれない。
$mail->CharSet = $t_email_data->metadata['charset']; $mail->CharSet = 'UTF-8'; //←ここを追加。CharSetを上書き
コメント