GHOST > masaya's memo > Server

CREATED: March 9, 2003  LAST MODIFIED: February 11, 2004

qmail + qmail-vida で SMTP-AUTH

sendmail はいろいろできて便利だけど、設定の仕方が理解しにくかった(でも覚えたい)。
qmail の設定はシンプルで理解しやすかったかな。

あと、sendmail と違って Maildir形式でメールがスプールされるのがお気に入り。~/Maildir 以下に保存されるのでバックアップが楽だし、1メールに付き1ファイルなのでメールを溜め込んだときの反応が早いらしい。(^^
postfix は Maildir に対応しているらしいので、postfix でもいいかも。

qmail は SMTP-AUTH に対応していないので、拡張パッケージ qmail-vida を導入し、SMTP-AUTH / APOP 及びバーチャルドメイン管理機能を利用。

基本的に、ports を利用して install 作業をします。

導入ソフトウェア Ver. 説明
qmail 1.03 qmail 本体。
qmail-vida 0.51 qmail とcheckpassword に SMTP認証とAPOP対応のPOP認証を追加し、バーチャルドメインと仮想ユーザを管理するためのプログラムを提供する。
checkpassword 0.90 passwordチェックを行うソフトウェア。qmail のSMTP / POP認証に使用する。
ucspi-tcp 0.88 inetdと同等な機能を提供する。smtpd / pop3d の起動に使用する。

導入パッチ一覧

qmail には、多数のパッチが存在する※1ので、必要に応じてパッチ適用しましょう。

私は、以下のpatchを導入しています。

patchファイル 説明
qmail-date-localtime.patch Recieved フィールドの日時は、標準では GMT が入る。これをローカルタイム(JST) にするには、qmail-date-localtime patch 当てる必要がある。
qmail-smtpd-relay-reject '%'等を含むアカウントへのメール受信を禁止し、relayを抑止する。
このパッチを当てることにより、受信後エラーメール返信の手順を行わず、最初の受信時にエラーとするようになる。
qmailqueue-patch 環境変数QMAILQUEUEによりqueue登録プログラムを変更する。qmail-scanner導入のため必要。
portにてmake時に WITH_QMAILQUEUE_PATCH=yes を指定することにより導入。
qmail-large-dns.patch DNS の MX レコードが 512byte 以上の応答(RFC違反らしい)を返してくる AOL などに対応するためのパッチ。
portにてデフォルトで導入される。

ユーザ / グループ

qmail

qmailでは以下のユーザとグループを使用します。

ユーザ UID グループ GID 用途
alias 81 qnofiles 81  
qmaild 82 qnofiles 81  
qmaill 83 qnofiles 81  
qmailp 84 qnofiles 81  
qmailq 85 qmail 82  
qmailr 86 qmail 82  
qmails 87 qmail 82  

これらのユーザ / グループはportで自動登録されますので作成する必要はありません。
UID,GIDは環境によって変更されるかもしれません。

qmail-vida

qmail-vidaで使用するユーザとグループの追加をします。

ユーザvpopはバーチャルドメインを使用する場合に作成する必要があります。
バーチャルドメインをローカルユーザと切り離して運用しない場合には作成する必要はありません。

ユーザ UID グループ GID 用途
pop 68 mail,vida 6,103 ローカルドメイン所有ユーザ
authdb 103 vida 103 パスワードデータベース管理ユーザ
qmailu 104 vida 103 users/assignファイル管理ユーザ
vpop 105 vida 103 バーチャルドメイン所有ユーザ

UID,GIDは環境にあわせて空いている数字を設定してください。
popユーザは、FreeBSDに標準で登録済みのユーザを使用します。

ファイルの取得

手作業で当てるpatchと、qmail-vidaパッケージをダウンロードします。
私と同じpatchを当てる場合には、この他のファイルはportで自動取得するのでダウンロードしておく必要はありません。

qmail-vidaの取得

qmail-vidaパッケージを取得しておきます。
qmail-vidaもportになってるとべんりなんだけどなぁ(ぼそっ)。

$ fetch http://www.emaillab.org/djb/qmail-vida/software/qmail-vida-0.51.tar.gz
Receiving qmail-vida-0.51.tar.gz (69784 bytes): 100%
69784 bytes transferred in 0.0 seconds (1.92 MBps)

patchファイルの取得

適用するpatchをあらかじめ取得しておきます。

$ fetch ftp://ftp.nlc.net.au/pub/unix/mail/qmail/qmail-date-localtime.patch
Receiving qmail-date-localtime.patch (2603 bytes): 100%
2603 bytes transferred in 0.0 seconds (104.79 kBps)
$ fetch http://www.qmail.org/qmail-smtpd-relay-reject
Receiving qmail-smtpd-relay-reject (1230 bytes): 100%
1230 bytes transferred in 0.0 seconds (2.61 MBps)

qmailqueue-patch, qmail-large-dns.patchは、portで自動取得するのでダウンロードしておく必要はありません。

展開 / patch

qmailの取得/展開/patch適用

qmail本体に適用するpatchあてていきます。

まず、portsを利用してアーカイブの取得 / 展開 / patchの適用をします。

# cd /usr/ports/mail/qmail
# make patch WITH_QMAILQUEUE_PATCH=yes
===>  Extracting for qmail-1.03_1
>> Checksum OK for qmail-1.03.tar.gz.
>> Checksum OK for qmail-103.patch.
>> Checksum OK for qmailqueue-patch.
===>  Patching for qmail-1.03_1
===>  Applying distribution patches for qmail-1.03_1
===>  Applying FreeBSD patches for qmail-1.03_1

これでqmailqueue-patch, qmail-large-dns.patchが適用された状態になっています。

次に、qmail-smtpd-relay-reject, qmail-date-localtime.patchを適用します。

# cd work/qmail-1.03
# patch -p1 < path_to_qmail-date-localtime.patch
Hmm...  Looks like a unified diff to me...
The text leading up to this was:
--------------------------
<中略>
|--- qmail-1.03.orig/date822fmt.c       Tue Apr 15 15:05:23 1997
|+++ qmail-1.03/date822fmt.c    Fri Apr 18 00:39:41 1997
--------------------------
Patching file date822fmt.c using Plan A...
Hunk #1 succeeded at 1.
Hunk #2 succeeded at 13.
done
# patch -p1 < path_to_qmail-smtpd-relay-reject
Hmm...  Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|--- orig/qmail-smtpd.c  Mon Jun 15 06:53:16 1998
|+++ qmail-smtpd.c       Sat Feb  9 12:07:19 2002
--------------------------
Patching file qmail-smtpd.c using Plan A...
Hunk #1 succeeded at 53.
Hunk #2 succeeded at 217.
Hunk #3 succeeded at 266.
Hmm...  Ignoring the trailing garbage.
done

すべてのpatchが成功していることを確認しておくことを忘れずに。

checkpasswordの取得/展開

# cd /usr/ports/security/checkpassword
# make patch
===>  Extracting for checkpassword-0.90
>> Checksum OK for checkpassword-0.90.tar.gz.
===>  Patching for checkpassword-0.90

ucspi-tcpの取得/展開

# cd /usr/ports/sysutils/ucspi-tcp
# make patch
===>  Extracting for ucspi-tcp-0.88
>> Checksum OK for ucspi-tcp-0.88.tar.gz.
>> Checksum OK for ucspi-tcp-0.88-man.tar.gz.
===>  Patching for ucspi-tcp-0.88

portを使ってもcheckpasswordとucspi-tcpにはpatchは当てないみたいだけど、将来変更があるかもしれないのとconfigure前までの処理ということで、make patchしています。

qmail-vidaの展開

アーカイブ展開

qmail-vidaパッケージのtarアーカイブを展開します。

# cd /usr/local/src/
# tar zxvf path_to_qmail-vida-0.51.tar.gz

Makefile編集

FreeBSD ports でのソースディレクトリにあわせて、Makefileの先頭3行を変更します。

# cd qmail-vida-0.51/
# vi Makefile
QMAILSRC        = /usr/ports/mail/qmail/work/qmail-1.03
CHECKPASSWORDSRC= /usr/ports/security/checkpassword/work/checkpassword-0.90
UCSPITCPSRC     = /usr/ports/sysutils/ucspi-tcp/work/ucspi-tcp-0.88

各ソフトウェアのバージョンが上がった場合には、パスが変更されます。
portでのソース展開先を確認して設定してください。

patch適用

vidaパッケージのqmail / checkpasswordに対するpatchを適用します。

qmail-vidaのマニュアル通りにmake patchすると、qmailのpatchでコケてしまいcheckpasswordにpatchがあたらないので別々にpatchを適用します。

# make patch-checkpassword
<中略>
--------------------------
|diff -u checkpassword-0.90.orig/conf-home checkpassword-0.90/conf-home
|--- checkpassword-0.90.orig/conf-home  Sat Dec 23 15:40:46 2000
|+++ checkpassword-0.90/conf-home       Wed Jan  9 23:53:20 2002
--------------------------
Patching file conf-home using Plan A...
Hunk #1 succeeded at 1.
done

qmailへのpatchはエラーになってしまいます。 なせ エラーになるかはまだ追跡調査していません。
patchの内容を見たところ、qmail-smtpupのmanについてのインストール設定と思われるので、エラーのまま放置しています。

# make patch-qmail
<中略>
--------------------------
|diff -u qmail-1.03.orig/hier.c qmail-1.03/hier.c
|--- qmail-1.03.orig/hier.c     Mon Jun 15 19:53:16 1998
|+++ qmail-1.03/hier.c  Sun Oct 28 16:47:14 2001
--------------------------
Patching file hier.c using Plan A...
Hunk #1 succeeded at 32 with fuzz 1.
Hunk #2 succeeded at 64 (offset -45 lines).
Hunk #3 succeeded at 82 (offset -45 lines).
Hunk #4 failed at 203.
1 out of 4 hunks failed--saving rejects to hier.c.rej
<中略>
done
*** Error code 1

Stop in /usr/local/src/test-vida/qmail-vida-0.51.

ライブラリコピー

ライブラリをqmail-vidaパッケージからqmailとcheckpasswordのディレクトリにコピーします。

# make copy
here=`pwd` && cd src/qmail &&  /bin/cp `/bin/cat ${here}/src/qmail/FILES` ${here
}//usr/ports/mail/qmail/work/qmail-1.03/
usage: cp [-R [-H | -L | -P]] [-f | -i | -n] [-pv] src target
       cp [-R [-H | -L | -P]] [-f | -i | -n] [-pv] src1 ... srcN directory
*** Error code 64

うぅ。エラーになってしまいました…。

ソースディレクトリ指定で絶対パスを指定したのでエラーになっているようです。
もう一度Makefileを修正しましょう。

変更点は、
$${here}/${QMAILSRC}/ → /${QMAILSRC}/
$${here}/${CHECKPASSWORD SRC}/ → ${CHECKPASSWORDSRC}/
です。

# vi Makefile
copy-qmail:
        here=`pwd` && cd src/qmail && \
        ${CP} `${CAT} $${here}/src/qmail/FILES` ${QMAILSRC}/

copy-checkpassword:
        here=`pwd` && cd src/checkpassword && \
        ${CP} `${CAT} $${here}/src/checkpassword/FILES` ${CHECKPASSWORDSRC}/
        here=`pwd` && cd ${QMAILSRC} && \
        ${CP} `${CAT} $${here}/djblib/checkpassword/QMAIL` ${CHECKPASSWORDSRC}/
        here=`pwd` && cd ${UCSPITCPSRC} && \
        ${CP} `${CAT} $${here}/djblib/checkpassword/UCSPITCP` ${CHECKPASSWORDSRC
}/

再度make copyすると、ライブラリのコピー終了です。

# make copy
here=`pwd` && cd src/qmail &&  /bin/cp `/bin/cat ${here}/src/qmail/FILES` /usr/p
orts/mail/qmail/work/qmail-1.03/
here=`pwd` && cd src/checkpassword &&  /bin/cp `/bin/cat ${here}/src/checkpasswo
rd/FILES` /usr/ports/security/checkpassword/work/checkpassword-0.90/
here=`pwd` && cd /usr/ports/mail/qmail/work/qmail-1.03 &&  /bin/cp `/bin/cat ${h
ere}/djblib/checkpassword/QMAIL` /usr/ports/security/checkpassword/work/checkpas
sword-0.90/
here=`pwd` && cd /usr/ports/sysutils/ucspi-tcp/work/ucspi-tcp-0.88 &&  /bin/cp `
/bin/cat ${here}/djblib/checkpassword/UCSPITCP` /usr/ports/security/checkpasswor
d/work/checkpassword-0.90/
here=`pwd` && cd /usr/ports/mail/qmail/work/qmail-1.03 &&  /bin/cp `/bin/cat ${h
ere}/djblib/vida/QMAIL` ${here}/src/vida/
here=`pwd` && cd /usr/ports/sysutils/ucspi-tcp/work/ucspi-tcp-0.88 &&  /bin/cp `
/bin/cat ${here}/djblib/vida/UCSPITCP` ${here}/src/vida/
here=`pwd` && cd /usr/ports/security/checkpassword/work/checkpassword-0.90 &&  /
bin/cp `/bin/cat ${here}/djblib/vida/CHECKPASSWORD` ${here}/src/vida/

これでやっとmakeする準備が完了しました。

Install

qmail

qmailをinstallする際に、既に/var/qmail/control/rcpthosts, /var/qmail/control/localsファイルが存在する場合には、上書きされてしまうので退避しておきます。

# cp /var/qmail/control/rcpthosts /var/qmail/control/rcpthosts.backup
# cp /var/qmail/control/locals/var/qmail/control/locals.backup

qmailをmakeしinstallします。
ports には、sendmail から qmail に移行するためのターゲットがあるので、それも実行しておきます。

# cd /usr/ports/mail/qmail/
# make
# make install
# make disable-sendmail
# make enable-qmail

make disable-sendmail で /etc/rc.conf に sendmail_enable="NO" が追加されます。make enable-qmail では /etc/mail/mailer.conf が qmail 用に変更されて、FreeBSD の mailwrapper の動作が変わります。

checkpassword

# cd /usr/ports/security/checkpassword
# make
# make install

ucspi-tcp

# cd /usr/ports/sysutils/ucspi-tcp
# make
# make install

qmail-vida

グループの追加

グループvidaを追加、ユーザpopをグループvidaに追加するために、/etc/groupを編集し以下の行を追記します。

# vi /etc/group
vida:*:103:pop

ユーザ追加・編集

ユーザauthdb, qmailu, vpopを追加、ユーザpopの設定を変更するためにvipwを起動し編集を行います。

# vipw
pop:*:68:6::0:0:Post Office Owner:/home/pop:/usr/local/bin/bash
<中略>
qmailu:*:103:103::0:0:qmailu:/var/qmail:/nonexistent
authdb:*:104:103::0:0:authdb:/var/qmail:/nonexistent

ユーザpopのホームディレクトリ / ログインシェルを変更し、ユーザqmailu, ユーザauthdbを登録します。
ユーザpopのログインシェルは好みのものを記入してください。

ユーザpop,のホームディレクトリは、仮想メールボックス(システムアカウントの存在しないメールアカウント)の保存先に使用されるので、仮想メールボックスを保存したいパーティションを指定してください。

アカウントの登録が終わったら、ユーザpopのホームディレクトリを作成しておきます。

# makedir -m 755 /home/pop
# chown pop:vida /home/pop

ここでは、ユーザpopの環境設定は行っていません。 必要ならば各自で作成してください。

インストール

# cd /usr/local/src/qmail-vida-0.51/src/vida/
# make
# make setup check

付属文書のインストール

qmail-vidaの付属文書(html形式)が/var/qmail/doc/qmail-vida/にインストールされます。

# cd /usr/local/src/qmail-vida-0.51/
# make install-doc

Configuration

コントロールファイル

ここまでの操作で、/var/qmail/control に qmail のコントロールファイルが作成されています。/var/qmail/bin/qmail-showctl コマンドで qmail がどういう動作をするようになっているか確認しながら、コントロールファイルを編集していきます。

下の表がqmailで使用されるコントロールファイルの一覧です。
(http://www.jp.qmail.org/q103/jman5/qmail-control.html より引用)

制御ファイル 既定値 参照コマンド  
badmailfrom (none) qmail-smtpd 拒絶発送元アドレスリスト
bouncefrom MAILER-DAEMON qmail-send 差戻し管理者名
bouncehost me qmail-send 差戻しホスト名
concurrencylocal 10 qmail-send ローカル配送多重度
concurrencyremote 20 qmail-send リモート配送多重度
databytes 0 qmail-smtpd 受信データ量上限
defaultdomain me qmail-inject 省略時ドメイン名
defaulthost me qmail-inject 省略時ホスト名
doublebouncehost me qmail-send 2重バウンスホスト名
doublebounceto postmaster qmail-send 2重バウンスの宛先
envnoathost me qmail-send ホスト省略時ドメイン名
helohost me qmail-remote SMTP開始ホスト名
idhost me qmail-inject Message-IDホスト名
localiphost me qmail-smtpd IPアドレス対応ホスト
locals me qmail-send ローカルドメイン名一覧
me     自ドメイン(FQDN)
morercpthosts (none) qmail-smtpd 受信ドメイン一覧(2)
percenthack (none) qmail-send %ハック適用ドメイン名一覧
plusdomain me qmail-inject 追加ドメイン名
qmqpservers (none) qmail-qmqpc qmqpサーバリスト
queuelifetime 604800 qmail-send キュー最大滞在秒数
rcpthosts (none) qmail-smtpd 受信ドメイン一覧
smtpgreeting me qmail-smtpd SMTP応答用ホスト名
smtproutes (none) qmail-remote SMTP経路指定
timeoutconnect 60 qmail-remote 接続時待ち時間
timeoutremote 1200 qmail-remote 応答待ち時間
timeoutsmtpd 1200 qmail-smtpd SMTPデータ待ち時間
virtualdomains (none) qmail-send 仮想ドメイン名一覧

下の表がqmail-vidaで拡張されたコントロールファイルの一覧です。

制御ファイル 既定値 参照コマンド  
senderhosts   qmail-smtpd envelope senderの許可リスト
badrcptto   qmail-smtpd 拒絶送信先アドレスリスト

自ドメイン名の設定

me / defaultdomain / plusdomainを表示し、自ドメインの設定が間違っていないか確認します。
ドメイン名部分は、メールアドレスのドメイン部分にあわせて読み替えてください。

# cat /var/qmail/control/me
example.co.jp
# cat /var/qmail/control/defaultdomain
example.co.jp
# cat /var/qmail/control/plusdomain
example.co.jp

受信ドメイン名の設定

rcphostsを編集し、受信を許可する宛先ドメイン名を登録します。

# vi /var/qmail/control/rcphosts
example.co.jp
example.com

qmail-vidaによるSMTP-AUTHや、tcpserver等による環境変数RELAYCLIENTの設定が行われていない場合、 qmailの基本動作としてrcphostsに登録されている宛先以外のメールは受信しません。

ローカルドメイン名の設定

localsを編集し、ローカルに配信をする宛先ドメイン名を登録します。
バーチャルドメインを使用しないならば、rcphostsと同一の内容になります。

# vi /var/qmail/control/locals
example.co.jp
example.com

ここに登録したドメイン宛のメールは、ローカルの実在ユーザ/仮想ユーザ宛に配送されます。

SMTP経路指定

smtproutesを編集し、SMTPの経路指定をします。

私の場合、AUの携帯電話にメールをするのですが、AUのメールサーバがメールを受け取ってくれない為、一度プロバイダのメールサーバを経由して送信するように指定しています。

# vi /var/qmail/control/smtproutes
ezweb.ne.jp:provider.example.ne.jp

この例では、ezweb.ne.jp宛のメールはprovider.example.ne.jpを経由して配送されます。

リレー設定

qmail-smtp は /var/qmail/control/rcpthost で指定された宛先のメールしか受信しません。LANのwindows等のホストから中継させたい場合には、許可されたアドレス範囲からのアクセスは環境変数 RELAYCLIENT を設定することによって中継させることができます。

RELAYCLIENTを設定しなくても、qmail-vidaのSMTP-AUTHだけで運用することも可能です。
RELAYCLIENTで許可されたアドレスからのメールは、SMTP-AUTHをしなくてもメールを送信することができるだけです。
#ローカルLANのPCにSMTP-AUTH設定するのが面倒なので…。

ここでは192.168.0.0/24のネットワークとローカルからの中継を受け付けるようtcpserverの設定を作成します。
アドレス範囲については、環境に合わせて読み替えてください。

# vi /usr/local/etc/tcp.smtp
192.168.0.:allow,RELAYCLIENT=""
127.:allow,RELAYCLIENT=""

上記のファイルを作成したら、cdbファイルに変換します。

# cd /use/local/etc/
# tcprules tcp.smtp.cdb tcp.smtp.tmp < tcp.smtp

マニュアルページ

qmail の man は、/var/qmail/man/ にあります。このままだと man コマンドで読めないので、MANPATH を設定して読めるようにします。

# vi /etc/manpath.config
# check if the directory exists and if it does, add it to MANPATH
#
OPTIONAL_MANPATH  /var/qmail/man

起動スクリプト

qmail

ports で作成された、/usr/local/etc/rc.d/qmail.sh は /var/qmail/rc へのシンボリックリンクですが、デフォルトで /var/qmail/rc は用意されていないので、/var/qmail/boot/ にある起動スクリプトから選んでコピーします。各ファイルにコメントが書いてあるのでそれを参考にしてください。(大体ファイル名で判断できるけど)

ファイル名 説明
binm1 BSD 4.4 binmailインターフェイスを利用してローカル配送
ログ出力:syslog
メールの保存先:/var/spool/mail/$USER
binm1+df BSD 4.4 binmailインターフェイスを利用してローカル配送
ログ出力:syslog
メールの保存先:/var/spool/mail/$USER
.forward使用可能
binm2 SVR4 binmailインターフェイスを利用してローカル配送
ログ出力:syslog
メールの保存先:/var/spool/mail/$USER
binm2+df SVR4 binmailインターフェイスを利用してローカル配送
ログ出力:syslog
メールの保存先:/var/spool/mail/$USER
.forward使用可能
binm3 V7 binmailインターフェイスを利用してローカル配送
ログ出力:syslog
メールの保存先:/var/spool/mail/$USER
binm3+df V7 binmailインターフェイスを利用してローカル配送
ログ出力:syslog
メールの保存先:/var/spool/mail/$USER
.forward使用可能
home ログ出力:syslog
メールの保存先:~/Mailbox
home+df ログ出力:syslog
メールの保存先:~/Mailbox
.forward使用可能
maildir ログ出力:syslog
メールの保存先:~/Maildir/
proc prcmailインターフェイスを利用してローカル配送
ログ出力:syslog
メールの保存先:procmailの設定による
proc+df prcmailインターフェイスを利用してローカル配送
ログ出力:syslog
メールの保存先:procmailの設定による
.forward使用可能

私は、Maildir形式を使用するので、maildirをコピーしました。

# cp -p /var/qmail/boot/maildir /var/qmail/rc

smtp デーモン

外部からのメールを受信できるように、smtpデーモン qmail-smtpd を起動するようにします。

qmail使用変数一覧

変数名 参照コマンド 説明
QMAILQUEUE qmail-smtpd QUEUE管理コマンドを指定する。
RELAYCLIENT qmail-smtpd リレーを許可する場合に設定する。
tcpserverによって許可されたアドレス範囲からの中継をする場合に設定される。

qmail-vida使用変数一覧

変数名 参照コマンド 説明
ALLOWPLAIN qmail-smtpup SMTP-AUTHでの平文認証を許可する。
Outlook Express等の平文認証のみに対応したMUAを使用する場合には設定する必要がある。
FORCEAUTH qmail-smtpup 認証なしのメール受信を一切禁止する。
自ドメイン宛のメールも認証されないと受信しないので中継送信専用のサーバ以外は設定しないこと。
TEMPRELAYCLIENT qmail-smtpd 認証の成功後にRELAYCLIENTと同じ役割を行う。
SENDERHOSTS qmail-smtpd control/senderhosts の設定を上書きする。
RCPTHOSTS qmail-smtpd control/rcpthosts の設定を上書きする。但し、SMTP-AUTH、環境変数 RELAYCLIENTによって中継が許可された場合でもRCPTHOSTS に登録されたドメイン宛のメールのみ受信する。
特定のユーザからは外部にメールを送信させない場合にvida-passwdを使用して設定する。
DOMAINOWNER checkpassword ドメインを所有・管理するユーザを設定する。
ログインIDベースのバーチャルドメインを運用する場合には空の値を設定する。
DOMAINDELIMITERS checkpassword ログインIDベースのバーチャルドメインを運用する場合のログインIDのユーザ部とドメイン部のデリミタ。デフォルト値"@%"

起動スクリプト

tcpserver を使ってqmail-smtpdを起動するように起動スクリプトを作成します。

# vi /usr/local/etc/rc.d/smtpd.sh
#!/bin/sh

PATH="$PATH:/var/qmail/bin";export PATH

case "$1" in
start)
        ulimit -d 1024

        QMAILQUEUE="/var/qmail/bin/qmail-scanner-queue.pl" export QMAILQUEUE
        ALLOWPLAIN=""; export ALLOWPLAIN
        DOMAINOWNER=""; export DOMAINOWNER

        #  start qmail for tcpserver
        /usr/local/bin/tcpserver -Rpv -x /usr/local/etc/tcp.smtp.cdb 0 smtp \
        /var/qmail/bin/qmail-smtpup example.co.jp /usr/local/bin/checkpassword \
        /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 2 &

        echo -n ' qmail-smtpd'
        exit 0
        ;;
stop)
        kill -TERM `ps axwww | grep [q]mail-smtpd | awk '{print $1}'` && \
        echo -n ' qmail-smtpd'
        ;;
