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

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

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

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

おもなパーザクラスは `Parser` です。これは電子メールの ヘッダおよびペイロードを両方解析します。multipart メッセージの 場合、これはそのコンテナのボディを再帰的に解析します。 解析には 2つのモードがサポートされており、ひとつは strict 解析で、 これはふつういかなる RFC非準拠なメッセージも受けつけません。 もうひとつは lax 解析で、こちらはよく知られた MIME の書式上の 問題に対処しようとします。

`email.Parser` モジュールはまた、`HeaderParser` と呼ばれる 2番目のクラスも提供しています。これはメッセージのヘッダのみを処理したい場合に 使うことができ、ずっと高速な処理がおこなえます。なぜならこれはメッセージ本体を 解析しようとはしないからです。かわりに、そのペイロードにはメッセージ本体の 生の文字列が格納されます。`HeaderParser` クラスは `Parser` クラスと同じ API をもっています。