突然だが、筆者はこの原稿を執筆している今現在、地球の反対側の国、ブラジル共和国に出張中である。故あってLatin American Test Workshop(LATW 2009) という集積回路の信頼性テストを議論する学会のアジア代表を数年前から務めている縁で、10周年記念の今年の会議に出席することにした。ブラジルに行くには世界のどこを経由しても同じだけ時間がかかるもので、筆者が利用したデルタ航空はアトランタ経由で日本からはほぼ一直線なのだが、乗り継ぎ時間も含めて、家を出てからホテルに着くまで丸38時間の道程だ。
幸いにというか、今では世界中のどこでもメールが使えるので、日本にいるのとかわらないペースで日常の仕事をこなしているのだが、海外でメールを使うときに厄介なのが大量のスパムメール の問題である。筆者が使っている大学のメールアドレスは、1993年から使いつづけているということもあってか、あちこちのスパマーに登録されてしまっており、残念ながら新着メールの9割から9割5分、1日900通ものスパムをフィルタ処理しなくてはならない。名刺に印刷している手前アドレスを変えるわけにもいかず、機械的にフィルタをすると大事なメールが自動処理されてしまってビジネスチャンスを逃すかもしれないということで、毎日一応全部に目を通している。特に海外に行ったときには、いつもの「常時接続、ブロードバンド」環境のつもりで読んでいると、通信時間と料金の無駄が、ばかにならないほど膨れあがってしまう。
筆者はFreeBSDのおかげで、海外からインターネットへ接続する2週間の合計時間2時間以下 で、合計1万通~2万通 のメールをダウンロードして読むことができる。この秘密は「まとめてダウンロード」メソッドを使っているからだ。本稿ではこのテクニックを紹介しよう。
図1 真夏のブラジル
普通のとき~ 筆者のメール環境
筆者は「機械を信用せず、全部のメールに(Subjectだけでも)目を通す」主義である。さらに「メールはEmacsで読む」主義で、ソフトウェアはmh-e、2000年からはWanderlustを使ってきた。この「Wanderlustで全メールいきなりダウンロード」メソッドが破綻したのは2005年、今回と同じくLATWに出席のためブラジルに出張したときだった。なにしろ回線が細くて(10Kバイト/sくらいだったと記憶) 、まともにやると、日本では数分で終わるところがブラジルからでは数時間かかってしまうとわかって愕然としたのだ。
そこで導入したのがThunderbird である。Thunderbirdには、「 ヘッダのみを取得」するというオプションがあるので、これを使い、ヘッダだけをまず読んで 要・不要をふるい分けて、サーバ上の不要なメールを消去した後で全文をダウンロードするようにしたわけである。さらに、Thunderbirdにはスパムメールフィルタが付いているので、これを併用することで、不要なメール量をかなり削減することができた。
利用に先立って、Thunderbirdの「Account options」を開き、通常のようにサーバ名やユーザ名を登録する他、図2 のように「□Fetch headers only」と「□Leave messages on server」「 □Until I delete them」をチェックしておく。ちなみに、筆者が利用しているプロトコルは「POP」(Post Office Protocol)だが、そのままではパスワードが平文で流れるので、「 □Use secure authentication」にもチェックして「APOP」で接続する。より安全なSSL(Secure Sockets Layer)などを使いたいところだが、プロバイダによっては提供していなかったりするのが痛いところだ(仕方ない) 。
図2 Thunderbirdの設定
毎日の手順は図3 のようになる。【 1】Thunderbirdを起動してメールを「読み込む」と、図4 のように、メッセージのヘッダのみ表示される。この状態で「click here 」のハイパーリンクをクリックすると、本文がThunderbirdに取りこまれるのだが、今回その操作は行わず、ひたすら【2】不要なメールの削除を行い、ゴミ箱を空(Empty trash)にする。不要なメールの選別には、Thunderbirdのスパムフィルタが意外に便利である[1] 。
そうして、【 3】再びメールを「読み込む」と、ゴミ箱から消したメールの本体がサーバから消えてくれるので、あとは【4】anderlustやSylpheedなどの「普段使っているメールソフト(MailUser Agent: MUA) 」で、メールを読み込めばよい。このメソッドを開発したおかげで、ブラジルから数時間かかったメールのダウンロードを1時間以内に短縮できるようになり、ずいぶんと助かった。もう4年も前の話である。
図3 ヘッダだけダウンロードしてフィルタする
インターネットには常時接続する
図4 「 ゴミ箱を空」にする
さらにエコなメソッド~メールをまとめてダウンロード、ローカルで展開する
前節で紹介した「ヘッダだけ先読み」メソッドは、単にThunderbirdを使っているだけだから、実はOSに依存しない。「 FreeBSDのメリットじゃあないじゃん」という突っ込みが聞こえてきそうだが、実際ここからがUNIX遣いの本領発揮であるのでお立ち合いである。
前述のメソッドでは、無駄メール削除のために、ヘッダを2回読み込んでいる。そのうち2回目で不要なメール本文を消去しているのだが、特に回線が細いとヘッダだけ読むにも意外に時間がかかることに気がつく。これは、POPでヘッダを読むために、裏では1つ1つのメールに対してリクエスト送信しているからで、さらにThunderbirdのスパムフィルタ等にかかる時間を加えると、かなりの時間が実体ではないデータのやりとり とソフトの内部処理 に食われているのだ。
前回のブラジル滞在時のホテルは、ネットにつなぎ放題だったから、1時間でも2時間でも辛抱強く放っておいたのだが、今回滞在したホテルは「1分0.25ブラジルレアル(=15円) 」という「従量制料金」だから、接続時間は1分でも短かくしたい。こんなときに役立つのが今回の目玉、「 まとめてダウンロード」メソッドである。
種明かしは簡単。「 scpコマンドで、日本のサーバマシンから/var/mail/mita(ユーザ名「mita」の場合)を手元のマシンにコピーして、手元のマシンをサーバにしたててヘッダ先読みメソッドを使えばよい」のである。手順は図6 のようになる。先ほどとの違いは、「 まずファイルを丸ごとコピーして」そののちは「全てローカルで作業する」ことである。もちろん、サーバにログインできることが条件となる。
図5 ローカルマシンににダウンロードするメソッド
前準備1:popa3dとMHの準備
必要なものは、Thunderbirdのほか、「 popa3d」などのPOPサーバプログラムと、メイルハンドラ「MH」である。7.1-RELEASEに附属のものはpopa3d-1.0.2_1とja-mh-6.8.4.j3.05_1だが、ここではportsからインストールしてみよう。
# cd /usr/ports/mail/popa3d
# make install clean
# cd /usr/ports/japanese/mh
# make install clean
popa3dは、インターネットデーモン「inetd」から起動することができる。/etc/inetd.confをrootで編集して、以下の1行を追加する。
pop3 stream tcp nowait root /usr/local/libexec/popa3d popa3d
inetdは最近のFreeBSDではデフォルトで起動していないので、本メソッドを利用する前には忘れずにrootで起動しておく。
# inetd
毎回起動がめんどうだという場合は、 /etc/rc.confに
inetd_enable="YES"
という1行を追加してもよい。
前準備2:Thunderbirdの準備
localhostの110番ポート(pop3)からメールをダウンロードするような設定を新規に作成する。「 ヘッダのみ取得」や「メールをサーバに残す」などの設定は、前節とまったく一緒である。ここでは、「 popa3d」というアカウント名にしておいた。
図6 thunderbirdの設定
メソッド実行
[手順0]ファイルを丸ごとコピー
日本に置いてあるメールサーバがUNIXの場合[2] 、メールの本文は/var/mail/に置いてあるので、これを単純にscp(secure copy)してくればよい。
ただし、既読のメールは二度は読みたくないので、サーバから削除したい。ということで、
日本のサーバにログイン
↓
/var/mail/mita を自分のホームディレクトリにコピー、gzip
↓
/var/mail/mita に /dev/null を上書き
↓
ログアウト、SCP
という、少し込み行った手順を行っている[3] 。
[3] さらに筆者が使っているサーバでは、新着メールが無いときには「Don't delete this message」という内容のメールが保存される仕組みなので、実際には「空メールを示すメール」を上書き保存している。
ホスト「remotehost」上の「mita」を取ってくる手順は以下のとおり。
> ssh remotehost
$ cp /var/mail/mita . ; cat /dev/null > /var/mail/mita; gzip -9 mita
mita.gz already exists -- do you wish to overwrite (y or n)? y
$ logout
> scp remotehost:mita.gz .
この例では、安全のためにファイル「mita」をgzip圧縮している。というのは、不注意にコピーの手順を二度繰り返すと、一つ前のメールの内容が永久に消えてしまう から、gzip時にで上書き確認をする時間で、誤っていた場合気付くだろうという一種のフェイルセーフである。この心掛けのために助かったことが数回ある。
[手順1] 展開、ダウンロード
圧縮ファイルを展開して、/var/mailにコピーする。
> gzip -df mita.gz
> cat mita > /var/mail/mita
はじめて使うときは、/var/mail/mitaが存在しないかもしれない。そのときは
> cat mita > /var/mail/mita
/var/mail/mita: Permission denied.
のようにエラーとなるので、rootになってファイルを作製する。
# touch /var/mail/mita
# chown mita:mail /var/mail/mita
# chmod 600 /var/mail/mita
Thundebirdであらかじめ作製しておいた「popa3d」アカウントでメールを読むと、パスワードを聞かれる。入力するとヘッダのダウンロードがはじまる。ローカル接続なので通信速度での律速はなく、Thunderbirdの処理スピードでヘッダが展開されてゆく。1000通といった量のヘッダがものすごいスピードで展開される様は圧巻である。
[手順2~4]メールの整理、本文取り込み
先程とまったく同じように、ヘッダの件名やThunderbirdのスパムフィルタを参考に、不要なメールをゴミ箱送り、ゴミ箱を空にして、再び「popa3d」アカウントでメールを読んで不要なメールを削除する。あとはWanderlustやsylpheedなどのメールソフト(MUA)でlocalhostからメールを読めばいいのだが、せっかくローカルにメールがあるメリットを活かそう。MHをインストールしたので使ってみよう。
> inc
と入力するたけで/var/mail/mitaの内容が /home/mita/Mail/以下にとりこまれる。これで終了である。
パフォーマンス比較: インターネットへの接続時間比較
道中のアトランタ空港で、飛行機に載っていた半日のあいだにたまったメールをダウンロードする実験を行った。半日の間にたまったメールは1080Kバイト。アメリカとの間は最近では太い回線が引かれているので、昔ほどのストレスは無いが、それでも明らかに差を見ることができた。
メソッド1 - Thunderbirdでヘッダを読む場合:合計187秒
[step1]ヘッダの取得: 45秒
2009年 3月 1日 日曜日 05時49分40秒 JST ヘッダ取得開始
2009年 3月 1日 日曜日 05時51分25秒 JST ヘッダ取得終了
[step2]ヘッダの処理(手動): 6分
[step3,4]ヘッダの再取得、実体ダウンロード: 2分22秒
2009年 3月 1日 日曜日 05時57分49秒 JST ヘッダ再取得開始
2009年 3月 1日 日曜日 06時00分11秒 JST 本文ダウンロード完了
メソッド2 - /var/mail/ファイルを丸ごとダウンロードの場合: 16秒
2009年 3月 1日 日曜日 05時51分38秒 JST コピーコマンド発行
2009年 3月 1日 日曜日 05時51分54秒 JST コピー終了
実験ではgzipしないファイル「mita」を、scp -Cオプションで圧縮して送ったところ、アメリカとの間で218kバイト/sのスピードが確認できた。
mita 100% 1090KB 218.1KB/s 00:05
結果、187秒対16秒と、10倍以上のスピードアップ効果があることが明らかになった。日本のサーバにログインしてファイルを準備する時間もほんの10~20秒程度だから、半日分の1Mバイト程度のメールファイル であれば、ものの1、2分 でダウンロード可能なことがわかる。
筆者は昨夏、フランスの田舎から2週間ほどメールにアクセスしたのだが、このメソッドを使って、ダウンロードを始める直前にInternetを開き、終了した瞬間にInternet接続をまめに(せこく?)切ることで、2週間の合計で2時間以内という驚異的な短かさで、投稿論文などの割と重めのデータも含む、全てのメールをダウンロードできた。通信にかかったコストはUSBディジタル電話機の代金(29ユーロ)のほか、Orange(France Telecom社)の2時間接続アカウントの15ユーロのみ。かなりのお値頃感である。わが家のこの夏のエコ(ノミー)に貢献したと思っている。
いまこそFreeBSDでホームサーバ~プロバイダのメールを読むにはどうするか
このように便利な「ローカルにメールダウンロード」メソッドだが、お気付きのようにログインできるサーバでなければ使えない ことが欠点である。大学のサーバならともかく、一般のプロバイダのサーバにはログインできないのが普通なので、さて困ったということになる。こんなときこそFreeBSDで、常時接続の我が家に24時間稼働のFreeBSDサーバを置いて、そこに定期的にプロバイダのメールをダウンロードすればよい 。
筆者もかれこれ8年ほど、わが家でFAXサーバ兼WebサーバのFreeBSDマシンを動かしている。先週の記事で7.1-RELEASEにアップデートしたマシンのことだが、このマシンにプロバイダのメールをダウンロードすることにした。使うソフトウェアは「fetchmail」と「maildrop」である。
[手順1]外部のネットワークからsshログインできる環境を作る
24時間動いているFreeBSDサーバがすでに家にあることが前提なので、初心者には若干ハードルが高いかもしれない。といっても作業自体は簡単で、FreeBSDをインストールしたマシンに適当にIPアドレスを振って(たとえば192.168.1.1) 、/etc/rc.confに、
sshd_enable="YES"
と書いて再起動すれば、我が家のローカルネットワークに接続した他のマシンから、Secure SHellで外部からログインできるようになる。
> ssh 192.168.1.1
などと入力して、ログインできるようになればまずは正解。
次に、ネットワークの外部から特定のポート(SSHのデフォルトだと22番)に接続したときに、「 192.168.1.1」に接続するようにルータの設定をする。最近のブロードバンド回線では、専用のルータが使われることがほとんどなので、ルータの取扱説明書のとおりに設定する。
筆者の家ではさらに、Dynamic DNSサービスに加入しており、特定のホスト名で外部からSSH接続できるようにしてある。
[手順2]fetchmailとmaildropのインストール
定期的にサーバからメールを取ってくる(fetchする)ソフトで有名なものは、「 fetchmail」というものがある。fetchmailだけだと外部のサーバからメールを取得した後、システムのメール転送ソフトに転送してしまうので、ローカルにメールを落とすために何か他のソフトウェアと組合せて使う。
/etc/rc.confに
sendmail_enable="YES"
と記入してsendmailを起動してもよいし、sendmailは何となく恐くてイヤダ(?)という読者にはメール保存専用のソフトをインストールすればよい。今回は「maildrop」というソフトウェアを使ってみる。それぞれ7.1-RELEASEに附属のバージョンはfetchmail-6.3.8_7とmaildrop-2.0.4だが、今回もまた、rootになってportsからインストールしてみよう。
# cd /usr/ports/mail/maildrop
# make install clean
# cd /usr/ports/mail/fetchmail
# make install clean
これだけで終了である。特別なファイルも必要ない。
[手順3]~/.fetchmailrcの整備
我が家のFreeBSDマシンのユーザ「mita」がメールを定期的に取ってくるという設定を書いてみよう。マシンにユーザ名「mita」でログインして、~/.fetchmailrcファイルを作る。~/.fetchmailrcにはパスワードが「生で」入るので(何と危険な!)他人が読めないように制限をかける。
> touch ~/.fetchmailrc
> ls -l .fetchmailrc
-rw-r--r-- 1 mita mita 0 3 4 07:57 .fetchmailrc
> chmod 600 ~/.fetchmailrc
> ls -l .fetchmailrc
-rw------- 1 mita mita 0 3 4 07:57 .fetchmailrc
> vi .fetchmailrc
.fetchmailrcの中身はリスト1 のとおり。
リスト1 ~/.fetchmailrc
set postmaster mita
set nobouncemail
defaults
protocol APOP
flush
poll 〈〉 user 〈〉 password 〈〉 is mita here
mda "/usr/local/bin/maildrop -d mita"
「flush」という1行を入れることで、「 メールをダウンロードしたらサーバ上のメールを消す」という設定になる。うまくいくまでは「flush」のかわりに「keep」として保持しておいた方がよいだろう。
最も大切なのは「poll」の1行で、〈サーバ〉の〈ユーザ〉で〈パスワード〉の者はここではmitaです、といった設定を必要に応じて変更する。fetchmailで取ってきたメールは「mda」で指定されたエージェントの手によって/var/mail/mitaに落とされる。/var/mail/mitaファイルが無い場合は、これまた先ほど紹介した手順で作っておくとよいだろう。
設定に間違いが無いことを確認して、おもむろに「fetchmail」と入力すると、メール取得が始まる。
> fetchmail
1 通のメッセージが アカウント (ユーザ名) , サーバ (名前) 宛に届いています (1018 バイト)
(ユーザ名)@(サーバ) 宛に届いた 1 番目のメッセージ(全部で 1 通)を読み込んでいます (1018 バイト) サーバからメッセージを削除しませんでした。
>
「ls -l」で本当にメールが入ったか確認しよう。
> ll /var/mail/mita
-rw------- 1 mita mita 1018 3 4 10:00 /var/mail/mita
うまくいったら、~/.fetchmailrcに「set daemon 600」という指定を追加して、fetchmailをデーモンモード動かすことにしよう。600秒(=10分)おきに起き出して、メールを取りにくるという寸法だ。同時に、「 keep」を「flush」に戻すとよいだろう。
リスト2 ~/.fetchmailrcに追加
set daemon 600
間違いがないことを確認して、
> fetchmail
とすれば、設定した秒数ごとにfetchmailがメールを取りこんで蓄えてくれる。あとは前節の方法を使って適当なタイミングでダウンロードすればよいというわけだ。簡単。
おわりに
同じことをWindowsマシンでやろうとすると、メールサーバを作ったりするのは簡単ではないことに気づく。海外出張のたびにFreeBSD(Macintoshでも可)を使っいてよかったと悦にひたっている筆者である[4] 。
本稿で紹介したメソッドは、通信業者には申し訳ないが(刺されるかも?) 、日本にいるときでも、ディジタル携帯電話など「時間制の接続サービス」を使うときにはとても便利な手法である。通信のバンド幅を最大限有効利用するこの「エコ接続メソッド」 、さっそく試してみてはいかがだろうか。