このモジュールでは (Unixの) メイルボックス内のメイルに 簡単かつ一様な方法でアクセスできるようにするクラスを定義しています。
fp[, factory]) |
可搬性を最大限にするために、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 を参照してください。
fp[, factory]) |
'From '
で始まる行をクオートするため、
この分割はうまく動作します。
fp[, factory]) |
dirname[, factory]) |
dirname[, factory]) |
fp[, factory]) |
'*** 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)
参考: