email.message.Message:compat32 APIを使用した電子メールメッセージの表現—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.8/library/email.compat32-message
移動先:案内検索

email.message.Message : compat32 APIを使用して電子メールメッセージを表す

Message クラスは EmailMessage クラスと非常によく似ていますが、そのクラスによってメソッドが追加されておらず、他の特定のメソッドのデフォルトの動作がわずかに異なります。 また、 EmailMessage クラスでサポートされているものの、レガシーコードを扱っている場合を除いて推奨されないいくつかのメソッドについてもここで説明します。

2つのクラスの哲学と構造は他の点では同じです。

このドキュメントでは、デフォルト(メッセージの場合)ポリシー Compat32 での動作について説明します。 別のポリシーを使用する場合は、代わりに EmailMessage クラスを使用する必要があります。

電子メールメッセージは、ヘッダーペイロードで構成されます。 ヘッダーは RFC 5322 スタイルの名前と値である必要があります。ここで、フィールド名と値はコロンで区切られます。 コロンは、フィールド名またはフィールド値の一部ではありません。 ペイロードは、単純なテキストメッセージ、バイナリオブジェクト、またはそれぞれ独自のヘッダーセットと独自のペイロードを持つサブメッセージの構造化されたシーケンスの場合があります。 後者のタイプのペイロードは、 multipart / * または message / rfc822 などのMIMEタイプのメッセージによって示されます。

Message オブジェクトによって提供される概念モデルは、ヘッダーからの特殊な情報へのアクセス、ペイロードへのアクセス、メッセージのシリアル化バージョンの生成、およびオブジェクトツリー上を再帰的に歩きます。 重複ヘッダーがサポートされていますが、それらにアクセスするには特別なメソッドを使用する必要があることに注意してください。

Message 疑似辞書は、ASCII値でなければならないヘッダー名によって索引付けされます。 辞書の値は、ASCII文字のみを含むことになっている文字列です。 非ASCII入力には特別な処理がありますが、常に正しい結果が得られるとは限りません。 ヘッダーは大文字と小文字を区別せずに保存および返されますが、フィールド名は大文字と小文字を区別せずに照合されます。 Unix-From ヘッダーまたはFrom_ヘッダーとも呼ばれる単一のエンベロープヘッダーが存在する場合もあります。 payload は、単純なメッセージオブジェクトの場合は文字列またはバイト、またはMIMEコンテナドキュメントの場合は Message オブジェクトのリストです(例: multipart / * および message / rfc822 )。

Message クラスのメソッドは次のとおりです。

class email.message.Message(policy=compat32)

policy が指定されている場合( policy クラスのインスタンスである必要があります)、指定されたルールを使用して、メッセージの表現を更新およびシリアル化します。 policy が設定されていない場合は、 compat32 ポリシーを使用してください。これにより、Python3.2バージョンの電子メールパッケージとの下位互換性が維持されます。 詳細については、ポリシーのドキュメントを参照してください。

バージョン3.3で変更: policy キーワード引数が追加されました。

as_string(unixfrom=False, maxheaderlen=0, policy=None)

平坦化されたメッセージ全体を文字列として返します。 オプションの unixfrom がtrueの場合、エンベロープヘッダーは返される文字列に含まれます。 unixfrom のデフォルトはFalseです。 下位互換性の理由から、 maxheaderlen のデフォルトは0であるため、別の値が必要な場合は、明示的にオーバーライドする必要があります(ポリシーで max_line_length に指定された値はこの方法では無視されます)。 policy 引数を使用して、メッセージインスタンスから取得したデフォルトのポリシーを上書きできます。 指定されたポリシーGeneratorに渡されるため、これを使用して、メソッドによって生成されるフォーマットの一部を制御できます。

文字列への変換を完了するためにデフォルトを入力する必要がある場合、メッセージをフラット化すると、メッセージへの変更がトリガーされる場合があります(たとえば、MIME境界が生成または変更される場合があります)。

