:mod:`!email.parser`: Parsing email messages
--------------------------------------------

.. module:: email.parser
   :synopsis: Parse flat text email messages to produce a message object structure.

**Source code:** :source:`Lib/email/parser.py`

--------------

Message object structures can be created in one of two ways: they can be
created from whole cloth by creating an :class:`~email.message.EmailMessage`
object, adding headers using the dictionary interface, and adding payload(s)
using :meth:`~email.message.EmailMessage.set_content` and related methods, or
they can be created by parsing a serialized representation of the email
message.

The :mod:`email` package provides a standard parser that understands most email
document structures, including MIME documents.  You can pass the parser a
bytes, string or file object, and the parser will return to you the root
:class:`~email.message.EmailMessage` instance of the object structure.  For
simple, non-MIME messages the payload of this root object will likely be a
string containing the text of the message.  For MIME messages, the root object
will return ``True`` from its :meth:`~email.message.EmailMessage.is_multipart`
method, and the subparts can be accessed via the payload manipulation methods,
such as :meth:`~email.message.EmailMessage.get_body`,
:meth:`~email.message.EmailMessage.iter_parts`, and
:meth:`~email.message.EmailMessage.walk`.

There are actually two parser interfaces available for use, the :class:`Parser`
API and the incremental :class:`FeedParser` API.  The :class:`Parser` API is
most useful if you have the entire text of the message in memory, or if the
entire message lives in a file on the file system.  :class:`FeedParser` is more
appropriate when you are reading the message from a stream which might block
waiting for more input (such as reading an email message from a socket).  The
:class:`FeedParser` can consume and parse the message incrementally, and only
returns the root object when you close the parser.

Note that the parser can be extended in limited ways, and of course you can
implement your own parser completely from scratch.  All of the logic that
connects the :mod:`email` package's bundled parser and the
:class:`~email.message.EmailMessage` class is embodied in the :class:`~email.policy.Policy`
class, so a custom parser can create message object trees any way it finds
necessary by implementing custom versions of the appropriate :class:`!Policy`
methods.


FeedParser API
^^^^^^^^^^^^^^

The :class:`BytesFeedParser`, imported from the :mod:`email.feedparser` module,
provides an API that is conducive to incremental parsing of email messages,
such as would be necessary when reading the text of an email message from a
source that can block (such as a socket).  The :class:`BytesFeedParser` can of
course be used to parse an email message fully contained in a :term:`bytes-like
object`, string, or file, but the :class:`BytesParser` API may be more
convenient for such use cases.  The semantics and results of the two parser
APIs are identical.

The :class:`BytesFeedParser`'s API is simple; you create an instance, feed it a
bunch of bytes until there's no more to feed it, then close the parser to
retrieve the root message object.  The :class:`BytesFeedParser` is extremely
accurate when parsing standards-compliant messages, and it does a very good job
of parsing non-compliant messages, providing information about how a message
was deemed broken.  It will populate a message object's
:attr:`~email.message.EmailMessage.defects` attribute with a list of any
problems it found in a message.  See the :mod:`email.errors` module for the
list of defects that it can find.

Here is the API for the :class:`BytesFeedParser`:


.. class:: BytesFeedParser(_factory=None, *, policy=policy.compat32)

   Create a :class:`BytesFeedParser` instance.  Optional *_factory* is a
   no-argument callable; if not specified use the
   :attr:`~email.policy.Policy.message_factory` from the *policy*.  Call
   *_factory* whenever a new message object is needed.

   If *policy* is specified use the rules it specifies to update the
   representation of the message.  If *policy* is not set, use the
   :class:`compat32 <email.policy.Compat32>` policy, which maintains backward
   compatibility with the Python 3.2 version of the email package and provides
   :class:`~email.message.Message` as the default factory.  All other policies
   provide :class:`~email.message.EmailMessage` as the default *_factory*. For
   more information on what else *policy* controls, see the
   :mod:`~email.policy` documentation.

   Note: **The policy keyword should always be specified**; The default will
   change to :data:`email.policy.default` in a future version of Python.

   .. versionadded:: 3.2

   .. versionchanged:: 3.3 Added the *policy* keyword.
   .. versionchanged:: 3.6 *_factory* defaults to the policy ``message_factory``.


   .. method:: feed(data)

      Feed the parser some more data.  *data* should be a :term:`bytes-like
      object` containing one or more lines.  The lines can be partial and the
      parser will stitch such partial lines together properly.  The lines can
      have any of the three common line endings: carriage return, newline, or
      carriage return and newline (they can even be mixed).


   .. method:: close()

      Complete the parsing of all previously fed data and return the root
      message object.  It is undefined what happens if :meth:`~feed` is called
      after this method has been called.


