qmailの設定

Presented by 非武装エリア
最終更新日:2003年12月31日

■1.起動・終了スクリプトの作成

1.1 /var/qmail/rc の作成

qmailを開始するためのスクリプトを記述します。スクリプトは/var/qmail/bootディレクトリの下に幾つかの起動スクリプトがあります。利用している環境に合わせてこれを/var/qmail/rcとしてコピーします。もし、適当なスクリプトが見つからない場合には、以下のスクリプトを試してください。

( /var/qmail/rc )

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

/var/qmail/rcを作成したら、実行権を与えるのを忘れないように。

# chmod +x /var/qmail/rc [Enter]

もし、qmailのメール管理方式を従来のsendmailと同じmbox方式にしたい場合には、「./Maildir/」の部分を、「./mbox」と指定します。
※ ./Maildir/の部分の最後のスラッシュ(/)は指定をするのを忘れないでください。 忘れた場合にはmailbox形式のファイルとして処理されます。

(注意)
Maildir方式を使う場合、各ユーザのホームディレクトリには、Maildir用ディレクトリが存在している必要
があります。(自動的には作成されません)
ディレクトリの作成は次のようなコマンドを各ユーザで実行する必要があります.

    $ /var/qmail/bin/maildirmake $HOME/Maildir [Enter]

また、新規にユーザ登録の際に、自動的にMaildirを作成するようにするには、スケルトンディレクトリ
(テンプレートディレクトリ)にMaildirを作成しておくと良いでしょう。
スケルトンディレクトリへの登録は、LinuxやFreeBSDでは

    # /var/qmail/bin/maildirmake /etc/skel/Maildir [Enter] 

とすれば良いはずです。

1.2 起動・終了スクリプト

システム起動時に自動的にqmailを開始するスクリプトを以下のように作成します。

■Linuxの場合

/etc/rc.d/init.d/qmail というスクリプトを以下の内容で作成します。

#!/bin/bash
#
# qmail This starts and stops qmail.
#
# chkconfig: 345 92 20
# description: qmail is SMTP server.
#!/bin/sh
# -------------- /etc/rc.d/init.d/qmail
#
PATH=$PATH:/var/qmail/bin:/usr/local/bin:/usr/bin:/bin
export PATH

[ -f /var/qmail/rc ] || exit 0

QMAILDUID=`id -u qmaild`
NOFILESGID=`id -g qmaild`

case "$1" in
start)
    echo -n "qmail-smtpd :"
    cd /var/qmail/supervise
    env - PATH="$PATH" svscan &
    echo $! > /var/run/svscan.pid
    echo "."
    ;;
stop)
    echo -n "Stopping qmail: svscan"
    kill `cat /var/run/svscan.pid`
    echo -n " qmail"
    svc -dx /var/qmail/supervise/*
    echo -n " logging"
    svc -dx /var/qmail/supervise/*/log
    echo "."
    ;;
stat)
    cd /var/qmail/supervise
    svstat * */log
    ;;
doqueue|alrm)
    echo "Sending ALRM signal to qmail-send."
    svc -a /var/qmail/supervise/qmail-send
    ;;
queue)
    qmail-qstat
    qmail-qread
    ;;
reload|hup)
    echo "Sending HUP signal to qmail-send."
    svc -h /var/qmail/supervise/qmail-send
    ;;
pause)
    echo "Pausing qmail-pop3d"
    svc -p /var/qmail/supervise/qmail-pop3d
    echo "Pausing qmail-send"
    svc -p /var/qmail/supervise/qmail-send
    echo "Pausing qmail-smtpd"
    svc -p /var/qmail/supervise/qmail-smtpd
    ;;
cont)
    echo "Continuing qmail-pop3d"
    svc -c /var/qmail/supervise/qmail-pop3d
    echo "Continuing qmail-send"
    svc -c /var/qmail/supervise/qmail-send
    echo "Continuing qmail-smtpd"
    svc -c /var/qmail/supervise/qmail-smtpd
    ;;
restart)
    echo "Restarting qmail:"
    echo "Stopping qmail-smtpd."
    svc -d /var/qmail/supervise/qmail-smtpd
    echo "Sending qmail-send SIGTERM and restarting."
    svc -t /var/qmail/supervise/qmail-send
    echo "Restarting qmail-smtpd."
    svc -u /var/qmail/supervise/qmail-smtpd
    ;;
cdb)
    tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
    chmod 644 /etc/tcp.smtp*
    echo "Reloaded /etc/tcp.smtp."
    ;;
help)
    cat <<HELP
