通常ユーザアカウントへ配達されるメールは、 そのユーザのシステムメールボックスへメッセージが置かれますが、 そうしなければならないわけではありません。 メール配達指示により外部プログラムにメッセージを処理させたり、あるいは 別のアドレスに転送できます。いろんな .courier ファイルにより簡単なメール配達指示を指定することができます。 もし高度なメールフィルタリング処理を行いたい場合には、 メールフィルタ用外部プログラム、例えばmaildrop(1)をメール配達指示ファイル中に指定してください。
$HOME/.courier ファイルは当該アカウントに対するメッセージを どう配達するのかを指定します。 このファイルがなかった場合、 システム管理者が決めた標準的な動作が行われます。 システム管理者が決めた標準的な動作では、 当該アカウントのシステムメールボックスを指定しています。
user@domainという形式のほか、 user-foo@domainという形式のメールもアカウントuserに配達することができます。ここで fooは任意の文字列です。 これを可能にするには、 $HOME/.courier-fooという配達指示ファイルを作成してください。 このファイルの配達指示は、user-foo@domain向けのメールで用いられます。
システム管理者はCourierに対し、 メールアドレスの大文字小文字を区別しないように設定することができます。 その場合 .courier のファイル名はすべて小文字で記述してください。 また、いずれの場合も、アドレス中のピリオドはコロンに変換してください。 例えば、メールアドレスuser-Foo.Bar@domainに対する配送指示は、 ~user/.courier-foo:barファイルに記述してください。
また、$HOME/.courier-foo-defaultファイルを作成するとuser-foo-bar@domainという形式のアドレスには、barが何であってもこの配達指示ファイルが用いられます。 しかしuser-foo@domainというアドレスはこのファイルではなく、 $HOME/.courier-fooファイルで指示します。
メール配達指示には以下のものがあります: 標準のメールボックス以外への配達; 別のメールアドレスへの転送; メッセージを処理する別プログラムの起動です。 .courierから起動されるプログラムは いくつかの環境変数を参照できます (環境変数の項参照。) -defaultファイルから起動されたプログラムは環境変数を参照することにより 配達された実際のアドレスを得ることができます。
ローカルアドレスへのメールの配達方法が見つからなかった場合、/etc/courier/aliasdir ディレクトリが最後の手段として参照されます。
/etc/courier/aliasdirの機能はQmailのaliasアカウントの実装方法に似ていますが、 Courierでは実際のシステムアカウントは必要ありません。 <user@example.com>がローカルアドレスで、 userという名前のローカルアカウントがなく このアドレスに対するエイリアスも定義されていない場合、 Courierは配達指示を /etc/courier/aliasdir/.courier-userファイルから読み取ろうとします。
この場合も.courierファイルと同じような扱いをされます。 <user-foo@example.com>に対するアカウントがなかった場合、Courierは /etc/courier/aliasdir/.courier-user-fooファイルを調べ、次に /etc/courier/aliasdir/.courier-user-default、最後に /etc/courier/aliasdir/.courier-defaultファイルを調べます。
よって /etc/courier/aliasdir/.courier-defaultには存在しないアドレスに対するローカルメール配達指示を記述できます。 これは、動的メール配達指示(下記) と組み合わせることにより、 標準的でないメールボックスを配達指定する1つの方法です。
/etc/courier/aliasdir/.courier-:xalias/ディレクトリは makealiases(8)スクリプトにより、 プログラムやメールボックスに直接配達するエイリアスを実装するために 作成され、維持されます。 詳しくは makealiases(8)を参照してください。 (このディレクトリは ".xalias/"ではじまるメールアドレスに対応しますが、 Courierは明示的にピリオドではじまるローカルアドレス指定を許可しません。)
さらに、 makealiases(8)は /etc/courier/aliasdir/.courier-:xalias-protocol/というサブディレクトリも作成します。ここで "protocol" は -m オプションにより指定されます。
各 .courier ファイルにはゼロか1以上の配達指示を指定します。 もし .courier ファイルが長さ0バイトなら、 システム管理者が決めた標準の配達方法が用いられます。 もしファイルが0バイトでなく、かつ何の配達方法も指定していない場合、 対応するメールアドレスに来たメッセージは単に捨てられます。
注: | もし$HOME/.courier ファイルが存在しない場合、長さ0のファイルと同じように扱われ、 標準の配達方法によりメールボックスに格納されます。 もし $HOME/.courier-foo ファイルが存在しない場合、それは存在しないアドレス宛であるとみなされ、 配達不能メッセージが返送されます。 |
ホームディレクトリの他者読み取り実行アクセス権が設定されている場合、 Courierは存在しないメールボックスへのメールを 即座に拒否することが可能になります。 CourierのESMTPサーバプロセスは特権をもっていないため、 他者読み取り実行権を設定していないホームディレクトリに アクセスすることはできません。 よってそのメッセージは配達のためにCourierに受け付けられます。 メッセージを配達する段階になって、対応する.courier ファイルがないため、すぐに配達不能で返送されます。 しかし、配達不能レポートを返す前に、 メッセージを配達のためにいったん受け入れる必要があります。
.courier ファイル中の配達指示は1度に1つが実行されます。 配達指示の実行がなんらかの理由で失敗すると、 そのメッセージは配送不能で返送されるか、 あるいは再配達のために再びキューに入れられます。 キューに長く残っているメッセージは配送不能で返送されます。
注: | 配達指示のファイルの途中で失敗しても (そして配達不能メッセージが返送されていても)、 その前までの配達指示は完了しています。 |
ファイル中の空行は無視されます。 # で始まる行はコメントとみなされ無視されます。 そうでなければ、各行は次のどれかの指示であると見なされます: メールボックスあるいはmaildir形式への配達; 外部プログラムの実行; そして別のアドレスへの転送です。
. または / ではじまる行は、 mailboxメールボックスかmaildirメールボックスへの配達を指示します。 行にはmailboxファイルの場所かmaildirディレクトリを完全な形で指定します。 . ではじまる場合にはアカウントのホームディレクトリからの相対パスであると 見なされます。 mailbox形式のファイルは昔ながらのmailboxファイルで、 多くのメールソフトウェアで読み取り可能です。 maildir形式はディレクトリベースのメールの保存場所で、 mailbox形式に対していくつかの利点があります。 mailbox形式はロックが必要であるため、同時配送はできません。 mailboxファイルは新しいメッセージを追加中はロックしなければなりません。 そうでないと同時にメッセージが配達された場合、 お互いをぐちゃぐちゃにしてしまいます。 maildir形式ではロックは不要であり、 同じmaildirディレクトリへの同時配送が可能です。 maildirディレクトリは maildirmake(1)コマンドで作成できます。
注: | Courierは "dot-locking" 形式のmailboxのロックを行いません。 Courierのロック機構はシステム提供のもの (lockf、flockシステムコール) です。 他のロック方法を用いる場合は maildrop(1)を利用しなければなりません。 |
| 文字ではじまる行は外部プログラムの実行を指示します。 行の残りの部分はシェルにより実行されるコマンドを指定します。 長いコマンドは、行を\文字で終えることにより次行へ続けることができます。
Courierは指定されたコマンドを実行し、 配達しようとしているメッセージが標準入力から入力されます。
Courierは外部コマンドの実行の終了を待ってから、 次行の配達指示を実行します。 Courierは外部コマンドの終了コードを調べて、 配達が成功したか失敗したかを判断します。
もし外部コマンドが終了コード0で終わった場合には、 次行の配達指示が実行されます。 もしその行が配達指示ファイルの最後の行であったなら、 そのメッセージは正常に配達されたものとみなされます。
もし外部コマンドが終了コード99で終了した場合、ファイルの残りの配送指示は実行されませんが、 メッセージは正常に配達されたものとみなされます。
もし外部コマンドが64、 65、 67、 68、 69、 70、 76、 77、 78、 112のどれかの終了コードで終了した場合、 メッセージは配送不能として返送され、残りの配達指示は実行されません。
もし外部コマンドがそれら以外の終了コードで終了した場合、 それは一時的なエラーであるとみなされ、 メッセージは再配達のためにキューに入れられます。
注: | 再配達では、配達指示は再び.courier ファイルの頭から実行されます。 |
|| ではじまる行も外部プログラムの実行を指示します。 行の残りの部分はシェルにより実行されるコマンドを指定します。 長いコマンドは、行を\文字で終えることにより次行へ続けることができます。
しかしながら、 || による外部プログラムの実行は、 unlike |の場合とは異なり、外部プログラムの標準出力をCourierが受け取り、 その内容が配達指示として再び解釈されます。 これにより外部プログラムが動的なメール配達指示を作成し、 Courierがそれを実行することを可能にします。
外部プログラムの標準出力は、あたかも.courierファイルのその部分に配達指示があったかのように読み込まれ、解釈されます。 動的生成による配達指示には文字数の上限があります。 glibc利用の場合にはこれは 8191バイトです。他のシステムでも 似たような上限です。
動的に生成された配達指示にはさらに ||指示を再帰的に含むことができます。 動的配送指示の再帰は最大4重までです。
||で実行されたプログラムの終了コードは |の場合とほぼ同様に解釈されますが、例外があります。 動的に生成された配達指示は、終了コードが 0 か 99の場合にのみCourierにより再び解釈されます。 それ以外の終了コードでは、生成された配達指示は捨てられます。 この点以外では、終了コードの解釈は同じです。 終了コード99の場合は、正常に生成されたとみなされ、元の.courier ファイルにある残りの配達指示は無視されます。 終了コード 0の場合は、元の.courierファイルにある残りの配達指示も実行されます。
Courierが /etc/courier/aliasdirディレクトリ中のデフォルト配達指示を用いるときには、 これらの配達指示はCourierがインストールされたユーザとグループで実行されます。 つまり、 この配達指示により起動されるプログラムやアクセスされるメールボックスは Courierメールシステムのユーザとグループで実行されることになります。
.courierファイルから起動されるプログラムには次のような環境変数が渡されます:
ホームディレクトリ
受信者のユーザ名
メッセージのリターンアドレス (エンベロープ送信者名)
受信者のアドレス
RECIPIENT環境変数が user@domain形式の場合の、domainの部分
RECIPIENT環境変数がuser@domain形式の場合の、userの部分
LOCAL環境変数が$USER-foobarの場合の、foobarの部分
EXTの最初のダッシュ以降
EXT2の最初のダッシュ以降
EXT3の最初のダッシュ以降
user-foo-bar@domain向けの配達指示をファイル$HOME/.courier-foo-defaultから読み込む場合の、 barの部分
mailbox形式でのFrom_ヘッダそのもの
Return-Path:ヘッダそのもの
Delivered-To: ヘッダそのもの
注: | 外部プログラムが標準入力からメッセージを読み取る場合、 ローカル配達メールに通常含まれると考えられる From_、 Return-Path:、Delivered-To:の各ヘッダは含まれません。 外部プログラムはこれらのヘッダを環境変数から取得する必要があります。 これらのヘッダが存在することを仮定しているプログラムを使う場合は、 preline(1)コマンドを使用してヘッダを追加してください。 例えばprocmailプログラムはこれらのヘッダを必要とします。 |
NOTE: | maildropメールフィルタリング用プログラムは、 システム管理者が正しく設定していれば、 prelineを必要とはしません。 さらにシステム管理者がオプションで設定することにより、 Courierはmaildropを認識し、maildrop専用の最適化を行うこともできます。 これらの設定がなされた場合、.courierファイルからmaildropを直接起動できますが、maildropからはこれらのヘッダは自動的に追加されたように見えます。 メッセージはパイプ経由ではなく、maildropの標準入力に直接与えられるため、 Courierのメッセージキューから直接メッセージを配達することができ、 一時ファイルを必要としません。 |
Courierの .courier ファイルは Qmailの .qmailファイルと似ていますが、いくつか異なる点があります。 Qmailには (1.03の段階では) 動的配達指示をサポートしていません。 また、ハードエラーとして扱う終了コードに若干の差があります。 また転送に関しても違いがあります。 Qmailのドキュメントによれば、外部コマンドが一時あるいは致命的エラーで 失敗した場合、そのメッセージは.qmailファイルで指定されているどのアドレスにも転送されません。 エラーを起こした転送指示の前に書いてあるものにもです。 メッセージは完全に成功した場合のみ転送されます。 Courierの場合は転送はすぐに行われます。 また、Courierは状況により、メッセージのリターンアドレスを、 転送しようとしているアカウントに変更することがあります。
さらに混乱させることには、Courierに$HOME/.courierファイルでなく、$HOME/.qmailファイルを読ませるような設定がされている場合があることです。