Webメール

作成日:2005.05.28

 Webメールとはブラウザ上でメールの送受信が可能なシステムである。ブラウザさえあれば、OutlookExpress, Becky!, Eudoraなどのメールソフトは必要としない。出先などでメーラが使えない、あるいは、ファイアウォールのために HTTPプロトコルしか通らないといった場合でも Webメールを使えばメールの読み書きができるので便利である。
 Yahoo! Mail の Webメールは広く使われており、「外部メール」機能を使うと他のメールアドレスに届いたメールを読むことも可能である。また、Niftyなどのプロバイダでもユーザに対して Webメールのサービスを提供している。ここで話題にするのは自前の Webメールシステムの構築である。

 Webメールシステムでは、メールサーバにアクセス可能な Webサーバ上で、メールを読み書きするための CGIスクリプト(PHPが多いようである)を動作させる。Webサーバとメールサーバは同一ホストでもよいし、自宅の Webサーバとプロバイダのメールサーバのように全く別ホストでも構わない(スクリプトが動くならプロバイダの Webサーバでも可能かもしれないが、他所のサーバにあまりログは残したくない気がする)。メールを読み書きするクライアントからは Webサーバにさえアクセスできればよく、メールサーバに直接アクセスできる必要はない。
 出先から自宅の Webサーバ経由で自宅のメールサーバからメールを読んだり、あるいはプロバイダのメールを読むといったことができるようになる。簡単に図示すると以下のような感じである。

クライアント -----------> Webサーバ+メールサーバ(自宅)