*)
        echo "Usage: `basename $0` {start|stop}" >&2
        exit 64
        ;;
esac

私は、qmail-scannerを使用してウイルスチェックをしているので、変数QMAILQUEUEを指定しています。
必要ない場合には。コメントアウトするか削除してしまってください。

15行目のexample.co.jp]の部分は、使用するドメイン名を指定してください。コントロールファイルmeと同じドメインを設定すればよいと思います。

pop3デーモン

外部からメールを受信できるようにpop3デーモンを起動します。

qmail-vida使用変数一覧

変数名 参照コマンド 説明
ALLOWPLAIN qmail-popup POPでの平文認証を許可する。
Outlook Express等のAPOPを使用できないMUAを使用する場合には設定する必要がある。
DOMAINOWNER checkpassword ドメインを所有・管理するユーザを設定する。
ログインIDベースのバーチャルドメインを運用する場合には空の値を設定する。
DOMAINDELIMITERS checkpassword ログインIDベースのバーチャルドメインを運用する場合のログインIDのユーザ部とドメイン部のデリミタ。デフォルト値"@%"

起動スクリプト

tcpserver を使ってqmail-pop3dを起動するように起動スクリプトを作成します。

# vi /usr/local/etc/rc.d/qmail-pop3d.sh
#!/bin/sh

