# 19.1.15. `email.iterators`: イテレータ

ソースコード: Lib/email/iterators.py

`Message.walk` メソッドを使うと、簡単にメッセージオブジェクトツリー内を次から次へとたどる (iteration) ことができます。 `email.iterators` モジュールはこのための高水準イテレータをいくつか提供します。

`email.iterators.``body_line_iterator`(msg, decode=False)

  このイテレータは msg 中のすべてのサブパートに含まれるペイロードをすべて順にたどっていき、ペイロード内の文字列を 1 行ずつ返します。サブパートのヘッダはすべて無視され、Python 文字列でないペイロードからなるサブパートも無視されます。これは `readline()` を使って、ファイルからメッセージを (ヘッダだけとばして) フラットなテキストとして読むのにいくぶん似ているかもしれません。

  オプション引数 decode は、 `Message.get_payload` にそのまま渡されます。

`email.iterators.``typed_subpart_iterator`(msg, maintype='text', subtype=None)

  このイテレータは msg 中のすべてのサブパートをたどり、それらの中で指定されたMIME 形式 maintype と subtype をもつようなパートのみを返します。

  subtype は省略可能であることに注意してください。これが省略された場合、サブパートの MIME 形式は maintype のみがチェックされます。じつは maintype も省略可能で、その場合にはデフォルトは text です。

  つまり、デフォルトでは `typed_subpart_iterator()` は MIME 形式 text/* をもつサブパートを順に返していくというわけです。

以下の関数は役に立つデバッグ用ツールとして追加されたもので、パッケージとして公式なサポートのあるインターフェイスでは ありません。

`email.iterators.``_structure`(msg, fp=None, level=0, include_default=False)

  そのメッセージオブジェクト構造の content-type をインデントつきで表示します。例えば:

      >>> msg = email.message_from_file(somefile)
      >>> _structure(msg)
      multipart/mixed
          text/plain
          text/plain
          multipart/digest
              message/rfc822
                  text/plain
              message/rfc822
                  text/plain
              message/rfc822
                  text/plain
              message/rfc822
                  text/plain
              message/rfc822
                  text/plain
          text/plain

  オプション引数 fp は出力を渡すための file-like オブジェクトです。 これは Python の `print()` 関数が対応できるようになっている必要があります。 level は内部的に使用されます。 include_default が真の場合、デフォルトの型も出力します。