最終更新日: 2003-06-18 (公開日: 2003-11-13)
UNIX USER誌 2003年8月号 に掲載された記事の元の原稿です。
mobileimap は、i-mode や au などの携帯電話から、PC用のアドレ スに届いたメールを手軽に参照するためのツールである。本稿 では mobileimap のインストール方法から使い方、仕組みまで幅広 く紹介する。
携帯電話がない時代にどうやって待ち合わせをしていたか覚えてい る人は少ない。特に携帯電話のメールは、電車などで移動している 最中にも相手と連絡が取れるため、待ち合わせには欠かせないツー ルである。私の周りには、つい最近にいたるまで、なんだかんだと 理由をつけて携帯電話を持つことをかたくなに拒否していた人が何 人かいたが、結局は誰もが入手した途端に前言を撤回することにな り、彼らの抵抗はすべて無駄に終わった。
携帯電話のメールアドレスは DoCoMo や KDDI といった通信業者に よって割り当てられており、職場や自宅のPC で利用しているメー ルアドレスとは異なるものとなっている。このため、PC用のアドレ スに届いたメールを携帯電話で読むには、メールの転送設定を行っ たり、リモートメール*1などの有料サー ビスを利用する必要があった。
しかし、PC用のアドレスのメールをすべて携帯電話に転送するのは 考え物である。「お、彼女からメール!」と思ってチェックして 「初心者です。 Unix User の付録の Linuxがうまく動きません。 教えてください」のようなメールが転送されて届いていたら本誌を 恨んでしまうだろう。また、有料サービスの世話にならずに自前で なんとかしたくなるのが Unixオタクの性質である。本稿では、そ んな人にぴったりなツール mobileimap を紹介する。
mobileimap *2 は、 i-mode や au などの携帯電話から、PC用のアドレスに届いたメー ルを手軽に参照するためのツールである。mobileimap はWebメーラー として動作し、携帯電話のブラウザからアクセスして利用する。
mobileimap は PC用のアドレスに届いたメールを参照するために IMAP (Internet Message Access Protocol) というプロトコル *3を利用している*4。 mobileimap は次のような特徴を持っている。
mobileimap の動作を確認した携帯電話の機種を次に挙げる。ここ に挙げられていないものでも、i-mode や au の最近の機種であれ ばまず大丈夫である。
また、mobileimap との動作を確認した IMAP サーバは次の通りで ある。
私の場合は、uw-imapd は動作が遅い、 Cyrus IMAP Server はメー ルボックスを独自の形式で保存する、という話を聞いていたため、 Maildir 形式 *8 でメールボックスを保存し、動作が高速という評判のCourier-IMAP を選んで使っている。
IMAP はサーバ上にすべてのメールを保存して管理するためのプロ トコルである。このため、PC や PDAなどのどのクライントからア クセスしても自分のメールボックスを同じように参照できるという 利点を持つ*9 。
一方、現在多くのプロバイダが採用しているPOP (Post Office Protocol) というプロトコルでは、一度受信したメールは基本的に サーバ上から削除される。このため、複数のクライントからメール を受信する場合にメールボックスの共有ができないという欠点を持っ ている。
私の場合、以前は POP を利用してメールの受信を行っていたもの の、レンタルサーバを借りてからは PC用のアドレスのメールはす べて IMAP で管理している。IMAP に乗り換える前は、出先などで、 「打ち合わせのスケジュールは職場のデスクトップのあのメールに 入っているんだけど」といった不便があったが、現在は mobileimap を利用して出先からも自分のメールボックスをいつで もどこでも参照できるので、ずいぶん快適になった。出先にPC が ある場合は mobileimap ではなくsquirrelmail *10 というWebメーラを使っている。 こちらは mobileimap と違ってかなり作り込まれたWebメーラであ る。
まだ POP を使っている方で、自由に使えるUnix サーバがある方は ぜひ IMAP への移行をお勧めする。
mobileimap を利用するには次のソフトウェアをインストールする。
Ruby*11はまつもとゆきひろ氏に よって開発されたオブジェクト指向スクリプト言語である。 mobileimap はバージョン 1.6.7 以上の Ruby で動作する。日本語 のフォルダ名を表示するには Ruby 1.8 に付属するライブラリを必 要とするため、Ruby 1.8 のインストールをお勧めする。原稿執筆 時点では Ruby 1.8 は正式に公開されていないため、開発版のスナッ プショット *12を入 手してインストールする必要があった。
% gzip -dc snapshot.tar.gz | tar xvf - % cd ruby % ./configure % make % su Password: (rootのパスワードを入力) # make install
Ruby/Zlib はデータ圧縮用のライブラリ Zlib*13 を Ruby から使うための バインディング *14 である。 Ruby/Zlib*15 をインストールしておくと、mobileimap が生成する HTML コンテ ンツを gzip 形式で圧縮してブラウザに送信することができる。 Ruby/Zlib のインストールは必須ではなく、mobileimap は Ruby/Zlib がなくても問題なく動く。
Ruby/Zlib のインストールは次のように行う。原稿執筆時点での最 新版は 0.6.0 である。
% gzip -dc ruby-zlib-0.6.0.tar.gz |tar xvf - % cd ruby-zlib-0.6.0 % ruby extconf.rb % make % su Password: (rootのパスワードを入力) # make install
OpenSSL for Ruby は暗号化通信用のライブラリ OpenSSL*16 を Ruby から使うた めのバインディングである。OpenSSL for Ruby*17をインストールして おくと、https *18 に対応した Webメーラーとしてmobileimap を動作させ ることができる。OpenSSL for Ruby のインストールは必須ではな く、mobileimap は OpenSSL for Ruby がなくても問題なく動く。
OpenSSL for Ruby のインストールは次のように行う。原稿執筆時 点での最新版は 0.2.0-pre2 である。
% gzip -dc ossl-0.2.0-pre2.tgz |tar xvf - % cd ossl-0.2.0-pre2 % ruby extconf.rb % make % su Password: (rootのパスワードを入力) # make install
mobileimap のインストールは次のように行う。原稿執筆時点での最新 版はバージョン 1.5 である。
% gzip -dc mobileima-1.5.tar.gz |tar xvf - % cd mobileima-1.5 % make % su Password: (rootのパスワードを入力) # make install
mobileimap をもっとも簡単に起動するには、IMAPサーバが動いて いるホストにログインして、コマンドラインから次のように実行す る。
% mobileimap ユーザ名@localhost:143[CRAM-MD5]: IMAP Password: (IMAP用のパスワードを入力) http://example.com:8143/
IMAP用のパスワードを正しく入力すると、mobileimap が HTTP サー バとして動作を開始し、ブラウザからアクセスするための URL (この例では http://example.com:8143/) を表示する。表示され たURL に Mozilla や Internet Explorer などのブラウザからアク セスしてうまくメールが読めることを確認したら、携帯電話からア クセスしてみよう。
上のようにコマンドラインから起動した mobileimap は Ctrl + C を押すと終了する。
mobileimap はデフォルトで次のようなパラメータを使用する。 各パラメータは括弧内に示したコマンドラインオプションで指定できる。
IMAPサーバの認証方法を CRAM-MD5 *19 から、 パスワードを平文で流す LOGIN 認証に切り替えるには、
% mobileimap -a LOGIN
と指定する。IMAPで使用するユーザ名、ホスト名、ポート番号を指 定するにはそれぞれ -u, -S, -P オプションを用いる。
mobileimap は HTTP を喋るサーバとして動作する。その際のホス ト名はデフォルトでは gethostnameシステムコールによって取得し たものが使われる。複数のホスト名を持ったホストで mobileimap を動かす場合に、ホスト名を指定するには -s オプションを用いる。 たとえば、 foo.example.com, bar.example.com baz.example.com という3つの名前を持つホスト名で mobileimap を動かす場合に、 foo.example.com というホスト名を利用する場合は
% mobileimap -s foo.example.com
のように指定する。このとき、ブラウザから http://bar.example.com:8143/ のように、foo.example.com 以外 のホスト名でアクセスすると「ホスト名が間違っています」という エラーメッセージが表示され、メールの閲覧はできないので注意が 必要である。mobileimap が用いるポート番号は -p オプション で指定できる。
mobileimap からメールを送信するときには、デフォルトでは localhost の25番ポートで動いている SMTP (Simple Mail Transfer Protocol) サーバが用いられる。SMTPサーバのホスト名 とポート番号を指定するにはそれぞれ、--smtp-host, --smtp-port でオプションを用いる。
mobileimap からメールを送信する時の From: の情報を設定するに は
% mobileimap --from="Taro Yamada <taro@example.com>"
のように指定する。このように From: の情報を設定することによ り、PC 用のアドレスで参加しているメーリングリストに mobileimap を使って投稿できて便利である。
mobileimap の起動時に -d オプションを指定するとサーバとして 常駐する。このとき ~/.mobileimap.log *20 にログが書 き出され、~ /.mobileimap.pid にプロセスID が書き出される。
バックグラウンドで動いているサーバを停止するには次のように実 行する。mobileimap のサーバが停止し、 ~/.mobileimap.pid が 削除される。
% mobileimap --stop
複数の mobileimap をサーバとして立ち上げている場合は、 ~/.mobileimap.pid にプロセスIDが記録されているすべてのサーバ が停止する。個別に停止したいときは
% mobileimap --list 7754 http://example.com:8143/ 7761 http://example.com:8144/foo
のように実行して、現在動いているサーバのリストを調べて、
% mobileimap --stop='http://example.com:8143/'
のように停止させたいサーバがサービスしている URL を指定する。 次のように複数のURLを指定してまとめて停止させることもできる。
% mobileimap --stop='http://example.com:8143/ http://example.com:8144/foo'
mobileimap のような Web アプリケーションは通常、CGI のプログ ラムとして実装されることが多い。mobileimap を CGI ではなく HTTPサーバとして実装したのは
という理由からである。サーバとして実装したため、パスワードの 入力はサーバを立ち上げるときの 1回だけでよく、携帯電話からパ スワードを入力する必要はない。その代償として mobileimap が動 いているホスト名とポート番号を知られてしまうと、誰でもアクセ スできてしまうという危険性があるが、後述する方法によってセキュ リティを高めることができる。
なお、Ruby を使って HTTPサーバを作るには WEBrick*21 というライブラリを使 うと楽であるが、mobileimap では自前で用意したコードで HTTPサー バの処理を行っている。これは、Ruby標準添付以外のライブラリに 依存するのを避けたかったということもあるが、コンパクトな HTTPサーバを自分で作ってみたかったという理由も大きい。
mobileimap を利用して携帯電話からメールを参照するのは簡単で ある。まず、携帯電話のブラウザから mobileimap の URL にアク セスするとIMAP の受信箱のメール一覧が表示される。■マークは 既読のメールを、□マークは未読のメールを表している。
メールの内容を閲覧するにはメールの件名の部分のリンクをクリッ クすればよい。
このとき、添付ファイルがある場合は添付ファイルへのリンクとサ イズが表示されるので、携帯電話で表示可能なファイルの場合は、 ここをクリック (この例では robo.jpg) すれば添付ファイルを閲 覧することができる。
閲覧中のメールに返信をするには、下の方に表示されている「端末 で返信」か「Webで返信」をクリックする。前者は携帯電話に内蔵 しているメーラーで返信するための、後者は mobileimap を利用し て Web経由で返信するためのリンクである。「Webで返信」をクリッ クすると
のように、件名や差出人の部分があらかじめ記入されたフォームが 表示される。本文を記入して「送信」ボタンをクリックすれば返信 が完了する。
フォルダの一覧を表示するには、メール一覧のページにある「フォ ルダ一覧」のリンクをクリックすればよい。
一覧表示されているフォルダ名をクリックすれば、受信箱のときと 同様にメールの一覧が表示される。
以上が携帯電話からの主な使い方である。他にもへッダの詳細を表 示したり、メールの転送を行うといった機能も備えている。
上で紹介した起動方法では、mobileimap が動いているホスト名と ポート番号を知られてしまうと、誰でもアクセスできてしまうとい う危険性がある。そこで、他人からアクセスされにくくし、セキュ リティを高める方法を紹介する。ここで紹介する2つの方法はいず れも完全ではないが、個人のメール程度のセキュリティとしては十 分なものと考えている。
mobileimap の起動時に
% mobileimap -x foobar
のようにキーワードを指定すると、 http://example.com:8143/foobar という URL でしかアクセスでき なくなる。foobar の部分を秘密にしておけば、他人からアクセス される危険性を低くすることができる。
mobileimap はメール本文に現れる http:// といった URL へのリ ンクを張らないので、Webサーバのリファラーのログ *22から mobileimap の URLが見つかってしまう危険性は少ない。また、ps コマンドから mobileimap のコマンドラインオプションは見えない ようにしている。
au の携帯電話から Webにアクセスすると、サブスクライバID とい う、端末ごとに異なるID が HTTPのリクエストへッダ *23 に付加される。これを利用 すれば、mobileimap の起動時に
% mobileimap -i xxxxxxxxxxxxxx_xx.ezweb.ne.jp
のように指定したサブスクライバIDを持つ端末からの接続のみを受 けつけるようにできる。自分の携帯電話のサブスクライバIDを調べ るには、ezweb の「トップメニュー」から「料金・申し込み・イン フォ」→「設定情報」→「サブスクライバIDの表示」という手順で 選択*24していくか、
% mobileimap -i unixuser
のように、でたらめな文字列を -i オプションで指定して携帯電話 から mobileimap の URL にアクセスすればいい。このとき、「サ ブスクライバID が間違っています: xxxxxxxxxxxxxx_xx.ezweb.ne.jp」のように、自分のサブスクライ バID が表示されるので、これを記録して -i オプションに指定す る。なお、-i オプションは -x オプションと併用できる。
ここでは mobileimap のその他の機能を紹介する。
OpenSSL for Ruby がインストールされている場合は https を利用 して通信の暗号化ができる。https を利用するにはコマンドラインから 次のように実行する。
% mobileimap --ssl
このとき、https を喋る mobileimap のホスト名とポート名は --http-host, --http-port で指定したものが用いられる。SSLの鍵 と証明書を指定するには-- ssl-key, --ssl-cert オプションを利 用する。鍵と認証書が指定されていないときは使い捨ての鍵と認証 書を自動生成して用いる。この場合、ブラウザは次のような警告を 表示するが、「はい」を選んで続行すれば、通信自体は暗号化され るので特に問題はない。
IMAP には購読フォルダ *25 という仕組みがあり、IMAP対応のメーラーに よっては購読フォルダを選択する機能を持ったものがある。この機 能は、古くなったフォルダを、削除はせずにフォルダ一覧から見え ないようにする、といった用途で使われる。mobileimap のフォル ダ一覧で購読フォルダのみを表示するには
% mobileimap --subscribed-only
のようにオプションを指定する。
フォルダ一覧で表示されるフォルダを制限するには、-- folder-include と --folder-exclude オプションで正規表現を指 定する。たとえば、friends または ml という文字列を含むフォル ダ名のみをフォルダ一覧で表示するには次のように指定する。
% mobileimap --folder-include="friends|ml"
あるいは、boss という文字列を含むフォルダ名を除外するには次 のように指定する。
% mobileimap --folder-exclude="boss"
両方指定したときは --folder-include が先に適用され、 その後で --folder-exclude が適用される。
HTML コンテンツの gzip 圧縮は、gzip 対応のブラウザからアクセ スしたときのみに働く。gzip 圧縮が働いている場合は、ページの 末尾の部分に
のように、gzip で圧縮されているという印がつく。gzip圧縮を行 うと、通信するデータの量が減るため、通信料金の節約が期待でき る。とはいうものの、現在のところ gzip 圧縮に対応したブラウザ を内蔵した携帯電話は存在しないようである。パケットが増えるほ ど通信料金を請求できる仕組みなのだから、当然といえる。gzip 圧縮の機能が有効に働くのは、PDA や PC などからパケット課金の 通信カードを利用して mobileimap にアクセスするときくらいかも しれない。
IMAP では日本語のフォルダ名を Unicode の UTF-7 というエンコー ディングを用いて *26表現している。たとえば「abc日本語」という フォルダ名は、 IMAP では「abc&ZeVnLIqe-」のような文字列とし て扱われる。
mobileimap では、Ruby 1.8 に標準添付されている net/imap と iconv ライブラリを利用して、日本語のフォルダ名の表示を実現し ている。具体的には、次のようなコードで処理を行っている。
str = Net::IMAP::decode_utf7(str) c = Iconv.new("euc-jp", "utf-8") c.iconv(str)
mobileimap のコマンドラインオプションの一覧をまとめておく。
-d, --daemon デーモンとして実行 (サーバとして常駐)する -k, --stop[=URLs] デーモンを停止する -l, --list 実行中のデーモンの一蘭を表示する -a, --imap-auth=METHOD IMAPサーバの認証方法を指定する (デフォルトは CRAM-MD5) -u, --imap-user=USER IMAPサーバのユーザ名を指定する (デフォルトは $USER) -S, --imap-host=HOST IMAPサーバのホスト名を指定する (デフォルトは localhost) -P, --imap-port=PORT IMAPサーバのポート番号を指定する (デフォルトは 143) -s, --http-host=HOST HTTPサーバのホスト名を指定する(デフォルトは gethostname(2)) -p, --http-port=PORT HTTPサーバのポート番号を指定する (デフォルトは 8143) --ssl SSL対応を有効化する --ssl-key=FILE SSLの鍵を指定する --ssl-cert=FILE SSLの証明書を指定する --smtp-host=HOST SMTPサーバのホスト名を指定する (デフォルトは localhost) --smtp-port=PORT SMTPサーバのポート番号を指定する (デフォルトは 25) -i, --subscriber-id=ID ezweb のサブスクライバIDを指定する -x, --url-path=PATH URLのパス部分を指定する -f, --from=FROM メールの From: フィールドを指定する (デフォルトは $USER @ gethostname(2)) --folder=FOLDER 最初に見るフォルダ名を指定する (デフォルトは INBOX) --folder-include=RE 一覧するフォルダ名を正規表現で指定する (デフォルトは "") --folder-exclude=RE 除外するフォルダ名を正規表現で指定する (デフォルトは "^$") --folder-prefix=PREFIX フォルダ名のプリフィクスを指定する (デフォルトは "") --fcc-folder=FOLDER 送信済メールの保存先フォルダを指定する --subscribed-only 購読フォルダのみを一覧する -c --cache-control <meta> タグによるキャッシュ制御を有効にする -w, --client-width=WIDTH クライアントの横幅を指定する (デフォルトは 20)
あるとき、研修のため1週間ほど出張する機会があり、滞在先には インターネット接続がないと聞いていたので AirH" の通信カード を持って出かけることにした。滞在中の暇なときにメッセンジャー やメールで時間を潰そうという考えである。ところが、現地に着い てみると AirH" が圏外であることが分かった。これではメッセン ジャーどころかメールも読めない。
実際のところ、メールが読めなくてもたいして困らないのだが、メー ルは読めないとなると無性に気になるものである。そこで、携帯電 話を使って IMAP サーバ上のメールを読む方法はないかと考えてい たところ、知人から、 mongle*27 という Webメーラを携帯電話用に改造したものがあると教えてもらった*28。
さっそく氏から CGI プログラムのソースを見せてもらったところ、 次のような問題があることが分かった。
そこで、こうした問題のないツールを作ろうと考えて開発したのが mobileimap である。滞在中の空き時間を利用して集中的に開発を 行ったため、短期間で満足のいく出来に仕上げることができた。ネッ ト接続が絶たれていたために、ネットサーフィンなどの余計な時間 を使わなかったのもよかったようである。
本稿を書いていると、ふと、「1日に何通くらいのメールを出して いるのだろうか」という疑問がわいてきた。そこで、簡単なツール を作って調べた結果を以下に示す。メールを出さない日はほとんど ないだろうと思っていたが、意外にもそうでもないことがわかった。
% mailhist ~/Maildir/.Sent/cur 一日に出したメールの数の棒グラフ 1999-01-01 〜 2003-06-11 (全1623日, 全13156通, 平均8.11通/日) 0通 123日 ***************************************************** 1通 97日 ****************************************** 2通 114日 ************************************************* 3通 96日 ****************************************** 4通 113日 ************************************************* 5通 137日 ************************************************************ 6通 116日 ************************************************** 7通 104日 ********************************************* 8通 108日 *********************************************** 9通 88日 ************************************** 10通 72日 ******************************* 11通 63日 *************************** 12通 66日 **************************** 13通 43日 ****************** 14通 38日 **************** 15通 35日 *************** 16通 34日 ************** 17通 33日 ************** 18通 22日 ********* 19通 16日 ******* 20通 19日 ******** 21通 12日 ***** 22通 7日 *** 23通 12日 ***** 24通 10日 **** 25通 6日 ** 26通 6日 ** 27通 3日 * 28通 4日 * 29通 4日 * 30通 2日 (以下省略)
mailhist *29 と 名づけたこのツールは、 1メール = 1ファイルの Maidir 形式、MH 形式のメールボックスに対応している。興味のある方は試していた だきたい。ちなみに、私の友人の場合は、次のように美しい指数分 布になった。
2001-02-12 〜 2003-06-10 (全849日, 全1712通, 平均2.02通/日) 0通 294日 ************************************************************ 1通 177日 ************************************ 2通 125日 ************************* 3通 84日 ***************** 4通 58日 *********** 5通 35日 ******* 6通 27日 ***** 7通 18日 *** 8通 7日 * 9通 8日 * (以下省略)
mobileimap を使い始めてから 2か月の間、毎日、便利に使ってい る。こんなに便利なんだからもっと普及してもいいのに、とは思う ものの、残念ながら mobileimap のユーザは多くないようだ。現状 ではそもそも IMAP 自体があまり普及していないが、自宅でIMAPサー バを動かす人が増えたり、IMAP に対応するプロバイダが増えてい くに従って、mobileimap が役に立つ場面は増えていくのではない かと考えている。
*1<http://rstyle.jp/>
*2<http://0xcc.net/mobileimap/>
*3IMAP には IMAP2, IMAP2bis, IMAP3, IMAP4, IMAP4rev1 などの
さまざまなバージョンがあるが、本記事では最新の IMAP4rev1 の
ことを指している。
*4 POP には対応していな
い。開発者が POP の対応を必要としていないためである。
*5<http://www.inter7.com/courierimap/>
*6<http://asg.web.cmu.edu/cyrus/imapd/>
*7<http://www.washington.edu/imap/>
*8qmail や Postfix などのメールサーバが対応し
ているメールボックスの形式。1 メール=1ファイルで保存する
*9IMAPについての詳しい解説としては、日比野洋克氏
による @IT の連載「モバイル環境に優しいメールプロトコルIMAP」
<http://www.atmarkit.co.jp/fmobile/rensai/imap01/imap01.html>
がある。
*10<http://squirrelmail.jp/>
*11<http://www.ruby-lang.org/>
*12<ftp://ftp.ruby-lang.org/pub/ruby/snapshot.tar.gz>
*13<http://www.gzip.org/zlib/>
*14ネイティブにコンパイルされたライブラリをス
クリプト言語などから利用するためのライブラリのこと。
*15<http://raa.ruby-lang.org/list.rhtml?name=ruby-zlib>
*16<http://www.gzip.org/zlib/>
*17<http://www.nongnu.org/rubypki/>
*18SSL (Secure Socket Layer) という技術を用い
て Webサーバとクライアントの間の通信を暗号化するためのプロト
コル。
*19MD5 という一方向ハッシュ
関数と Challenge-Response Authentication Mechanism という手
順を用いて、パスワードを暗号化してサーバに伝える方式。
*20~/.mobileimap.log は
自分のホームディレクトリの下の .mobileimap.log ファイルであ
る。私の場合は /home/satoru/.mobileimap.log。
*21<http://www.webrick.org/>
*22どこのペー
ジのリンクから飛んでアクセスされたかを記録するログ。
*23ブラウザ
からWebサーバに送るへッダのこと。
*24ezwebのメニューはときどき変更されることがあるようなの
で、この手順は変わるかもしれない。
*25中のメールを読んだり整理したりする
フォルダのこと。
*26正確には UTF-7 にいくつかの細かい変更が
加えられている。
*27<http://home.sunheartcowfork.com/mongle/>
*28
インターフェイスの街角(65) - IMAPを利用した楽々メール管理,
増井俊之, Unix Magazhine 2003年5月号
*29<http://0xcc.net/attic/mailhist>