.. class:: FeedParser(_factory=None, *, policy=policy.compat32)

   Works like :class:`BytesFeedParser` except that the input to the
   :meth:`~BytesFeedParser.feed` method must be a string.  This is of limited
   utility, since the only way for such a message to be valid is for it to
   contain only ASCII text or, if :attr:`~email.policy.EmailPolicy.utf8` is
   ``True``, no binary attachments.

   .. versionchanged:: 3.3 Added the *policy* keyword.


Parser API
^^^^^^^^^^

The :class:`BytesParser` class, imported from the :mod:`!email.parser` module,
provides an API that can be used to parse a message when the complete contents
of the message are available in a :term:`bytes-like object` or file.  The
:mod:`!email.parser` module also provides :class:`Parser` for parsing strings,
and header-only parsers, :class:`BytesHeaderParser` and
:class:`HeaderParser`, which can be used if you're only interested in the
headers of the message.  :class:`BytesHeaderParser` and :class:`HeaderParser`
can be much faster in these situations, since they do not attempt to parse the
message body, instead setting the payload to the raw body.


.. class:: BytesParser(_class=None, *, policy=policy.compat32)

   Create a :class:`BytesParser` instance.  The *_class* and *policy*
   arguments have the same meaning and semantics as the *_factory*
   and *policy* arguments of :class:`BytesFeedParser`.

   Note: **The policy keyword should always be specified**; The default will
   change to :data:`email.policy.default` in a future version of Python.

   .. versionchanged:: 3.3
      Removed the *strict* argument that was deprecated in 2.4.  Added the
      *policy* keyword.
   .. versionchanged:: 3.6 *_class* defaults to the policy ``message_factory``.


   .. method:: parse(fp, headersonly=False)

      Read all the data from the binary file-like object *fp*, parse the
      resulting bytes, and return the message object.  *fp* must support
      both the :meth:`~io.IOBase.readline` and the :meth:`~io.BufferedIOBase.read`
      methods.

      The bytes contained in *fp* must be formatted as a block of :rfc:`5322`
      (or, if :attr:`~email.policy.EmailPolicy.utf8` is ``True``, :rfc:`6532`)
      style headers and header continuation lines, optionally preceded by an
      envelope header.  The header block is terminated either by the end of the
      data or by a blank line.  Following the header block is the body of the
      message (which may contain MIME-encoded subparts, including subparts
      with a :mailheader:`Content-Transfer-Encoding` of ``8bit``).

      Optional *headersonly* is a flag specifying whether to stop parsing after
      reading the headers or not.  The default is ``False``, meaning it parses
      the entire contents of the file.


   .. method:: parsebytes(bytes, headersonly=False)

      Similar to the :meth:`parse` method, except it takes a :term:`bytes-like
      object` instead of a file-like object.  Calling this method on a
      :term:`bytes-like object` is equivalent to wrapping *bytes* in a
      :class:`~io.BytesIO` instance first and calling :meth:`parse`.

      Optional *headersonly* is as with the :meth:`parse` method.

   .. versionadded:: 3.2


.. class:: BytesHeaderParser(_class=None, *, policy=policy.compat32)

   Exactly like :class:`BytesParser`, except that *headersonly*
   defaults to ``True``.

   .. versionadded:: 3.3


.. class:: Parser(_class=None, *, policy=policy.compat32)

   This class is parallel to :class:`BytesParser`, but handles string input.

   .. versionchanged:: 3.3
      Removed the *strict* argument.  Added the *policy* keyword.
   .. versionchanged:: 3.6 *_class* defaults to the policy ``message_factory``.


   .. method:: parse(fp, headersonly=False)

      Read all the data from the text-mode file-like object *fp*, parse the
      resulting text, and return the root message object.  *fp* must support
      both the :meth:`~io.TextIOBase.readline` and the
      :meth:`~io.TextIOBase.read` methods on file-like objects.

      Other than the text mode requirement, this method operates like
      :meth:`BytesParser.parse`.


   .. method:: parsestr(text, headersonly=False)

      Similar to the :meth:`parse` method, except it takes a string object
      instead of a file-like object.  Calling this method on a string is
      equivalent to wrapping *text* in a :class:`~io.StringIO` instance first
      and calling :meth:`parse`.

      Optional *headersonly* is as with the :meth:`parse` method.


