18.11. rfc822 — RFC 2822メールヘッダーの解析—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/2.7/library/rfc822
移動先:案内検索

18.11。 rfc822 — RFC2822メールヘッダーを解析します

バージョン2.3以降非推奨: email パッケージを rfc822 モジュールよりも優先して使用する必要があります。 このモジュールは、下位互換性を維持するためにのみ存在し、Python3で削除されました。


このモジュールは、インターネット標準 RFC 2822 で定義されている「電子メールメッセージ」を表すクラス Message を定義します。 1 このようなメッセージは、メッセージヘッダーのコレクションとメッセージ本文で構成されます。 このモジュールは、 RFC 2822 アドレスを解析するためのヘルパークラス AddressList も定義します。 RFC 2822 メッセージの特定の構文については、RFCを参照してください。

mailbox モジュールは、さまざまなエンドユーザーメールプログラムによって作成されたメールボックスを読み取るためのクラスを提供します。

class rfc822.Message(file[, seekable])

Message インスタンスは、入力オブジェクトをパラメーターとしてインスタンス化されます。 メッセージは、 readline()メソッドを持つ入力オブジェクトのみに依存します。 特に、通常のファイルオブジェクトが対象となります。 インスタンス化は、入力オブジェクトから区切り行(通常は空白行)までのヘッダーを読み取り、インスタンスに格納します。 ヘッダーに続くメッセージ本文は消費されません。

このクラスは、 readline()メソッドをサポートする任意の入力オブジェクトで機能します。 入力オブジェクトにシークアンドテル機能がある場合、 rewindbody()メソッドが機能します。 また、不正な行は入力ストリームにプッシュバックされます。 入力オブジェクトにシークがないが、入力行をプッシュバックできるunread()メソッドがある場合、 Message はそれを使用して不正な行をプッシュバックします。 したがって、このクラスを使用して、バッファリングされたストリームからのメッセージを解析できます。

オプションの seekable 引数は、lseek()システムコールが機能しないことを検出する前に、tell()がバッファリングされたデータを破棄する特定のstdioライブラリの回避策として提供されます。 移植性を最大にするには、seekable引数をゼロに設定して、ソケットオブジェクトから作成されたファイルオブジェクトなどのシークできないオブジェクトを渡すときに、最初のtell()を防ぐ必要があります。

ファイルから読み取られた入力行は、CR-LFまたは単一の改行のいずれかで終了できます。 終端のCR-LFは、ラインが格納される前に単一のラインフィードに置き換えられます。

すべてのヘッダーマッチングは、大文字または小文字に関係なく行われます。 例えば m['From']m['from']m['FROM']はすべて同じ結果になります。

class rfc822.AddressList(field)
解析する RFC 2822 アドレスのコンマ区切りリストである単一の文字列パラメーターを使用して、 AddressList ヘルパークラスをインスタンス化できます。 (パラメーターNoneは、空のリストを生成します。)
rfc822.quote(str)
str のバックスラッシュが2つのバックスラッシュに置き換えられ、二重引用符がバックスラッシュ-二重引用符に置き換えられた新しい文字列を返します。
rfc822.unquote(str)
引用符で囲まれていないバージョンの str である新しい文字列を返します。 str が終了し、二重引用符で始まる場合、それらは削除されます。 同様に、 str が山かっこで終わり、角かっこで始まる場合、それらは削除されます。
rfc822.parseaddr(address)
address を解析します。これは ToCc などのアドレスを含むフィールドの値であり、構成要素である「実名」と「メールアドレス」の部分になります。 。 解析が失敗しない限り、その情報のタプルを返します。失敗した場合は、2タプル(None, None)が返されます。
rfc822.dump_address_pair(pair)
parseaddr()の逆で、これは(realname, email_address)の形式の2タプルを取り、 To または Cc に適した文字列値を返します。 ]ヘッダー。 pair の最初の要素がfalseの場合、2番目の要素は変更されずに返されます。
rfc822.parsedate(date)
RFC 2822 のルールに従って日付を解析しようとします。 ただし、一部のメーラーは指定された形式に従わないため、 parsedate()はそのような場合に正しく推測しようとします。 date は、'Mon, 20 Nov 1995 19:12:08 -0500'など、 RFC 2822 の日付を含む文字列です。 日付の解析に成功した場合、 parsedate()time.mktime()に直接渡すことができる9タプルを返します。 それ以外の場合は、Noneが返されます。 結果タプルのインデックス6、7、および8は使用できないことに注意してください。
rfc822.parsedate_tz(date)
parsedate()と同じ機能を実行しますが、Noneまたは10タプルのいずれかを返します。 最初の9つの要素は、 time.mktime()に直接渡すことができるタプルを構成し、10番目はUTC(グリニッジ標準時の公式用語)からの日付のタイムゾーンのオフセットです。 (タイムゾーンオフセットの符号は、同じタイムゾーンのtime.timezone変数の符号と反対であることに注意してください。後者の変数はPOSIX標準に従いますが、このモジュールは RFCに従います。 2822 。)入力文字列にタイムゾーンがない場合、返されるタプルの最後の要素はNoneです。 結果タプルのインデックス6、7、および8は使用できないことに注意してください。
rfc822.mktime_tz(tuple)
parsedate_tz()によって返される10タプルをUTCタイムスタンプに変換します。 タプルのタイムゾーン項目がNoneの場合、現地時間を想定します。 軽微な欠陥:これは最初に最初の8つの要素を現地時間として解釈し、次にタイムゾーンの違いを補正します。 これにより、夏時間の切り替え日の前後にわずかなエラーが発生する可能性があります。 一般的な使用について心配するのに十分ではありません。

