SquirrelMailがメールヘッダのcharsetを見ずに文字化けするのでパッチを書いた
Squirrel Mailのダメなところは、メールのヘッダに書いてあるコーディングの情報を全て無視して、WebのUIの言語設定をそのまま使うところだ。
http://stlabwww.ssi.ist.hokudai.ac.jp/yuhyama/squirrel-ja-charset.html
同意。こうした実装になっている理由は調べていないけれど、メールヘッダのcharsetは信用できないということなのかな。その代わりに本文でmb_detect_encodingしているので、UTF-8なんかで送られたメールがたまに文字化けする。
メールヘッダを信用するパッチを、最新のSquirrelMail-1.4.15のソースに基づき書いてみた。
--- squirrelmail-1.4.15/functions/mime.php.org 2008-03-08 11:53:42.000000000 +0900
+++ squirrelmail-1.4.15/functions/mime.php 2008-06-20 00:15:47.061184000 +0900
@@ -329,9 +329,9 @@
if (isset($languages[$squirrelmail_language]['XTRA_CODE']) &&
function_exists($languages[$squirrelmail_language]['XTRA_CODE'])) {
- if (mb_detect_encoding($body) != 'ASCII') {
- $body = $languages[$squirrelmail_language]['XTRA_CODE']('decode', $body);
- }
+// if (mb_detect_encoding($body) != 'ASCII') {
+ $body = $languages[$squirrelmail_language]['XTRA_CODE']('decode', $body, $body_message->header->getParameter('charset'));
+// }
}
$hookResults = do_hook("message_body", $body);
$body = $hookResults[1];
--- squirrelmail-1.4.15/functions/i18n.php.org 2008-05-20 18:15:08.000000000 +0900
+++ squirrelmail-1.4.15/functions/i18n.php 2008-06-20 00:18:43.895459200 +0900
@@ -571,6 +571,7 @@
if (function_exists('mb_detect_encoding')) {
switch (func_get_arg(0)) { /* action */
case 'decode':
+/*
$detect_encoding = @mb_detect_encoding($ret);
if ($detect_encoding == 'JIS' ||
$detect_encoding == 'EUC-JP' ||
@@ -579,6 +580,17 @@
$ret = mb_convert_kana(mb_convert_encoding($ret, 'EUC-JP', 'AUTO'), "KV");
}
+*/
+ $encoding = '';
+ if (count(func_get_args()) == 3) {
+ $encoding = func_get_arg(2);
+ }
+ if ($encoding == '') {
+ $encoding = @mb_detect_encoding($ret);
+ }
+ if ($encoding != '') {
+ $ret = mb_convert_kana(mb_convert_encoding($ret, 'EUC-JP', $encoding), 'KV', 'EUC-JP');
+ }
break;
case 'encode':
$detect_encoding = @mb_detect_encoding($ret);私は訳あって古いバージョンのSquirrelMailを使っているので、最新版での動作は未確認。ご利用は自己責任で。