PATH="$PATH:/var/qmail/bin";export PATH

case "$1" in
start)
        ALLOWPLAIN=""; export ALLOWPLAIN
        DOMAINOWNER=""; export DOMAINOWNER

        #  start qmail-pop3d for tcpserver
        /usr/local/bin/tcpserver -vHR 0 pop3 \
        /var/qmail/bin/qmail-popup blade.jp \
        /usr/local/bin/checkpassword \
        /var/qmail/bin/qmail-pop3d Maildir 2>&1 | \
        splogger pop3d 4 &

        echo -n ' qmail-pop3d'
        exit 0
        ;;
stop)
        kill -TERM `ps axwww | grep [q]mail-pop3d | awk '{print $1}'` && \
        echo -n ' qmail-pop3d'
        ;;
*)
        echo "Usage: `basename $0` {start|stop}" >&2
        exit 64
        ;;
esac

ユーザ管理

エイリアス

qmail では、root 宛のメール配送はしませんので、エイリアスとして登録する必要があります。その他、必要なエイリアスも作成します。

port を利用した場合には root、postmaster、mailer-daemon のエイリアスが作成されています。

# cd /var/qmail/alias
# touch .qmail-root .qmail-postmaster .qmail-mailer-daemon
# chmod 644 .qmail*

ファイルの内容が空ならば、/var/qmail/alias に配送されます。Maildir 形式を使う場合には、Maildir を作成しておきます。

