##
12.11.1 Message オブジェクト

`Message` インスタンスは以下のメソッドを持っています:

`rewindbody`( | )

  メッセージ本体の先頭を seek します。このメソッドはファイルオブジェクト が seek 可能である場合にのみ動作します。

`isheader`( | line)

  ある行が正しい RFC 2822 ヘッダである場合、その行の正規化された フィールド名 (インデクス指定の際に使われる辞書キー) を返します; そうでない場合 `None` を返します (解析をここで一度中断し、 行データを入力ストリームに押し戻すことを意味します)。 このメソッドをサブクラスで上書きすると便利なことがあります。

`islast`( | line)

  与えられた line が Message の区切りとなるデリミタであった場合に真を 返します。このデリミタ行は消費され、ファイルオブジェクトの読み位置は その直後になります。標準ではこのメソッドは単にその行が空行かどうか をチェックしますが、サブクラスで上書きすることもできます。

`iscomment`( | line)

  与えられた行全体を無視し、単に読み飛ばすときに真を返します。 標準では、これは控えメソッド (stub) であり、常に `False` を返し ますが、サブクラスで上書きすることもできます。

`getallmatchingheaders`( | name)

  name に一致するヘッダからなる行のリストがあれば、それらを 全て返します。各物理行は連続した行内容であるか否かに関わらず 別々のリスト要素になります。name に一致するヘッダがない場合、 空のリストを返します。

`getfirstmatchingheader`( | name)

  name に一致する最初のヘッダと、その行に連続する (複数) 行からなる行データのリストを返します。 name に一致するヘッダがない場合 `None` を返します。

`getrawheader`( | name)

  name に一致する最初のヘッダにおけるコロン以降のテキストが入った 単一の文字列を返します。このテキストには、先頭の空白、末尾の改行、 また後続の行がある場合には途中の改行と空白が含まれます。 name に一致するヘッダが存在しない場合には `None` を返します。

`getheader`( | name[, default])

  `getrawheader(name)` に似ていますが、先頭および末尾の 空白を剥ぎ取ります。途中にある空白は剥ぎ取られません。 オプションの default 引数は、name に一致する ヘッダが存在しない場合に、別のデフォルト値を返すように指定する ために使われます。

`get`( | name[, default])

  正規の辞書との互換性をより高めるための `getheader()` の別名 (alias) です。

`getaddr`( | name)

  `getheader(name)` が返した文字列を解析して、 `(full name, email address)` からなるペアを返します。 name に一致するヘッダが無い場合、`(None, None)` が返され ます; そうでない場合、full name および address は (空文字列をとりうる) 文字列になります。

  例: m に最初の From: ヘッダに文字列 `'jack@cwi.nl (Jack Jansen)'` が入っている場合、 `m.getaddr('From')` はペア `('Jack Jansen', 'jack@cwi.nl')` になります。 また、`'Jack Jansen <jack@cwi.nl>'` であっても、全く同じ結果に なります。

`getaddrlist`( | name)

  `getaddr(list)` に似ていますが、複数のメイルアドレス からなるリストが入ったヘッダ (例えば To: ヘッダ) を 解析し、 `(full name, email address)` のペア からなるリストを (たとえヘッダには一つしかアドレスが入っていなかった としても) 返します。name に一致するヘッダが無かった場合、 空のリストを返します。

  指定された名前に一致する複数のヘッダが存在する場合 (例えば、 複数の Cc: ヘッダが存在する場合)、全てのアドレスを 解析します。指定されたヘッダが連続する行に収められている場合も 解析されます。

`getdate`( | name)

  `getheader()` を使ってヘッダを取得して解析し、 `time.mktime()` と互換な 9 要素のタプルにします; フィールド 6、7、および 8 は有用な値ではないので注意して下さい。 name に一致するヘッダが存在しなかったり、ヘッダが解析不能 であった場合、`None` を返します。

  日付の解析は妖術のようなものであり、全てのヘッダが標準に従って いるとは限りません。このメソッドは多くの発信源から集められた 膨大な数の電子メールでテストされており、正しく動作することが 分かっていますが、間違った結果を出力してしまう可能性はまだ あります。

`getdate_tz`( | name)

  `getheader()` を使ってヘッダを取得して解析し、10 要素の タプルにします; 最初の 9 要素は `time.mktime()` と 互換性のあるタプルを形成し、10 番目の要素はその日におけるタイムゾーン の UTC からのオフセットを与える数字になります。`getdate()` と同様に、name に一致するヘッダがなかったり、解析不能であった 場合、`None` を返します。

`Message` インスタンスはまた、限定的なマップ型のインタフェースを 持っています。 すなわち: `m[name]` は `m.getheader(name)` に似て いますが、一致するヘッダがない場合 `KeyError` を送出します; `len(m)`、 `m.get(name[, default])`、 `m.has_key(name)`, `m.keys()`、 `m.values()` `m.items()`、および `m.setdefault(name[, default])` は期待通りに動作します。ただし `setdefault()` は標準の設定値 として空文字列をとります。 `Message` インスタンスはまた、 マップ型への書き込みを行えるインタフェース `m[name] = value` および `del m[name]` をサポートしています。 `Message` オブジェクトでは、 `clear()`、 `copy()`、 `popitem()`、あるいは `update()` といったマップ型 インタフェースのメソッドはサポートしていません。 (`get()` および `setdefault()` のサポートは Python 2.2 でしか追加されていません。)

最後に、`Message` インスタンスはいくつかの public なインスタンス 変数を持っています:

`headers`
  ヘッダ行のセット全体が、(setitem を呼び出して変更されない限り) 読み出された順番に入れられたリストです。各行は末尾の改行を 含んでいます。ヘッダを終端する空行はリストに含まれません。

`fp`
  インスタンス化の際に渡されたファイルまたはファイル類似オブジェクトです。 この値はメッセージ本体を読み出すために使うことができます。

`unixfrom`
  メッセージに Unix "`From` " 行がある場合はその行、そうでなければ 空文字列になります。この値は例えば `mbox` 形式のメイルボックス ファイルのような、あるコンテキスト中のメッセージを再生成するために 必要です。