## 2 電子メールメッセージを解析(パース)する

メッセージオブジェクト構造体をつくるには 2つの方法があります。 ひとつはまったくのスクラッチから `Message` を生成して、これを `attach()` と `set_payload()` 呼び出しを介してつなげていく方法で、 もうひとつは電子メールメッセージのフラットなテキスト表現を 解析 (parse、パーズ) する方法です。

`email` パッケージでは、MIME 文書をふくむ、 ほとんどの電子メールの文書構造に対応できる標準的なパーザ (解析器) を提供しています。 このパーザに文字列あるいはファイルオブジェクトを渡せば、パーザは そのオブジェクト構造の基底となる (root の) `Message` インスタンスを返します。 簡単な非MIMEメッセージであれば、この基底オブジェクトのペイロードは たんにメッセージのテキストを格納する文字列になるでしょう。MIMEメッセージであれば、 基底オブジェクトはその `is_multipart()` メソッドに対して `True` を 返します。そして、その各 subpart に `get_payload()` メソッドおよび `walk()` メソッドを介してアクセスすることができます。

実際には 2つのパーザインターフェイスが使用可能です。ひとつは旧式の `Parser` API であり、もうひとつはインクリメンタルな `FeedParser` API です。 旧式の `Parser` API はメッセージ全体のテキストが文字列としてすでに メモリ上にあるか、それがローカルなファイルシステム上に存在しているときには 問題ありません。`FeedParser` はメッセージを読み込むときに、そのストリームが 入力待ちのためにブロックされるような場合 (ソケットから email メッセージを 読み込む時など) に、より有効です。`FeedParser` はインクリメンタ ルにメッセージを読み込み、解析します。パーザを close したときには根っ こ (root) のオブジェクトのみが返されます15。

このパーザは、ある制限された方法で拡張できます。また、もちろん 自分でご自分のパーザを完全に無から実装することもできます。 `email` パッケージについているパーザと `Message` クラスの間に 隠された秘密の関係はなにもありませんので、ご自分で実装されたパーザも、 それが必要とするやりかたでメッセージオブジェクトツリーを作成することができます。

#### Footnotes

... のオブジェクトのみが返されます 15
  Python 2.4 から導入 された email パッケージ バージョン 3.0 では、 旧式の `Parser` は `FeedParser` によって書き直されました。 そのためパーザの意味論と得られる結果は 2つのパーザで同一のものになります。