# /var/qmail/bin/maildirmake /var/qmail/alias/Maildir
# chown -R alias /var/qmail/alias/Maildir

私は、root, postmaster, mailer-daemon 宛のメールは、他のアカウントに転送するようにしています。その場合、各ファイルに転送先を指定しておきます。

# cd /var/qmail/alias
# echo '&masaya' > .qmail-root
# echo '&masaya' > .qmail-postmaster
# echo '&masaya' > .qmail-mailer-daemon

メールボックス

Maildir形式を使う場合には、全てのユーザーのホームに Maildir を作成します。

Mailbox形式では、POPでのアクセスは多分出来ませんが、ローカルからメールを読むユーザーがいる場合には、メールボックス形式を選択しやすいように .qmail も作成しておきます。
#Maildir形式以外ではPOPアクセスは出来なくなります。

# cd ~
# /var/qmail/bin/maildirmake ~/Maildir
# vi .qmail
# use Maildir
./Maildir/
# use Mailbox
#./Mailbox

ユーザー追加の際に、Maildirも自動的に作成されるようにしておくと後で楽なので、skel にも作っておきます。

# cd /usr/share/skel
# /var/qmail/bin/maildirmake ~/Maildir
# vi dot.qmail
# use Maildir
./Maildir/
# use Mailbox
#./Mailbox