stop -- stops mail service (smtp connections refused, nothing goes out)
start -- starts mail service (smtp connection accepted, mail can go out)
pause -- temporarily stops mail service (connections accepted, nothing leaves)
cont -- continues paused mail service
stat -- displays status of mail service
cdb -- rebuild the tcpserver cdb file for smtp
restart -- stops and restarts smtp, sends qmail-send a TERM & restarts it
doqueue -- sends qmail-send ALRM, scheduling queued messages for delivery
reload -- sends qmail-send HUP, rereading locals and virtualdomains
queue -- shows status of queue
alrm -- same as doqueue
hup -- same as reload
HELP # --- 「HELP」はラベルなので先頭スペースを空けないこと。
    ;;
*)
    echo "Usage: $0 {start|stop|restart|doqueue|reload|stat|pause|cont|cdb|queue|help}"
    exit 1
    ;;
esac

exit 0

登録したスクリプトに実行属性を与えます。

# chmod +x /etc/rc.d/init.d/qmail [Enter]

※ もし、qmail自動時にすぐ終了してしまうような場合には、”start”セクションの部分を「nohup」を追加して起動してください。
例) nohup env - PATH="$PATH" svscan &

Linux系のOSでは、サービスとして上記のスクリプトを自動的に起動させるために、以下のように設定します。

# chkconfig --add qmail [Enter]

これで、先ほどのスクリプトに記述された「chkconfig: 345 92 20」の各RUNレベルで/etc/rc.d/init.d/qmailが起動時に立ち上がるようになります。 なお、作成したスクリプトに以下のようなリンクを張っておきます。

# ln -s /etc/rc.d/init.d/qmail /usr/local/sbin/qmail [Enter]

■FreeBSDの場合

/usr/local/etc/rc.d/qmail.sh というスクリプトを以下の内容で作成します。

#!/bin/sh
# -------------- /usr/local/etc/rc.d/qmail.sh
#
PATH=/var/qmail/bin:/usr/local/bin:/usr/bin:/bin
export PATH

case "$1" in
start)
    echo -n "Starting qmail:svscan"
    cd /var/qmail/supervise
    env - PATH="$PATH" svscan &
    echo $! > /var/run/svscan.pid
    echo "."
    ;;
stop)
    echo -n "Stopping qmail: svscan"
    kill `cat /var/run/svscan.pid`
    echo -n " qmail"
    svc -dx /var/qmail/supervise/*
    echo -n " logging"
    svc -dx /var/qmail/supervise/*/log
    echo "."
    ;;
stat)
    cd /var/qmail/supervise
    svstat * */log
    ;;
doqueue|alrm)
    echo "Sending ALRM signal to qmail-send."
    echo "Sending ALRM signal to qmail-send."
    svc -a /var/qmail/supervise/qmail-send
    ;;
queue)
    qmail-qstat
    qmail-qread
    ;;
reload|hup)
    echo "Sending HUP signal to qmail-send."
    svc -h /var/qmail/supervise/qmail-send
    ;;
pause)
    echo "Pausing qmail-send"
    svc -p /var/qmail/supervise/qmail-send
    echo "Pausing qmail-smtpd"
    svc -p /var/qmail/supervise/qmail-smtpd
    ;;
cont)
    echo "Continuing qmail-send"
    svc -c /var/qmail/supervise/qmail-send
    echo "Continuing qmail-smtpd"
    svc -c /var/qmail/supervise/qmail-smtpd
    ;;
restart)
    echo "Restarting qmail:"
    echo "Stopping qmail-smtpd."
    svc -d /var/qmail/supervise/qmail-smtpd
    echo "Sending qmail-send SIGTERM and restarting."
    svc -t /var/qmail/supervise/qmail-send
    echo "Restarting qmail-smtpd."
    svc -u /var/qmail/supervise/qmail-smtpd
    ;;
cdb)
    tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
    chmod 644 /etc/tcp.smtp*
    echo "Reloaded /etc/tcp.smtp."
    ;;
help)
    cat <<HELP
stop -- stops mail service (smtp connections refused, nothing goes out)
start -- starts mail service (smtp connection accepted, mail can go out)
pause -- temporarily stops mail service (connections accepted, nothing leaves)
cont -- continues paused mail service
stat -- displays status of mail service
cdb -- rebuild the tcpserver cdb file for smtp
restart -- stops and restarts smtp, sends qmail-send a TERM & restarts it
doqueue -- sends qmail-send ALRM, scheduling queued messages for delivery
reload -- sends qmail-send HUP, rereading locals and virtualdomains
queue -- shows status of queue
alrm -- same as doqueue
hup -- same as reload
HELP # --- 「HELP」はラベルなので先頭スペースを空けないこと。
    ;;
*)
    echo "Usage: $0 {start|stop|restart|doqueue|reload|stat|pause|cont|cdb|queue|help}"
exit 1
;;
esac

exit 0

