なぜにあなたはCourier Mail Serverを使うの?

Debianの標準はeximです。で良く使われるのはQmail。
「courier? 使ってるよ。あのimapのサーバでしょ?wuより速いよね。」
といわれてしまうほど悲しいメールサーバ。

Courierメール兄弟には、

courier-mta
クーリエメールサーバ。eximとかqmailのたぐい。超マイナー。
courier-maildrop
メールフィルタ。maildropの名前は有名かな。
courier-imap
imapサーバ。超有名、というかcourierといえばこれを示す。
courier-pop
pop3サーバ。courier-imapのおかげでそこそこ利用者あり。
sqwebmail
webmailサーバ。webからメールを読み書きできる。 有名だもんでパッケージ名にcourierがない…
courier-mlm
メーリングリストマネージャ。fmlとかmajordomoのたぐい。これまた超マイナー。
courier-pcpなどなど
よくわからん。
とひとそろい揃ってます。そして、なんとなくだけど、ldapの対応がよさそうです。 というわけで果敢にもcourierメールサーバのインストールに挑戦してみます。

courierメールサーバの特徴をいうと、設定ファイルがこまかく分かれていてQmail風、 maildirの扱いやその他でも Qmailを意識 (ライバル視ではない) したところが結構多いです。

な方にはオススメです。

インストール

標準でeximが入っている状態から
# dpkg -r exim
# apt-get install courier-mta-ssl
eximは依存があるため削除されませんが、次のapt-get installで削除されます。 これでcourier-authdaemon、courier-base、courier-ssl (基本部分)、 courier-mta(-ssl)がインストールされます。 courierのインストール質問にはデフォルトでいいです。インストール後に、
# dpkg -P exim
# cd /etc
# rm -r exim
でeximがきれいさっぱりなくなります。
(dselectを利用する場合はcourier-mta-sslを先に選んで、 そこで衝突解決した方がいいです。eximを先に削除すると操作が面倒です。)

インストールそのままだとmkesmtpdcertのバグのせいで、 /etc/courier/esmtpd.pemが作成されないので、 次のように作成しておきます。 esmtpd.pemはdaemonの所有にしておくか、 daemonグループにして読み取り権が必要です。 秘密鍵も一緒になっているので他者読み取り権はつけないでください。

# ln -s /etc/courier/esmtpd.pem /usr/lib/courier/esmtpd.pem
# cd /usr/bin      -- mkesmtpdcertスクリプトのバグ回避
# mkesmtpdcert
# chgrp daemon /etc/courier/esmtpd.pem
# chmod 640 /etc/courier/esmtpd.pem

メールの基本設定

/etc/courier/内が設定ファイルです。
# vi /etc/courier/me
icarus.hoehoe.japan
まずmeに自分のマシン名を完全修飾名で指定します。 書かないとhostnameの値つまりicarusだけになり、 他でちゃんと設定すればいいのですが面倒です。 meは変更したらnewaliasesしておきます。
/etc/aliasesのエイリアスを更新した、 あるいはmeを変更した場合はnewaliasesを実行します。 courierのコマンドmakealiasesでは /etc/courier/aliases/配下のファイルが 参照されますが、これはdebianの標準ではないため、 newaliasesで更新します。newaliasesは/etc/aliasesを参照し、 /etc/courier/aliases/を参照しません。
# vi /etc/courier/locals
locahost
icarus
icarus.hoehoe.japan
次にlocalsを編集します。このファイルは、キューにたまったメールのうち、 どれがローカルに配送すべきなのかを指定します。 これで、moke、moke@localhst、moke@icarus、moke@icarus.hoehoe.japan というメールアドレスはアカウントmoke宛であると判断されます。 localsは変更したら/etc/init.d/courier-mta restartしておきます。
# vi /etc/courier/smtpaccess/default
127.0.0.1  allow,RELAYCLIENT
10         allow,RELAYCLIENT
172.16     allow.RELAYCLIENT
172.17     allow,RELAYCLIENT
172.18     allow,RELAYCLIENT
...
172.31     allow,RELAYCLIENT
192.168	   allow,RELAYCLIENT
このファイルには、無条件でリレーを許可するものを追加します。 172.16.0.0/12のアドレスレンジが標準では追加されていませんので、 必要なら追加します。上記のようにいちいち指定しないといけませんし、 また、アドレス部と指示部は必ず1つだけのタブで区切る必要があります。 smtpaceess内のファイルを変更したらmakesmtpaccessしておきます。
# vi /etc/courier/esmtpacceptmailfor
icarus.hoehoe.japan
最後に、smtp経由で外部から受け取るメールをesmtpacceptmailfor に指定します。 localsはあくまでキューに入ったものの配送に用いられるだけなので、 smtp経由で受け取りたいメールの宛先をここに記述します。 (なお、esmtpacceptmailfor.dirからmakeacceptmailforコマンドで作成される esmtpacceptmailfor.datファイルでも指定できます。両方有効です。)