この方法は便宜上提供されており、必ずしもメッセージを希望どおりにフォーマットするとは限らないことに注意してください。 たとえば、デフォルトでは、unixmbox形式で必要なFromで始まる行のマングリングは行われません。 柔軟性を高めるには、 Generator インスタンスをインスタンス化し、その flatten()メソッドを直接使用します。 例えば:

from io import StringIO
from email.generator import Generator
fp = StringIO()
g = Generator(fp, mangle_from_=True, maxheaderlen=60)
g.flatten(msg)
text = fp.getvalue()

メッセージオブジェクトにRFC標準に従ってエンコードされていないバイナリデータが含まれている場合、非準拠データはユニコードの「不明な文字」コードポイントに置き換えられます。 ( as_bytes()および BytesGenerator も参照してください。)

バージョン3.4で変更: policy キーワード引数が追加されました。

__str__()

as_string()と同等です。 str(msg)がフォーマットされたメッセージを含む文字列を生成できるようにします。

as_bytes(unixfrom=False, policy=None)

平坦化されたメッセージ全体をbytesオブジェクトとして返します。 オプションの unixfrom がtrueの場合、エンベロープヘッダーは返される文字列に含まれます。 unixfrom のデフォルトはFalseです。 policy 引数を使用して、メッセージインスタンスから取得したデフォルトのポリシーを上書きできます。 指定されたポリシーBytesGeneratorに渡されるため、これを使用して、メソッドによって生成されるフォーマットの一部を制御できます。

文字列への変換を完了するためにデフォルトを入力する必要がある場合、メッセージをフラット化すると、メッセージへの変更がトリガーされる場合があります(たとえば、MIME境界が生成または変更される場合があります)。

この方法は便宜上提供されており、必ずしもメッセージを希望どおりにフォーマットするとは限らないことに注意してください。 たとえば、デフォルトでは、unixmbox形式で必要なFromで始まる行のマングリングは行われません。 柔軟性を高めるには、 BytesGenerator インスタンスをインスタンス化し、その flatten()メソッドを直接使用します。 例えば:

from io import BytesIO
from email.generator import BytesGenerator
fp = BytesIO()
g = BytesGenerator(fp, mangle_from_=True, maxheaderlen=60)
g.flatten(msg)
text = fp.getvalue()

バージョン3.4の新機能。

__bytes__()

as_bytes()と同等です。 bytes(msg)がフォーマットされたメッセージを含むbytesオブジェクトを生成できるようにします。

バージョン3.4の新機能。

is_multipart()

メッセージのペイロードがサブメッセージオブジェクトのリストである場合はTrueを返し、それ以外の場合はFalseを返します。 is_multipart()Falseを返す場合、ペイロードは文字列オブジェクト(CTEでエンコードされたバイナリペイロードの場合があります)である必要があります。 ( is_multipart()Trueを返すことは、必ずしも「msg.get_content_maintype()== 'multipart'」がTrueを返すことを意味するわけではないことに注意してください。 たとえば、メッセージのタイプがmessage/rfc822の場合、is_multipartTrueを返します。)

set_unixfrom(unixfrom)

メッセージのエンベロープヘッダーを unixfrom に設定します。これは文字列である必要があります。

get_unixfrom()

メッセージのエンベロープヘッダーを返します。 エンベロープヘッダーが設定されていない場合、デフォルトはNoneです。

attach(payload)

指定された payload を現在のペイロードに追加します。現在のペイロードはNoneまたは Message オブジェクトのリストである必要があります。 呼び出し後、ペイロードは常に Message オブジェクトのリストになります。 ペイロードをスカラーオブジェクトに設定する場合(例: 文字列)、代わりに set_payload()を使用します。

これは従来の方法です。 EmailMessageクラスでは、その機能は set_content()および関連するmakeおよびaddメソッドに置き換えられています。

get_payload(i=None, decode=False)

現在のペイロードを返します。これは、 is_multipart()Trueの場合はメッセージオブジェクトのリスト、 is_multipart()の場合は文字列になります。 Falseです。 ペイロードがリストであり、リストオブジェクトを変更する場合は、メッセージのペイロードをその場で変更します。