パスワードデータベースの作成

ローカルユーザ用のパスワードデータベースを作成します。

# vida-pwdbinit

この操作で以下のファイルが作成されます。

ファイル名 管理ユーザ 説明
/var/qmail/authdb/pwdusers/passwd pop / 一般ユーザ ローカルドメイン・実在ユーザ用パスワードファイル
/var/qmail/authdb/pwdusers/cdb pop / 一般ユーザ ローカルドメイン・実在ユーザ用cdbファイル
/var/qmail/authdb/pop/passwd pop ローカルドメイン・仮想ユーザ用パスワードファイル
/var/qmail/authdb/pop/cdb pop ローカルドメイン・仮想ユーザ用cdbファイル

実在ユーザの登録

パスワードデータベースへ実在ユーザ(システムアカウントのあるユーザ)のパスワード登録を行います。
ここでユーザの登録をしていない実在ユーザは、POP及びSMTP-AUTHのサービスを受けられません。

コンパイルオプションで、パスワードデータベースに登録の無いユーザをUNIXパスワードで認証することも出来ますが、APOP / SMTP-AUTH MD5認証等が使用できないメーラーに対応する為に、平文認証を使用しなければならないので、ログインパスワードとメール関係のパスワードは切り離した方が安全でしょう。

個別登録