そして次に、メールを受け取るユーザのmaildir形式のメールボックスを 作成しなければなりません。 courierは標準でmaildir形式を扱いますが、 メール配送指定先に指定されたディレクトリがないと、 それをmailbox形式であると判断し、ファイルとして作ってしまいます。 (Qmailではmailboxへの配達とmaildirへの配達指示は明らかに異なりますし、 eximではmaildirを自動で作ってくれますが、courierはそんなことしません。) よって、各ユーザでmaildir形式のメールボックスを作成します。
各ユーザに.courierファイルがなかった場合に標準で配送されるのは、 /etc/courier/courierdのDEFAULTDELIVERYで指定された ./Maildir ディレクトリです。

moke% cd
moke% maildirmake Maildir
これで~moke/Maildirディレクトリにmaildir形式のメールボックスが作成されます。 まずmokeアカウントでメールをmailコマンドで内部や外部に送ってみましょう。 また外部からmoke@icarus.hoehoe.japan宛にメールを送ってみて、 それがmokeアカウントの~moke/Maildir/curに入ってくるか 確認しましょう。

このアカウントmokeはそのままの設定でもldapで定義したアカウントmokeにも 配送してくれます。 これは、

  1. /etc/courier/authmodulelistでauthdaemonを認証モジュールとして利用
    (authdaemonはキャッシュ機構みたいなものです)
  2. /etc/courier/authdaemonrcでauthpamが認証モジュールとして利用
  3. /etc/pam.d/esmtp等でpam_unix.soがアカウント情報取得機構として指定
  4. /etc/nsswitch.confでldapを指定 (libnss-ldap)
ことによります。 ただ、このままだとアカウント情報は取れても、パスワード認証はだめなので、 後で/etc/pam.d/のファイルを編集します。

受信できるドメインの追加

@icarus.hoehoe.japanだけでなく、@hoehoe.japan宛のメールも 同じように受信したい場合は、localsとesmtpacceptmailforに追加します。
# vi /etc/courier/locals
locahost
icarus
icarus.hoehoe.japan
hoehoe.japan
# vi /etc/courier/esmtpacceptmailfor
icarus.hoehoe.japan
hoehoe.japan
これだけです。/etc/init.d/courier-mta restartの実行をお忘れなく。 なお、moke@hoehoe.japan宛てのメールは最初に moke@icarus.hoehoe.japan宛てに変更されるので、 /etc/aliasesでこれら2つを区別して転送することはできません。 区別したい場合はlocalsには記述せずに、以下のようにします。

他のドメイン宛メールの受信

他のドメイン宛のメールを、ローカルアカウントにマッピングせず、 特定のアカウントで受信したい場合があります。 その場合には/etc/aliasesに記述します。
# vi /etc/courier/esmtpacceptmailfor
icarus.hoehoe.japan
enyaka.japan
# vi /etc/aliases
...
info@enyaka.japan: moke
これでinfo@enyaka.japan宛のメールはローカルアカウントmokeに届きます。
@enyaka.japan宛のすべてのメールをローカルアカウントmokeに届けるには、
# vi /etc/aliases
...
@enyaka.japan: moke
のようにして、かつ、
moke% vi .courier-default
./Maildir
とします。上記の一括形式でメールを転送すると、info@enyaka.japan宛の メールはローカルアカウントmoke-info宛となります。 ここでアカウントmokeに.courier-defaultを作っておかないと、 ユーザ無しと見なされて配送されません。 (.courierがあってもだめです。)
# vi /etc/aliases
...
@enyaka.japan: moke-enyaka
としておくとinfo@enyaka.japan宛のメールはmoke-enyaka-infoとして届きます。
いずれにせよnewaliasesをお忘れなく。(makealisesではないです。)

他のドメイン宛メールの転送

メールホストになっているマシンでは、他のドメインのメールを一旦メールホストで 受信し、指定のホストに転送したいことがあります。
enyaka.japan.   MX  10 icarus.hoehoe.japan.
みたいにenyaka.japanドメイン宛のメールも受信して、これを マシンposeidon.hoehoe.japanに転送したい場合は次のようにします。
# vi /etc/courier/esmtpacceptmailfor
icarus.hoehoe.japan
enyaka.japan
# vi /etc/courier/esmtproutes
enyaka.japan: poseidon.hoehoe.japan
enyaka.japanの特定のユーザだけをposeidonに転送したい場合は aliasesに次のように追記します。
# vi /etc/aliases
...
mokeke@enyaka.japan: mokeke@enyaka.japan
undara@enyaka.japan: undara@enyaka.japan
@enyaka.japan: ERRORNOUSER