qmailのローカル配送の概要

株式会社ディノでは、2001年頃から各種サーバにインストールするMTAとしてqmailを多く採用しています。qmailはよく言われるようにシンプルな構造なのですが、他のMTAとの差が大きいため、直感的にわかりにくい点もあるような気がします。

本稿はqmail初心者だった頃の私が、自分のためにまとめたものです。qmailが外部から来たメールをローカル配送用として受け取って、dot-qmailファイルに従ってメールを処理するまでを説明しています。qmail本家でいくつかのドキュメントに分かれていたものをまとめ直しただけのもので、特に新しい情報があるわけではありませんが、当時の私と同じような状況の人には役に立つかと思います。わかると大して難しくない内容なのですが、わかっていない人への説明としてはヘタクソかもしれません。

説明の前に、まずはqmailの処理に関する図を参照してください。これはqmailの処理が一目で把握できるような非常に良い図で、私などは以前は印刷して常に手が届く場所に置いていたほどです。本稿を読む際に別ウインドウとして開いておくことをお勧めします。(ちなみに、この図はhttp://www.unixuser.org/~euske/doc/qmail/index.htmlの中の絵です)。

qmailがメールをローカル配送として受け取るまで

外部から来たメールをqmail-sendがローカル配送として受け取るまでには、以下のような手順を踏んで受け取っています。

  1. qmail-smtpdが rcpthosts以外のドメインに宛てたメールで、 かつリレーを認めないホストからの場合は、 以後何もせず配送を拒否します。
  2. 宛先ドメインを見て、 localsに書いてあるドメインあてのメールの場合、 無条件にローカル配送にします。 (virtualdomainsを使いたいドメインはlocalsに書いてはいけません)
  3. virtualdomainsの内容に従って、 例えばhoge@test.com宛てのメールを test.com-hoge@localなどとしてローカル配送を行います。
  4. 以上のどれにも該当しなかった場合にはリモート配送を行います。

ローカル配送メールのユーザー決定

  1. /var/qmail/users/assign の内容に従って、 ローカル配送アドレスから ホームディレクトリおよび対応するdot-qmailファイルを決めます。 例えば、test.com-から始まるローカル配送アドレスに対して、 /home/vpopmail/domains/test.com/がホームディレクトリ、 などと決定します。 ホームディレクトリの対応するdot-qmailを探します。
  2. /var/qmail/users/assign に書いていない分は、 /etc/passwdを参考にホームディレクトリを決めます。 そのユーザーが自身のホームディレクトリのオーナーと同一で、 なおかつroot以外のユーザーである場合に限り、 そのユーザーを有効なユーザーと判断します。 (一般ユーザーアカウントとシステム用アカウントを区別するため。 qmail-getpw参照。)
    例えば、hnw-private@example.jp 宛てのメールをlocalsの設定で受け取った場合、 ~hnw/.qmail-private で処理を決定します。また、virtualdomainsの設定によりwebadmin@example.com宛てのメールをhnw-example-webadmin@localで受け取った場合、対応する.qmailファイルは~hnw/.qmail-example-webadminです。
  3. 以上のどれにも該当しなかった場合、ユーザーaliasが処理します。
    例えば、root-test@example.jpの場合、 ~alias/.qmail-root-test で処理を決定します。

設定例

$ cat /var/qmail/control/rcpthosts
example.com
sub.example.com
$ cat /var/qmail/control/virtualdomains
example.com:hnw-example
test@sub.example.com:hnw2-mlexample
$ cat ~hnw/.qmail-example-default
&hnw@example.jp
$ cat ~hnw2/.qmail-mlexample-test
&hnw2@sub.example.jp

このサーバがexample.comとsub.example.comのMXだとして話を進めます。また、/var/qmail/control/localsにこれらのドメインが含まれていないことも条件です。

???@example.comに来たメールは全てユーザーhnwの持ち物とし、hnw-example-???宛てとして扱います。結果、~hnw/.qmail-example-defaultに従い、hnw@example.jpに転送します。(~hnw/.qmail-example-*にマッチするファイルが他にないものとします)

また、test@sub.example.comに来たメールはhnw2-mlexample-test宛てとして扱いますので、結果、~hnw2/.qmail-mlexample-testに従い、hnw2@sub.example.jpに転送します。一方、test2@sub.example.comはvirtualdomainsで受け取ることになっていないため、この設定では受け取りません。???@sub2.example.com宛てのメールが来たとしても、そもそもドメインがrcpthostsに含まれていないので受け取りません。

コメント / トラックバックはありません

コメントする