| :mod:`email.message`: Representing an email message | 
 | --------------------------------------------------- | 
 |  | 
 | .. module:: email.message | 
 |    :synopsis: The base class representing email messages. | 
 | .. moduleauthor:: R. David Murray <rdmurray@bitdance.com> | 
 | .. sectionauthor:: R. David Murray <rdmurray@bitdance.com>, | 
 |                    Barry A. Warsaw <barry@python.org> | 
 |  | 
 | **Source code:** :source:`Lib/email/message.py` | 
 |  | 
 | -------------- | 
 |  | 
 | .. versionadded:: 3.6 [1]_ | 
 |  | 
 | The central class in the :mod:`email` package is the :class:`EmailMessage` | 
 | class, imported from the :mod:`email.message` module.  It is the base class for | 
 | the :mod:`email` object model.  :class:`EmailMessage` provides the core | 
 | functionality for setting and querying header fields, for accessing message | 
 | bodies, and for creating or modifying structured messages. | 
 |  | 
 | An email message consists of *headers* and a *payload* (which is also referred | 
 | to as the *content*).  Headers are :rfc:`5322` or :rfc:`6532` style field names | 
 | and values, where the field name and value are separated by a colon.  The colon | 
 | is not part of either the field name or the field value.  The payload may be a | 
 | simple text message, or a binary object, or a structured sequence of | 
 | sub-messages each with their own set of headers and their own payload.  The | 
 | latter type of payload is indicated by the message having a MIME type such as | 
 | :mimetype:`multipart/\*` or :mimetype:`message/rfc822`. | 
 |  | 
 | The conceptual model provided by an :class:`EmailMessage` object is that of an | 
 | ordered dictionary of headers coupled with a *payload* that represents the | 
 | :rfc:`5322` body of the message, which might be a list of sub-``EmailMessage`` | 
 | objects.  In addition to the normal dictionary methods for accessing the header | 
 | names and values, there are methods for accessing specialized information from | 
 | the headers (for example the MIME content type), for operating on the payload, | 
 | for generating a serialized version of the message, and for recursively walking | 
 | over the object tree. | 
 |  | 
 | The :class:`EmailMessage` dictionary-like interface is indexed by the header | 
 | names, which must be ASCII values.  The values of the dictionary are strings | 
 | with some extra methods.  Headers are stored and returned in case-preserving | 
 | form, but field names are matched case-insensitively.  Unlike a real dict, | 
 | there is an ordering to the keys, and there can be duplicate keys.  Additional | 
 | methods are provided for working with headers that have duplicate keys. | 
 |  | 
 | The *payload* is either a string or bytes object, in the case of simple message | 
 | objects, or a list of :class:`EmailMessage` objects, for MIME container | 
 | documents such as :mimetype:`multipart/\*` and :mimetype:`message/rfc822` | 
 | message objects. | 
 |  | 
 |  | 
 | .. class:: EmailMessage(policy=default) | 
 |  | 
 |    If *policy* is specified use the rules it specifies to udpate and serialize | 
 |    the representation of the message.  If *policy* is not set, use the | 
 |    :class:`~email.policy.default` policy, which follows the rules of the email | 
 |    RFCs except for line endings (instead of the RFC mandated ``\r\n``, it uses | 
 |    the Python standard ``\n`` line endings).  For more information see the | 
 |    :mod:`~email.policy` documentation. | 
 |  | 
 |    .. method:: as_string(unixfrom=False, maxheaderlen=None, policy=None) | 
 |  | 
 |       Return the entire message flattened as a string.  When optional | 
 |       *unixfrom* is true, the envelope header is included in the returned | 
 |       string.  *unixfrom* defaults to ``False``.  For backward compabitility | 
 |       with the base :class:`~email.message.Message` class *maxheaderlen* is | 
 |       accepted, but defaults to ``None``, which means that by default the line | 
 |       length is controlled by the | 
 |       :attr:`~email.policy.EmailPolicy.max_line_length` of the policy.  The | 
 |       *policy* argument may be used to override the default policy obtained | 
 |       from the message instance.  This can be used to control some of the | 
 |       formatting produced by the method, since the specified *policy* will be | 
 |       passed to the :class:`~email.generator.Generator`. | 
 |  | 
 |       Flattening the message may trigger changes to the :class:`EmailMessage` | 
 |       if defaults need to be filled in to complete the transformation to a | 
 |       string (for example, MIME boundaries may be generated or modified). | 
 |  | 
 |       Note that this method is provided as a convenience and may not be the | 
 |       most useful way to serialize messages in your application, especially if | 
 |       you are dealing with multiple messages.  See | 
 |       :class:`email.generator.Generator` for a more flexible API for | 
 |       serializing messages.  Note also that this method is restricted to | 
 |       producing messages serialized as "7 bit clean" when | 
 |       :attr:`~email.policy.EmailPolicy.utf8` is ``False``, which is the default. | 
 |  | 
 |       .. versionchanged:: 3.6 the default behavior when *maxheaderlen* | 
 |          is not specified was changed from defaulting to 0 to defaulting | 
 |          to the value of *max_line_length* from the policy. | 
 |  | 
 |  | 
 |    .. method:: __str__() | 
 |  | 
 |       Equivalent to `as_string(policy=self.policy.clone(utf8=True)`.  Allows | 
 |       ``str(msg)`` to produce a string containing the serialized message in a | 
 |       readable format. | 
 |  | 
 |       .. versionchanged:: 3.4 the method was changed to use ``utf8=True``, | 
 |          thus producing an :rfc:`6531`-like message representation, instead of | 
 |          being a direct alias for :meth:`as_string`. | 
 |  | 
 |  | 
 |    .. method:: as_bytes(unixfrom=False, policy=None) | 
 |  | 
 |       Return the entire message flattened as a bytes object.  When optional | 
 |       *unixfrom* is true, the envelope header is included in the returned | 
 |       string.  *unixfrom* defaults to ``False``.  The *policy* argument may be | 
 |       used to override the default policy obtained from the message instance. | 
 |       This can be used to control some of the formatting produced by the | 
 |       method, since the specified *policy* will be passed to the | 
 |       :class:`~email.generator.BytesGenerator`. | 
 |  | 
 |       Flattening the message may trigger changes to the :class:`EmailMessage` | 
 |       if defaults need to be filled in to complete the transformation to a | 
 |       string (for example, MIME boundaries may be generated or modified). | 
 |  | 
 |       Note that this method is provided as a convenience and may not be the | 
 |       most useful way to serialize messages in your application, especially if | 
 |       you are dealing with multiple messages.  See | 
 |       :class:`email.generator.BytesGenerator` for a more flexible API for | 
 |       serializing messages. | 
 |  | 
 |  | 
 |    .. method:: __bytes__() | 
 |  | 
 |       Equivalent to :meth:`.as_bytes()`.  Allows ``bytes(msg)`` to produce a | 
 |       bytes object containing the serialized message. | 
 |  | 
 |  | 
 |    .. method:: is_multipart() | 
 |  | 
 |       Return ``True`` if the message's payload is a list of sub-\ | 
 |       :class:`EmailMessage` objects, otherwise return ``False``.  When | 
 |       :meth:`is_multipart` returns ``False``, the payload should be a string | 
 |       object (which might be a CTE encoded binary payload).  Note that | 
 |       :meth:`is_multipart` returning ``True`` does not necessarily mean that | 
 |       "msg.get_content_maintype() == 'multipart'" will return the ``True``. | 
 |       For example, ``is_multipart`` will return ``True`` when the | 
 |       :class:`EmailMessage` is of type ``message/rfc822``. | 
 |  | 
 |  | 
 |    .. method:: set_unixfrom(unixfrom) | 
 |  | 
 |       Set the message's envelope header to *unixfrom*, which should be a | 
 |       string.  (See :class:`~mailbox.mboxMessage` for a brief description of | 
 |       this header.) | 
 |  | 
 |  | 
 |    .. method:: get_unixfrom() | 
 |  | 
 |       Return the message's envelope header.  Defaults to ``None`` if the | 
 |       envelope header was never set. | 
 |  | 
 |  | 
 |    The following methods implement the mapping-like interface for accessing the | 
 |    message's headers.  Note that there are some semantic differences | 
 |    between these methods and a normal mapping (i.e. dictionary) interface.  For | 
 |    example, in a dictionary there are no duplicate keys, but here there may be | 
 |    duplicate message headers.  Also, in dictionaries there is no guaranteed | 
 |    order to the keys returned by :meth:`keys`, but in an :class:`EmailMessage` | 
 |    object, headers are always returned in the order they appeared in the | 
 |    original message, or in which they were added to the message later.  Any | 
 |    header deleted and then re-added is always appended to the end of the | 
 |    header list. | 
 |  | 
 |    These semantic differences are intentional and are biased toward | 
 |    convenience in the most common use cases. | 
 |  | 
 |    Note that in all cases, any envelope header present in the message is not | 
 |    included in the mapping interface. | 
 |  | 
 |  | 
 |    .. method:: __len__() | 
 |  | 
 |       Return the total number of headers, including duplicates. | 
 |  | 
 |  | 
 |    .. method:: __contains__(name) | 
 |  | 
 |       Return true if the message object has a field named *name*. Matching is | 
 |       done without regard to case and *name* does not include the trailing | 
 |       colon.  Used for the ``in`` operator.  For example:: | 
 |  | 
 |            if 'message-id' in myMessage: | 
 |               print('Message-ID:', myMessage['message-id']) | 
 |  | 
 |  | 
 |    .. method:: __getitem__(name) | 
 |  | 
 |       Return the value of the named header field.  *name* does not include the | 
 |       colon field separator.  If the header is missing, ``None`` is returned; a | 
 |       :exc:`KeyError` is never raised. | 
 |  | 
 |       Note that if the named field appears more than once in the message's | 
 |       headers, exactly which of those field values will be returned is | 
 |       undefined.  Use the :meth:`get_all` method to get the values of all the | 
 |       extant headers named *name*. | 
 |  | 
 |       Using the standard (non-``compat32``) policies, the returned value is an | 
 |       instance of a subclass of :class:`email.headerregistry.BaseHeader`. | 
 |  | 
 |  | 
 |    .. method:: __setitem__(name, val) | 
 |  | 
 |       Add a header to the message with field name *name* and value *val*.  The | 
 |       field is appended to the end of the message's existing headers. | 
 |  | 
 |       Note that this does *not* overwrite or delete any existing header with the same | 
 |       name.  If you want to ensure that the new header is the only one present in the | 
 |       message with field name *name*, delete the field first, e.g.:: | 
 |  | 
 |          del msg['subject'] | 
 |          msg['subject'] = 'Python roolz!' | 
 |  | 
 |       If the :mod:`policy` defines certain haders to be unique (as the standard | 
 |       policies do), this method may raise a :exc:`ValueError` when an attempt | 
 |       is made to assign a value to such a header when one already exists.  This | 
 |       behavior is intentional for consistency's sake, but do not depend on it | 
 |       as we may choose to make such assignments do an automatic deletion of the | 
 |       existing header in the future. | 
 |  | 
 |  | 
 |    .. method:: __delitem__(name) | 
 |  | 
 |       Delete all occurrences of the field with name *name* from the message's | 
 |       headers.  No exception is raised if the named field isn't present in the | 
 |       headers. | 
 |  | 
 |  | 
 |    .. method:: keys() | 
 |  | 
 |       Return a list of all the message's header field names. | 
 |  | 
 |  | 
 |    .. method:: values() | 
 |  | 
 |       Return a list of all the message's field values. | 
 |  | 
 |  | 
 |    .. method:: items() | 
 |  | 
 |       Return a list of 2-tuples containing all the message's field headers and | 
 |       values. | 
 |  | 
 |  | 
 |    .. method:: get(name, failobj=None) | 
 |  | 
 |       Return the value of the named header field.  This is identical to | 
 |       :meth:`__getitem__` except that optional *failobj* is returned if the | 
 |       named header is missing (*failobj* defaults to ``None``). | 
 |  | 
 |  | 
 |    Here are some additional useful header related methods: | 
 |  | 
 |  | 
 |    .. method:: get_all(name, failobj=None) | 
 |  | 
 |       Return a list of all the values for the field named *name*. If there are | 
 |       no such named headers in the message, *failobj* is returned (defaults to | 
 |       ``None``). | 
 |  | 
 |  | 
 |    .. method:: add_header(_name, _value, **_params) | 
 |  | 
 |       Extended header setting.  This method is similar to :meth:`__setitem__` | 
 |       except that additional header parameters can be provided as keyword | 
 |       arguments.  *_name* is the header field to add and *_value* is the | 
 |       *primary* value for the header. | 
 |  | 
 |       For each item in the keyword argument dictionary *_params*, the key is | 
 |       taken as the parameter name, with underscores converted to dashes (since | 
 |       dashes are illegal in Python identifiers).  Normally, the parameter will | 
 |       be added as ``key="value"`` unless the value is ``None``, in which case | 
 |       only the key will be added. | 
 |  | 
 |       If the value contains non-ASCII characters, the charset and language may | 
 |       be explicitly controlled by specifying the value as a three tuple in the | 
 |       format ``(CHARSET, LANGUAGE, VALUE)``, where ``CHARSET`` is a string | 
 |       naming the charset to be used to encode the value, ``LANGUAGE`` can | 
 |       usually be set to ``None`` or the empty string (see :rfc:`2231` for other | 
 |       possibilities), and ``VALUE`` is the string value containing non-ASCII | 
 |       code points.  If a three tuple is not passed and the value contains | 
 |       non-ASCII characters, it is automatically encoded in :rfc:`2231` format | 
 |       using a ``CHARSET`` of ``utf-8`` and a ``LANGUAGE`` of ``None``. | 
 |  | 
 |       Here is an example:: | 
 |  | 
 |          msg.add_header('Content-Disposition', 'attachment', filename='bud.gif') | 
 |  | 
 |       This will add a header that looks like :: | 
 |  | 
 |          Content-Disposition: attachment; filename="bud.gif" | 
 |  | 
 |       An example of the extended interface with non-ASCII characters:: | 
 |  | 
 |          msg.add_header('Content-Disposition', 'attachment', | 
 |                         filename=('iso-8859-1', '', 'Fußballer.ppt')) | 
 |  | 
 |  | 
 |    .. method:: replace_header(_name, _value) | 
 |  | 
 |       Replace a header.  Replace the first header found in the message that | 
 |       matches *_name*, retaining header order and field name case of the | 
 |       original header.  If no matching header is found, raise a | 
 |       :exc:`KeyError`. | 
 |  | 
 |  | 
 |    .. method:: get_content_type() | 
 |  | 
 |       Return the message's content type, coerced to lower case of the form | 
 |       :mimetype:`maintype/subtype`.  If there is no :mailheader:`Content-Type` | 
 |       header in the message return the value returned by | 
 |       :meth:`get_default_type`.  If the :mailheader:`Content-Type` header is | 
 |       invalid, return ``text/plain``. | 
 |  | 
 |       (According to :rfc:`2045`, messages always have a default type, | 
 |       :meth:`get_content_type` will always return a value.  :rfc:`2045` defines | 
 |       a message's default type to be :mimetype:`text/plain` unless it appears | 
 |       inside a :mimetype:`multipart/digest` container, in which case it would | 
 |       be :mimetype:`message/rfc822`.  If the :mailheader:`Content-Type` header | 
 |       has an invalid type specification, :rfc:`2045` mandates that the default | 
 |       type be :mimetype:`text/plain`.) | 
 |  | 
 |  | 
 |    .. method:: get_content_maintype() | 
 |  | 
 |       Return the message's main content type.  This is the :mimetype:`maintype` | 
 |       part of the string returned by :meth:`get_content_type`. | 
 |  | 
 |  | 
 |    .. method:: get_content_subtype() | 
 |  | 
 |       Return the message's sub-content type.  This is the :mimetype:`subtype` | 
 |       part of the string returned by :meth:`get_content_type`. | 
 |  | 
 |  | 
 |    .. method:: get_default_type() | 
 |  | 
 |       Return the default content type.  Most messages have a default content | 
 |       type of :mimetype:`text/plain`, except for messages that are subparts of | 
 |       :mimetype:`multipart/digest` containers.  Such subparts have a default | 
 |       content type of :mimetype:`message/rfc822`. | 
 |  | 
 |  | 
 |    .. method:: set_default_type(ctype) | 
 |  | 
 |       Set the default content type.  *ctype* should either be | 
 |       :mimetype:`text/plain` or :mimetype:`message/rfc822`, although this is | 
 |       not enforced.  The default content type is not stored in the | 
 |       :mailheader:`Content-Type` header, so it only affects the return value of | 
 |       the ``get_content_type`` methods when no :mailheader:`Content-Type` | 
 |       header is present in the message. | 
 |  | 
 |  | 
 |    .. method:: set_param(param, value, header='Content-Type', requote=True, \ | 
 |                          charset=None, language='', replace=False) | 
 |  | 
 |       Set a parameter in the :mailheader:`Content-Type` header.  If the | 
 |       parameter already exists in the header, replace its value with *value*. | 
 |       When *header* is ``Content-Type`` (the default) and the header does not | 
 |       yet exist in the message, add it, set its value to | 
 |       :mimetype:`text/plain`, and append the new parameter value.  Optional | 
 |       *header* specifies an alternative header to :mailheader:`Content-Type`. | 
 |  | 
 |       If the value contains non-ASCII characters, the charset and language may | 
 |       be explicity specified using the optional *charset* and *language* | 
 |       parameters.  Optional *language* specifies the :rfc:`2231` language, | 
 |       defaulting to the empty string.  Both *charset* and *language* should be | 
 |       strings.  The default is to use the ``utf8`` *charset* and ``None`` for | 
 |       the *language*. | 
 |  | 
 |       If *replace* is ``False`` (the default) the header is moved to the | 
 |       end of the list of headers.  If *replace* is ``True``, the header | 
 |       will be updated in place. | 
 |  | 
 |       Use of the *requote* parameter with :class:`EmailMessage` objects is | 
 |       deprecated. | 
 |  | 
 |       Note that existing parameter values of headers may be accessed through | 
 |       the :attr:`~email.headerregistry.BaseHeader.params` attribute of the | 
 |       header value (for example, ``msg['Content-Type'].params['charset']``. | 
 |  | 
 |       .. versionchanged:: 3.4 ``replace`` keyword was added. | 
 |  | 
 |  | 
 |    .. method:: del_param(param, header='content-type', requote=True) | 
 |  | 
 |       Remove the given parameter completely from the :mailheader:`Content-Type` | 
 |       header.  The header will be re-written in place without the parameter or | 
 |       its value.  Optional *header* specifies an alternative to | 
 |       :mailheader:`Content-Type`. | 
 |  | 
 |       Use of the *requote* parameter with :class:`EmailMessage` objects is | 
 |       deprecated. | 
 |  | 
 |  | 
 |    .. method:: get_filename(failobj=None) | 
 |  | 
 |       Return the value of the ``filename`` parameter of the | 
 |       :mailheader:`Content-Disposition` header of the message.  If the header | 
 |       does not have a ``filename`` parameter, this method falls back to looking | 
 |       for the ``name`` parameter on the :mailheader:`Content-Type` header.  If | 
 |       neither is found, or the header is missing, then *failobj* is returned. | 
 |       The returned string will always be unquoted as per | 
 |       :func:`email.utils.unquote`. | 
 |  | 
 |  | 
 |    .. method:: get_boundary(failobj=None) | 
 |  | 
 |       Return the value of the ``boundary`` parameter of the | 
 |       :mailheader:`Content-Type` header of the message, or *failobj* if either | 
 |       the header is missing, or has no ``boundary`` parameter.  The returned | 
 |       string will always be unquoted as per :func:`email.utils.unquote`. | 
 |  | 
 |  | 
 |    .. method:: set_boundary(boundary) | 
 |  | 
 |       Set the ``boundary`` parameter of the :mailheader:`Content-Type` header to | 
 |       *boundary*.  :meth:`set_boundary` will always quote *boundary* if | 
 |       necessary.  A :exc:`~email.errors.HeaderParseError` is raised if the | 
 |       message object has no :mailheader:`Content-Type` header. | 
 |  | 
 |       Note that using this method is subtly different from deleting the old | 
 |       :mailheader:`Content-Type` header and adding a new one with the new | 
 |       boundary via :meth:`add_header`, because :meth:`set_boundary` preserves | 
 |       the order of the :mailheader:`Content-Type` header in the list of | 
 |       headers. | 
 |  | 
 |  | 
 |    .. method:: get_content_charset(failobj=None) | 
 |  | 
 |       Return the ``charset`` parameter of the :mailheader:`Content-Type` header, | 
 |       coerced to lower case.  If there is no :mailheader:`Content-Type` header, or if | 
 |       that header has no ``charset`` parameter, *failobj* is returned. | 
 |  | 
 |  | 
 |    .. method:: get_charsets(failobj=None) | 
 |  | 
 |       Return a list containing the character set names in the message.  If the | 
 |       message is a :mimetype:`multipart`, then the list will contain one element | 
 |       for each subpart in the payload, otherwise, it will be a list of length 1. | 
 |  | 
 |       Each item in the list will be a string which is the value of the | 
 |       ``charset`` parameter in the :mailheader:`Content-Type` header for the | 
 |       represented subpart.  If the subpart has no :mailheader:`Content-Type` | 
 |       header, no ``charset`` parameter, or is not of the :mimetype:`text` main | 
 |       MIME type, then that item in the returned list will be *failobj*. | 
 |  | 
 |  | 
 |    .. method:: is_attachment | 
 |  | 
 |       Return ``True`` if there is a :mailheader:`Content-Disposition` header | 
 |       and its (case insensitive) value is ``attachment``, ``False`` otherwise. | 
 |  | 
 |       .. versionchanged:: 3.4.2 | 
 |          is_attachment is now a method instead of a property, for consistency | 
 |          with :meth:`~email.message.Message.is_multipart`. | 
 |  | 
 |  | 
 |    .. method:: get_content_disposition() | 
 |  | 
 |       Return the lowercased value (without parameters) of the message's | 
 |       :mailheader:`Content-Disposition` header if it has one, or ``None``.  The | 
 |       possible values for this method are *inline*, *attachment* or ``None`` | 
 |       if the message follows :rfc:`2183`. | 
 |  | 
 |       .. versionadded:: 3.5 | 
 |  | 
 |  | 
 |    The following methods relate to interrogating and manipulating the content | 
 |    (payload) of the message. | 
 |  | 
 |  | 
 |    .. method:: walk() | 
 |  | 
 |       The :meth:`walk` method is an all-purpose generator which can be used to | 
 |       iterate over all the parts and subparts of a message object tree, in | 
 |       depth-first traversal order.  You will typically use :meth:`walk` as the | 
 |       iterator in a ``for`` loop; each iteration returns the next subpart. | 
 |  | 
 |       Here's an example that prints the MIME type of every part of a multipart | 
 |       message structure: | 
 |  | 
 |       .. testsetup:: | 
 |  | 
 |          from email import message_from_binary_file | 
 |          with open('../Lib/test/test_email/data/msg_16.txt', 'rb') as f: | 
 |              msg = message_from_binary_file(f) | 
 |          from email.iterators import _structure | 
 |  | 
 |       .. doctest:: | 
 |  | 
 |          >>> 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`` iterates over the subparts of any part where | 
 |       :meth:`is_multipart` returns ``True``, even though | 
 |       ``msg.get_content_maintype() == 'multipart'`` may return ``False``.  We | 
 |       can see this in our example by making use of the ``_structure`` debug | 
 |       helper function: | 
 |  | 
 |       .. doctest:: | 
 |  | 
 |          >>> 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 | 
 |  | 
 |       Here the ``message`` parts are not ``multiparts``, but they do contain | 
 |       subparts. ``is_multipart()`` returns ``True`` and ``walk`` descends | 
 |       into the subparts. | 
 |  | 
 |  | 
 |    .. method:: get_body(preferencelist=('related', 'html', 'plain')) | 
 |  | 
 |       Return the MIME part that is the best candidate to be the "body" of the | 
 |       message. | 
 |  | 
 |       *preferencelist* must be a sequence of strings from the set ``related``, | 
 |       ``html``, and ``plain``, and indicates the order of preference for the | 
 |       content type of the part returned. | 
 |  | 
 |       Start looking for candidate matches with the object on which the | 
 |       ``get_body`` method is called. | 
 |  | 
 |       If ``related`` is not included in *preferencelist*, consider the root | 
 |       part (or subpart of the root part) of any related encountered as a | 
 |       candidate if the (sub-)part matches a preference. | 
 |  | 
 |       When encountering a ``multipart/related``, check the ``start`` parameter | 
 |       and if a part with a matching :mailheader:`Content-ID` is found, consider | 
 |       only it when looking for candidate matches.  Otherwise consider only the | 
 |       first (default root) part of the ``multipart/related``. | 
 |  | 
 |       If a part has a :mailheader:`Content-Disposition` header, only consider | 
 |       the part a candidate match if the value of the header is ``inline``. | 
 |  | 
 |       If none of the candidates matches any of the preferences in | 
 |       *preferneclist*, return ``None``. | 
 |  | 
 |       Notes: (1) For most applications the only *preferencelist* combinations | 
 |       that really make sense are ``('plain',)``, ``('html', 'plain')``, and the | 
 |       default ``('related', 'html', 'plain')``.  (2) Because matching starts | 
 |       with the object on which ``get_body`` is called, calling ``get_body`` on | 
 |       a ``multipart/related`` will return the object itself unless | 
 |       *preferencelist* has a non-default value. (3) Messages (or message parts) | 
 |       that do not specify a :mailheader:`Content-Type` or whose | 
 |       :mailheader:`Content-Type` header is invalid will be treated as if they | 
 |       are of type ``text/plain``, which may occasionally cause ``get_body`` to | 
 |       return unexpected results. | 
 |  | 
 |  | 
 |    .. method:: iter_attachments() | 
 |  | 
 |       Return an iterator over all of the immediate sub-parts of the message | 
 |       that are not candidate "body" parts.  That is, skip the first occurrence | 
 |       of each of ``text/plain``, ``text/html``, ``multipart/related``, or | 
 |       ``multipart/alternative`` (unless they are explicitly marked as | 
 |       attachments via :mailheader:`Content-Disposition: attachment`), and | 
 |       return all remaining parts.  When applied directly to a | 
 |       ``multipart/related``, return an iterator over the all the related parts | 
 |       except the root part (ie: the part pointed to by the ``start`` parameter, | 
 |       or the first part if there is no ``start`` parameter or the ``start`` | 
 |       parameter doesn't match the :mailheader:`Content-ID` of any of the | 
 |       parts).  When applied directly to a ``multipart/alternative`` or a | 
 |       non-``multipart``, return an empty iterator. | 
 |  | 
 |  | 
 |    .. method:: iter_parts() | 
 |  | 
 |       Return an iterator over all of the immediate sub-parts of the message, | 
 |       which will be empty for a non-``multipart``.  (See also | 
 |       :meth:`~email.message.EmailMessage.walk`.) | 
 |  | 
 |  | 
 |    .. method:: get_content(*args, content_manager=None, **kw) | 
 |  | 
 |       Call the :meth:`~email.contentmanager.ContentManager.get_content` method | 
 |       of the *content_manager*, passing self as the message object, and passing | 
 |       along any other arguments or keywords as additional arguments.  If | 
 |       *content_manager* is not specified, use the ``content_manager`` specified | 
 |       by the current :mod:`~email.policy`. | 
 |  | 
 |  | 
 |    .. method:: set_content(*args, content_manager=None, **kw) | 
 |  | 
 |       Call the :meth:`~email.contentmanager.ContentManager.set_content` method | 
 |       of the *content_manager*, passing self as the message object, and passing | 
 |       along any other arguments or keywords as additional arguments.  If | 
 |       *content_manager* is not specified, use the ``content_manager`` specified | 
 |       by the current :mod:`~email.policy`. | 
 |  | 
 |  | 
 |    .. method:: make_related(boundary=None) | 
 |  | 
 |       Convert a non-``multipart`` message into a ``multipart/related`` message, | 
 |       moving any existing :mailheader:`Content-` headers and payload into a | 
 |       (new) first part of the ``multipart``.  If *boundary* is specified, use | 
 |       it as the boundary string in the multipart, otherwise leave the boundary | 
 |       to be automatically created when it is needed (for example, when the | 
 |       message is serialized). | 
 |  | 
 |  | 
 |    .. method:: make_alternative(boundary=None) | 
 |  | 
 |       Convert a non-``multipart`` or a ``multipart/related`` into a | 
 |       ``multipart/alternative``, moving any existing :mailheader:`Content-` | 
 |       headers and payload into a (new) first part of the ``multipart``.  If | 
 |       *boundary* is specified, use it as the boundary string in the multipart, | 
 |       otherwise leave the boundary to be automatically created when it is | 
 |       needed (for example, when the message is serialized). | 
 |  | 
 |  | 
 |    .. method:: make_mixed(boundary=None) | 
 |  | 
 |       Convert a non-``multipart``, a ``multipart/related``, or a | 
 |       ``multipart-alternative`` into a ``multipart/mixed``, moving any existing | 
 |       :mailheader:`Content-` headers and payload into a (new) first part of the | 
 |       ``multipart``.  If *boundary* is specified, use it as the boundary string | 
 |       in the multipart, otherwise leave the boundary to be automatically | 
 |       created when it is needed (for example, when the message is serialized). | 
 |  | 
 |  | 
 |    .. method:: add_related(*args, content_manager=None, **kw) | 
 |  | 
 |       If the message is a ``multipart/related``, create a new message | 
 |       object, pass all of the arguments to its :meth:`set_content` method, | 
 |       and :meth:`~email.message.Message.attach` it to the ``multipart``.  If | 
 |       the message is a non-``multipart``, call :meth:`make_related` and then | 
 |       proceed as above.  If the message is any other type of ``multipart``, | 
 |       raise a :exc:`TypeError`. If *content_manager* is not specified, use | 
 |       the ``content_manager`` specified by the current :mod:`~email.policy`. | 
 |       If the added part has no :mailheader:`Content-Disposition` header, | 
 |       add one with the value ``inline``. | 
 |  | 
 |  | 
 |    .. method:: add_alternative(*args, content_manager=None, **kw) | 
 |  | 
 |       If the message is a ``multipart/alternative``, create a new message | 
 |       object, pass all of the arguments to its :meth:`set_content` method, and | 
 |       :meth:`~email.message.Message.attach` it to the ``multipart``.  If the | 
 |       message is a non-``multipart`` or ``multipart/related``, call | 
 |       :meth:`make_alternative` and then proceed as above.  If the message is | 
 |       any other type of ``multipart``, raise a :exc:`TypeError`. If | 
 |       *content_manager* is not specified, use the ``content_manager`` specified | 
 |       by the current :mod:`~email.policy`. | 
 |  | 
 |  | 
 |    .. method:: add_attachment(*args, content_manager=None, **kw) | 
 |  | 
 |       If the message is a ``multipart/mixed``, create a new message object, | 
 |       pass all of the arguments to its :meth:`set_content` method, and | 
 |       :meth:`~email.message.Message.attach` it to the ``multipart``.  If the | 
 |       message is a non-``multipart``, ``multipart/related``, or | 
 |       ``multipart/alternative``, call :meth:`make_mixed` and then proceed as | 
 |       above. If *content_manager* is not specified, use the ``content_manager`` | 
 |       specified by the current :mod:`~email.policy`.  If the added part | 
 |       has no :mailheader:`Content-Disposition` header, add one with the value | 
 |       ``attachment``.  This method can be used both for explicit attachments | 
 |       (:mailheader:`Content-Disposition: attachment` and ``inline`` attachments | 
 |       (:mailheader:`Content-Disposition: inline`), by passing appropriate | 
 |       options to the ``content_manager``. | 
 |  | 
 |  | 
 |    .. method:: clear() | 
 |  | 
 |       Remove the payload and all of the headers. | 
 |  | 
 |  | 
 |    .. method:: clear_content() | 
 |  | 
 |       Remove the payload and all of the :exc:`Content-` headers, leaving | 
 |       all other headers intact and in their original order. | 
 |  | 
 |  | 
 |    :class:`EmailMessage` objects have the following instance attributes: | 
 |  | 
 |  | 
 |    .. attribute:: preamble | 
 |  | 
 |       The format of a MIME document allows for some text between the blank line | 
 |       following the headers, and the first multipart boundary string. Normally, | 
 |       this text is never visible in a MIME-aware mail reader because it falls | 
 |       outside the standard MIME armor.  However, when viewing the raw text of | 
 |       the message, or when viewing the message in a non-MIME aware reader, this | 
 |       text can become visible. | 
 |  | 
 |       The *preamble* attribute contains this leading extra-armor text for MIME | 
 |       documents.  When the :class:`~email.parser.Parser` discovers some text | 
 |       after the headers but before the first boundary string, it assigns this | 
 |       text to the message's *preamble* attribute.  When the | 
 |       :class:`~email.generator.Generator` is writing out the plain text | 
 |       representation of a MIME message, and it finds the | 
 |       message has a *preamble* attribute, it will write this text in the area | 
 |       between the headers and the first boundary.  See :mod:`email.parser` and | 
 |       :mod:`email.generator` for details. | 
 |  | 
 |       Note that if the message object has no preamble, the *preamble* attribute | 
 |       will be ``None``. | 
 |  | 
 |  | 
 |    .. attribute:: epilogue | 
 |  | 
 |       The *epilogue* attribute acts the same way as the *preamble* attribute, | 
 |       except that it contains text that appears between the last boundary and | 
 |       the end of the message.  As with the :attr:`~EmailMessage.preamble`, | 
 |       if there is no epilog text this attribute will be ``None``. | 
 |  | 
 |  | 
 |    .. attribute:: defects | 
 |  | 
 |       The *defects* attribute contains a list of all the problems found when | 
 |       parsing this message.  See :mod:`email.errors` for a detailed description | 
 |       of the possible parsing defects. | 
 |  | 
 |  | 
 | .. class:: MIMEPart(policy=default) | 
 |  | 
 |     This class represents a subpart of a MIME message.  It is identical to | 
 |     :class:`EmailMessage`, except that no :mailheader:`MIME-Version` headers are | 
 |     added when :meth:`~EmailMessage.set_content` is called, since sub-parts do | 
 |     not need their own :mailheader:`MIME-Version` headers. | 
 |  | 
 |  | 
 | .. rubric:: Footnotes | 
 |  | 
 | .. [1] Oringally added in 3.4 as a :term:`provisional module <provisional | 
 |        package>`.  Docs for legacy message class moved to | 
 |        :ref:`compat32_message`. |