オプションの引数 i を使用すると、 is_multipart()[X153Xの場合、 get_payload()はペイロードの i 番目の要素をゼロから数えて返します。 ]はTrueです。 IndexError は、 i が0未満、またはペイロード内のアイテム数以上の場合に発生します。 ペイロードが文字列の場合(つまり is_multipart()False)であり、 i が指定されると、 TypeError が発生します。

オプションの decode は、 Content-Transfer-Encoding ヘッダーに従って、ペイロードをデコードする必要があるかどうかを示すフラグです。 Trueでメッセージがマルチパートでない場合、このヘッダーの値がquoted-printableまたはbase64の場合、ペイロードはデコードされます。 他のエンコーディングが使用されている場合、または Content-Transfer-Encoding ヘッダーが欠落している場合、ペイロードはそのまま(デコードされていない)で返されます。 いずれの場合も、戻り値はバイナリデータです。 メッセージがマルチパートであり、 decode フラグがTrueの場合、Noneが返されます。 ペイロードがbase64であり、完全に形成されていない場合(パディングがない、base64アルファベット以外の文字)、適切な欠陥がメッセージの欠陥プロパティに追加されます(それぞれ、InvalidBase64PaddingDefectまたはInvalidBase64CharactersDefect)。 )。

decodeFalse(デフォルト)の場合、本文は Content-Transfer-Encoding をデコードせずに文字列として返されます。 ただし、8ビットの Content-Transfer-Encoding の場合、 Content-Type ヘッダーで指定されたcharsetを使用して、元のバイトをデコードしようとします。 replaceエラーハンドラー。 charsetが指定されていない場合、または指定されたcharsetが電子メールパッケージで認識されない場合、本文はデフォルトのASCII文字セットを使用してデコードされます。

これは従来の方法です。 EmailMessageクラスでは、その機能は get_content()および iter_parts()に置き換えられています。

set_payload(payload, charset=None)

メッセージオブジェクト全体のペイロードを payload に設定します。 ペイロードの不変条件を保証するのはクライアントの責任です。 オプションの charset は、メッセージのデフォルトの文字セットを設定します。 詳細については、 set_charset()を参照してください。

これは従来の方法です。 EmailMessageクラスでは、その機能は set_content()に置き換えられています。

set_charset(charset)

ペイロードの文字セットを charset に設定します。これは、 Charset インスタンス( email.charset を参照)、文字セットに名前を付ける文字列、またはNone。 文字列の場合は、 Charset インスタンスに変換されます。 charsetNoneの場合、charsetパラメーターは Content-Type ヘッダーから削除されます(メッセージは他の方法で変更されません)。 それ以外の場合は、 TypeError が生成されます。

既存の MIME-Version ヘッダーがない場合は、ヘッダーが追加されます。 既存の Content-Type ヘッダーがない場合は、 text / plain の値でヘッダーが追加されます。 Content-Type ヘッダーがすでに存在するかどうかに関係なく、そのcharsetパラメーターは charset.output_charset に設定されます。 charset.input_charsetcharset.output_charset が異なる場合、ペイロードは output_charset に再エンコードされます。 既存の Content-Transfer-Encoding ヘッダーがない場合、ペイロードは、必要に応じて、指定された Charset を使用して転送エンコードされ、適切な値のヘッダーは次のようになります。追加した。 Content-Transfer-Encoding ヘッダーがすでに存在する場合、ペイロードはその Content-Transfer-Encoding を使用してすでに正しくエンコードされていると見なされ、変更されません。

これは従来の方法です。 EmailMessageクラスでは、その機能はemail.emailmessage.EmailMessage.set_content()メソッドの charset パラメーターに置き換えられています。

get_charset()

メッセージのペイロードに関連付けられている Charset インスタンスを返します。

これは従来の方法です。 EmailMessageクラスでは、常にNoneを返します。

次のメソッドは、メッセージの RFC 2822 ヘッダーにアクセスするためのマッピングのようなインターフェイスを実装します。 これらのメソッドと法線マッピングの間にはいくつかのセマンティックの違いがあることに注意してください(つまり、 辞書)インターフェース。 たとえば、辞書には重複するキーはありませんが、ここでは重複するメッセージヘッダーが存在する可能性があります。 また、辞書では、 keys()によって返されるキーの順序は保証されていませんが、 Message オブジェクトでは、ヘッダーは常に元のメッセージに表示された順序で返されます。または後でメッセージに追加されました。 削除されてから再追加されたヘッダーは、常にヘッダーリストの最後に追加されます。

