■MTAをqmailに交換
qmailは「安全・確実・高速」をうたい文句にしており、この頃評判が良いMTAの一つです。
そのうたい文句に踊らされてsendmailからの移行をしてみました。(ま・確かに変えて良かったです。)

qmailご本家 日本語ページ
http://www.jp.qmail.org/

qmailインストール参考
http://www.artemis.or.jp/~jk/1999-4q/19991010/

qmailでprocmailを使う
http://web.tac.tsukuba.ac.jp/~hiromi/Guide/procmail.html

qmail --- 新世代の MTA procmailの記載もあり。
http://www.kaba.or.jp/~fujiwara/server/qmail.html

ここもお勧め qmailとezmlm解説
http://center.osaka-wu.ac.jp/~yositomi/qmail/

参考書籍
Software Design 2月号

■運用方針
qmail でsmtpとpop3を。 Listserverにはfml。振り分けにprocmailを使う。qmailはtcpserverから起動しinetdは(qmailの起動に対しては)使わない。

■使ったファイル
qmail-1.03.tar.gz
ucspi-tcp-0.84.tar.gz
cdb-0.55.tar.gz
checkpassword-0.81.tar.gz

■qmailのインストール
tar zxvf qmail-1.03.tar.gz
cd qmail-1.03
mkdir /var/qmail
pw groupadd nofiles
pw useradd alias -g nofiles -d /var/qmail/alias -s /noexistent
pw useradd qmaild -g nofiles -d /var/qmail -s /noexistent
pw useradd qmaill -g nofiles -d /var/qmail -s /noexistent
pw useradd qmailp -g nofiles -d /var/qmail -s /noexistent
pw groupadd qmail
pw useradd qmailq -g qmail -d /var/qmail -s /noexistent
pw useradd qmailr -g qmail -d /var/qmail -s /noexistent
pw useradd qmails -g qmail -d /var/qmail -s /noexistent

make
make man
make setup
make check

./config
又はホスト名検索させずに
./config-fast hostname.your.domain
と言う手もある。DNSに登録されていないマシンやlocalipを振ってあるマシンには有効

動かす前にaliasを設定。
cd /var/qmail/alias
touch .qmail-postmaster .qmail-mailer-daemon .qmail-root
chmod 644 .qmail*
各のファイルに
&hoge@bar.net
等と転送先を書いておく事を忘れずに。中身に管理者のアドレスを書いておかないと鯖からのジャーナルが読めません。

qmailでは/etc/aliasが使えないので
替わりに
/var/qmail/alias 以下に
.qmail-xxxxを作って
中に
&takamura@hoge.com

と書いておけば

xxxx宛のメイルはtakamura@hoge.comに転送されます。
8文字を越えるメイルアカウントを使う時に必要でしょう。

■起動スクリプトの複写
cp /var/qmail/boot/home /var/qmail/rc

ブート時に起動するように
FreeBSDの場合
ln -s /var/qmail/rc /usr/local/etc/rc.d/qmail.sh
しておく。

■tcpserver
inetd(インタネットスーパサーバ)は大量のリクエストでコケることが有るが、tcpserverはそのような事は
ない・・・そうです。
/var/qmail/control/rcpthosts
での制限だけでは他から来たsmtpのリクエストまで却下してしまうのでtcpserverは必須。

tar zxvf ucspi-tcp-0.84.tar.gz
cd ucspi-tcp-0.84
make
make man
make setup

してインストール。

■/etc/tcp.smtpの作成とdbの作成

まず先にcdbをインストール
tar zxvf cdb-0.55.tar.gz
cd cdb-0.55
make
cp cdbget /usr/local/bin
cp cdbmake /usr/local/bin
cp cdbdump /usr/local/bin
cp cdbstats /usr/local/bin
cp cdbtest /usr/local/bin
cp 12tocdbm /usr/local/bin
cp *.1 /usr/local/man/man1
cp *.3 /usr/local/man/man3

tcpserverの挙動を決めるファイルをつくります。

[root@dns.itoh.co.jp /var/qmail]$ cat /etc/tcp.smtp
172.16.:allow,RELAYCLIENT=""
127.:allow,RELAYCLIENT=""
210.145.46.225-238:allow,RELAYCLIENT=""
:allow

のように無条件で(RELAYCLIENT=""を書いておくと、/var/qmail/control/rcpthostsを無視して)
転送を受けつけるホストを指定できる。

その後db化。

tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
これでDBが完成。

■POPはどうする?
これも先にcheckpasswordをインストールしておきます。

tar zxvf checkpassword-0.81.tar.gz
cd checkpassword-0.81
make
make setup
make check

■起動スクリプトの編集

/var/qmail/rc

#!/bin/sh

# Using splogger to send the log through syslog.
# Using qmail-local to deliver messages to ~/Mailbox by default.

exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start ./Maildir/ splogger qmail &

/usr/local/bin/tcpserver -x /etc/tcp.smtp.cdb -v -c 100 -u 1072 -g 1063 0 \
smtp /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 &

/usr/local/bin/tcpserver 0 pop3 /var/qmail/bin/qmail-popup dns.itoh.co.jp \
/bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir &

