mobileimap: 携帯電話用の IMAP対応 Webメーラー

mobileimap とは?

mobileimap は携帯電話用の IMAP対応 Webメーラーです。au や i-mode などの携帯電話から IMAP サーバ上のメールを読むことが できます。CGIではなく、HTTP対応のサーバとして動作します。

新着情報

  • 2005-05-22: mobileimap 2.7 を公開
    • Ruby 1.9 で動くようにしました。
    • --signature オプションでシグネチャファイルを指定できるようにしました。
      (Masanori Hanawa 氏によるパッチ)
  • 2003-04-08: mobileimap 0.1 を公開
    • 最初のバージョンを公開しました。

スクリーンショット

au の A3014S でのスクリーンショットです。 (この画面はやや古くなっています。最新版にはメールの検索とフォ ルダ名の検索のためのフォームが追加されています)

必要なもの

  • Ruby 1.8以上
  • gzip圧縮に対応するために必要なもの (なくても動きます)
  • https に対応するために必要なもの (なくても動かします)
  • 日本語のフォルダ名を表示をするために必要なもの (なくても動かします)
    • Ruby 1.8 に付属の iconv モジュール
    • Net::IMAP::decode_utf7 メソッドを備えた Net::IMAP ライブラリ (Ruby 1.8.0 2003-05-09以降に付属)

動作を確認した機種

WAP 2.0 (XHTML Basic対応) 対応の携帯電話なら大丈夫だと思います。

au
A5304T, A5303H, A3014S, A3012CA, A5303H, A1301S
i-mode
P504i, P211i, SO505i, SH505i
FOMA
P2102V
Air H" PHONE
AH-J3002V
feelH"
SANYO J90
J-PHONE
J-SH52, J-SH53
J-PHONEは80番または443番のポートで動いている Webサーバ 以外は接続できないようです。mobileimap を80番で動かすか、 Apache の mod_proxy を利用して、 ProxyPass /mobileimap http://localhost:12345 のように、localhostの12345番で動かしているmobileimapを80番 で動いている Apache の /mobileimap として見せるような設定 をすれば大丈夫です。
このとき、ProxyRequests On という余計な設定も一緒に書いてしまうと、オープンプロキシになってしまう可能性があるため、危険です。

動作を確認した IMAPサーバ

  • Courier-IMAP
    最近の Courier-IMAP であれば configure 時に --enable-unicode=iso-2022-jp を 指定して make すると日本語の検索が行えるようになります。 参考サイト
  • Cyrus IMAP Server
    標準で日本語の検索に対応しているようです。
  • uw-imapd
    標準で日本語の検索に対応しているようです。
  • Binc IMAP
    2004年1月現在、まだ日本語の検索に対応していないようです。

使い方

基本編

mobileimap は HTTP を喋るサーバとして動作します。 IMAPサーバが動いているホストで mobileimap を起動するには、コマンドラインから次のように実行します。

% mobileimap
ユーザ名@localhost:143[CRAM-MD5]: IMAP Password: 
http://example.jp:8143/

IMAPのパスワードを入力すると、URLが表示されます。表示された URL に Mozilla や Internet Explorer などのブラウザからアクセ スしてうまくメールが読めることを確認したら、携帯電話からアク セスしてみてください。mobileimap は Ctrl + C を押すと終了します。

mobileimap はデフォルトで次のようなパラメータを使用します。 各パラメータはコマンドラインオプションで指定できます。

IMAPの認証方法 (-a, --imap-auth)
CRAM-MD5
CRAM-MD5 の他は LOGIN と PLAIN を選べます。
IMAPのユーザ名 (-u, --imap-user)
環境変数USER
IMAPのホスト名 (-S, --imap-host)
localhost
IMAPのポート番号 (-P, --imap-host)
143
HTTPのホスト名 (-s, --http-host)
Socket.gethostname
HTTPのポート番号 (-p, --http-port)
8143
SMTPのホスト名 (--smtp-host)
localhost
SMTPのポート番号 (--smtp-port)
25
メール送信時の From: (-f, --from)
環境変数USER @ Socket.gethostname
--from="Taro Yamada <taro@example.jp>" のように指定できます

サーバとして常駐させる方法

起動時に -d オプションを指定するとサーバとして常駐します。 このとき ~/.mobileimap.log にログが書き出され、 ~/.mobileimap.pid にプロセスID が書き出されます。

バックグラウンドで動いているサーバを停止するには次のように実 行します。mobileimap のサーバが停止し、 ~/.mobileimap.pid が 削除されます。

% mobileimap --stop

複数の mobileimap をサーバとして立ち上げている場合は、 ~/.mobileimap.pid にプロセスIDが記録されているすべての サーバが停止します。個別に停止したいときは

% mobileimap --list
7754 http://example.jp:8143/
7761 http://example.jp:8144/foo

のように実行して、現在動いているサーバのリストを調べて、

% mobileimap --stop='http://example.jp:8143/'

のように停止させたいサーバがサービスしている URL を指定します。 次のように複数のURLを指定してまとめて停止させることもできます。

% mobileimap --stop='http://example.jp:8143/ http://example.jp:8144/foo'

安心感を高める方法

その1: URLのパスを指定する

上で紹介した起動方法では、mobileimap のURLに誰でもアクセス できてしまいます。そこで、起動時に

% mobileimap -x foobar 