これらのセマンティックの違いは意図的なものであり、最大限の利便性に偏っています。

すべての場合において、メッセージに存在するエンベロープヘッダーはマッピングインターフェイスに含まれないことに注意してください。

バイトから生成されたモデルでは、(RFCに違反して)非ASCIIバイトを含むヘッダー値は、このインターフェイスを介して取得されると、 unknownの文字セットを持つ Header オブジェクトとして表されます。 -8ビット。

__len__()

重複を含むヘッダーの総数を返します。

__contains__(name)

メッセージオブジェクトに name という名前のフィールドがある場合は、Trueを返します。 マッチングは大文字と小文字を区別せずに行われ、 name には末尾のコロンを含めないでください。 in演算子に使用されます。例:

if 'message-id' in myMessage:
   print('Message-ID:', myMessage['message-id'])
__getitem__(name)

名前付きヘッダーフィールドの値を返します。 name には、コロンフィールド区切り文字を含めないでください。 ヘッダーがない場合は、Noneが返されます。 KeyError が発生することはありません。

名前付きフィールドがメッセージのヘッダーに複数回表示される場合、それらのフィールド値のどれが返されるかは正確には定義されていないことに注意してください。 get_all()メソッドを使用して、現存するすべての名前付きヘッダーの値を取得します。

__setitem__(name, val)

フィールド名名前および値 val のヘッダーをメッセージに追加します。 このフィールドは、メッセージの既存のフィールドの最後に追加されます。

これは、同じ名前の既存のヘッダーを上書きまたは削除しないことに注意してください。 新しいヘッダーがフィールド名 name のメッセージに存在する唯一のヘッダーであることを確認する場合は、最初にフィールドを削除します。例:

del msg['subject']
msg['subject'] = 'Python roolz!'
__delitem__(name)

メッセージのヘッダーから name という名前のフィールドのすべての出現箇所を削除します。 名前付きフィールドがヘッダーに存在しない場合、例外は発生しません。

keys()

すべてのメッセージのヘッダーフィールド名のリストを返します。

values()

すべてのメッセージのフィールド値のリストを返します。

items()

すべてのメッセージのフィールドヘッダーと値を含む2タプルのリストを返します。

get(name, failobj=None)

名前付きヘッダーフィールドの値を返します。 これは __ getitem __()と同じですが、名前付きヘッダーがない場合にオプションの failobj が返される点が異なります(デフォルトはNone)。

ここにいくつかの追加の便利な方法があります:

get_all(name, failobj=None)

name という名前のフィールドのすべての値のリストを返します。 メッセージにそのような名前付きヘッダーがない場合は、 failobj が返されます(デフォルトはNone)。

add_header(_name, _value, **_params)

拡張ヘッダー設定。 このメソッドは __ setitem __()に似ていますが、追加のヘッダーパラメーターをキーワード引数として指定できる点が異なります。 _name は追加するヘッダーフィールドであり、 _value はヘッダーの primary 値です。

キーワード引数ディクショナリ _params の各項目について、キーがパラメータ名として使用され、アンダースコアがダッシュに変換されます(ダッシュはPython識別子では無効であるため)。 通常、パラメータは、値がNoneの場合、キーのみが追加されます。 値に非ASCII文字が含まれている場合は、(CHARSET, LANGUAGE, VALUE)の形式で3つのタプルとして指定できます。ここで、CHARSETは、値のエンコードに使用される文字セットを指定する文字列[X185X ] は通常、Noneまたは空の文字列に設定でき(他の可能性については RFC 2231 を参照)、VALUEは文字列です非ASCIIコードポイントを含む値。 3つのタプルが渡されず、値に非ASCII文字が含まれている場合、utf-8CHARSETを使用して、 RFC 2231 形式で自動的にエンコードされます。 ]およびNoneLANGUAGE