ユーザ / パスワードを登録するには、ユーザPOPで以下のコマンドを実行します。

# su - pop
$ /var/qmail/bin/vida-passwd -a -r -u USERNAME
New password:PASSWORD
Retype new password:PASSWORD
vida-passwd: user USERNAME was added
pwdbmake: authdb/pwdusers/cdb was updated

一括登録

大量のアカウントを登録する場合には、パスワードファイルを編集してから一括してパスワードデータベースを作成すると手間が省けます。
ディレクトリ/var/qmail/authdb以下のファイルは、ユーザPOPでは直接編集できないのでrootユーザで編集を行います。

フィールド区切り文字はTABで、ユーザ名・パスワード・ユーザ固有の変数設定を記述します。
以下の例では、USER3のメール発信はexample.co.jp宛のみ許可されます。

# vi /var/qmail/authdb/pwdusers/passwd
#user  	 password        environ
USER1   PASSWORD1
USER2   PASSWORD2
USER3   PASSWORD3	RCPTHOSTS="example.co.jp"

パスワードファイルの編集が終了したら、ユーザPOPでパスワードデータベースを作成します。

# su - pop
$ /var/qmail/bin/vida-pwdbmake -r 
pwdbmake: authdb/pwdusers/cdb was updated

仮想ユーザの登録

