7.3.1.1 Maildir

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

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

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 形式のもう一つの仕様。フォルダをサポートする一般的な拡張について 記述されています。

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。