★/var/qmail/boot/homeをコピーしてきただけの/var/qmail/rcでは
qmail-start ./Mailbox splogger qmail
になっているはず。
./Mailbox を ./Maildir/ に変更し 行末に&を加える事。今思えばあたりまえだけど起動時に返ってこなくて往生しました。hi
-u の後はqmaildの uid
-g の後はnofilesのgid に指定。
-c 100 は 100個のsmtpを同時処理と言う意味。デフォルトでは40らしい。

■いよいよsendmailを停めます。

killall -HUP sendmail
してからキューをフラッシュ
/usr/sbin/sendmail -q

その後用が無くなったsendmailの名前を変更してsやらxを削ります。
chmod 0 /usr/sbin/sendmail
mv /usr/sbin/senmail /usr/sbin/sendmail.younashi

sendmailの代わりにqmailが呼び出されるようにリンクを張っておきます。
ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail

■/etc/rc.conf (/etc/defaults/rc.conf)やinetd.confの変更

/etc/rc.conf
sendmailを起動時に動かす為に書いてあった一行を以下のように変更
sendmail_enable="NO"

inetdからpopperが起動するようになっていたのでtcpserverが以後担当するので
/etc/inetd.conf の該当行をコメントアウトします。

■controlファイル群
デフォルトでは
/var/qmail/control以下に
defaultdomain
locals
me
plusdomain
rcpthosts
の5つが有ります。ここで重要なのが

localsとrcpthostsでしょう。

★locals
qmailはローカルの配送も自力でやってしまいます。MXが振られた計算機ではドメイン名だけ
のメイルも受けなければなりませんから
ここに
mailserver.hoge.net
hoge.net
とドメイン名を加えておきます。そうしないと計算機名付きのメイルアドレスだとメイルを受け取るが、そうでないものは受け取り拒否してしまいます。いくらMXで指定していてもガンとして受け取らない気合いの入ったMTAがqmailです。

★rcpthosts
/var/qmail/control/rcpthosts
にこれまたドメイン名等が書いて有ればそこのホストからのメイルは中継を
許します。

/etc/tcp.smtp
172.16.:allow,RELAYCLIENT=""
127.:allow,RELAYCLIENT=""
のようにtcpserverのRELAYCLIENTが""なら


smtpの要求がくると
1・smtpをリレーすべきホストかをtcpserverがチェック RELAYCLIENT=""なら無条件で受ける。
  rcpthostsにいくら書いてあっても、無視です。""はオールマイティなんですね。
2・1で最後にかかれた :allow を見て、次に/var/qmail/control/rcpthostsに有れば受ける。
3・1でも2でも無いsmtp要求は不正中継と見なして受け付けない。
となるわけです。

■旧メイルの引っ越し
/var/qmail/bin/maildirmake $HOME/Maildir
echo ./Maildir/ > ~/.qmail
で、持ち主をそのユーザに変えておく。
(そうしないとそのユーザがpopできないから)

この状態で再起動するともう動く筈なのですが、sendmail時代のメイルが /var/mail/ユーザ名で
残っている可能性があります。

移行するにはMaildir形式に /var/mail/以下 を移動して。。。
http://center.osaka-wu.ac.jp/~yositomi/qmail/qmail_guide.html#QA1
ここにMailbox<-->Maildirの変換についての記述があります。

■procmail について

.forwardに
"|IFS=' ' && exec /usr/local/bin/procmail -f- || exit 75 #takamura"
等と書いていたが、.forwardも使えません。

代わりに
.qmailに
| preline /usr/local/bin/procmail
と書けばよいそうです。

しかし・・・自分のもともとのメイルスプール(~/Maildir/以下)にも
コピーをおきたいときはこれではダメで

|IFS=' '&& exec /usr/local/bin/procmail -f-||exit 75 #takamura
./Maildir/
(必要なら)
&hoge@hoge.net

のように。。。(.forwardの時は
"|IFS=' ' && exec /usr/local/bin/procmail -f- || exit 75 #takamura"
みたいに""で囲っていたけど、.qmailではつけてはダメ。

また
sendmailの頃のレシピ(~/.procmailrc)では

:0
! hoge@itoh.co.jp , foo@itoh.net
なんて書くことができたが、どうも「,」が悪いらしくエラーになりました。
しようがないので
! hoge@itoh.co.jp foo@itoh.net
とスペースにしたら問題ないようです。

と、言いながら、なぜかprocmailで転送したメイルを見ると
From: takamura@itoh.co.jp (高村@いとう\ゼロワン)
と\が途中にはいってします。これは今だ未解決。

■ユーザー独自のaliasを設定できる
takamura-aho というaliasは
/home/takamura/.qmail-aho を作って、&xxxxで転送して読めば良い。

qmail-***の内容は
#はコメント
&は転送 .forwardと同じ
|は別のプログラムに渡す
mbox は(./Mailbox)
Maildir (./Maildir/)
といったとこです。

■新しいユーザを作ったときに自動的にMaildirが作られるようにしておく。

/var/qmail/bin/maildirmake /usr/share/skel/Maildir