address LogoPowered by Pegasus

分散環境における mail コマンド

2001/06/28


最近は SPAM が横行しているためにメールの送信が窮屈になってきた。DNS に登録されていないホストからのメールの受け取りを拒否するホストが増えてきているのである。



端末からのメールの2つの送り方

Plan9 の分散環境においては端末は(一般論として) DNS に登録されていないと考える事ができる。CPU サーバは DNS に登録されるであろう。この事を前提にして端末を使用するユーザがメールを出す事を考えよう。

Bob が alice にメールを出す場合には CPU サーバから

mail alice@somedom.com
を実行すれば、メールは CPU サーバから somedom.com に送り届けられる(と設定されているとせよ)。

では端末を使用している Bob がメールを出す場合にはどのようにすべきか? Bob の端末は DNS には登録されていない。従って必ず CPU サーバにログインして (Plan9 の場合には単に cpu コマンドを打てばよい)、CPU サーバから mail コマンド を発行する必要があるように思えてくる。しかし、Bob はうっかりすると CPU サーバへのログインを忘れて mail コマンドを発行するのだ...

いくつかの解決法が存在するであろう。UNIX 的な考え方をすれば、端末は CPU サーバにメールを転送し、そこから届けてもらう。この方法は Plan9 でも可能であるが、いくつかの難点がある。

第一に、メールのヘッダに端末から CPU サーバへの経路記録が残る。これは美しくはない。
第二に、/mail/lib/rewriteの内容を端末とCPUサーバで変えなくてはならない。 共通のルートファイルシステムを使用している場合には端末用の/mail/lib/rewrite.gatewayを書き、 /bin/termrc の中で
bind /mail/lib/rewrite.gateway /mail/lib/rewrite
を実行する事によって可能ではあるが美しくはない。

Plan9 らしい処理の方法は /rc/bin/mail を以下のように書き換える事であろう。

#!/bin/rc
switch($#*){
case 0
        exec upas/nedmail
}

switch($1){
case -f* -r* -c* -m*
        exec upas/nedmail $*
case *
        if(~ $service terminal)
                rx ar upas/marshal $*
        if not
                exec upas/marshal $*
}

case *以下が変更され、端末からの実行の場合には

rx ar upas/marshal $*
が実行されるようになっている。

Plan9 の rx コマンドは単にリモート実行を行うだけではない。I/O のリダイレクトが端末とサーバとの間で許されるのである。

この方法の欠点は、フルシステムの Plan9 と CPU サーバを持たない Plan9 システムで /rc/bin/mail の内容を分けなくてはならない事にある。もっと良い方法があるかも知れない... !