次に例を示します。

msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')

これにより、次のようなヘッダーが追加されます

Content-Disposition: attachment; filename="bud.gif"

非ASCII文字の例:

msg.add_header('Content-Disposition', 'attachment',
               filename=('iso-8859-1', '', 'Fußballer.ppt'))

どちらが生成します

Content-Disposition: attachment; filename*="iso-8859-1''Fu%DFballer.ppt"
replace_header(_name, _value)

ヘッダーを置き換えます。 _name に一致するメッセージで見つかった最初のヘッダーを置き換え、ヘッダーの順序とフィールド名の大文字と小文字を保持します。 一致するヘッダーが見つからなかった場合、 KeyError が発生します。

get_content_type()

メッセージのコンテンツタイプを返します。 返される文字列は、 maintype / subtype の形式の小文字に強制変換されます。 メッセージに Content-Type ヘッダーがない場合、 get_default_type()で指定されたデフォルトタイプが返されます。 RFC 2045 によると、メッセージには常にデフォルトタイプがあるため、 get_content_type()は常に値を返します。

RFC 2045 は、メッセージのデフォルトタイプを text / plain と定義しています。ただし、 multipart / digest コンテナ内に表示される場合は、 message / rfc822 になります。 Content-Type ヘッダーに無効な型指定がある場合、 RFC 2045 は、デフォルトの型を text / plain にすることを義務付けています。

get_content_maintype()

メッセージのメインコンテンツタイプを返します。 これは、 get_content_type()によって返される文字列の maintype 部分です。

get_content_subtype()

メッセージのサブコンテンツタイプを返します。 これは、 get_content_type()によって返される文字列のサブタイプの部分です。

get_default_type()

デフォルトのコンテンツタイプを返します。 マルチパート/ダイジェストコンテナーのサブパートであるメッセージを除いて、ほとんどのメッセージのデフォルトのコンテンツタイプはテキスト/プレーンです。 このようなサブパーツのデフォルトのコンテンツタイプは message / rfc822 です。

set_default_type(ctype)

デフォルトのコンテンツタイプを設定します。 ctypetext / plain または message / rfc822 のいずれかである必要がありますが、これは強制されません。 デフォルトのコンテンツタイプは、 Content-Type ヘッダーに保存されません。

get_params(failobj=None, header='content-type', unquote=True)

メッセージの Content-Type パラメータをリストとして返します。 返されるリストの要素は、'='記号で分割されているように、キーと値のペアの2タプルです。 '='の左側がキーで、右側が値です。 パラメータに'='記号がない場合、値は空の文字列です。それ以外の場合、値は get_param()で説明されているとおりであり、オプションの unquoteTrue(デフォルト)。

オプションの failobj は、 Content-Type ヘッダーがない場合に返されるオブジェクトです。 オプションの header は、 Content-Type の代わりに検索するヘッダーです。

これは従来の方法です。 EmailMessageクラスでは、その機能は、ヘッダーアクセスメソッドによって返される個々のヘッダーオブジェクトの params プロパティに置き換えられます。

get_param(param, failobj=None, header='content-type', unquote=True)

Content-Type ヘッダーのパラメーター param の値を文字列として返します。 メッセージに Content-Type ヘッダーがない場合、またはそのようなパラメーターがない場合は、 failobj が返されます(デフォルトはNone)。

オプションの header が指定されている場合、 Content-Type の代わりに使用するメッセージヘッダーを指定します。

パラメータキーは常に大文字と小文字を区別せずに比較されます。 戻り値は、文字列、またはパラメータが RFC 2231 でエンコードされている場合は3タプルのいずれかです。 3タプルの場合、値の要素は(CHARSET, LANGUAGE, VALUE)の形式になります。 CHARSETLANGUAGEはどちらもNoneにすることができます。その場合、VALUEus-ascii文字セットでエンコードされていると見なす必要があります。 通常、LANGUAGEは無視できます。