仮想ユーザのパスワードデータベースを作成します。
仮想ユーザは、ユーザpopのホームディレクトリに作成されます。

登録方法は、実在ユーザの場合とほぼ同じです。

個別登録

仮想ユーザ / パスワードを登録するには、ユーザpopで以下のコマンドを実行します。

# su - pop
$ /var/qmail/bin/vida-passwd -a -u USERNAME
New password:PASSWORD
Retype new password:PASSWORD
vida-passwd: user USERNAME was added
pwdbmake: authdb/pwdusers/cdb was updated
$ /var/qmail/bin/vida-assign -a -u USERNAME

一括登録

大量のアカウントを登録する場合には、パスワードファイルを編集してから一括してパスワードデータベースを作成すると手間が省けます。
ディレクトリ/var/qmail/authdb以下のファイルは、ユーザPOPでは直接編集できないのでrootユーザで編集を行います。

# vi /var/qmail/authdb/pop/passwd
#user  	 password        environ
VERTUAL1   PASSWORD1
VERTUAL2   PASSWORD2
VERTUAL3   PASSWORD3

次に、配送先情報ファイル /var/qmail/users/assign を編集します。

# vi /var/qmail/users/assign
=VIRTUAL1:pop:68:6:/home/pop/VIRTUAL1:::
+VIRTUAL1-:pop:68:6:/home/pop/VIRTUAL1:-::
=VIRTUAL2:pop:68:6:/home/pop/VIRTUAL2:::
+VIRTUAL2-:pop:68:6:/home/pop/VIRTUAL2:-::
=VIRTUAL3:pop:68:6:/home/pop/VIRTUAL3:::
+VIRTUAL3-:pop:68:6:/home/pop/VIRTUAL3:-::

ファイルの編集が終了したら、ユーザpopでパスワードデータベースと配送データベースを更新します。

# su - pop
$ /var/qmail/bin/vida-pwdbmake 
pwdbmake: authdb/pwdusers/cdb was updated
$ /var/qmail/bin/qmail-newu 

仮想メールボックスの作成

仮想ユーザのメールボックスを作成するには、ユーザpopで以下のコマンドを実行します。
登録したユーザ名を指定して、全ユーザ分実行してください。

# su - pop
$ /var/qmail/bin/vida-maildirmake VERTUAL1 Maildir
$ /var/qmail/bin/vida-maildirmake VERTUAL2 Maildir
$ /var/qmail/bin/vida-maildirmake VERTUAL3 Maildir

バーチャルドメイン

複数のバーチャルドメインを運用する場合には、各バーチャルドメイン毎に管理ユーザを作成する必要があります。
同一の管理ユーザにて管理されているバーチャルドメインは、同一のメールボックスに配送されてしまいますので注意してください、

バーチャルドメイン管理ユーザの追加

バーチャルドメイン管理ユーザ vpopを追加するためにvipwを起動しユーザvpopを追加します。

# vipw
vpop:*:105:103::0:0:virtual pop acount:/home/vpop:/usr/local/bin/bash

ユーザvpopのログインシェルは好みのものを記入してください。

ユーザvpopのホームディレクトリは、仮想ドメインのメールボックスに使用されるので、仮想メールボックスを保存したいパーティションを指定してください。

アカウントの登録が終わったら、ユーザ vpopのホームディレクトリを作成しておきます。

# makedir -m 755 /home/vpop
# chown vpop:vida /home/vpop

ここでは、ユーザvpopの環境設定は行っていません。 必要ならば各自で作成してください。

受信ドメイン名の設定

rcphostsを編集し、バーチャルドメイン宛のメールを受信許可するためにバーチャルドメイン名を追記します。

# vi /var/qmail/control/rcphosts
example.co.jp
example.com
example.org

バーチャルドメイン名の設定

virtualdomainsを編集し、バーチャルドメインの登録をします。
この例では、example.org宛のメールはバーチャルドメイン管理ユーザであるvpopユーザに配送されます。

