Logo address

メールに関するファイルの設定

目次

ここでは Plan9 のメール関係のファイルの設定項目を述べる。動作の仕組みは
"Plan9 sendmail" で解説する。

一般的な解説は手に余るので、筆者の環境を想定してメールの設定を解説しよう。

  1. システム構成
  2. /lib/ndb/local
  3. /mail
  4. /mail/lib/smtpd.conf
  5. /mail/lib/blocked
  6. /mail/lib/rewrite
  7. /mail/lib/qmail
  8. /mail/lib/remotemail
  9. /mail/lib/names.local

システム構成

筆者の Plan9 システムは大学の研究室で運用されている。その構成は以下の通りである。

さらに

である。

またさらに家庭でもLANが組まれており、メールを出す。家庭からメールを出した場合にはメールは ar を中継して配送される仕組みにしている。
大学のメールサーバから中継しない理由は、あたかもメールが ar から発信されたかのように見せたいからである。(さらに現在では大学のメールサーバは防火壁によって守られており、家庭からのメールの中継には使用できない。
もっとも大学がサービスする接続口は大学の一部と見做されているのでメール中継は可能なのですが、電話代が大変です。結局はB社の回線を通じて大学にアクセスしています。この場合には電話は定額料金ですからネ...)

家では主に NEXT を使用している。Plan9 も使えるが、電子文具としての能力は NEXT には及ばない。

/lib/ndb/local

ホスト名とドメイン名は既に /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

ディレクトリ /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>
になっているかもしれない。その場合には大きなファイルを受け取る事ができないので
rwxrwxrwx にしておく必要がある。

/mail/lib/smtpd.conf

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
にしか配送されない。

/mail/lib/blocked

注意: /mail/lib/blocked は現在では使われていないようです。(マニュアルにはまだ載っているのですが....) 代わりに smtpd の -g オプションが素晴らしい SPAM ブロック機能を提供しています。従ってここの記述は意味を失っています。(2004/10/20)

第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
のような行が含まれている。(この内容には筆者の設定も含まれているかも知れない。)
*block のようにアステリスク(*)で始まる場合には名前でアドレスが指定される。アステリスクを付けない場合には IP アドレスを指定する。
dial,block,relay はいずれもメールの受け取りを拒否するコマンドである。これらの違いは相手ホストに送るメッセージ、ログをとるか否かなどである。(詳しくは man smtpd を見る事)
添付ファイルでは aol が拒否されているが、筆者のサーバにも頻繁に aol から SPAM メールが入って来る。

allow は例外を定めている。この行以降の拒否コマンドに対して効果がある。


/mail/lib/rewrite

rewrite はメールの配送先のアドレスの変換規則を定義する。変換規則には正規表現が使用されている。(詳しい解説は Plan9 sendmail を見よ。)

配布ファイルにはrewrite.gatewayrewrite.directが添付されており、このいずれかを rewrite にコピーして編集する。
gateway の方はリレーホストにメールを転送し、direct は宛て先のホストに直接メールを配送する。以下に direct を例に解説する。
rewrite.direct を rewrite にコピーしよう。すると、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 でドメイン名を表すようにしてもよいではないか?)

/mail/lib/qmail

メールが配送キューに回される直前にメールは qmail に通される。ここでフィルターを掛ける事が可能である。通常はそのような事は必要ないが、筆者は重宝している。(筆者のは実はここにフィルターがかかっている。NEXT から送られたメールはここで発信者アドレスなどを書き換えているのである。)

#!/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&lt;/dev/null&gt;/dev/null &gt;[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&lt;/dev/null&gt;/dev/null &gt;[2=1]
exit
}

/mail/lib/remotemail

外部に出すメールの送り先は 、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:&lt;.....&gt;
の中の ..... で使用される。このアドレスはメールが配送できなかった場合のリターン先を指定している。(RFC821 を見よ)

メールが配送できなかった場合のリターン先は原則として配送を行ったホストであろうが、例外を定める事ができる。このスクリプトに現れる

	/bin/upas/aliasmail -f $sender
は、/mail/lib/fromfileが存在した時に、この中に記載されているユーザのメールアドレスの domain 名を返す。(筆者は使用した事がない。)

SMTP プロトコルの HELO ホストは smtp を実行するホストのアドレスに固定されている。

/mail/lib/names.local

namefile はシステムワイドなユーザの別名が書かれているファイルを指定する。ここには次の内容が書かれている。

names.last
names.local

/mail/lib/namefiles

names.local の内容は例えば次のようなものである。

postmaster      arisawa
staff           arisawa bootes