アプリケーションがパラメーターが RFC 2231 のようにエンコードされているかどうかを気にしない場合は、 email.utils.collapse_rfc2231_value()を呼び出すことでパラメーター値を折りたたむことができます。 、 get_param()からの戻り値を渡します。 これにより、値がタプルの場合は適切にデコードされたUnicode文字列が返され、そうでない場合は引用符で囲まれていない元の文字列が返されます。 例えば:

rawparam = msg.get_param('foo')
param = email.utils.collapse_rfc2231_value(rawparam)

いずれの場合も、 unquoteFalseに設定されていない限り、パラメーター値(返される文字列、または3タプルのVALUE項目)は常に引用符で囲まれません。

これは従来の方法です。 EmailMessageクラスでは、その機能は、ヘッダーアクセスメソッドによって返される個々のヘッダーオブジェクトの params プロパティに置き換えられます。

set_param(param, value, header='Content-Type', requote=True, charset=None, language=, replace=False)

Content-Type ヘッダーにパラメーターを設定します。 パラメータがすでにヘッダーに存在する場合、その値は value に置き換えられます。 このメッセージに対して Content-Type ヘッダーがまだ定義されていない場合は、 text / plain に設定され、 に従って新しいパラメーター値が追加されます。 ] RFC 2045

オプションの header は、 Content-Type の代替ヘッダーを指定し、オプションの requoteFalse(デフォルト)でない限り、すべてのパラメーターが必要に応じて引用されます。 True)です。

オプションの charset が指定されている場合、パラメーターは RFC 2231 に従ってエンコードされます。 オプションの language は、RFC 2231言語を指定し、デフォルトで空の文字列になります。 charsetlanguage はどちらも文字列である必要があります。

replaceFalse(デフォルト)の場合、ヘッダーはヘッダーのリストの最後に移動されます。 replaceTrueの場合、ヘッダーはその場で更新されます。

バージョン3.4で変更: replaceキーワードが追加されました。

del_param(param, header='content-type', requote=True)

Content-Type ヘッダーから指定されたパラメーターを完全に削除します。 ヘッダーは、パラメーターまたはその値なしでその場で書き直されます。 requoteFalse(デフォルトはTrue)でない限り、すべての値が必要に応じて引用されます。 オプションの header は、 Content-Type の代替を指定します。

set_type(type, header='Content-Type', requote=True)

Content-Type ヘッダーのメインタイプとサブタイプを設定します。 type は、 maintype / subtype の形式の文字列である必要があります。そうでない場合、 ValueError が発生します。

このメソッドは、 Content-Type ヘッダーを置き換え、すべてのパラメーターを所定の位置に保持します。 requoteFalseの場合、既存のヘッダーの引用はそのままになります。それ以外の場合、パラメーターは引用されます(デフォルト)。

header 引数で代替ヘッダーを指定できます。 Content-Type ヘッダーが設定されている場合、 MIME-Version ヘッダーも追加されます。

これは従来の方法です。 EmailMessageクラスでは、その機能はmake_およびadd_メソッドに置き換えられています。

get_filename(failobj=None)

メッセージの Content-Disposition ヘッダーのfilenameパラメーターの値を返します。 ヘッダーにfilenameパラメーターがない場合、このメソッドは Content-Type ヘッダーでnameパラメーターを探すことにフォールバックします。 どちらも見つからない場合、またはヘッダーがない場合は、 failobj が返されます。 返される文字列は、 email.utils.unquote()に従って、常に引用符で囲まれていません。

get_boundary(failobj=None)

メッセージの Content-Type ヘッダーのboundaryパラメーターの値を返します。ヘッダーがないか、 [がない場合は、 failobj を返します。 X163X]パラメータ。 返される文字列は、 email.utils.unquote()に従って、常に引用符で囲まれていません。

set_boundary(boundary)

Content-Type ヘッダーのboundaryパラメーターを boundary に設定します。 set_boundary()は、必要に応じて常に boundary を引用します。 メッセージオブジェクトに Content-Type ヘッダーがない場合、 HeaderParseError が発生します。

set_boundary()[ X195X]は、ヘッダーのリスト内の Content-Type ヘッダーの順序を保持します。 ただし、元の Content-Type ヘッダーに存在していた可能性のある継続行は保存されません