このスクリプトは、http://Web.InfoAve.net/~dsill/qmail-script-dt61.txt に用意されています。
登録したスクリプトに実行属性を与えます。

# chmod 0755 /usr/local/etc/rc.d/qmail.sh [Enter]

※ もし、qmail自動時にすぐ終了してしまうような場合には、”start”セクションの部分を「nohup」を追加して起動してください。
例) nohup env - PATH="$PATH" svscan &

1.3 サービスのためのディレクトリを作成

サービスのためのディレクトリを作成し、属性を与えます。さらに幾つかのスクリプトを作成します。

# mkdir -p /var/qmail/supervise/qmail-send/log [Enter]
# mkdir -p /var/qmail/supervise/qmail-smtpd/log [Enter]
# mkdir /var/qmail/env [Enter]
# chmod +t /var/qmail/supervise/qmail-send [Enter]
# chmod +t /var/qmail/supervise/qmail-smtpd [Enter]

このディレクトリに以下のスクリプトを作成します。

■ /var/qmail/supervise/qmail-send/run

#!/bin/sh
exec /var/qmail/rc


■ /var/qmail/supervise/qmail-send/log/run

#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail


■ /var/qmail/supervise/qmail-smtpd/run

#!/bin/sh
QMAILD_ID=`id -u qmaild`
NOFILES_ID=`id -g qmaild`
exec /usr/local/bin/envdir /var/qmail/env sh -c '/usr/local/bin/softlimit -m 2000000 \
  /usr/local/bin/tcpserver -v -p -x /etc/tcp.smtp.cdb \
  -u ${QMAILD_ID} -g ${NOFILES_ID} 0 smtp \
  /var/qmail/bin/qmail-smtpd 2>&1'

(注意)
softlimitで制限するメモリ限界は、あなたが利用している環境に合わせて変更する必要があるかも知れません。もし、リモートからポート25(smtp)への接続が失敗するようならば、この値を3000000や4000000としてみてください。

■ /var/qmail/supervise/qmail-smtpd/log/run

#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail/smtpd