クライアント -----------> Webサーバ(自宅) -----------> メールサーバ(プロバイダ)

 メールの管理は Webサーバ上で行われるので、クライアント側には Webブラウザ以外には何もインストールする必要はない。

 受信したメールはブラウザ上に一覧表示し、メールを選択して本文を表示したり、添付ファイルの表示や必要に応じてダウンロードも可能である。もちろん、返信や転送も可能である。WeBメールで読んだメールはメールサーバ上からは削除せずに残せるので、後でメーラを使って読むことも可能である。
 新規メールの作成はフォームに宛先や本文を入力し、送信ボタンを押せば後は Webサーバがメールサーバに送信してくれる。添付ファイルやアドレス帳機能なども使える。

 代表的な Webメールとして、Squirrelmail, IMP, IlohaMailなどがある。

  1. Squirrelmail
     人気 No.1のWebメールスクリプト。動作環境は Webサーバ + PHP4 + IMAPサーバ。AN HTTPDでの動作も確認済。プラグインなどによるカスタマイズの自由度大。使用上は IMAPサーバにアカウントが必須という制約があるので、誰でも使えるというわけにはいかないだろう。IMAPを使っているプロバイダってあるのだろうか? 自宅の LINUX上で IMAPサーバを動作させれば、プロバイダなど他の POP3サーバからも読み出せるように設定することは可能である。
     公式サイト日本公式サイト

  2. IMP
     人気度は No.2か? 動作環境は Webサーバ + PHP4 + IMAPサーバ。POP3サーバでも可能な模様。インストールが結構面倒そうであったので試してはいない。日本語のユーザコミュニティもある。
     公式サイト日本公式サイト

  3. IlohaMail
     人気度は不明。軽快に動作しているという評価もある。動作環境は Webサーバ + PHP4 + IMAPサーバ。POP3サーバしかなくても動作可能。Ilohaは「いろは」であり、開発者は日系の方だそうだ。
     公式サイト

     以下では筆者が実際に IlohaMailを試行した経験から、インストールおよび各種設定方法と、長い日本語のファイル名の添付ファイルで発生する不具合に対応するためのスクリプトの変更箇所をまとめた。サーバ/クライアントとも Windows以外は全く考慮していないし、気がついた箇所をとりあえず動作するように変更しただけなので残っている問題はまだあるとは思う。利用は自己責任でお願いします。

    【インストール手順】
    (1) ダウンロード
    http://prdownloads.sourceforge.net/ilohamail/
    最新版は 0.8.14(IlohaMail-0.8.14-rc3.zip)。RCだがまあいいかと。
    慎重な方は 0.8.13(IlohaMail-0.8.13.zip)をどうぞ。0.9は開発版なので当面見送り。
    解凍してフォルダ名を IlohaMailに変更し、ドキュメントルート下にフォルダ毎移動する。

    (2) アクセス
    とりあえず、何も設定しなくても
    http://127.0.0.1/IlohaMail/IlohaMail/
    にアクセスすれば以下のパスワード問合わ画面になる。

    User ID:
    Password:
    Server:
    Type:を選択
    Language:を選択

    設定後、「Log In」ボタンを押すと最初のアクセスのときのみ設定画面に移る。言語設定欄で

    インタフェース言語:
    標準文字コード:
    時差: を選択
    時間オプション: (好みで好きな方を)

    のように設定し、「すぐに反映」ボタンを押す。その他の設定は必要に応じて変更してもよいが、とりあえずそのままで構わない。次に「個人情報」をクリックし、

    名前:
    メールアドレス:
    返信用アドレス:
    署名:
     デフォルトに指定

    を入力後、デフォルトに指定をチェックして「追加」ボタンを押す。「一般」で元の設定画面に戻り、「すぐに反映」ボタンを押す。

    「受信箱」をクリックすると、メールが届いていればメール一覧が表示され、メールがなければ「このフォルダにメッセージはありません」と表示される。 デフォルトでは 150秒毎に新着メールのチェックがされる。すぐにチェックしたいときは「新着チェック」をクリックする。

    ここまではエラーなしに操作できることが前提である。もし動作しないなら PHPの設定などを見直すこと。一旦「ログアウト」をクリックして終了し、引き続き以下を設定する。

    (3)環境設定ファイル
    ファイル:IlohaMail\conf\defaults.generic.inc
    88行目 $init_from_address = ""; //for "user@host"
      ↓
    $init_from_address = "user@example.com"; //for "user@host"

    Fromアドレスとしてここで設定したものを使う
    この設定をしないとFromが ユーザ名@pop3(imap)サーバ名 になってしまう
    ファイル:IlohaMail\conf\conf.php
    196行目 $SMTP_SERVER = "";
      ↓
    $SMTP_SERVER = "smtp.nifty.com";

    Niftyの SMTPサーバなら上記のように設定する
    Webサーバと SMTPサーバのホストが同じなら空でよい(localhostとみなす)
    ファイル:IlohaMail\conf\login.php
    32行目 $default_host = "";
      ↓
    $default_host = "pop.nifty.com";

    POP3/IMAPサーバの設定。上記は NiftyのPOP3サーバからメールを読む場合
    Webサーバと同じホストでメールサーバも動いているなら空でよい(localhost)
    いくつかのメールサーバから SELECTできるようにするなら 42-49行目を参照
    75行目 $default_port = 143;
      ↓
    $default_port = 110;

    プロトコルのデフォルトがIMAPなら 143, POP3なら 110に
    101行目 $default_lang = "eng/";
      ↓
    $default_lang = "jp/";

    表示を日本語に設定する
    119行目 $hide_host = 0;
      ↓
    $hide_host = 1;

    メールサーバを固定し、他のサーバにはアクセスできないようにする
    メールサーバが複数あるときは 0のままに
    121行目 $hide_protocol = 0;
      ↓
    $hide_protocol = 1;

    IMAP/POP3を固定し、切り替えできないようにする
    125行目 $hide_lang = 0;
      ↓
    $hide_lang = 1;

    言語を日本語固定にし変更しないなら
     IlohaMailのインストール先の Manualフォルダに設定ファイルの全体の説明があるので一度見ておくのがよい。

    (4)スクリプトの変更
     添付ファイルが読めない/文字化けする問題でスクリプトの以下の箇所を修正する。
    ファイル:IlohaMail\source\compose.php
    233行目 $a_name=base64_decode($file_parts[1]);

    $a_name=JcodeConvert(base64_decode($file_parts[1]),0,3);
    238-
    239行目
    $part[$num_parts]["type"]="Content-Type: ".$a_type."; name=\"".$a_name."\"\n";
    $part[$num_parts]["disposition"]="Content-Disposition: attachment; filename=\"".$a_name."\"\n";
      ↓
    $part[$num_parts]["type"]="Content-Type: ".$a_type."; name=\""."=?iso-2022-jp?B?".base64_encode($a_name)."?="."\"\n";
    $part[$num_parts]["disposition"]="Content-Disposition: attachment; filename=\""."=?iso-2022-jp?B?".base64_encode($a_name)."?="."\"\n";
    ファイル:IlohaMail\source\compose2.php
    363行目 $a_name=mod_base64_decode($file_parts[1]);
      ↓
    $a_name=JcodeConvert(mod_base64_decode($file_parts[1]),0,3);
    373-
    374行目
    $part[$num_parts]["type"]="Content-Type: ".$a_type."; name=\"".$a_name."\"\r\n";
    $part[$num_parts]["disposition"]="Content-Disposition: attachment; filename=\"".$a_name."\"\r\n";
      ↓
    $part[$num_parts]["type"]="Content-Type: ".$a_type."; name=\""."=?iso-2022-jp?B?".base64_encode($a_name)."?="."\"\r\n";
    $part[$num_parts]["disposition"]="Content-Disposition: attachment; filename=\""."=?iso-2022-jp?B?".base64_encode($a_name)."?="."\"\r\n";
    43行目 の下に追加
    mb_http_output("euc-jp");
    ファイル:IlohaMail\source\view.php
    157行目 header("Content-type: ".$tnef_files[$tneffid]['type0']."/".$tnef_files[$tneffid]['type1']."; name=\"".$tnef_files[$tneffid]['name']."\"");
      ↓
    header("Content-type: ".$tnef_files[$tneffid]['type0']."/".$tnef_files[$tneffid]['type1']."; name=\n\t\"".$tnef_files[$tneffid]['name']."\"");
    179-
    181行目
    $name = str_replace("/",".",iml_GetPartName($structure, $part));
    header("Content-type: $typestr; name=\"".$name."\"");
    header("Content-Disposition: ".$DISPOSITION_MODE."; filename=\"".$name."\"");
      ↓
    $name = mb_decode_mimeheader(str_replace("/",".",iml_GetPartName($structure, $part)));
    header("Content-type: $typestr; name=\n\t\"".$name."\"");
    header("Content-Disposition: ".$DISPOSITION_MODE."; filename=\"".JcodeConvert($name,0,2)."\"");
    186-
    187行目
    $name=str_replace("/",".", iml_GetPartName($structure, $part));
    header("Content-Type: text/plain; name=\"".$name."\"");
      ↓
    $name=mb_decode_mimeheader(str_replace("/",".", iml_GetPartName($structure, $part)));
    header("Content-Type: text/plain; name=\n\t\"".$name."\"");
    190行目 $name=str_replace("/",".", iml_GetPartName($structure, $part));
      ↓
    $name=mb_decode_mimeheader(str_replace("/",".", iml_GetPartName($structure, $part)));
    196行目 header("Content-Disposition: ".$DISPOSITION_MODE."; filename=\"".$name."\"");
      ↓
    header("Content-Disposition: ".$DISPOSITION_MODE."; filename=\"".JcodeConvert($name,0,2)."\"");
    201行目 header("Content-Disposition: inline; filename=\"".$name."\"");
      ↓
    header("Content-Disposition: inline; filename=\"".JcodeConvert($name,0,2)."\"");
    33行目 の下に以下の2行を追加
    include_once("../lang/jp/jcode.inc");
    mb_http_output("pass");
    ファイル:IlohaMail\lang\EUC-JP.inc
    69行目 $result["type"]="Content-Type: text/plain; charset=\"us-ascii\"\r\n";
      ↓
    $result["type"]="Content-Type: text/plain; charset=\"iso-2022-jp\"\r\n";

    (5) php.iniの設定
    output_handler が空のとき、添付ファイル名が長いと Content-Type行を全部読めないという問題あり。
    output_handler = mb_output_handler に設定すると長いファイル名は読めるようになるが添付ファイル自体が文字化けする。
    結局、view.phpに mb_http_output("pass"); 行を追加し、Content-Type行の途中に改行を入れることによって output_handler が何であったとしても問題は解消したのではないかとと思う。

    mbstring.http_output = EUC-JP
    スクリプト内では日本語は EUC-JPのようなので上記の設定をした方がいいかもしれない。ただ、IlohaMail以外の PHPスクリプトも使っているならここは SJISあるいは passにしたいかもしれない。添付ファイルの受信では mb_output_handlerと組み合わせると文字化けするので、スクリプト内部で送信時には EUC-JPに、受信時にはpassにするように変更した。それによって mbstring.http_outputは何に設定されていたとしても文字化けはしなくなったと思う。

    (6) セキュリティ
     セキュリティ上は SSLによる暗号化が可能な Webサーバが望ましいと思う(必須ではない)。ブラウザと Webサーバ間はメール本文だけでなくパスワードも平文で流れるので安全というわけではない。Webサーバが AN HTTPDなら、DeleGateを使って AN HTTPDで SSL通信する を参考に HTTPSでアクセスできるようにするといいだろう。
     SMTPを SPAMに利用されないために自分以外のユーザは利用できないように正しく設定をすること。

    (7)認証時エラー
    IlohaMailでログイン時に以下のようなエラーが出てアクセスできないことがある。
    Invalid session ID: xxxxxxxxxx-yyyyy
    Please log back in.

    筆者が経験したのは
    http://127.0.0.1/IlohaMail/
    ではエラーになってだめであるが、
    http://localhost/IlohaMail/
    http://host.domain.jp/IlohaMail/
    ならアクセスできた。また PHP4で起き、PHP5では起きなかったり、PHP4でも別のPCでは起きないなどよく分からない現象であった。
    作者は file_exists()関数が原因だと言っているので調べてみると確かに PATHが文字化けしていた。php.iniの設定が原因かも?
    http://ilohamail.org/forum/view_thread.php?topic_id=1&id=689

  4. 関連情報へのリンク
     Webメーラ


作成:いと,mailto:gfh05223@nifty.com