mailbox —さまざまな形式のメールボックスを操作します
ソースコード: :source: `Lib / mailbox.py`
このモジュールは、ディスク上のメールボックスとそれに含まれるメッセージにアクセスして操作するための2つのクラス Mailbox と Message を定義します。 Mailbox は、キーからメッセージへの辞書のようなマッピングを提供します。 Message は、 email.message モジュールの Message クラスをフォーマット固有の状態と動作で拡張します。 サポートされているメールボックス形式は、Maildir、mbox、MH、Babyl、およびMMDFです。
メールボックスオブジェクト
- class mailbox.Mailbox
検査および変更される可能性のあるメールボックス。
Mailbox クラスはインターフェースを定義し、インスタンス化されることを意図していません。 代わりに、フォーマット固有のサブクラスは Mailbox から継承する必要があり、コードは特定のサブクラスをインスタンス化する必要があります。
メールボックスインターフェースは辞書のようなもので、メッセージに対応する小さなキーがあります。 キーは、それらが使用される Mailbox インスタンスによって発行され、その Mailbox インスタンスに対してのみ意味があります。 キーは、対応するメッセージが変更された場合でも、メッセージを別のメッセージに置き換えるなどして、メッセージを識別し続けます。
メッセージは、set-likeメソッド add()を使用して Mailbox インスタンスに追加し、
del
ステートメントまたはset-likeメソッド removeを使用して削除できます。 ()および discard()。メールボックスインターフェイスのセマンティクスは、いくつかの注目すべき点で辞書のセマンティクスとは異なります。 メッセージが要求されるたびに、メールボックスの現在の状態に基づいて新しい表現(通常は Message インスタンス)が生成されます。 同様に、メッセージが Mailbox インスタンスに追加されると、提供されたメッセージ表現のコンテンツがコピーされます。 どちらの場合も、 Mailbox インスタンスによって保持されるメッセージ表現への参照ではありません。
デフォルトの Mailbox イテレーターは、デフォルトのディクショナリイテレーターのようにキーではなく、メッセージ表現を反復処理します。 さらに、反復中のメールボックスの変更は安全で明確に定義されています。 イテレータの作成後にメールボックスに追加されたメッセージは、イテレータには表示されません。 イテレータがメッセージを生成する前にメールボックスから削除されたメッセージはサイレントにスキップされますが、イテレータからのキーを使用すると、対応するメッセージが後で削除された場合に KeyError 例外が発生する可能性があります。
警告
他のプロセスによって同時に変更される可能性のあるメールボックスを変更する場合は、十分に注意してください。 このようなタスクに使用する最も安全なメールボックス形式はMaildirです。 同時書き込みにmboxなどの単一ファイル形式を使用しないようにしてください。 メールボックスを変更する場合は、ロック()およびロック解除()メソッドを呼び出してを読み取る前にロックする必要がありますファイル内のメッセージ、またはメッセージを追加または削除して変更を加える。 メールボックスのロックに失敗すると、メッセージが失われたり、メールボックス全体が破損したりするリスクがあります。
Mailbox インスタンスには次のメソッドがあります。
- add(message)
メッセージをメールボックスに追加し、それに割り当てられているキーを返します。
パラメータ message は、 Message インスタンス、 email.message.Message インスタンス、文字列、バイト文字列、またはファイルのようなオブジェクト(バイナリモードで開いている)。 message が適切なフォーマット固有の Message サブクラスのインスタンスである場合(たとえば、 mboxMessage インスタンスであり、これが mbox である場合)インスタンス)、そのフォーマット固有の情報が使用されます。 それ以外の場合は、フォーマット固有の情報に適切なデフォルトが使用されます。
バージョン3.2で変更:バイナリ入力のサポートが追加されました。
- remove(key)
__delitem__(key)
discard(key) キーに対応するメッセージをメールボックスから削除します。
そのようなメッセージが存在しない場合、メソッドが remove()または __ delitem __()として呼び出された場合、 KeyError 例外が発生しますが、メソッドが発生した場合は例外は発生しません。 discard()と呼ばれていました。 基になるメールボックス形式が他のプロセスによる同時変更をサポートしている場合は、 discard()の動作が優先される場合があります。
- __setitem__(key, message)
キーに対応するメッセージをメッセージに置き換えてください。 key に対応するメッセージがまだない場合は、 KeyError 例外を発生させます。
add()と同様に、パラメーター message は、 Message インスタンス、 email.message.Message インスタンス、文字列、バイト文字列、またはファイルのようなオブジェクト(バイナリモードで開く必要があります)。 message が適切なフォーマット固有の Message サブクラスのインスタンスである場合(たとえば、 mboxMessage インスタンスであり、これが mbox である場合)インスタンス)、そのフォーマット固有の情報が使用されます。 それ以外の場合、現在キーに対応しているメッセージのフォーマット固有の情報は変更されません。
- iterkeys()
keys() iterkeys()として呼び出された場合はすべてのキーに対してイテレータを返し、 keys()として呼び出された場合はキーのリストを返します。
- itervalues()
__iter__()
values() itervalues()または __ iter __()として呼び出された場合は、すべてのメッセージの表現に対するイテレーターを返します。 values()として呼び出された場合は、そのような表現のリストを返します。 Mailbox インスタンスが初期化されたときにカスタムメッセージファクトリが指定されていない限り、メッセージは適切な形式固有の Message サブクラスのインスタンスとして表されます。
ノート
__ iter __()の動作は、キーを反復処理する辞書の動作とは異なります。
- iteritems()
items() ( key 、 message )ペアに対してイテレータを返します。ここで、 key はキーであり、 message はメッセージ表現です。 iteritems()または、 items()として呼び出された場合は、そのようなペアのリストを返します。 Mailbox インスタンスが初期化されたときにカスタムメッセージファクトリが指定されていない限り、メッセージは適切な形式固有の Message サブクラスのインスタンスとして表されます。
- get(key, default=None)
__getitem__(key) キーに対応するメッセージの表現を返します。 そのようなメッセージが存在しない場合、メソッドが get()として呼び出された場合は default が返され、メソッドがとして呼び出された場合は KeyError 例外が発生します。 ] __ getitem __()。 メールボックスインスタンスが初期化されたときにカスタムメッセージファクトリが指定されていない限り、メッセージは適切なフォーマット固有のメッセージサブクラスのインスタンスとして表されます。
- get_message(key)
key に対応するメッセージの表現を適切なフォーマット固有の Message サブクラスのインスタンスとして返すか、そのようなメッセージが存在しない場合は KeyError 例外を発生させます。
- get_bytes(key)
key に対応するメッセージのバイト表現を返すか、そのようなメッセージが存在しない場合は KeyError 例外を発生させます。
バージョン3.2の新機能。
- get_string(key)
key に対応するメッセージの文字列表現を返すか、そのようなメッセージが存在しない場合は KeyError 例外を発生させます。 メッセージは email.message.Message を介して処理され、7ビットのクリーンな表現に変換されます。
- get_file(key)
key に対応するメッセージのファイルのような表現を返すか、そのようなメッセージが存在しない場合は KeyError 例外を発生させます。 ファイルのようなオブジェクトは、バイナリモードで開いているかのように動作します。 このファイルは、不要になったら閉じる必要があります。
バージョン3.2で変更:ファイルオブジェクトは実際にはバイナリファイルです。 以前は、テキストモードで誤って返されていました。 また、ファイルのようなオブジェクトがコンテキスト管理プロトコルをサポートするようになりました。 with ステートメントを使用して自動的に閉じることができます。
ノート
メッセージの他の表現とは異なり、ファイルのような表現は、メッセージを作成した Mailbox インスタンスまたは基になるメールボックスから必ずしも独立しているわけではありません。 より具体的なドキュメントは、各サブクラスによって提供されます。
- __contains__(key)
キーがメッセージに対応する場合は
True
を返し、そうでない場合はFalse
を返します。
- __len__()
メールボックス内のメッセージの数を返します。
- clear()
メールボックスからすべてのメッセージを削除します。
- pop(key, default=None)
キーに対応するメッセージの表現を返し、メッセージを削除します。 そのようなメッセージが存在しない場合は、 default を返します。 メールボックスインスタンスが初期化されたときにカスタムメッセージファクトリが指定されていない限り、メッセージは適切なフォーマット固有のメッセージサブクラスのインスタンスとして表されます。
- popitem()
任意の( key 、 message )ペアを返します。ここで、 key はキー、 message はメッセージ表現であり、対応するものを削除します。メッセージ。 メールボックスが空の場合は、 KeyError 例外を発生させます。 メールボックスインスタンスが初期化されたときにカスタムメッセージファクトリが指定されていない限り、メッセージは適切なフォーマット固有のメッセージサブクラスのインスタンスとして表されます。
- update(arg)
パラメータ arg は、 key から message へのマッピング、または( key 、 message )の反復可能である必要がありますペア。 メールボックスを更新し、指定されたキーおよびメッセージごとに、キーに対応するメッセージがメッセージに設定されるようにします。 __ setitem __()。 __ setitem __()と同様に、各 key はすでにメールボックス内のメッセージに対応している必要があります。そうでない場合、 KeyError 例外が発生するため、一般的には正しくありません。 arg が Mailbox インスタンスになる場合。
ノート
辞書とは異なり、キーワード引数はサポートされていません。
- flush()
保留中の変更をファイルシステムに書き込みます。 一部の Mailbox サブクラスでは、変更は常にすぐに書き込まれ、 flush()は何もしませんが、このメソッドを呼び出す習慣をつける必要があります。
- lock()
メールボックスの排他的アドバイザリロックを取得して、他のプロセスがメールボックスを変更しないようにします。 ロックが使用できない場合、 ExternalClashError が発生します。 使用される特定のロックメカニズムは、メールボックスの形式によって異なります。 メールボックスの内容を変更する前に、常にロックする必要があります。
- unlock()
メールボックスのロックを解除します(ある場合)。
- close()
メールボックスをフラッシュし、必要に応じてロックを解除し、開いているファイルをすべて閉じます。 一部のメールボックスサブクラスでは、このメソッドは何もしません。
Maildir
- class mailbox.Maildir(dirname, factory=None, create=True)
Maildir形式のメールボックスの Mailbox のサブクラス。 パラメータ factory は、ファイルのようなメッセージ表現(バイナリモードで開かれたかのように動作する)を受け入れ、カスタム表現を返す呼び出し可能なオブジェクトです。 factory が
None
の場合、 MaildirMessage がデフォルトのメッセージ表現として使用されます。 create がTrue
の場合、メールボックスが存在しないと作成されます。create が
True
で、 dirname パスが存在する場合、ディレクトリレイアウトを確認せずに、既存のmaildirとして扱われます。dirname が path ではなく、そのように命名されているのは歴史的な理由によるものです。
Maildirは、qmailメール転送エージェント用に考案されたディレクトリベースのメールボックス形式であり、現在、他のプログラムで広くサポートされています。 Maildirメールボックス内のメッセージは、共通のディレクトリ構造内の個別のファイルに保存されます。 この設計により、Maildirメールボックスは、データを破壊することなく、複数の無関係なプログラムからアクセスおよび変更できるため、ファイルロックは不要です。
Maildirメールボックスには、
tmp
、new
、およびcur
の3つのサブディレクトリが含まれています。 メッセージは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)
ホストプラットフォームによっては、返されたファイルが開いたままの状態で、基になるメッセージを変更または削除できない場合があります。
も参照してください
- Courierのmaildirmanページ
- フォーマットの仕様。 フォルダをサポートするための一般的な拡張子について説明します。
- maildir形式を使用する
- 発明者によるMaildirに関するメモ。 更新された名前作成スキームと「情報」セマンティクスの詳細が含まれています。
mbox
- class mailbox.mbox(path, factory=None, create=True)
mbox形式のメールボックス用の Mailbox のサブクラス。 パラメータ factory は、ファイルのようなメッセージ表現(バイナリモードで開かれたかのように動作する)を受け入れ、カスタム表現を返す呼び出し可能なオブジェクトです。 factory が
None
の場合、 mboxMessage がデフォルトのメッセージ表現として使用されます。 create がTrue
の場合、メールボックスが存在しないと作成されます。mbox形式は、Unixシステムにメールを保存するための古典的な形式です。 mboxメールボックス内のすべてのメッセージは単一のファイルに保存され、各メッセージの先頭は最初の5文字が「From」である行で示されます。
オリジナルの認識された欠点に対処するために、mbox形式のいくつかのバリエーションが存在します。 互換性のために、 mbox は、 mboxo と呼ばれることもある元の形式を実装しています。 これは、 Content-Length ヘッダーが存在する場合は無視され、メッセージ本文の行頭にある「From」の出現は、メッセージの保存時に「> From」に変換されることを意味します。ただし、メッセージの読み取り時に「> From」の出現は「From」に変換されません。
mbox によって実装されたいくつかの Mailbox メソッドは、特別な注意に値します。
- get_file(key)
mbox インスタンスで
flush()
またはclose()
を呼び出した後にファイルを使用すると、予期しない結果が発生したり、例外が発生したりする場合があります。
- lock()
unlock() 3つのロックメカニズムが使用されます。ドットロックと、可能な場合は
flock()
およびlockf()
システムコールです。
も参照してください
- 錫からのmboxのmanページ
- ロックの詳細を含むフォーマットの仕様。
- UnixでのNetscapeメールの設定:Content-Length形式が悪い理由
- バリエーションではなく、元のmbox形式を使用するための引数。
- 「mbox」は、相互に互換性のないいくつかのメールボックス形式のファミリーです。
- mboxのバリエーションの歴史。
MH
- class mailbox.MH(path, factory=None, create=True)
MH形式のメールボックス用の Mailbox のサブクラス。 パラメータ factory は、ファイルのようなメッセージ表現(バイナリモードで開かれたかのように動作する)を受け入れ、カスタム表現を返す呼び出し可能なオブジェクトです。 factory が
None
の場合、 MHMessage がデフォルトのメッセージ表現として使用されます。 create がTrue
の場合、メールボックスが存在しないと作成されます。MHは、メールユーザーエージェントであるMHメッセージ処理システム用に考案されたディレクトリベースのメールボックス形式です。 MHメールボックス内の各メッセージは、独自のファイルに存在します。 MHメールボックスには、メッセージに加えて、他のMHメールボックス(フォルダーと呼ばれる)が含まれる場合があります。 フォルダは無期限にネストされる場合があります。 MHメールボックスはシーケンスもサポートします。これは、メッセージをサブフォルダーに移動せずに論理的にグループ化するために使用される名前付きリストです。 シーケンスは、各フォルダの
.mh_sequences
というファイルで定義されています。MH クラスはMHメールボックスを操作しますが、 mh のすべての動作をエミュレートしようとはしません。 特に、 mh が状態と構成を保存するために使用する
context
または.mh_profile
ファイルは変更されず、影響を受けません。MH インスタンスには、以下に加えて、 Mailbox のすべてのメソッドがあります。
- list_folders()
すべてのフォルダの名前のリストを返します。
- get_folder(folder)
folder という名前のフォルダーを表す MH インスタンスを返します。 フォルダが存在しない場合、 NoSuchMailboxError 例外が発生します。
- add_folder(folder)
folder という名前のフォルダーを作成し、それを表す MH インスタンスを返します。
- remove_folder(folder)
folder という名前のフォルダーを削除します。 フォルダにメッセージが含まれている場合、 NotEmptyError 例外が発生し、フォルダは削除されません。
- get_sequences()
キーリストにマップされたシーケンス名の辞書を返します。 シーケンスがない場合は、空の辞書が返されます。
- set_sequences(sequences)
get_sequences()によって返されるように、キーリストにマップされた名前の辞書である sequences に基づいて、メールボックスに存在するシーケンスを再定義します。
- pack()
ナンバリングのギャップをなくすために、必要に応じてメールボックス内のメッセージの名前を変更します。 シーケンスリストのエントリはそれに応じて更新されます。
ノート
すでに発行されているキーは、この操作によって無効になるため、後で使用しないでください。
MH によって実装されたいくつかのメールボックスメソッドは特別な注意に値します。
- remove(key)
__delitem__(key)
discard(key) これらのメソッドは、メッセージをすぐに削除します。 メッセージの名前の前にコンマを付けて削除するようにマークするというMH規則は使用されません。
- lock()
unlock() 3つのロックメカニズムが使用されます。ドットロックと、可能な場合は
flock()
およびlockf()
システムコールです。 MHメールボックスの場合、メールボックスをロックするとは、.mh_sequences
ファイルをロックし、それらに影響を与える操作の期間中のみ、個々のメッセージファイルをロックすることを意味します。
- get_file(key)
ホストプラットフォームによっては、返されたファイルが開いたままの状態で、基になるメッセージを削除できない場合があります。
- flush()
MHメールボックスへのすべての変更はすぐに適用されるため、このメソッドは何もしません。
も参照してください
- nmh-メッセージ処理システム
- オリジナルの mh のアップデートバージョンである nmh のホームページ。
- MH&nmh:ユーザーとプログラマー向けのメール
- mh および nmh に関するGPLライセンスの本で、メールボックスの形式に関する情報が含まれています。
Babyl
- class mailbox.Babyl(path, factory=None, create=True)
Babyl形式のメールボックス用の Mailbox のサブクラス。 パラメータ factory は、ファイルのようなメッセージ表現(バイナリモードで開かれたかのように動作する)を受け入れ、カスタム表現を返す呼び出し可能なオブジェクトです。 factory が
None
の場合、 BabylMessage がデフォルトのメッセージ表現として使用されます。 create がTrue
の場合、メールボックスが存在しないと作成されます。Babylは、Emacsに含まれているRmailメールユーザーエージェントが使用する単一ファイルのメールボックス形式です。 メッセージの開始は、Control-Underscore(
'\037'
)とControl-L('\014'
)の2文字を含む行で示されます。 メッセージの終わりは、次のメッセージの始まり、または最後のメッセージの場合はControl-Underscore('\037'
)文字を含む行で示されます。Babylメールボックス内のメッセージには、元のヘッダーといわゆる可視ヘッダーの2セットのヘッダーがあります。 可視ヘッダーは通常、より魅力的になるように再フォーマットまたは要約された元のヘッダーのサブセットです。 Babylメールボックス内の各メッセージには、ラベルの付随リスト、またはメッセージに関する追加情報を記録する短い文字列もあり、メールボックス内にあるすべてのユーザー定義ラベルのリストは、Babylオプションに保持されます。セクション。
Babyl インスタンスには、以下に加えて、 Mailbox のすべてのメソッドがあります。
- get_labels()
メールボックスで使用されているすべてのユーザー定義ラベルの名前のリストを返します。
ノート
Babylオプションセクションのラベルのリストを参照するのではなく、実際のメッセージを調べてメールボックスに存在するラベルを判別しますが、メールボックスが変更されるたびにBabylセクションが更新されます。
Babyl によって実装されたいくつかの Mailbox メソッドは、特別な注意に値します。
- get_file(key)
Babylメールボックスでは、メッセージのヘッダーはメッセージの本文と連続して保存されません。 ファイルのような表現を生成するために、ヘッダーと本文が一緒に io.BytesIO インスタンスにコピーされます。このインスタンスには、ファイルと同じAPIがあります。 その結果、ファイルのようなオブジェクトは、基になるメールボックスから完全に独立していますが、文字列表現と比較してメモリを節約しません。
- lock()
unlock() 3つのロックメカニズムが使用されます。ドットロックと、可能な場合は
flock()
およびlockf()
システムコールです。
MMDF
- class mailbox.MMDF(path, factory=None, create=True)
MMDF形式のメールボックス用の Mailbox のサブクラス。 パラメータ factory は、ファイルのようなメッセージ表現(バイナリモードで開かれたかのように動作する)を受け入れ、カスタム表現を返す呼び出し可能なオブジェクトです。 factory が
None
の場合、 MMDFMessage がデフォルトのメッセージ表現として使用されます。 create がTrue
の場合、メールボックスが存在しないと作成されます。MMDFは、メール転送エージェントであるマルチチャネルメモ配布機能用に考案された単一ファイルのメールボックス形式です。 各メッセージはmboxメッセージと同じ形式ですが、前後に4つのControl-A(
'\001'
)文字を含む行で囲まれています。 mbox形式と同様に、各メッセージの先頭は最初の5文字が「From」である行で示されますが、メッセージを格納するときに「From」の追加のオカレンスは「> From」に変換されません。これは、追加のメッセージ区切り行がそのような出来事を後続のメッセージの開始と間違えます。MMDF によって実装されたいくつかのメールボックスメソッドは特別な注意に値します。
- get_file(key)
MMDF インスタンスで
flush()
またはclose()
を呼び出した後にファイルを使用すると、予期しない結果が発生したり、例外が発生したりする場合があります。
- lock()
unlock() 3つのロックメカニズムが使用されます。ドットロックと、可能な場合は
flock()
およびlockf()
システムコールです。
も参照してください
- スズからのmmdfmanページ
- ニュースリーダーであるtinのドキュメントからのMMDF形式の仕様。
- MMDF
- マルチチャネル覚書配布機能について説明しているウィキペディアの記事。
メッセージオブジェクト
- class mailbox.Message(message=None)
email.message モジュールの Message のサブクラス。 mailbox.Message のサブクラスは、メールボックス形式固有の状態と動作を追加します。
メッセージを省略すると、新しいインスタンスはデフォルトの空の状態で作成されます。 message が email.message.Message インスタンスの場合、その内容がコピーされます。 さらに、メッセージがメッセージインスタンスである場合、フォーマット固有の情報は可能な限り変換されます。 message が文字列、バイト文字列、またはファイルの場合、 RFC 2822 準拠のメッセージが含まれている必要があります。このメッセージは、読み取られて解析されます。 ファイルはバイナリモードで開く必要がありますが、下位互換性のためにテキストモードファイルが受け入れられます。
サブクラスによって提供される形式固有の状態と動作は異なりますが、一般に、サポートされるのは特定のメールボックスに固有ではないプロパティのみです(ただし、プロパティは特定のメールボックス形式に固有であると考えられます)。 たとえば、単一ファイルのメールボックス形式のファイルオフセットとディレクトリベースのメールボックス形式のファイル名は、元のメールボックスにのみ適用されるため、保持されません。 ただし、メッセージ自体に適用されるため、メッセージがユーザーによって読み取られたか、重要としてマークされたかなどの状態は保持されます。
メッセージインスタンスを使用して、メールボックスインスタンスを使用して取得されたメッセージを表す必要はありません。 状況によっては、メッセージ表現を生成するために必要な時間とメモリが許容できない場合があります。 このような状況では、メールボックスインスタンスも文字列およびファイルのような表現を提供し、メールボックスインスタンスが初期化されるときにカスタムメッセージファクトリを指定できます。
MaildirMessage
- class mailbox.MaildirMessage(message=None)
Maildir固有の動作を伴うメッセージ。 パラメーター message は、 Message コンストラクターと同じ意味を持ちます。
通常、メールユーザーエージェントアプリケーションは、ユーザーが最初にメールボックスを開いたり閉じたりした後、
new
サブディレクトリ内のすべてのメッセージをcur
サブディレクトリに移動し、メッセージが古いかどうかを記録します。実際に読まれたわけではありません。cur
の各メッセージには、その状態に関する情報を格納するために、ファイル名に「info」セクションが追加されています。 (一部のメールリーダーは、new
のメッセージに「info」セクションを追加する場合もあります。)「info」セクションは、「2」とそれに続く標準化されたフラグのリストのいずれかをとることができます(たとえば、「2、FR」)または「1」とそれに続くいわゆる実験情報が含まれる場合があります。 Maildirメッセージの標準フラグは次のとおりです。国旗
意味
説明
D
下書き
作曲中
F
フラグ付き
重要としてマーク
P
合格しました
転送、再送、またはバウンス
R
返信しました
に返信
S
見られる
読む
T
ゴミ箱
その後の削除用にマーク
MaildirMessage インスタンスは、次のメソッドを提供します。
- get_subdir()
「new」(メッセージを
new
サブディレクトリに保存する必要がある場合)または「cur」(メッセージをcur
サブディレクトリに保存する必要がある場合)のいずれかを返します。ノート
メッセージは通常、メールボックスにアクセスした後、メッセージが読み取られたかどうかに関係なく、
new
からcur
に移動されます。"S" in msg.get_flags()
がTrue
の場合、メッセージmsg
が読み取られました。
- set_subdir(subdir)
メッセージを保存するサブディレクトリを設定します。 パラメータ subdir は、「new」または「cur」のいずれかである必要があります。
- get_flags()
現在設定されているフラグを指定する文字列を返します。 メッセージが標準のMaildir形式に準拠している場合、結果は、
'D'
、'F'
、'P'
、'R'
、'S'
、および'T'
。 フラグが設定されていない場合、または「info」に実験的なセマンティクスが含まれている場合は、空の文字列が返されます。
- set_flags(flags)
flags で指定されたフラグを設定し、他のすべての設定を解除します。
- add_flag(flag)
他のフラグを変更せずに、フラグで指定したフラグを設定してください。 一度に複数のフラグを追加するには、フラグを複数の文字の文字列にすることができます。 現在の「情報」は、フラグではなく実験情報が含まれているかどうかに関係なく上書きされます。
- remove_flag(flag)
他のフラグを変更せずに、フラグで指定されたフラグの設定を解除します。 一度に複数のフラグを削除するには、 flag は複数の文字の文字列である可能性があります。 「info」にフラグではなく実験情報が含まれている場合、現在の「info」は変更されません。
- get_date()
メッセージの配信日を、エポックからの秒数を表す浮動小数点数として返します。
- set_date(date)
メッセージの配信日を date に設定します。これは、エポックからの秒数を表す浮動小数点数です。
- get_info()
メッセージの「情報」を含む文字列を返します。 これは、実験的な(つまり、フラグのリストではない)「情報」にアクセスして変更する場合に役立ちます。
- set_info(info)
「info」を info に設定します。これは文字列である必要があります。
MaildirMessage インスタンスが mboxMessage または MMDFMessage インスタンスに基づいて作成される場合、 Status および X-Status ヘッダーは省略され、次の変換が行われます。
結果の状態 | mboxMessage または MMDFMessage の状態 |
---|---|
「cur」サブディレクトリ | Oフラグ |
Fフラグ | Fフラグ |
Rフラグ | フラグ |
Sフラグ | Rフラグ |
Tフラグ | Dフラグ |
MaildirMessage インスタンスが MHMessage インスタンスに基づいて作成されると、次の変換が行われます。
結果の状態 | MHMessage 状態 |
---|---|
「cur」サブディレクトリ | 「見えない」シーケンス |
「cur」サブディレクトリとSフラグ | 「見えない」シーケンスはありません |
Fフラグ | 「フラグ付き」シーケンス |
Rフラグ | 「返信された」シーケンス |
MaildirMessage インスタンスが BabylMessage インスタンスに基づいて作成されると、次の変換が行われます。
結果の状態 | BabylMessage 状態 |
---|---|
「cur」サブディレクトリ | 「見えない」ラベル |
「cur」サブディレクトリとSフラグ | 「見えない」ラベルはありません |
Pフラグ | 「転送済み」または「再送済み」ラベル |
Rフラグ | 「回答済み」ラベル |
Tフラグ | 「削除された」ラベル |
mboxMessage
- class mailbox.mboxMessage(message=None)
mbox固有の動作を伴うメッセージ。 パラメーター message は、 Message コンストラクターと同じ意味を持ちます。
mboxメールボックス内のメッセージは、1つのファイルにまとめて保存されます。 送信者のエンベロープアドレスと配信時間は通常、メッセージの開始を示すために使用される「From」で始まる行に格納されますが、mboxの実装間でこのデータの正確な形式にはかなりの違いがあります。 メッセージが読み取られたか、重要としてマークされたかなど、メッセージの状態を示すフラグは、通常、 Status および X-Status ヘッダーに格納されます。
mboxメッセージの従来のフラグは次のとおりです。
国旗
意味
説明
R
読む
読む
O
年
以前にMUAによって検出されました
D
削除されました
その後の削除用にマーク
F
フラグ付き
重要としてマーク
A
答えた
に返信
「R」および「O」フラグは Status ヘッダーに格納され、「D」、「F」、および「A」フラグは X-Status に格納されます。ヘッダ。 フラグとヘッダーは通常、記載されている順序で表示されます。
mboxMessage インスタンスは、次のメソッドを提供します。
- get_from()
mboxメールボックス内のメッセージの開始を示す「From」行を表す文字列を返します。 先頭の「From」と末尾の改行は除外されます。
- set_from(from_, time_=None)
「From」行を from_ に設定します。これは、先頭の「From」または末尾の改行なしで指定する必要があります。 便宜上、 time_ を指定すると、適切にフォーマットされ、 from_ に追加されます。 time_ を指定する場合は、 time.struct_time インスタンス、 time.strftime()、または
True
に渡すのに適したタプルである必要があります。 ]( time.gmtime()を使用するため)。
- get_flags()
現在設定されているフラグを指定する文字列を返します。 メッセージが従来の形式に準拠している場合、結果は、
'R'
、'O'
、'D'
、'F'
、および'A'
。
- set_flags(flags)
flags で指定されたフラグを設定し、他のすべての設定を解除します。 パラメータフラグは、
'R'
、'O'
、'D'
、'F'
のそれぞれが0回以上出現する順序で連結する必要があります。 、および'A'
。
- add_flag(flag)
他のフラグを変更せずに、フラグで指定したフラグを設定してください。 一度に複数のフラグを追加するには、フラグを複数の文字の文字列にすることができます。
- remove_flag(flag)
他のフラグを変更せずに、フラグで指定されたフラグの設定を解除します。 一度に複数のフラグを削除するには、 flag は複数の文字の文字列である可能性があります。
mboxMessage インスタンスが MaildirMessage インスタンスに基づいて作成されると、 MaildirMessage インスタンスの配信日に基づいて「From」行が生成され、次の変換が行われます。場所:
結果の状態 | MaildirMessage 状態 |
---|---|
Rフラグ | Sフラグ |
Oフラグ | 「cur」サブディレクトリ |
Dフラグ | Tフラグ |
Fフラグ | Fフラグ |
フラグ | Rフラグ |
mboxMessage インスタンスが MHMessage インスタンスに基づいて作成されると、次の変換が行われます。
結果の状態 | MHMessage 状態 |
---|---|
RフラグとOフラグ | 「見えない」シーケンスはありません |
Oフラグ | 「見えない」シーケンス |
Fフラグ | 「フラグ付き」シーケンス |
フラグ | 「返信された」シーケンス |
mboxMessage インスタンスが BabylMessage インスタンスに基づいて作成されると、次の変換が行われます。
結果の状態 | BabylMessage 状態 |
---|---|
RフラグとOフラグ | 「見えない」ラベルはありません |
Oフラグ | 「見えない」ラベル |
Dフラグ | 「削除された」ラベル |
フラグ | 「回答済み」ラベル |
Message インスタンスが MMDFMessage インスタンスに基づいて作成されると、「From」行がコピーされ、すべてのフラグが直接対応します。
結果の状態 | MMDFMessage 状態 |
---|---|
Rフラグ | Rフラグ |
Oフラグ | Oフラグ |
Dフラグ | Dフラグ |
Fフラグ | Fフラグ |
フラグ | フラグ |
MHMessage
- class mailbox.MHMessage(message=None)
MH固有の動作を伴うメッセージ。 パラメーター message は、 Message コンストラクターと同じ意味を持ちます。
MHメッセージは、従来の意味でのマークやフラグをサポートしていませんが、任意のメッセージの論理グループであるシーケンスをサポートしています。 一部のメール読み取りプログラム(標準の mh および nmh ではありません)は、次のように、フラグが他の形式で使用されるのとほぼ同じ方法でシーケンスを使用します。
順序
説明
見えない
読み取られませんが、MUAによって以前に検出されました
答えた
に返信
フラグが立てられました
重要としてマーク
MHMessage インスタンスは、次のメソッドを提供します。
- get_sequences()
このメッセージを含むシーケンスの名前のリストを返します。
- set_sequences(sequences)
このメッセージを含むシーケンスのリストを設定します。
- add_sequence(sequence)
このメッセージを含むシーケンスのリストに sequence を追加します。
- remove_sequence(sequence)
このメッセージを含むシーケンスのリストから sequence を削除します。
MHMessage インスタンスが MaildirMessage インスタンスに基づいて作成されると、次の変換が行われます。
結果の状態 | MaildirMessage 状態 |
---|---|
「見えない」シーケンス | Sフラグなし |
「返信された」シーケンス | Rフラグ |
「フラグ付き」シーケンス | Fフラグ |
MHMessage インスタンスが mboxMessage または MMDFMessage インスタンスに基づいて作成される場合、 Status および X-Status ヘッダーは省略され、次の変換が行われます。
結果の状態 | mboxMessage または MMDFMessage の状態 |
---|---|
「見えない」シーケンス | Rフラグなし |
「返信された」シーケンス | フラグ |
「フラグ付き」シーケンス | Fフラグ |
MHMessage インスタンスが BabylMessage インスタンスに基づいて作成されると、次の変換が行われます。
結果の状態 | BabylMessage 状態 |
---|---|
「見えない」シーケンス | 「見えない」ラベル |
「返信された」シーケンス | 「回答済み」ラベル |
BabylMessage
- class mailbox.BabylMessage(message=None)
バビル特有の振る舞いを伴うメッセージ。 パラメーター message は、 Message コンストラクターと同じ意味を持ちます。
属性と呼ばれる特定のメッセージラベルは、慣例により特別な意味を持つように定義されています。 属性は次のとおりです。
ラベル
説明
見えない
読み取られませんが、MUAによって以前に検出されました
削除されました
その後の削除用にマーク
提出
別のファイルまたはメールボックスにコピーされました
答えた
に返信
転送
転送
編集
ユーザーが変更
憤る
憤る
デフォルトでは、Rmailは表示されているヘッダーのみを表示します。 ただし、 BabylMessage クラスは、より完全であるため、元のヘッダーを使用します。 必要に応じて、可視ヘッダーに明示的にアクセスできます。
BabylMessage インスタンスは、次のメソッドを提供します。
- get_labels()
メッセージのラベルのリストを返します。
- set_labels(labels)
メッセージのラベル一覧を labels に設定してください。
- add_label(label)
メッセージのラベルのリストに label を追加します。
- remove_label(label)
メッセージのラベルのリストから label を削除します。
- get_visible()
ヘッダーがメッセージの表示ヘッダーであり、本文が空の Message インスタンスを返します。
- set_visible(visible)
メッセージの表示ヘッダーをメッセージのヘッダーと同じに設定します。 パラメータ visible は、 Message インスタンス、 email.message.Message インスタンス、文字列、またはファイルのようなオブジェクト(テキストで開く必要があります)である必要がありますモード)。
- update_visible()
BabylMessage インスタンスの元のヘッダーが変更されても、表示されているヘッダーは対応するように自動的に変更されません。 このメソッドは、表示ヘッダーを次のように更新します。対応する元のヘッダーを持つ各表示ヘッダーは元のヘッダーの値に設定され、対応する元のヘッダーのない各表示ヘッダーは削除され、 Date 、[ X251X] From 、 Reply-To 、 To 、 CC 、および Subject で、元のヘッダーには存在するが存在しない表示されるヘッダーが表示されるヘッダーに追加されます。
BabylMessage インスタンスが MaildirMessage インスタンスに基づいて作成されると、次の変換が行われます。
結果の状態 | MaildirMessage 状態 |
---|---|
「見えない」ラベル | Sフラグなし |
「削除された」ラベル | Tフラグ |
「回答済み」ラベル | Rフラグ |
「転送された」ラベル | Pフラグ |
BabylMessage インスタンスが mboxMessage または MMDFMessage インスタンスに基づいて作成される場合、 Status および X-Status ヘッダーは省略され、次の変換が行われます。
結果の状態 | mboxMessage または MMDFMessage の状態 |
---|---|
「見えない」ラベル | Rフラグなし |
「削除された」ラベル | Dフラグ |
「回答済み」ラベル | フラグ |
BabylMessage インスタンスが MHMessage インスタンスに基づいて作成されると、次の変換が行われます。
結果の状態 | MHMessage 状態 |
---|---|
「見えない」ラベル | 「見えない」シーケンス |
「回答済み」ラベル | 「返信された」シーケンス |
MMDFMessage
- class mailbox.MMDFMessage(message=None)
MMDF固有の動作を伴うメッセージ。 パラメーター message は、 Message コンストラクターと同じ意味を持ちます。
mboxメールボックス内のメッセージと同様に、MMDFメッセージは、「From」で始まる最初の行に送信者のアドレスと配信日とともに保存されます。 同様に、メッセージの状態を示すフラグは通常、 Status および X-Status ヘッダーに格納されます。
MMDFメッセージの従来のフラグは、mboxメッセージのフラグと同じであり、次のとおりです。
国旗
意味
説明
R
読む
読む
O
年
以前にMUAによって検出されました
D
削除されました
その後の削除用にマーク
F
フラグ付き
重要としてマーク
A
答えた
に返信
「R」および「O」フラグは Status ヘッダーに格納され、「D」、「F」、および「A」フラグは X-Status に格納されます。ヘッダ。 フラグとヘッダーは通常、記載されている順序で表示されます。
MMDFMessage インスタンスは、 mboxMessage によって提供されるものと同じ次のメソッドを提供します。
- get_from()
mboxメールボックス内のメッセージの開始を示す「From」行を表す文字列を返します。 先頭の「From」と末尾の改行は除外されます。
- set_from(from_, time_=None)
「From」行を from_ に設定します。これは、先頭の「From」または末尾の改行なしで指定する必要があります。 便宜上、 time_ を指定すると、適切にフォーマットされ、 from_ に追加されます。 time_ を指定する場合は、 time.struct_time インスタンス、 time.strftime()、または
True
に渡すのに適したタプルである必要があります。 ]( time.gmtime()を使用するため)。
- get_flags()
現在設定されているフラグを指定する文字列を返します。 メッセージが従来の形式に準拠している場合、結果は、
'R'
、'O'
、'D'
、'F'
、および'A'
。
- set_flags(flags)
flags で指定されたフラグを設定し、他のすべての設定を解除します。 パラメータフラグは、
'R'
、'O'
、'D'
、'F'
のそれぞれが0回以上出現する順序で連結する必要があります。 、および'A'
。
- add_flag(flag)
他のフラグを変更せずに、フラグで指定したフラグを設定してください。 一度に複数のフラグを追加するには、フラグを複数の文字の文字列にすることができます。
- remove_flag(flag)
他のフラグを変更せずに、フラグで指定されたフラグの設定を解除します。 一度に複数のフラグを削除するには、 flag は複数の文字の文字列である可能性があります。
MMDFMessage インスタンスが MaildirMessage インスタンスに基づいて作成されると、 MaildirMessage インスタンスの配信日に基づいて「From」行が生成され、次の変換が行われます。場所:
結果の状態 | MaildirMessage 状態 |
---|---|
Rフラグ | Sフラグ |
Oフラグ | 「cur」サブディレクトリ |
Dフラグ | Tフラグ |
Fフラグ | Fフラグ |
フラグ | Rフラグ |
MMDFMessage インスタンスが MHMessage インスタンスに基づいて作成されると、次の変換が行われます。
結果の状態 | MHMessage 状態 |
---|---|
RフラグとOフラグ | 「見えない」シーケンスはありません |
Oフラグ | 「見えない」シーケンス |
Fフラグ | 「フラグ付き」シーケンス |
フラグ | 「返信された」シーケンス |
MMDFMessage インスタンスが BabylMessage インスタンスに基づいて作成されると、次の変換が行われます。
結果の状態 | BabylMessage 状態 |
---|---|
RフラグとOフラグ | 「見えない」ラベルはありません |
Oフラグ | 「見えない」ラベル |
Dフラグ | 「削除された」ラベル |
フラグ | 「回答済み」ラベル |
MMDFMessage インスタンスが mboxMessage インスタンスに基づいて作成されると、「From」行がコピーされ、すべてのフラグが直接対応します。
結果の状態 | mboxMessage 状態 |
---|---|
Rフラグ | Rフラグ |
Oフラグ | Oフラグ |
Dフラグ | Dフラグ |
Fフラグ | Fフラグ |
フラグ | フラグ |
例外
メールボックスモジュールでは、次の例外クラスが定義されています。
- exception mailbox.Error
- 他のすべてのモジュール固有の例外のベースクラス。
- exception mailbox.NoSuchMailboxError
- 存在しないパスを使用して Mailbox サブクラスをインスタンス化する場合(および create パラメーターを
False
に設定する場合など)、メールボックスが予期されているが見つからない場合に発生します。 ])、または存在しないフォルダを開くとき。
- exception mailbox.NotEmptyError
- メールボックスが空ではないが、メッセージを含むフォルダーを削除する場合など、空であることが予想される場合に発生します。
- exception mailbox.ExternalClashError
- 別のプログラムがすでにロックを保持しているロックの取得に失敗した場合や、一意に生成されたファイル名がすでに存在する場合など、プログラムの制御を超えたメールボックス関連の条件によって続行できなくなった場合に発生します。
- exception mailbox.FormatError
- MH インスタンスが破損した
.mh_sequences
ファイルを読み取ろうとした場合など、ファイル内のデータを解析できない場合に発生します。
例
面白そうなメールボックス内のすべてのメッセージの件名を印刷する簡単な例:
import mailbox
for message in mailbox.mbox('~/mbox'):
subject = message['subject'] # Could possibly be None.
if subject and 'python' in subject.lower():
print(subject)
すべてのメールをBabylメールボックスからMHメールボックスにコピーするには、変換可能なすべての形式固有の情報を変換します。
import mailbox
destination = mailbox.MH('~/Mail')
destination.lock()
for message in mailbox.Babyl('~/RMAIL'):
destination.add(mailbox.MHMessage(message))
destination.flush()
destination.unlock()
この例では、複数のメーリングリストからのメールを異なるメールボックスに分類します。他のプログラムによる同時変更によるメールの破損、プログラムの中断によるメールの損失、またはメールボックス内の不正な形式のメッセージによる早期終了を回避するように注意してください。
import mailbox
import email.errors
list_names = ('python-list', 'python-dev', 'python-bugs')
boxes = {name: mailbox.mbox('~/email/%s' % name) for name in list_names}
inbox = mailbox.Maildir('~/Maildir', factory=None)
for key in inbox.iterkeys():
try:
message = inbox[key]
except email.errors.MessageParseError:
continue # The message is malformed. Just leave it.
for name in list_names:
list_id = message['list-id']
if list_id and name in list_id:
# Get mailbox to use
box = boxes[name]
# Write copy to disk before removing original.
# If there's a crash, you might duplicate a message, but
# that's better than losing a message completely.
box.lock()
box.add(message)
box.flush()
box.unlock()
# Remove original message
inbox.lock()
inbox.discard(key)
inbox.flush()
inbox.unlock()
break # Found destination, so stop looking.
for box in boxes.itervalues():
box.close()