Home Top Up


qmail reference

maildir (5)

(directory for incoming mail messages)


[概要]

受信メール・メッセージを保存する mbox ディレクトリについて。

[説明]

maildir は、 受信メール・メッセージのディレクトリに関する体系です。 maildir は、 mbox ファイルや mh フォルダを悩ます信頼性の問題を解決します。

■ 信頼性 (RELIABILITY ISSUES)

メッセージを配送している間に、マシンがクラッシュするかもしれません。 mbox ファイルや mh フォルダの両方で、 これは、メッセージが密かに切り捨てられることを意味します。 もっと悪いことに、 mbox 形式に関して、 メッセージが行の途中で切り捨てられた場合、 そのメッセージは、密かに、次のメッセージ結合されます。 メールのトランスポート・エージェント(transport agent)は、 メッセージを配送するために、後で再び試行を行います。 しかし、 訛ったメッセージはすべて見えてしまいます。 maildir では、 あらゆるメッセージは、配送の上で完全に保証されます。

1つのマシンで、 メールを同じユーザーに配送する2つのプログラムが、 同時に動作しているかもしれません。 mbox や mh 形式は、 1つの中央のファイルを更新することを、 プログラムに要求します。 プログラムが何らかのロック機構を使用しない場合、 中央のファイルは、壊されてしまいます。 幾つかのの mbox や mh のロック機構がありますが、 可搬性と信頼性が高いものはありません。 対照的に、maildir では、 ロック機構は必要ありません。 異なる配送プロセスは、同じファイルを触りません。

ユーザーは、 マシンが新しいメッセージを配送するのと同じ瞬間に、 ユーザーのメール・ボックスから、 メッセージを削除しようとするかもしれません。 mbox や mh 形式では、 ユーザーのメール読み取りプログラムは、 メール配送プログラムが使用するロック機構を知っていなければなりません。 対照的に、maildir では、 どんな配送メッセージでも、 メール・読み取りプログラムによって、 安全に、更新または削除を行うことができます。

多くのサイトでは、 おそらくオペレーティング・システムのベンダーが何も提供しないために、 Sun 社の NFS (Network Failure System) を使用します。 NFS は、上記の問題のすべてを悪化させます。 幾つかの NFS の実装では、 何のロック機構も提供されません。 mbox や mh 形式では、 2つのマシンがメールを同じユーザーに配送したり、 ユーザーが配送マシンがどこであるかを省くようなメールを読み込む場合、 ユーザーのメールは、危険に遭遇しています。 maildir は、NFS 上でも、問題なく動作します。

■ maildir の構造 (THE MAILDIR STRUCTURE)

maildir 形式でのディレクトリは、 3つのサブディレクトリを持ちます。 すべてが同じファイル・システム上にある、tmp、new、cur などです。

new ディレクトリの各ファイルは、 新しく配送されたメール・メッセージです。 ファイルの変更時間は、メッセージの配送日付です。 メッセージは、 余分な UUCP 形式の From_ 行や、 >From クオーティング、 最後の余分な空行などを持たずに配送されます。 メッセージは、通常、 Return-Path 行や Delivered-To 行で始まるRFC 822 形式ですが、 任意のバイナリ・データを含むことができます。 これは、改行で終わっていないかもしれません。

cur ディレクトリのファイルは、 ちょうど new ディレクトリのファイルのようです。 大きな違いは、 cur ディレクトリのファイルは、もはや、新しいメールではありません。 これらは、 ユーザーのメール読み取りプログラムによって、 読まれています。

■ メッセージの配送方法 (HOW A MESSAGE IS DELIVERED)

tmp ディレクトリは、ここで議論されてるように、 信頼できる配送を確実にします。

プログラムは、 メール・メッセージを次の6つの段階で配送します。

  1. maildir ディレクトリに chdir() します。
  2. 名前 tmp/time.pid.host を stat() します。 ここで、time は GMT で1970年の開始からの秒数で、 pid はプログラムのプロセスID、 host はホスト名です。
  3. stat() が ENOENT と異なるコードを返した場合、 プログラムは、 2秒間休止し、時刻を更新し、再び stat() を試みます。 これを、回数の上限まで繰り返します。
  4. プログラムは、tmp/time.pid.host を生成します。
  5. プログラムは、メッセージをファイルに NFS 書き込み(NFS-writing)します。
  6. プログラムは、ファイルを new/time.pid.host に link() します。 この瞬間、メッセージは成功裏に配送されました。

配送プログラムは、 tmp/time.pid.host を生成する前に24時間タイマーを始動することや、 タイマーが満了した場合に配送を中止することなどを要求されます。 エラー、タイムアウト、正常完了(normal completion) などの場合でも、 配送プログラムは、 tmp/time.pid.host を unlink() しようとするかもしれません。

NFS 書き込み(NFS-writing) とは、

  1. いつものように、各 write() コールから返されたバイト数をチェックします。
  2. fsync() を呼び出し、戻り値をチェックします。
  3. close() を呼び出し、戻り値をチェックします。
などを意味します。 標準的な NFS の実装では、fsync() を誤って処理しますが、 close() を悪用することで、埋め合わせています。

■ メッセージの読み込み方法 (HOW A MESSAGE IS READ)

メール読み取りプログラムは、次のように作用します。

メール読み取りプログラムは、 新しいメッセージに関して、 新しいディレクトリを通して吟味します。 仮に、新しいメッセージ new/unique があったとします。 読み取りプログラムは、 次のようなことを自由に行うことができます。

読み取りプログラムも、 tmp ディレクトリを通して吟味することや、 そこで発見された古いファイルをきれいにすることなどを期待されています。 36 時間以内にアクセスされていない場合、 tmp ディレクトリのファイルは、安全に取り除くことができます。

ドットで始まる new と cur ディレクトリ中のすべてのファイル名をスキップすることは、 読み取りプログラムにとって良いことです。 これとは異なり、 メールの読み取りプログラムは、 ファイル名を構文解析しようとしえはいけません。

[環境変数]

MAILDIR
maildir をサポートするメールの読み取りプログラムは、 ユーザーの一次メール・ディレクトリの名前として、 環境変数 MAILDIR を使用します。

[関連項目]

mbox (5)
qmail-local (8)

[マニュアル・ページ]

日本語、 英語

▲ Top


(2003/02/09)