.. class:: HeaderParser(_class=None, *, policy=policy.compat32)

   Exactly like :class:`Parser`, except that *headersonly*
   defaults to ``True``.


Since creating a message object structure from a string or a file object is such
a common task, four functions are provided as a convenience.  They are available
in the top-level :mod:`email` package namespace.

.. currentmodule:: email


.. function:: message_from_bytes(s, _class=None, *, policy=policy.compat32)

   Return a message object structure from a :term:`bytes-like object`.  This is
   equivalent to ``BytesParser().parsebytes(s)``.  Optional *_class* and
   *policy* are interpreted as with the :class:`~email.parser.BytesParser` class
   constructor.

   .. versionadded:: 3.2
   .. versionchanged:: 3.3
      Removed the *strict* argument.  Added the *policy* keyword.


.. function:: message_from_binary_file(fp, _class=None, *, \
                                       policy=policy.compat32)

   Return a message object structure tree from an open binary :term:`file
   object`.  This is equivalent to ``BytesParser().parse(fp)``.  *_class* and
   *policy* are interpreted as with the :class:`~email.parser.BytesParser` class
   constructor.

   .. versionadded:: 3.2
   .. versionchanged:: 3.3
      Removed the *strict* argument.  Added the *policy* keyword.


.. function:: message_from_string(s, _class=None, *, policy=policy.compat32)

   Return a message object structure from a string.  This is equivalent to
   ``Parser().parsestr(s)``.  *_class* and *policy* are interpreted as
   with the :class:`~email.parser.Parser` class constructor.

   .. versionchanged:: 3.3
      Removed the *strict* argument.  Added the *policy* keyword.


.. function:: message_from_file(fp, _class=None, *, policy=policy.compat32)

   Return a message object structure tree from an open :term:`file object`.
   This is equivalent to ``Parser().parse(fp)``.  *_class* and *policy* are
   interpreted as with the :class:`~email.parser.Parser` class constructor.

   .. versionchanged:: 3.3
      Removed the *strict* argument.  Added the *policy* keyword.
   .. versionchanged:: 3.6 *_class* defaults to the policy ``message_factory``.


Here's an example of how you might use :func:`message_from_bytes` at an
interactive Python prompt::

   >>> import email
   >>> msg = email.message_from_bytes(myBytes)  # doctest: +SKIP


Additional notes
^^^^^^^^^^^^^^^^

Here are some notes on the parsing semantics:

* Most non-\ :mimetype:`multipart` type messages are parsed as a single message
  object with a string payload.  These objects will return ``False`` for
  :meth:`~email.message.EmailMessage.is_multipart`, and
  :meth:`~email.message.EmailMessage.iter_parts` will yield an empty list.

* All :mimetype:`multipart` type messages will be parsed as a container message
  object with a list of sub-message objects for their payload.  The outer
  container message will return ``True`` for
  :meth:`~email.message.EmailMessage.is_multipart`, and
  :meth:`~email.message.EmailMessage.iter_parts` will yield a list of subparts.

* Most messages with a content type of :mimetype:`message/\*` (such as
  :mimetype:`message/delivery-status` and :mimetype:`message/rfc822`) will also
  be parsed as container object containing a list payload of length 1.  Their
  :meth:`~email.message.EmailMessage.is_multipart` method will return ``True``.
  The single element yielded by :meth:`~email.message.EmailMessage.iter_parts`
  will be a sub-message object.

* Some non-standards-compliant messages may not be internally consistent about
  their :mimetype:`multipart`\ -edness.  Such messages may have a
  :mailheader:`Content-Type` header of type :mimetype:`multipart`, but their
  :meth:`~email.message.EmailMessage.is_multipart` method may return ``False``.
  If such messages were parsed with the :class:`~email.parser.FeedParser`,
  they will have an instance of the
  :class:`~email.errors.MultipartInvariantViolationDefect` class in their
  *defects* attribute list.  See :mod:`email.errors` for details.