# vi /var/qmail/control/virtualdomains
example.org:vpop

パスワードデータベースの作成

仮想ドメイン用のパスワードデータベースを作成します。

# vida-pwdbinit vpop

この操作で以下のファイルが作成されます。

ファイル名 管理ユーザ 説明
/var/qmail/authdb/vpop/passwd vpop 仮想ドメイン用パスワードファイル
/var/qmail/authdb/vpop/cdb vpop 仮想ドメイン用cdbファイル

仮想ドメインのユーザ登録

仮想ドメインのパスワードデータベースを作成します。
仮想ドメインのメールボックスは、ユーザvpopのホームディレクトリに作成されます。

個別登録

ユーザ / パスワードを登録するには、ユーザvpopで以下のコマンドを実行します。

# su - vpop
$ /var/qmail/bin/vida-passwd -a -u USERNAME
New password:PASSWORD
Retype new password:PASSWORD
vida-passwd: user USERNAME was added
pwdbmake: authdb/pwdusers/cdb was updated

一括登録

大量のアカウントを登録する場合には、パスワードファイルを編集してから一括してパスワードデータベースを作成すると手間が省けます。
ディレクトリ/var/qmail/authdb以下のファイルは、ユーザPOPでは直接編集できないのでrootユーザで編集を行います。

# vi /var/qmail/authdb/vpop/passwd
#user  	 password        environ
VERTUAL1   PASSWORD1
VERTUAL2   PASSWORD2
VERTUAL3   PASSWORD3

次に、配送先情報ファイル /var/qmail/users/assign を編集します。

# vi /var/qmail/users/assign
=vpop-VIRTUAL1:vpop:2003:103:/home/vpop/VIRTUAL1:::
+vpop-VIRTUAL1-:vpop:2003:103:/home/vpop/VIRTUAL1:-::
=vpop-VIRTUAL2:vpop:2003:103:/home/vpop/VIRTUAL2:::
+vpop-VIRTUAL2-:pop:2003:103:/home/vpop/VIRTUAL2:-::
=vpop-VIRTUAL3:vpop:2003:103:/home/vpop/VIRTUAL3:::
+vpop-VIRTUAL3-:vpop:2003:103:/home/vpop/VIRTUAL3:-::

ファイルの編集が終了したら、ユーザvpopでパスワードデータベースと配送データベースを更新します。

# su - vpop
$ /var/qmail/bin/vida-pwdbmake 
pwdbmake: authdb/pwdusers/cdb was updated
$ /var/qmail/bin/qmail-newu

仮想メールボックスの作成

仮想ユーザのメールボックスを作成するには、ユーザpopで以下のコマンドを実行します。
登録したユーザ名を指定して、全ユーザ分実行してください。

# su - vpop
$ /var/qmail/bin/vida-maildirmake VERTUAL1 Maildir
$ /var/qmail/bin/vida-maildirmake VERTUAL2 Maildir
$ /var/qmail/bin/vida-maildirmake VERTUAL3 Maildir

バーチャルドメインのログインID

POP及びSMTP-AUTHのログインIDは、ユーザ名@ドメイン名になります。
#その他に、ユーザ名@管理ユーザ名 / ユーザ名%ドメイン名でも接続可能です。

ユーザ名でログインした場合には、ローカルドメインのユーザとして扱われるので注意してください。

これまでの設定例の場合、VERTUAL1を指定するとローカルドメインの仮想ユーザVERTUAL1としてログインし、VERTUAL1@example.orgと指定すると仮想ドメインexample.orgのユーザVERTUAL1としてログインすることになります。

起動

ふぅ。やっと設定終了です。 早速起動してみましょう。
起動はすべてrootユーザで行います。

ここでは、手作業で起動する方法を説明します。
リブートしても良いマシンの場合には、再起動してしまえば自動的に起動します。

sendmailデーモンの停止

qmailを起動するためには、sendmailデーモンが停止している必要があります。
sendmailデーモンを使用する設定になっていた場合には、停止させましょう。

# killall -TERM sendmail

qmailの起動

qmailの各プロセスを起動します。
これによってローカル配送・外部へのメール送信が可能になります。

# /usr/local/etc/rc.d/qmail.sh start

qmail-smtpdの起動

qmailのsmtpデーモンであるqmail-smtpdを起動し、外部からのメール受信を可能にします。

# /usr/local/etc/rc.d/smtpd.sh start

qmail-pop3dの起動

qmailのPOPデーモンを起動し、POPでのメール閲覧を可能にします。

# /usr/local/etc/rc.d/qmail-pop3d.sh start

最後に

必ず、実在ユーザ・仮想ユーザ・仮想ドメインユーザのテストアカウントを作成して、メールの送受信・POPアクセスのテストを行ってください。

参考文献

  1. qmail * djbdns by D. J. Bernstein
  2. qmail-vida: qmail VIrtual Domain and Authentication package

注釈

※1 パッチ
qmail にはいろいろなパッチがでているようです。詳しくはこちらをどうぞ。
Taki Internet Mail Private Lab.qmail とパッチ

更新履歴

2004/02/11
仮想ユーザの作成時に、メール配送データベースの作成(vida-assign)が抜けていたのを追加。[ASTさん thanks]