一般的な解説は手に余るので、筆者の環境を想定してメールの設定を解説しよう。
さらに
またさらに家庭でもLANが組まれており、メールを出す。家庭からメールを出した場合にはメールは ar を中継して配送される仕組みにしている。
大学のメールサーバから中継しない理由は、あたかもメールが ar から発信されたかのように見せたいからである。(さらに現在では大学のメールサーバは防火壁によって守られており、家庭からのメールの中継には使用できない。
もっとも大学がサービスする接続口は大学の一部と見做されているのでメール中継は可能なのですが、電話代が大変です。結局はB社の回線を通じて大学にアクセスしています。この場合には電話は定額料金ですからネ...)
家では主に NEXT を使用している。Plan9 も使えるが、電子文具としての能力は NEXT には及ばない。
ホスト名とドメイン名は既に /lib/ndb/local
で指定されている。
このファイルで次のように smtp サーバが指定できるが、この情報は DHCP クライアント向けであり、Plan9 システムでのメールの設定とは無関係である。
# # my domain # dom=*.aichi-u.ac.jp # ns: name server # mb: Postmaster ns=aucc smtp=vega
本来は /lib/ndb/local
での smtp サーバの設定によってメールがそこへ転送されるようにすべきであろうが、実際にはそのようにはなっていない。
ディレクトリ /mail
の内容を確認しよう。
d-rwxrwxrwx M 60283 upas upas 0 Mar 8 20:40 /mail/box d-rwxrwxrwx M 60283 upas upas 0 Jun 8 2000 /mail/faxoutqueue d-rwxrwxrwx M 60283 upas upas 0 Nov 16 14:59 /mail/faxqueue d-r-xr-xr-x M 60283 upas upas 0 Jun 8 2000 /mail/fs d-rwxrwxr-x M 60283 upas upas 0 Nov 16 14:59 /mail/lib d-rwxrwxrwx M 60283 upas upas 0 Mar 11 14:21 /mail/queue d-rwxrwxrwx M 60283 upas upas 0 Feb 15 02:53 /mail/tmp
最後の /mail/tmp
はもしかすると
d-rwxrwxr-x M 60283 upas upas 0 Feb 15 02:53 /mail/tmp</pre>になっているかもしれない。その場合には大きなファイルを受け取る事ができないので
defaultdomain aichi-u.ac.jp norelay on # disallow relaying verifysenderdom off #disable dns verification of sender domain saveblockedmsg off #save blocked messages ournets 202.250.160.139 202.250.160.73 ourdomains ar.aichi-u.ac.jp
/mail/lib/smtpd.conf
norelay off はリレーサーバとしての設定である。普通の設定では on にする。
on にした場合には限定されたリレーだけが許される。
ournets は IP で指定する。ここで指定された IP のマシンは(信頼できると見做され)どこにでもメールを中継してくれる。それ以外のマシンは
ourdomains で指定された ar.aichi-u.ac.jp
にしか配送されない。
第3版のPlan9 ではメールの SPAM 対策が行われた。(第2版では筆者は自分で SPAM 対策のためにパッチをあてざるをえなかった。)
smtpd.conf や blocked や後述の patterns は SPAM 対策のために第3版で導入されたファイルである。
blocked は smtpd.conf でメールの受入を許されたホストに対してさらにメールをブロックする。
このファイルの中には
dial 152.166.0.0/15, 152.168.0.0/14 #aol modems allow 63.12.0.0/16 #uunet modems (63.0.0.0-63.31.255.255 not 12) *block aol.com!makemoneyfast block 193.189.160 # mail.siol.net relay 210.98.29.14 # cmp1.kias.re.kr *relay gatekeeper4.mcimail.comのような行が含まれている。(この内容には筆者の設定も含まれているかも知れない。)
allow
は例外を定めている。この行以降の拒否コマンドに対して効果がある。
rewrite.gateway
とrewrite.direct
が添付されており、このいずれかを rewrite にコピーして編集する。
# translate local aliases from /mail/lib/namefiles [^!@.]+ translate "/bin/upas/aliasmail '&'" # deliver mail without a domain locally local!(.*) >> /mail/box/\1/mbox # your local names \l!(.*) alias \1 \l\.YOURDOMAIN\.DOM!(.*) alias \1 # convert source domain address to a chain a@b@c@d... @([^@!,]*):([^!@]*)@([^!]*) alias \2@\3@\1 @([^@!]*),@([^!@,]*):([^!@]*)@([^!]*) alias @\1:\3@\4@\2 # convert a chain a@b@c@d... to ...d!c!b!a ([^@]+)@([^@]+)@(.+) alias \2!\1@\3 ([^@]+)@([^@]+) alias \2!\1 # queue all mail for delivery ([^!]*)!(.*) | "/mail/lib/qmail '\s' 'net!\1'" "'\2'"
/mail/lib/rewrite
\l\.YOURDOMAIN\.DOM!(.*) alias \1を
\l.aichi-u.ac.jp!(.*) alias \1に変更すればよい。
\.YOURDOMAIN\.DOM
をここで設定させるのは気が利かない。この値は分かっているのだから、それをそのまま採用すべきではないかと思われる。
(\l でホストのローカル名を表しているように、\d でドメイン名を表すようにしてもよいではないか?)
#!/bin/rc sender=$1 shift addr=$1 shift # for example # $sender: # alice -- from local mailer # now smptd rejects a sender who pretends local user. # /dev/null -- from local postmaster # *!alice -- from remote machin # *!/dev/null -- from remote postmaster # $addr: host address of recipient # net!vega -- to remote hosts vega # $*: recipient # bob -- a user on vega /bin/upas/qer /mail/queue mail $sender $addr $* || exit 1 /bin/upas/runq /mail/queue /mail/lib/remotemail</dev/null>/dev/null >[2=1] exit 0
/mail/lib/qmail
remotemail
に渡すべき引数は一旦はキューのデータとして記録され、runq
はそれをremotemail
に渡している(はずである。筆者はまだソースを見ていない。)OK=0 dom=aichi-u.ac.jp if(~ $sender gaea gaea.$dom!*){ ifs0=$ifs ifs='!' s=`{echo -n $sender} ifs=$ifs0 sender=$s(2) switch($sender){ case arisawa OK=1 case * ; } } if(~ $OK 1){ # sender masquering awk ' /^From |^Received:|^MBOX-Line:|^Message-ID:/{f=1;next} /^From:/{f=1; print "From:","'$sender@ar.aichi-u.ac.jp'"; next} /^[ \t]/ && f==1 {next} /^$/{ print; while (getline>0) print $0} /.+/{f=0;print $0}'|\ /bin/upas/qer /mail/queue mail $sender $addr $* || exit 1 /bin/upas/runq /mail/queue /mail/lib/remotemail</dev/null>/dev/null >[2=1] exit }
外部に出すメールの送り先は 、remotemail
の中で指定されている。
この内容は
#!/bin/rc shift sender=$1 shift addr=$1 shift fd=`{/bin/upas/aliasmail -f $sender} switch($fd){ case *.* ; case * #fd=yourdomain.dom fd=ar.aichi-u.ac.jp } echo remotemail: `{date} $fd $addr $sender $* >> /sys/log/test # smtp: the -h option uses host as the local system name; # it may be fully-qualified or not. # If .domain is given, it is appended to the end of the system name. exec /bin/upas/smtp -h $fd $addr $sender $*
/mail/lib/remotemail
yourdomain.dom
をar.aichi-u.ac.jp
に置き換える。
/bin/upas/smtp
はメールの送信を受け持つ。送信先のホストに SMTP プロトコルに従ってメールを送り込む仕事を受け持っている。このコマンドの -h
オプションで与えられる $fd
は、SMTPプロトコルの FROM アドレス、即ち
MAIL FROM:<.....>の中の
.....
で使用される。このアドレスはメールが配送できなかった場合のリターン先を指定している。(RFC821 を見よ)
メールが配送できなかった場合のリターン先は原則として配送を行ったホストであろうが、例外を定める事ができる。このスクリプトに現れる
/bin/upas/aliasmail -f $senderは、
/mail/lib/fromfile
が存在した時に、この中に記載されているユーザのメールアドレスの domain 名を返す。(筆者は使用した事がない。)
SMTP プロトコルの HELO ホストは smtp を実行するホストのアドレスに固定されている。
namefile
はシステムワイドなユーザの別名が書かれているファイルを指定する。ここには次の内容が書かれている。
names.last names.local
/mail/lib/namefiles
names.local
の内容は例えば次のようなものである。
postmaster arisawa staff arisawa bootes