も参照してください

モジュールメール
包括的な電子メール処理パッケージ。 rfc822 モジュールに取って代わります。
モジュールメールボックス
エンドユーザーのメールプログラムによって作成されたさまざまなメールボックス形式を読み取るためのクラス。
モジュール mimetools
MIMEエンコードされたメッセージを処理する rfc822.Message のサブクラス。


18.11.1。 メッセージオブジェクト

Message インスタンスには次のメソッドがあります。

Message.rewindbody()
メッセージ本文の先頭を探します。 これは、ファイルオブジェクトがシーク可能である場合にのみ機能します。
Message.isheader(line)
行が正当な RFC 2822 ヘッダーである場合、行の正規化されたフィールド名(インデックス付けに使用される辞書キー)を返します。 それ以外の場合は、Noneを返します(ここで解析を停止し、入力ストリームで行をプッシュバックする必要があることを意味します)。 サブクラスでこのメソッドをオーバーライドすると便利な場合があります。
Message.islast(line)
指定された行がメッセージを停止する区切り文字である場合はtrueを返します。 区切り行が消費され、ファイルオブジェクトの読み取り位置がその直後に配置されます。 デフォルトでは、このメソッドは行が空白であることを確認するだけですが、サブクラスでオーバーライドできます。
Message.iscomment(line)
指定された行を完全に無視する必要がある場合は、Trueを返します。スキップするだけです。 デフォルトでは、これは常にFalseを返すスタブですが、サブクラスでオーバーライドできます。
Message.getallmatchingheaders(name)
name に一致するすべてのヘッダーで構成される行のリストを返します(存在する場合)。 継続行であるかどうかに関係なく、各物理行は個別のリスト項目です。 name に一致するヘッダーがない場合は、空のリストを返します。
Message.getfirstmatchingheader(name)
name に一致する最初のヘッダーと、その継続行(存在する場合)を含む行のリストを返します。 name に一致するヘッダーがない場合は、Noneを返します。
Message.getrawheader(name)
name に一致する最初のヘッダーのコロンの後のテキストで構成される単一の文字列を返します。 これには、先頭の空白、末尾の改行、および継続行が存在する場合は内部の改行と空白が含まれます。 name に一致するヘッダーがない場合は、Noneを返します。
Message.getheader(name[, default])
name に一致する最後のヘッダーで構成される単一の文字列を返しますが、先頭と末尾の空白を削除します。 内部の空白は削除されません。 オプションの default 引数を使用して、 name に一致するヘッダーがない場合に返される別のデフォルトを指定できます。 デフォルトはNoneです。 これは、解析されたヘッダーを取得するための推奨される方法です。
Message.get(name[, default])
getheader()のエイリアスで、インターフェイスを通常の辞書との互換性を高めます。
Message.getaddr(name)

getheader(name)によって返された文字列から解析されたペア(full name, email address)を返します。 name に一致するヘッダーが存在しない場合は、(None, None)を返します。 それ以外の場合、フルネームとアドレスの両方が(おそらく空の)文字列です。

例: m の最初の From ヘッダーに文字列'[email protected] (Jack Jansen)'が含まれている場合、m.getaddr('From')はペア('Jack Jansen', '[email protected]')を生成します。 代わりにヘッダーに'Jack Jansen <[email protected]>'が含まれている場合、まったく同じ結果が得られます。

Message.getaddrlist(name)