以上のスクリプトを作成したら、それぞれ実行権を与えます。(忘れないで!

# chmod +x /var/qmail/supervise/qmail-send/run [Enter]
# chmod +x /var/qmail/supervise/qmail-send/log/run [Enter]
# chmod +x /var/qmail/supervise/qmail-smtpd/run [Enter]
# chmod +x /var/qmail/supervise/qmail-smtpd/log/run [Enter]

さらに、ログディレクトリを設定します。

# mkdir -p /var/log/qmail/smtpd [Enter]
# chown qmaill /var/log/qmail [Enter]
# chown qmaill /var/log/qmail/smtpd [Enter]


1.3 sendmailの停止

一般的なMTAであるsendmailを止めるには、

(Linuxの場合)

# /etc/rc.d/init.d/sendmail stop [Enter]

を実行すると良いでしょう。このコマンドが見つからない場合は、

# ps ax | grep sendmai [Enter]

コマンドでsendmailのプロセス番号(PID)を確認し、この番号を

# kill プロセス番号 [Enter]

というように指定することでもsendmaiは停止します。

(FreeBSDの場合)

FreeBSDではsendmailは、/etc/defaults/rc.dというスクリプトファイルの中で

sendmail_enable="YES"

という記述がある筈ですの、「YES」を「NO」に変更してから再起動するとsendmailが起動されなくなります。
MTA(sendmail)を停止したなら、再起動時にsendmailが起動されないようにするために、

# mv /usr/lib/sendmail /usr/lib/sendmail.old [Enter]

としておくと良いでしょう。できれば”chmod”コマンドを使いこれらの実行権を無くしておけばセキュリティ的にも安心です。そしてオリジナルのsendmail を代わりに、qmail によるsendmail ラッパーをリンクします。(qmail自体ではsendmail は使いませんが、色々なスクリプトやプログラムの中に埋め込まれた形でsendmail を使っているものがあるので、このための対策です)

# ln -s /var/qmail/bin/sendmail /usr/lib [Enter]

以上で起動のための設定はほぼ完了です。あとは必要な幾つかの設定ファイルを記述することです。


2. 設定

2.1 リレーの設定

ローカルシステムからのsmtp Relayを許可します。以下は、tcpserver の機能を使ってローカルマシン(qmailのインストールされたマシン)から他のマシンへのリレーを許可しています。もし、この指定やコントロールファイルのrcpthostsに同様の指定がない場合には、外部へメールすることができません。
まずエディタ等で、/etc/tcp.smtpというファイルを以下のように作成します。

■ /etc/tcp.smtp

127.:allow,RELAYCLIENT=""
192.168.0.:allow,RELAYCLIENT="" # --- qmailサーバにアクセスできるクライアントのネットワーク
:allow 

作成した上記ファイルをtcprulesコマンドでバイナリ化します。

# tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp [Enter]

上記の設定を行う事で、ローカル(qmailの動作しているマシン)からと、192.168.0.xxのネットワークからのメールをqmailが受け取った際に、宛先が外部ドメイン宛であるメールを相手に届けます。

(注意)qmailでは自分以外のドメイン宛てのメールはすべてリレー(Relay)として扱うので、明示的にRelayを許可したマシンからのメール以外をリレーしません。


2.2 alias(別名)の設定

メールシステムでは、管理用の幾つかのメールアドレスというものがあります。それらのアドレス宛てのメールを実際に管理しているユーザ宛てに書きかえるためにalias という機能を利用しています。
/var/qmail/alias ディレクトリに移り、最低限以下のような設定を行と良いでしょう。

# cd /var/qmail/alias [Enter]
# echo '&hogehoge' > .qmail-root [Enter] ("root"宛てのメールを"hogehoge"へ転送)
# echo '&root' > .qmail-postmaster [Enter] ("postmaster"宛てのメールを"root"へ転送)
# echo '&root' > .qmail-mailer-daemon [Enter]
# echo '&root' > .qmail-webmaster [Enter]
# chmod 644 .qmail-root [Enter]
# chmod 644 .qmail-postmaster [Enter]
# chmod 644 .qmail-mail-daemon [Enter]
# chmod 644 .qmail-webmaster [Enter]

勿論、aliasとして通常のユーザ宛てのメールを別のサーバへ転送したような場合にも利用できるので例えば、「akiba」宛てのメールを「hara@betu-host.domain.co.jp」宛てに転送するなら /var/qmail/alia ディレクトリに".qmail-akiba"というファイルを以下の内容で作成します。

■ /var/qmail/alia/.qmail-akiba

&hara@betu-host.domain.co.jp

3.qmailの動作確認

今までの設定で取りあえずqmailは動作するようになっている筈です。 動作を確認するために一度qmailを起動して動作確認を行って見ましょう。 動作に先立ち、/var/qmail/control/me にFQDN(ドメイン正式名)としてqmailサーバの名前が設定されている事を確認してください。 確認ができたら、

# /usr/local/sbin/qmail start [Enter]

でqmailが起動します。

3.1 qmailの動作テスト

まずは、ローカルマシン上でのテストを行ってみます。

# echo to: hogehoge | /var/qmail/bin/qmail-inject [Enter]

この結果、/var/log/maillogには次のような記録がされます。

Sep 11 00:26:20 gt575 qmail: 968599580.293363 new msg 58635
Sep 11 00:26:20 gt575 qmail: 968599580.313729 info msg 58635: bytes 225 from <root@gt575.hogehoge.or.jp> qp 9610 uid 10983
Sep 11 00:26:20 gt575 qmail: 968599580.445050 starting delivery 9: msg 58635 to local hogehoge@gt575.hogehoge.or.jp
Sep 11 00:26:20 gt575 qmail: 968599580.445571 status: local 1/10 remote 0/20
Sep 11 00:26:20 gt575 qmail: 968599580.494894 delivery 9: success: did_1+0+0/
Sep 11 00:26:20 gt575 qmail: 968599580.495407 status: local 0/10 remote 0/20
Sep 11 00:26:20 gt575 qmail: 968599580.537726 end msg 58635

ここで"success"の記述があればqmailが正常にメッセージを処理できたことを意味します。

同じように今度は、別のホストのユーザへ配送するテストを行います。

# echo to: hogehoge@hogehoge.or.jp | /var/qmail/bin/qmail-inject [Enter]

同じくログに、

Sep 11 00:34:19 gt575 qmail: 938992459.911970 new msg 129
Sep 11 00:34:19 gt575 qmail: 938992459.914644 info msg 129: bytes 211 from <root@gt575.hogehoge.or.jp> qp 5345 uid 2003
Sep 11 00:34:20 gt575 qmail: 938992460.056502 starting delivery 25: msg 129 to remote matsu-o@hogehoge.or.jp
Sep 11 00:34:20 gt575 qmail: 938992460.058032 status: local 0/10 remote 1/20
Sep 11 00:34:21 gt575 qmail: 938992461.309848 delivery 25: success: xxx.xxx.xxx.xx accepted_message./Remote_host_said:_250_IAA04720_Message_accepted_for_delivery/
Sep 11 00:34:21 gt575 qmail: 938992461.316097 status: local 0/10 remote 0/20
Sep 11 00:34:21 gt575 qmail: 938992461.317238 end msg 129

というように"success"と記述されていれば、別のホストへのメール転送も正常に行えたことを意味します。


Copyrightc 1998-2003 ROBATA.ORG

Mailwebmaster@robata.org