Webメールソフト SquirrelMail の PHP5.4対応


WWWサーバー上にGmailのようなWebメールシステムを構築できるSquirrelMailというWebアプリケーションソフトがあります。
PHP上で動くソフトなのですが、WWWサーバのPHPを5.4にバージョンアップしたらSquirrelMailがまともに動かなくなったので、PHP5.4対応の修正を行いました

Webメールソフトとしては以前RoundCubeを紹介しましたが、SquirrelMailはそれより古い「元祖Webメールソフト」と言ってもいいぐらいの老舗サーバソフトです。英語圏発祥のソフトですが昔から日本語にも対応しており安定して使えます。

PCで使う場合はRoundCubeの方が高機能で便利ですが、タブレットPCではSquirrelMailの方が軽くて安定しているので、私はこの2つを併用してます。

ところが、PHPを5.3から5.4にバージョンアップしたところ、SquirrelMail がまともに動かなくなってしまいました(日本語文字が全て消えてしまう)。そこで、SquirrelMail をPHP5.4でも動くような修正をおこないました。

ダウンロード

SquirrelMail Version 1.4.22 日本語設定PHP5.4対応版

(ライセンスは、本家と同じくGPLv2に従います)

原因

SquirrelMailがPHP5.4でまともに動かない原因は以下の通りです。

  • PHPには、htmlspecialchars という、HTML特有の文字を変換する関数があります。
  • PHP 5.3→5.4で、htmlspecialchars のデフォルト文字エンコーディングが、ISO8859-1 から UTF-8に変更になりました。
  • SquirrelMail は、言語設定が日本語(ja_JP)の場合、日本語文字を EUC-JP エンコーディングで出力します。
  • EUC-JP で表現された文字バイト列は、UTF-8として解釈すると不正な文字列であるということになってしまいます。
  • htmlspecialchars は不正な文字は破棄する仕様になっています。

以上の結果として、SquirrelMail を PHP5.4 で動かすと、日本語文字がまったく表示されない、ということになってしまいます。

PHP5.4対応 修正内容

  • SquirrelMail の言語設定に基づいて文字変換を行うラッパー関数「sq_htmlspecialchars」を追加します。
  • SquirrelMail のコードから、htmlspecialchars を sq_htmlspecialchars に置換します。

修正方法

下記手順により、バージョン1.4.22以外のSquirrelMailをPHP5.4に対応させたり、既存インストール済のSquirrelMailシステムをPHP5.4に対応させることができます。

SquirrelMail のソースコードを取得、展開

新規にインストールする場合は、ファイルのダウンロードと展開を行ってください

% wget -O 'squirrelmail-webmail-1.4.22.tar.gz' \
 'http://squirrelmail.org/countdl.php?fileurl=http%3A%2F%2Fprdownloads.sourceforge.net%2Fsquirrelmail%2Fsquirrelmail-webmail-1.4.22.tar.gz'
% tar zxvf 'squirrelmail-webmail-1.4.22.tar.gz
% cd squirrelmail-webmail-1.4.22/

(2012/7/5時点の最新版は 1.4.22 です。下記修正はバージョンに依存しませんので、作業時点での最新版をダウンロードページを確認してください。)

既存のSquirrelMail システムをPHP5.4対応に修正する場合は、そのSquirrelMailディレクトリに移動してください。念のため、あらかじめ既存のSquirrelMailファイル群をバックアップしておくことをオススメします。

htmlspecialchars→sq_htmlspecialchars 置換

対象ファイル:
functions/*.php
plugins/*/*.php
src/*.php
ただし、functions/global.php、src/configtest.php、src/login.php は除く。(i18n.php を読み込んでいないため)

% find . -name '*.php' -print \
 | xargs egrep -l 'htmlspecialchars *\([^\)]' \
 | egrep -v 'global.php|configtest.php|login.php|class/|contrib/' \
 | xargs perl -i.bak -pe 's/htmlspecialchars *\([^\)]/sq_$&/'

(修正ファイルが多岐に渡りますが、修正は単純な置換です。上記コマンド実行により置換が行われます)

sq_htmlspecialchars 関数追加

% cat >> functions/i18n.php
// wrapper of htmlspecialchars
// In PHP 5.4, defualt value of htmlspecialchars 3rd parameter is changed
// from 'ISO8859-1' to 'UTF-8',
// but if in ja_JP mode, html data encoding is 'EUC-JP', not 'UTF-8'.
// htmlspecialchars discard invalid encoding characters,
// so in ja_JP mode, EUC-JP characters are discarded.
function sq_htmlspecialchars($string) {
    $encoding = 'iso8859-1';
    if (function_exists('mb_internal_encoding')) {
        $encoding = mb_internal_encoding();
    }
    return htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, $encoding);
}
^D

(最終行は「^D」という文字列ではなく「Ctrl+D」でエンター)

インストール

新規インストールの場合、あとは通常のSquirrelMailのインストール手順に従ってください

以上で、PHP5.4でも SquirrelMail が使えるようになります。