get_content_charset(failobj=None)

Content-Type ヘッダーのcharsetパラメーターを小文字に強制変換して返します。 Content-Type ヘッダーがない場合、またはそのヘッダーにcharsetパラメーターがない場合は、 failobj が返されます。

このメソッドは、メッセージ本文のデフォルトエンコーディングの Charset インスタンスを返す get_charset()とは異なることに注意してください。

get_charsets(failobj=None)

メッセージ内の文字セット名を含むリストを返します。 メッセージが multipart の場合、リストにはペイロード内のサブパートごとに1つの要素が含まれます。それ以外の場合は、長さ1のリストになります。

リスト内の各項目は、表されたサブパーツの Content-Type ヘッダーのcharsetパラメーターの値である文字列になります。 ただし、サブパーツに Content-Type ヘッダーがない場合、charsetパラメーターがない場合、または text メインMIMEタイプでない場合、返されるリストのその項目 failobj になります。

get_content_disposition()

メッセージの Content-Disposition ヘッダーに小文字(パラメーターなし)がある場合はそれを返し、Noneを返します。 メッセージが RFC 2183 の後に続く場合、このメソッドに指定できる値は、インラインアタッチメント、またはNoneです。

バージョン3.5の新機能。

walk()

walk()メソッドは、メッセージオブジェクトツリーのすべての部分とサブ部分を深さ優先の走査順序で反復するために使用できる汎用ジェネレーターです。 通常、 walk()forループのイテレータとして使用します。 各反復は次のサブパートを返します。

マルチパートメッセージ構造のすべての部分のMIMEタイプを出力する例を次に示します。

>>> for part in msg.walk():
...     print(part.get_content_type())
multipart/report
text/plain
message/delivery-status
text/plain
text/plain
message/rfc822
text/plain

walkは、msg.get_content_maintype() == 'multipart'Falseを返す場合でも、 is_multipart()Trueを返すパーツのサブパーツを繰り返し処理します。 この例では、_structureデバッグヘルパー関数を使用してこれを確認できます。

>>> for part in msg.walk():
...     print(part.get_content_maintype() == 'multipart',
...           part.is_multipart())
True True
False False
False True
False False
False False
False True
False False
>>> _structure(msg)
multipart/report
    text/plain
    message/delivery-status
        text/plain
        text/plain
    message/rfc822
        text/plain

ここで、messageパーツはmultipartsではありませんが、サブパーツが含まれています。 is_multipart()Trueを返し、walkはサブパーツに下降します。

Message オブジェクトには、オプションで2つのインスタンス属性を含めることもできます。これらの属性は、MIMEメッセージのプレーンテキストを生成するときに使用できます。

preamble

MIMEドキュメントの形式では、ヘッダーに続く空白行と最初のマルチパート境界文字列の間にテキストを含めることができます。 通常、このテキストは標準のMIMEアーマーの範囲外であるため、MIME対応のメールリーダーには表示されません。 ただし、メッセージの生のテキストを表示する場合、またはMIMEに対応していないリーダーでメッセージを表示する場合、このテキストが表示される可能性があります。

preamble 属性には、MIMEドキュメント用のこの主要な追加アーマーテキストが含まれています。 Parser は、ヘッダーの後、最初の境界文字列の前にテキストを検出すると、このテキストをメッセージの preamble 属性に割り当てます。 Generator がMIMEメッセージのプレーンテキスト表現を書き出していて、メッセージに preamble 属性があることがわかった場合、ヘッダーと最初の境界。 詳細については、 email.parser および email.generator を参照してください。

メッセージオブジェクトにプリアンブルがない場合、プリアンブル属性はNoneになることに注意してください。

epilogue

epilogue 属性は、 preamble 属性と同じように機能しますが、最後の境界とメッセージの終わりの間に表示されるテキストが含まれている点が異なります。

Generator がファイルの最後に改行を出力するために、エピローグを空の文字列に設定する必要はありません。

defects

defects 属性には、このメッセージの解析時に見つかったすべての問題のリストが含まれています。 考えられる解析の欠陥の詳細については、 email.errors を参照してください。