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

[`google_buzz` not found]
[`friendfeed` not found]
このエントリーをはてなブックマークに追加
[`yahoo` not found]
[`livedoor` not found]

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 が使えるようになります。

Webメールソフト SquirrelMail の PHP5.4対応」への5件のフィードバック

  1. 貴重かつ有用な知識をありがとうございました。

    先月サーバーを入れ替えてからSquirrelmailが不調で困っていました。
    ご教示にしたがって,phpファイルの修正を行って正常に動作するようになりました。

    ただ,未だsquirrelmailでの送信がうまく行きません。

  2. お世話になっております。

    パッチを当ててから受信は文字化けもなく順調なものの,送信がうまく行っておりませんでした。
    PHP5の設定のどこかを間違えていると思い,PHP5を再インストールしました。
    すると,Squirrelmailの送信はバッチリ!
    パーフェクトです。

    ありがとうございました。

  3. 先日FreeBSD9.1から10.0にアップグレードした際に,Squirrelmailも新規にインストールしなおしました。
    最新版は1.4.23ですが,日本語の問題を直してあるようです。
    パッチも当てず,そのまま正常に稼働しています。

  4. SquirrelMail 1.4.22をCentOS7.1 PHP5.4.16にインストールしました。日本語が表示されない現象が確認でき、この記事が参考になりました。plugins/compatibility/includes/1.5.2/global.phpに同名の関数があり、if(0)で囲んで無効化する必要がありました。
    1.4.23は知らなかったので試していません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です