7.3.4 撤廃されたクラスとメソッド

古いバージョンの mailbox モジュールはメッセージの追加や削除といった メールボックスの変更をサポートしていませんでした。また形式ごとのメッセージプロパティ を表現するクラスも提供していませんでした。後方互換性のために、古いメールボックス クラスもまだ使うことができますが、できるだけ新しいクラスを使うべきです。

古いメールボックスオブジェクトは繰り返しと一つの公開メソッドだけを提供していました:

next( )
メールボックスオブジェクトのコンストラクタに渡された、オプションの factory 引数を使って、メールボックス中の次のメッセージを 生成して返します。標準の設定では、factoryrfc822.Message オブジェクトです (rfc822 モジュールを参照してください)。 メールボックスの実装により、このオブジェクトの fp 属性は 真のファイルオブジェクトかもしれないし、 複数のメールメッセージが単一のファイルに収められているなどの場合に、 メッセージ間の境界を注意深く扱うためにファイルオブジェクトをシミュレート するクラスのインスタンスであるかもしれません。 次のメッセージがない場合、このメソッドは None を返します。

ほとんどの古いメールボックスクラスは現在のメールボックスクラスと違う名前ですが、 Maildir だけは例外です。そのため、新しい方の Maildir クラスには next() メソッドが定義され、コンストラクタも他の新しいメールボックスクラスとは 少し異なります。

古いメールボックスのクラスで名前が新しい対応物と同じでないものは以下の通りです:

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

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

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

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

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

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

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

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

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

古いメールボックスクラスを撤廃された 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 メッセージしか入っていないと 分かっているのなら、単に以下のようにします:

import email
import mailbox

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

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