###
1 `Maildir`

クラス `Maildir`( | dirname[, factory=rfc822.Message[, create=True]])

  Maildir 形式のメールボックスのための `Mailbox` のサブクラス。 パラメータ factory は呼び出し可能オブジェクトで (バイナリモードで開かれているかのように振る舞う)ファイル風メッセージ表現を 受け付けて好みの表現を返すものです。factory が `None`ならば、 `MaildirMessage` がデフォルトのメッセージ表現として使われます。 create が `True` ならばメールボックスが存在しないときには 作成します。

  factory のデフォルトが `rfc822.Message` であったり、 path ではなく dirname という名前であったりというのは 歴史的理由によるものです。`Maildir` インスタンスが他の `Mailbox` サブクラスと同じように振る舞わせるためには、factory に `None` を セットしてください。

Maildir はディレクトリ型のメールボックス形式でメール転送エージェント qmail 用に 発明され、現在では多くの他のプログラムでもサポートされているものです。Maildir メールボックス中のメッセージは共通のディレクトリ構造の下で個別のファイルに保存されます。 このデザインにより、Maildir メールボックスは複数の無関係の プログラムからデータを失うことなくアクセスしたり変更したりできます。 そのためロックは不要です。

Maildir メールボックスには三つのサブディレクトリ tmp, new, cur があります。メッセージはまず tmp サブディレクトリに瞬間的に 作られた後、new サブディレクトリに移動されて配送を完了します。メールユーザ エージェントが引き続いて cur サブディレクトリにメッセージを移動し メッセージの状態についての情報をファイル名に追加される特別な"info"セクションに 保存することができます。

Courier メール転送エージェントによって導入されたスタイルのフォルダもサポートされます。 主たるメールボックスのサブディレクトリは "`.`" がファイル名の先頭であれば フォルダと見なされます。フォルダ名は `Maildir` によって先頭の "`.`" を除いて表現されます。各フォルダはまた Maildir メールボックスですがさらにフォルダを 含むことはできません。その代わり、論理的包含関係は例えば "Archived.2005.07" のような "`.`" を使ったレベル分けで表わされます。

注意: 本来の Maildir 仕様ではある種のメッセージのファイル名にコロン("`:`")を 使う必要があります。しかしながら、オペレーティングシステムによってはこの文字を ファイル名に含めることができないことがあります。そういった環境で Maildir のような 形式を使いたい場合、代わりに使われる文字を指定する必要があります。感嘆符("`!`") を使うのが一般的な選択です。以下の例を見てください。

    import mailbox
    mailbox.Maildir.colon = '!'

`colon` 属性はインスタンスごとにセットしても構いません。

`Maildir` インスタンスには `Mailbox` の全てのメソッドに加え以下の メソッドもあります。

`list_folders`( | )

  全てのフォルダ名のリストを返します。

`get_folder`( | folder)

  名前が folder であるフォルダを表わす `Maildir` インスタンスを返します。 そのようなフォルダが存在しなければ `NoSuchMailboxError` 例外が送出されます。

`add_folder`( | folder)

  名前が folder であるフォルダを作り、それを表わす `Maildir` インスタンスを返します。

`remove_folder`( | folder)

  名前が folder であるフォルダを削除します。もしフォルダに一つでもメッセージが 含まれていれば `NotEmptyError` 例外が送出されフォルダは削除されません。

`clean`( | )

  過去36時間以内にアクセスされなかったメールボックス内の一時ファイルを削除します。 Maildir 仕様はメールを読むプログラムはときどきこの作業をすべきだとしています。

`Maildir` で実装された `Mailbox` のいくつかのメソッドには特別な注意が 必要です。

`add`( | message)

`__setitem__`( | key, message)

`update`( | arg)

  警告: これらのメソッドは一意的なファイル名をプロセスIDに基づいて生成します。 複数のスレッドを使う場合は、同じメールボックスを同時に操作しないようにスレッド間で 調整しておかないと検知されない名前の衝突が起こりメールボックスを壊すかもしれません。

`flush`( | )

  Maildir メールボックスへの変更は即時に適用されるので、このメソッドは何もしません。

`lock`( | )

`unlock`( | )

  Maildir メールボックスはロックをサポート(または要求)しないので、 このメソッドは何もしません。

`close`( | )

  `Maildir` インスタンスは開いたファイルを保持しませんしメールボックスは ロックをサポートしませんので、このメソッドは何もしません。

`get_file`( | key)

  ホストのプラットフォームによっては、返されたファイルが開いている間元になったメッセージを 変更したり削除したりできない場合があります。

参考:

qmail の maildir man ページ
  Maildir 形式のオリジナルの仕様

Using maildir format
  Maildir 形式の発明者による注意書き。更新された名前生成規則と "info" の解釈 についても含まれます。

Courier の maildir man ページ
  Maildir 形式のもう一つの仕様。フォルダをサポートする一般的な拡張について 記述されています。