# 12.11 `rfc822` -- RFC 2822 準拠のメイルヘッダ読み出し

リリース 2.3 以降で撤廃された仕様です。 `rfc822` モジュールを使うよりも `email` パッケージを使うべきです。このモジュールは 以前のバージョンとの互換性のために保守されているにすぎません。

このモジュールでは、インターネット標準 RFC 2822 12.10で定義されている ``電子メイルメッセージ'' を表現するクラス、 `Message` を定義しています。 このメッセージはメッセージヘッダ群とメッセージボディの集まり からなります。このモジュールではまた、ヘルパークラス RFC 2822 アドレス群を解釈するための `AddressList` クラス を定義しています。RFC 2822 メッセージ固有の構文に関する情報 は RFC を参照してください。

`mailbox` モジュールでは、 多くのエンドユーザメイルプログラムによって生成されるメイルボックス を読み出すためのクラスを提供しています。

class `Message`( | file[, seekable])

  `Message` インスタンスは入力オブジェクトをパラメタに与えて インスタンス化します。入力オブジェクトのメソッドのうち、Message が 依存するのは `readline()` だけです; 通常のファイル オブジェクトは適格です。インスタンス化を行うと、入力オブジェクト からデリミタ行 (通常は空行 1 行) に到達するまでヘッダを読み出し、 それらをインスタンス中に保持します。ヘッダの後のメッセージ本体は 読み出しません。

  このクラスは `readline()` メソッドをサポートする任意の入力 オブジェクトを扱うことができます。入力オブジェクトが seek および tell できる場合、 `rewindbody()` メソッドが動作します。 また、不正な行データを入力ストリームにプッシュバックできます。 入力オブジェクトが seek できない一方で、入力行をプッシュバックする `unread()` メソッドを持っている場合、`Message` は不正な行データにこのプッシュバックを使います。こうして、 このクラスはバッファされているストリームから来るメッセージを 解釈するのに使うことができます。

  オプションの seekable 引数は、`lseek()` システムコール が動作しないと分かるまでは `tell()` がバッファされたデータを 無視するような、ある種の stdio ライブラリで回避手段として提供されています。 可搬性を最大にするために、socket オブジェクトによって生成されたファイル のような、seek できないオブジェクトを渡す際には、最初に `tell()` が呼び出されないようにするために seekable 引数をゼロに設定すべきです。

  ファイルとして読み出された入力行データは CR-LF と単一の改行 (line feed) のどちらで終端されていてもかまいません; 行データを記憶する前に、終端の CR-LF は単一の改行と置き換えられます。

  ヘッダに対するマッチは全て大小文字に依存しません。例えば、 `m['From']`、 `m['from']`、および `m['FROM']` は全て同じ結果になります。

class `AddressList`( | field)

  RFC 2833 アドレスをカンマで区切ったものとして解釈される 単一の文字列パラメタを使って、`AddressList` ヘルパークラスを インスタンス化することができます。 (パラメタ `None` は空のリストを表します。)

`quote`( | str)

  str 中のバックスラッシュが 2 つのバックスラッシュに置き換えられ、 二重引用符がバックスラッシュ付きの二重引用符に置き換えられた、 新たな文字列を返します。

`unquote`( | str)

  str の 逆クオートされた 新たな文字列を返します。 str が二重引用符で囲われていた場合、二重引用符を剥ぎ取ります。 同様に、 str が三角括弧で囲われていた場合にも剥ぎ取ります。

`parseaddr`( | address)

  To: や Cc: といった、アドレスが入っている フィールドの値 address を解析し、含まれている ``実名 (realname)'' 部分および ``電子メールアドレス'' 部分に分けます。それらの情報からなる タプルを返します。解析が失敗した場合には 2 要素のタプル `(None, None)` を返します。

`dump_address_pair`( | pair)

  `parseaddr()` の逆で、`(realname, email_address)` 形式の 2 要素のタプルをとり、To: や Cc: ヘッダに 適した文字列値を返します。pair の最初の要素が真値をとらない 場合、二つ目の要素をそのまま返します。

`parsedate`( | date)

  RFC 2822 の規則に従っている日付を解析しようと試みます。 しかしながら、メイラによっては RFC 2822 で指定されている ような書式に従わないため、そのような場合には `parsedata()` は正しい日付を推測しようと試みます。 date は `'Mon, 20 Nov 1995 19:12:08 -0500'` のような RFC 2822 様式の日付を収めた文字列です。日付の解析に成功した場合、 `parsedate()` は `time.mktime()` にそのまま渡す ことができるような 9 要素のタプルを返します; そうでない場合には `None` を返します。結果のフィールド 6、7、および 8 は 有用な情報ではありません。

`parsedate_tz`( | date)

  `parsedate()` と同じ機能を実現しますが、`None` または 10 要素のタプルを返します; 最初の 9 要素は `time.mktime()` に直接渡すことができるようなタプルで、 10 番目の要素はその日の タイムゾーンにおける UTC (グリニッチ標準時の公式名称) からの オフセットです。(タイムゾーンオフセットの符号は、 同じタイムゾーンにおける `time.timezone` 変数の符号と反転 しています; 後者の変数が POSIX 標準に従っている一方、 このモジュールは RFC 2822 に従っているからです。) 入力文字列 がタイムゾーン情報を持たない場合、タプルの最後の要素は `None` になります。結果のフィールド 6、7、および 8 は 有用な情報ではありません。

`mktime_tz`( | tuple)

  `parsedata_tz()` が返す 10 要素のタプルを UTC タイムスタンプ に変換します。タプル内のタイムゾーン要素が `None` の場合、地域の 時刻を表しているものと家庭します。些細な欠陥: この関数はまず最初の 8 要素を地域における時刻として変換し、次にタイムゾーンの違いに対する 補償を行います; これにより、夏時間の切り替え日前後でちょっとした エラーが生じるかもしれません。通常の利用に関しては心配ありません。

参考資料:

`email`モジュール:
  網羅的な電子メイル処理パッケージです; `rfc822` モジュールを代替します。.

`mailbox`モジュール:
  エンドユーザのメイルプログラムによって生成される、様々な mailbox 形式を読み出すためのクラス群。.

`mimetools`モジュール:
  MIME エンコードされたメッセージを処理する `rfc822.Message` のサブクラス。.

...2822 12.10
  このモジュールはもともと RFC 822 に適合していたので、そういう名前に なっています。その後、RFC 2822 が RFC 822 に対する更新として リリースされました。このモジュールは RFC 2822 適合であり、特に RFC 822 からの構文や意味付けに対する変更がなされています。