# 12.4 `mailbox` -- 様々なメールボックス形式の読み出し

このモジュールでは (Unixの) メイルボックス内のメイルに 簡単かつ一様な方法でアクセスできるようにするクラスを定義しています。

class `UnixMailbox`( | fp[, factory])

  全てのメッセージが単一のファイルに収められ、"`From` " ("`From_`" として知られています) 行によって分割されているような、 旧来の Unix形式のメイルボックスにアクセスします。 ファイルオブジェクト fp はメイルボックスファイルを指します。 オプションの factory パラメタは新たなメッセージオブジェクト を生成するような呼び出し可能オブジェクトです。factory は、 メイルボックスオブジェクトに対して `next()` メソッドを実行 した際に、単一の引数、fp を伴って呼び出されます。 この引数の標準の値は `rfc822.Message` クラスです (`rfc822` モジュール - および以下 - を参照してください)。

  注意: このモジュールの実装上の理由により、fp オブジェクトはバイナリ モードで開くようにしてください。特にWindows上では注意が必要です。

  可搬性を最大限にするために、Unix形式のメイルボックス内にある メッセージは、正確に `'From '` (末尾の空白に注意してください) で始まる文字列が、直前の正しく二つの改行の後にくるような行で 分割されます。現実的には広範なバリエーションがあるため、それ以外の From_ 行について考慮すべきではないのですが、現在の実装では先頭の 二つの改行をチェックしていません。これはほとんどのアプリケーションで うまく動作します。

  `UnixMailbox` クラスでは、ほぼ正確に From_ デリミタにマッチする ような正規表現を用いることで、より厳密に From_ 行のチェックを行う バージョンを実装しています。`UnixMailbox` ではデリミタ行が "`From namevartime`" の行に分割されるものと考えます。 可搬性を最大限にするためには、代わりに `PortableUnixMailbox` クラスを使ってください。このクラスは `UnixMailbox` と同じですが、 個々のメッセージは "`From` " 行だけで分割されるものとみなします。

  より詳細な情報については、 Configuring Netscape Mail on Unix: Why the Content-Length Format is Bad を参照してください。

class `PortableUnixMailbox`( | fp[, factory])

  厳密性の低い `UnixMailbox` のバージョンで、メッセージを分割 する行は "`From` " のみであると見なします。実際に見られるメイル ボックスのバリエーションに対応するため、 From 行における ``name time'' 部分は無視されます。メイル処理ソフトウェア はメッセージ中の `'From '` で始まる行をクオートするため、 この分割はうまく動作します。

class `MmdfMailbox`( | fp[, factory])

  全てのメッセージが単一のファイルに収められ、4 つの control-A 文字 によって分割されているような、MMDF 形式のメイルボックスにアクセスします。 ファイルオブジェクト fp はメイルボックスファイルをさします。 オプションの factory は `UnixMailbox` クラスにおけるのと 同様です。

class `MHMailbox`( | dirname[, factory])

  数字で名前のつけられた別々のファイルに個々のメッセージを収めた ディレクトリである、MH メイルボックスにアクセスします。 メイルボックスディレクトリの名前は dirname で渡します。 factory は `UnixMailbox` クラスにおけるのと 同様です。

class `Maildir`( | dirname[, factory])

  Qmail メイルディレクトリにアクセスします。dirname で 指定された全ての新規および現在のメッセージにアクセスできます。 factory は `UnixMailbox` クラスにおけるのと 同様です。

class `BabylMailbox`( | fp[, factory])

  MMDF メイルボックスと似ている、Babyl メイルボックスにアクセスします。 Babyl 形式では、各メッセージは二つのヘッダからなるセット、 original ヘッダおよび visible ヘッダをを持っています。 original ヘッダは `'*** EOOH ***'` (End-Of-Original-Headers) だけを含む行の前にあり、visible ヘッダは `EOOH` 行の後に あります。Babyl 互換のメイルリーダは visible ヘッダのみを表示 し、 `BabylMailbox` オブジェクトは visible ヘッダのみを 含むようなメッセージを返します。メイルメッセージは EOOH 行で始まり、 `'\037\014'` だけを含む行で終わります。 factory は `UnixMailbox` クラスにおけるのと 同様です。

`rfc822` モジュールが撤廃されたことにより、 `email` パッケージを使ってメイルボックスから メッセージオブジェクトを生成するよう推奨されているので 注意してください。 (デフォルトの設定は以前のバージョンとの 互換性のために変更されていません。) 安全に移行を行うには、以下のちょっとしたコードを使います:

    import email
    import email.Errors
    import mailbox

    def msgfactory(fp):
        try:
            return email.message_from_file(fp)
        except email.Errors.MessageParseError:
            # Don't return None since that will
    	# stop the mailbox iterator
    	return ''

    mbox = mailbox.UnixMailbox(fp, msgfactory)

上のラッパはメイルボックス内にある不正な形式の MIME メッセージに 対して防御性がある反面、メイルボックスの `next()` メソッド が空文字列を渡す場合に備えなければなりません。逆に、もし メイルボックス内には正しい形式の MIME メッセージしか入っていないと 分かっているのなら、単に以下のようにします:

    import email
    import mailbox

    mbox = mailbox.UnixMailbox(fp, email.message_from_file)

参考資料:

mbox - file containing mail messages
  伝統的な ``mbox'' メイルボックス形式に関する記述です。

maildir - directory for incoming mail messages
  ``maildir'' メイルボックス形式の記述です。

Configuring Netscape Mail on Unix: Why the Content-Length Format is Bad
  メイルボックスファイルに記録されている Content-Length: ヘッダに依存した場合に発生する問題についての記述です。