これはgetaddr(list)に似ていますが、電子メールアドレスのリストを含むヘッダーを解析します(例: To ヘッダー)、(full name, email address)ペアのリストを返します(ヘッダーにアドレスが1つしかない場合でも)。 name に一致するヘッダーがない場合は、空のリストを返します。

名前付きヘッダーに一致する複数のヘッダーが存在する場合(例: 複数の Cc ヘッダーがある場合)、すべてがアドレスについて解析されます。 名前付きヘッダーに含まれる継続行も解析されます。

Message.getdate(name)

getheader()を使用してヘッダーを取得し、 time.mktime()と互換性のある9タプルに解析します。 フィールド6、7、および8は使用できないことに注意してください。 name に一致するヘッダーがない場合、または解析できない場合は、Noneを返します。

日付の解析はブラックアートのようであり、すべてのメーラーが標準に準拠しているわけではありません。 多くのソースからの大量の電子メールコレクションでテストされ、正しいことが判明していますが、この関数が誤った結果をもたらす可能性があります。

Message.getdate_tz(name)
getheader()を使用してヘッダーを取得し、それを10タプルに解析します。 最初の9つの要素は、タプルを time.mktime()と互換性のあるものにし、10番目はUTCからの日付のタイムゾーンのオフセットを示す数値です。 フィールド6、7、および8は使用できないことに注意してください。 getdate()と同様に、 name に一致するヘッダーがない場合、または解析できない場合は、Noneを返します。

メッセージインスタンスは、制限されたマッピングインターフェイスもサポートします。 特に:m[name]m.getheader(name)に似ていますが、一致するヘッダーがない場合はKeyErrorを発生させます。 およびlen(m)m.get(name[, default])name in mm.keys()m.values() m.items()、およびm.setdefault(name[, default])の動作予想どおり、setdefault()がデフォルト値として空の文字列を使用するという1つの違いがあります。 メッセージインスタンスは、マッピング書き込み可能インターフェイスm[name] = valueおよびdel m[name]もサポートします。 メッセージオブジェクトは、マッピングインターフェイスのclear()copy()popitem()、またはupdate()メソッドをサポートしていません。 (get()およびsetdefault()のサポートはPython2.2でのみ追加されました。)

最後に、 Message インスタンスにはいくつかのパブリックインスタンス変数があります。

Message.headers
ヘッダー行のセット全体を、読み取られた順序で含むリスト(setitem呼び出しがこの順序を乱す可能性があることを除く)。 各行には、末尾の改行が含まれています。 ヘッダーを終了する空白行はリストに含まれていません。
Message.fp
インスタンス化時に渡されるファイルまたはファイルのようなオブジェクト。 これは、メッセージの内容を読み取るために使用できます。
Message.unixfrom
Unix From行(メッセージに1つある場合)、または空の文字列。 これは、mboxスタイルのメールボックスファイルなどの一部のコンテキストでメッセージを再生成するために必要です。


18.11.2。 AddressListオブジェクト

AddressList インスタンスには次のメソッドがあります。

AddressList.__len__()
アドレスリスト内のアドレスの数を返します。
AddressList.__str__()
アドレスリストの正規化された文字列表現を返します。 アドレスは「名前」で表示されます< host @ domain >フォーム、コンマ区切り。
AddressList.__add__(alist)
両方の AddressList オペランドにすべてのアドレスが含まれ、重複が削除された(和集合を設定した)新しい AddressList インスタンスを返します。
AddressList.__iadd__(alist)
__ add __()のインプレースバージョン。 この AddressList インスタンスを、それ自体と右側のインスタンス alist の和集合に変換します。
AddressList.__sub__(alist)
右側のアドレスオペランドに存在しない左側の AddressList オペランドのすべてのアドレスを含む、新しい AddressList インスタンスを返します(差を設定します)。
AddressList.__isub__(alist)
__ sub __()のインプレースバージョン。 alist にもあるこのリストのアドレスを削除します。

最後に、 AddressList インスタンスには1つのパブリックインスタンス変数があります。

AddressList.addresslist
アドレスごとに1つずつ、タプル文字列ペアのリスト。 各メンバーで、最初は正規化された名前の部分であり、2番目は実際のルートアドレス('@'で区切られたusername-host.domainペア)です。

脚注

1
このモジュールは元々 RFC 822 に準拠していたため、この名前が付けられました。 それ以来、 RFC 2822 は、 RFC 822 のアップデートとしてリリースされました。 このモジュールは、 RFC 2822 に準拠していると見なす必要があります。特に、 RFC 822 以降に構文またはセマンティクスが変更された場合はそうです。