qmailとsendmailを同時に利用する

注意:qmailの設定方法が若干間違っていました。localsに 記述するのはqmail用ドメインのみで、sendmail用ドメインを記述 する必要はありません。

qmailは、sendmailに比べ設定が単純で信頼性も高いので、大王ネットでも メールサーバに採用しています。 しかし、全く欠点がないわけでもありません。一部のメーリングリスト ドライバはsendmail向けに設計されているため、qmailでは動かないことが あります。そこで、大王ネットでは同一ホストでqmailとsendmailを同時に立ち上げて この問題を回避しています。

qmailとsendmailを同時に利用する方法としては、荒木靖宏さんによる解説 「qmail+sendmail+fmlでMLを配送する」で既に実現されています。 しかし、そこで説明しているのは「sendmailをベースに利用し、配送のみに qmailを用いる」ための方法です。ところが、大王ネットでは既にqmailをベースと して利用しているので、この方法をとることはできません。そこで、 「qmailをベースに利用し、一部のメーリングリストのみにsendmailを用いる」 方法を考えました。

設定方法

概要

通常のメール受信は、以下の概念図(等幅フォント で見てください)で示すような単純なモデルで表されます。

      +--------+   port 25
      |  qmail |<-----------[hoge.xx.jp]
      +--------+ 

これを崩さずにsendmailを同時に立ち上げるために、新たにsendmailで 受信するためのドメインを別に立ち上げます。そして、そのドメイン宛に きたメールは一旦qmailが受け取とらせ、port 10025で待機しているsendmail にリレーさせます。また、sendmailがメールの送信を必要とした場合は、 全てqmail側にリレーさせます。以下はその概念図です。

         ^ 外部に送信
         |
      +--------+   port 25
      |  qmail |<-----------[list.hoge.xx.jp]
      +--------+ 
        |   ^
  port  |   | qmailにrelayする
  10025 V   |
      +--------+
      |sendmail|
      +--------+

したがって、以下のような設定が必要になります。

DNSの設定
MXレコードの設定(qmail用とsendmail用の2種類)
qmailの設定
sendmailの設定

MXレコードの設定

qmail用のドメインとsendmail用のドメインについて設定を行います。

qmailの設定

qmail側の設定を行います

qmailが受信するドメインの設定

qmail側は、qmail用のドメインとsendmail用のドメイン両方のメールを 受け付けなくてはなりません。しかし、ローカルに処理するのは qmail用ドメインのみなので、/var/qmail/control/localsにそちらのみを 記述します。

前の説明では、ここでsendmail用ドメインも記述するよう 書いていましたが、あれは間違いです。

例:

localhost
smtp.hoge.xx.jp
hoge.xx.jp            <---- qmail用ドメイン

sendmailへのリレーの設定

qmailが受け取ったメールのうち、sendmail用ドメインのものはsendmailに リレーする必要があります。これは/var/qmail/control/smtproutesに記述 することで設定することで設定します。

例:

list.hoge.xx.jp:smtp.hoge.xx.jp:10025

sendmailの設定

筆者はsendmailの設定をCFで行っているので、ここではCFでの設定方法に ついてのみ説明します。

port 10025で待機するための設定

sendmailは通常port 25で待機しますが、qmailと同時に利用するためには、 これを変更しなければなりません。CFの場合、DAEMON_OPTIONSで設定を行います。

例:

DAEMON_OPTIONS='Port=10025'

ローカル以外のメールは全てqmailにリレーするための設定

qmailの高速な配送を利用するために、ローカル以外のメールは 全てqmailにリレーさせます。CFの場合、DIRECT_DELIVER_DOMAINSを`none'に、 DIRECT_DELIVER_MAILERを`smtp'に、DEFAULT_RELAYを自ホストに設定 することで実現できます。

例:

DIRECT_DELIVER_DOMAINS=none
DIRECT_DELIVER_MAILER=smtp
DEFAULT_RELAY='smtp:[smtp.hoge.xx.jp]'

注意:DEFAULT_RELAYのホスト名は[]で囲まなければなりません。

ローカルユーザへの配送に関する設定

ローカルユーザに対してメールを配送させる場合は、さらにローカルメーラの 設定を適切に行う必要があります。qmailのローカルメーラにはqmail-localという ものがありますが、筆者はこれでうまく配送できるような設定ができなかったので、 procmailを使った設定について紹介します。

procmailのインストール
まずprocmailをインストールします。もしqmailのローカル配送 形式がMaildirの場合、 procmailをMaildir形式に対応させるパッチも当てる必要があります。
procmailをローカルメーラに設定する
インストールしたprocmailをローカルメーラに用いるよう設定します。 CFの場合、LOCAL_MAILER_PATH, LOCAL_MAILER_FLAG_BASE, LOCAL_MAILER_ARGSを変更して設定します。

例:

      LOCAL_MAILER_PATH='/usr/local/bin/procmail'
      LOCAL_MAILER_FLAG_BASE='lDFMAw5:/|@SPqfhnu'
      LOCAL_MAILER_ARGS='procmail -Y -a $h -d $u'

以上で設定は完了です。

ローカルユーザに配送させない場合

ここで説明している設定ではqmail用のドメインとsendmail用のドメインを 別々にしているので、sendmail用のドメインに対してローカル ユーザへの配送をさせたくない場合もあると思います(大王ネットは まさにそのケースです)。

これに対する良い方法を筆者には思いつけなかったので、 sendmailに付属のmail.localを改造して常に'unknown name'を返すような ローカルメーラを設定するという方法で回避しています。

しかし、この方法はきちんと `550 unknown user'を返さないという問題を抱えています。もっと良い方法が ありましたら、野首宛に 連絡を頂ければ幸いです。

終りに

この文章を作成するにあたり、以下のURLを参考にしました。著者の 方々に感謝いたします。

荒木靖宏さんから、ローカルメーラにprocmailを使うという助言を いただきました。重ねて感謝いたします。


Last modified: 02/03/14

knok@daionet.gr.jp