と URL のパスを指定すると http://example.jp:8143/foobar とい う URL でしかアクセスできなくすることができます。foobar の部 分を秘密にしておけば、そこそこ安心できるでしょう。 mobileimap は http:// へのリンクを張らないので、リファラーのロ グから mobileimap の URLが見つかってしまう危険性は少ないと言えます。

その2: サブスクライバIDを指定する

au の端末でWebにアクセスすると、サブスクライバID という、端 末ごとに異なるID が HTTPのへッダに付加されます。そこで、

% mobileimap -i xxxxxxxxxxxxxx_xx.ezweb.ne.jp

のようにサブスクライバIDを指定すると、指定されたサブスクライ バID を含んだ HTTPの接続のみを受けつけるようになります。

自分の携帯電話のサブスクライバIDを調べるには、

% mobileimap -i foobar

のように、でたらめな文字列を -i オプションで指定して携帯電話 から mobileimap の URL にアクセスします。すると、「サブスク ライバID が間違っています: xxxxxxxxxxxxxx_xx.ezweb.ne.jp」の ように、自分のサブスクライバIDが表示されるので、これを記録し ます。

その3: vodafone のユーザIDでアクセス制限する

上の「サブスクライバIDを指定する」の方法の -i オプションを -j オプションに置き換えてください。

その4: ホスト名/IPアドレスでのアクセス制御

ホスト名/IPアドレスでのアクセス制御を行うには --allow-hosts オプションで、アクセスを許可するホスト名/IPアドレスを正規表 現で指定します。

たとえば、example.ne.jp 以外からのアクセスを受けつけないよう にするには、次のように指定します。

% mobileimap --allow-hosts='\.example\.ne\.jp$'

下の例のように、IPアドレスを指定することも可能です。

% mobileimap --allow-hosts='/^192\.168\.0\.1$/'

その5: https を喋る

OpenSSL for Ruby がインストールされている場合は https を喋ることがで きます。https を喋るにはコマンドラインから次のように実行します。

% mobileimap --ssl

ホスト名とポート名は --http-host, --http-port で指定したもの が使われます。SSLの鍵と証明書を指定するには --ssl-key, --ssl-cert オプションを使います。

その6: ベーシック認証を行う

Apache の ProxyPass を使って Apache 経由で mobileimap に アクセスするように設定すれば、 Apache 側でベーシック認証を 行えるはずです。

.mobileimaprc の設定方法

% mobileimap --dump-config > ~/.mobileimaprc

のように実行すると、~/.mobileimaprc の雛形が作成されるので、 これを編集してください。また、

% mobileimap -a login -u foo -x bar -d --dump-config > ~/.mobileimaprc

のように --dump-config とともに他のコマンドラインオプション も指定すると、それらの値を反映した ~/.mobileimap が作成されます。

~/.mobileimaprc は mobileimap の起動 時に自動的に読み込まれます。他の設定ファイルを読み込む場合は コマンドラインオプション --mobileimaprc=FILE で指定します。

フォルダ一覧で表示されるフォルダを指定する

フォルダ一覧で表示されるフォルダを指定するには、 --folder-include オプションと --folder-exclude オプションで 正規表現を指定します。両方指定したときは --folder-include が 先に適用され、その後で --folder-exclude が適用されます。

# foo|bar にマッチするフォルダのみを表示する
% mobileimap --folder-include="foo|bar"

# baz|quux にマッチするフォルダを除外する
% mobileimap --folder-exclude="baz|quux"

その他コマンドラインオプションの使い方

--subscribed-only
フォルダ一覧のときに購読フォルダのみを表示する
--folder-prefix=PREFIX
フォルダ名のプリフィクスを指定する (uw-imapd など用)
--fcc-folder=FOLDER
Webから送信したファイルを保存するフォルダを指定する (Courier-IMAP なら INBOX.Sent など)
--client-width
クライアントの横幅の桁数を指定する (デフォルトは20)

コマンドラインオプションの一覧は mobileimap --help で表示できます。

gzip 圧縮

Ruby/Zlib をインストールしてから mobileimap サーバを立ち上げると、 gzip による圧縮が行えるようになります。

gzip 対応のブラウザからアクセスすると、コンテンツが gzip で 圧縮されてブラウザに送られます。このとき、ページのフッタ部分 に

--
mobileimap 2.7 (gzip)

のように、gzip で圧縮されているという印がつきます。gzip圧縮 を行うと、通信するデータの量が減るため、パケット料金の節約が 期待できます。とはいうものの、gzip 圧縮に対応したブラウザを 内蔵した携帯電話は存在しないようです (パケットが増えた方が儲 かるわけですから、そういうものでしょうね。もしあったら教えて ください)。

豆知識

デフォルトで「未読」のメールだけを読みたい

デフォルトで「未読」のメールだけを読みたい場合はメール一覧で 「未読」を選択した後でブックマークしてください。

既知の問題点

  • メール一覧時に "unexpected token NIL" や "closed stream error" といった エラーが起きる場合は最新の Net::IMAP をお試しください。
    (Ruby 1.8.1 までの Net::IMAP では起きる可能性があります)
  • https接続時は gzip 圧縮できない (なぜか出力が途中で切れるというバグが解決しないため)

ダウンロード

GNU General Public License version 2 (日本語訳)に従ったフリーソフトウェアとして公開します。完全に無保証です。

関連リンク集

参考文献