日本データベース学会のサーバ交換を6月に行ったのだが、そのときに先送りになっていた作業をようやく終わらせた。MTAをqmailからPostfixに移行する作業である。学会を立ち上げたときに、私が設定に慣れているという理由でqmailを採用して以来、ずっとそのまま運用してきたのだが、何かとqmailの設計のまずさや古さが目立つようになってきて、以前からPostfixへの移行を検討していた。サーバ交換をいい機会に、移行を実行した、というわけである。
MTAの移行自体はそれほど難しくはない。厄介なのは、ezmlm-idxというメーリングリスト運用ソフトをどうするか、という点だった。これがqmailにべったり依存した設計になっており、qmail以外のMTAでは簡単に動きそうにない。諸処の事情で、他のメーリングリスト運用ソフトに移行することも難しい。
考えることは皆同じのようで、Postfixでezmlm-idxを動かす方法をまとめたページがいくつかあった。
アイデアはどちらも同じで、Postfixで受け取ったメールをqmailに渡し、ezmlm-idxのメール配送をさせる、というものである。前者はPostfixのサービスとしてqmailを定義する方法、後者はPerlスクリプトを介する方法である。前者の方がスマートに思えたので、今回、前者をベースにしていくつか方法を改良して、作業を行った。
まず前提として、qmailおよびezmlm-idxは適切にインストールして、正しく動く状態にしておかなければならない。qmail関連の設定ファイル、ユーザアカウント、パーミッションなどの設定も行っておく必要がある。もっとも、qmailが動いている環境からPostfixに移行するなら、あまり気にしなくてよい部分ではあるが。
次にPostfix側の設定である。ポイントは2つ。master.cf に qmail をサービスとして定義すること、transport_mapsを用いて、ezmlm-idxで使用するメールアドレスを受け取ったらqmailに渡すように設定すること、である。
master.cf の定義はこんな感じ。Postfix付属のコマンド pipe を用いて、メールをqmail付属のsendmailに渡すようにしている。pipeのflags=R(Return-Pathを取り除く)、user=qmailq(qmailのqueue管理アカウント)辺りに注意する必要がある。
qmail unix - n n - - pipe flags=R user=qmailq argv=/var/qmail/bin/sendmail ${recipient}
transport mapsの設定はこんな感じ(/etc/postfix/pcre_transport)。ezmlm-idxはVERPを全面的に活用しており、メーリングリストfoo@examle.comに対してfoo-*@example.comというアドレスを大量に使用する。したがって、正規表現による定義が必須である。なお、元記事の定義ではVERPを完全にカバーしておらず、例えば bounce mail の処理がうまくいかない。
/^foo(-.*)?@example¥.com$/ qmail:
main.cf に追加する transport_maps の定義はこんな感じ。
transport_maps = pcre:/etc/postfix/pcre_transport
最後に、qmailの動かし方である。元記事では「qmailのdaemonは全部止めろ」とあるのだが、これではqmailによるメール配送のログがとれない。qmailのdaemonには、SMTPリクエストを待ち受けるsmtpdと、実際のメール配送を行う qmail とがあり、後者は Postfix と同時に走らせていても問題ない。私は daemontools によって qmail を走らせているので、こんな感じで smtpd だけ止めた。
svc -d /service/smtpd /service/smtpd/log rm /service/smtpd
いくつか注意点を述べておく。
- ezmlm-idx周りは完全に qmail の設定のままでよい。例えば .qmail-foo* もそのままでよく、.forward-foo* などにする必要はない。
- 上と関連して、仮に新しく ezmlm-idx でメーリングリストを運用する場合も、普通に ezmlm-make でメーリングリストを作成し、pcre_transport に定義を書き加えるだけで良いと思われる。
- Postfix側のVERPやMaildirの機能は全く使っていない。したがって、home_mailbox = Maildir/ とか recipient_delimiter = - でなくても動くと思われる(検証はしていない)。
0 comments:
コメントを投稿