:mod:`!email.generator`: Generating MIME documents
--------------------------------------------------

.. module:: email.generator
   :synopsis: Generate flat text email messages from a message structure.

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

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

One of the most common tasks is to generate the flat (serialized) version of
the email message represented by a message object structure.  You will need to
do this if you want to send your message via :meth:`smtplib.SMTP.sendmail`,
or print the message on the console.  Taking a
message object structure and producing a serialized representation is the job
of the generator classes.

As with the :mod:`email.parser` module, you aren't limited to the functionality
of the bundled generator; you could write one from scratch yourself.  However
the bundled generator knows how to generate most email in a standards-compliant
way, should handle MIME and non-MIME email messages just fine, and is designed
so that the bytes-oriented parsing and generation operations are inverses,
assuming the same non-transforming :mod:`~email.policy` is used for both.  That
is, parsing the serialized byte stream via the
:class:`~email.parser.BytesParser` class and then regenerating the serialized
byte stream using :class:`BytesGenerator` should produce output identical to
the input [#]_.  (On the other hand, using the generator on an
:class:`~email.message.EmailMessage` constructed by program may result in
changes to the :class:`~email.message.EmailMessage` object as defaults are
filled in.)

The :class:`Generator` class can be used to flatten a message into a text (as
opposed to binary) serialized representation, but since Unicode cannot
represent binary data directly, the message is of necessity transformed into
something that contains only ASCII characters, using the standard email RFC
Content Transfer Encoding techniques for encoding email messages for transport
over channels that are not "8 bit clean".

To accommodate reproducible processing of SMIME-signed messages
:class:`Generator` disables header folding for message parts of type
``multipart/signed`` and all subparts.


.. class:: BytesGenerator(outfp, mangle_from_=None, maxheaderlen=None, *, \
                          policy=None)

   Return a :class:`BytesGenerator` object that will write any message provided
   to the :meth:`flatten` method, or any surrogateescape encoded text provided
   to the :meth:`write` method, to the :term:`file-like object` *outfp*.
   *outfp* must support a ``write`` method that accepts binary data.

   If optional *mangle_from_* is ``True``, put a ``>`` character in front of
   any line in the body that starts with the exact string ``"From "``, that is
   ``From`` followed by a space at the beginning of a line.  *mangle_from_*
   defaults to the value of the :attr:`~email.policy.Policy.mangle_from_`
   setting of the *policy* (which is ``True`` for the
   :data:`~email.policy.compat32` policy and ``False`` for all others).
   *mangle_from_* is intended for use when messages are stored in Unix mbox
   format (see :mod:`mailbox` and `WHY THE CONTENT-LENGTH FORMAT IS BAD
   <https://www.jwz.org/doc/content-length.html>`_).

   If *maxheaderlen* is not ``None``, refold any header lines that are longer
   than *maxheaderlen*, or if ``0``, do not rewrap any headers.  If
   *manheaderlen* is ``None`` (the default), wrap headers and other message
   lines according to the *policy* settings.

   If *policy* is specified, use that policy to control message generation.  If
   *policy* is ``None`` (the default), use the policy associated with the
   :class:`~email.message.Message` or :class:`~email.message.EmailMessage`
   object passed to ``flatten`` to control the message generation.  See
   :mod:`email.policy` for details on what *policy* controls.

   .. versionadded:: 3.2

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

   .. versionchanged:: 3.6 The default behavior of the *mangle_from_*
      and *maxheaderlen* parameters is to follow the policy.


   .. method:: flatten(msg, unixfrom=False, linesep=None)

      Print the textual representation of the message object structure rooted
      at *msg* to the output file specified when the :class:`BytesGenerator`
      instance was created.

      If the :mod:`~email.policy` option :attr:`~email.policy.Policy.cte_type`
      is ``8bit`` (the default), copy any headers in the original parsed
      message that have not been modified to the output with any bytes with the
      high bit set reproduced as in the original, and preserve the non-ASCII
      :mailheader:`Content-Transfer-Encoding` of any body parts that have them.
      If ``cte_type`` is ``7bit``, convert the bytes with the high bit set as
      needed using an ASCII-compatible :mailheader:`Content-Transfer-Encoding`.
      That is, transform parts with non-ASCII
      :mailheader:`Content-Transfer-Encoding`
      (:mailheader:`Content-Transfer-Encoding: 8bit`) to an ASCII compatible
      :mailheader:`Content-Transfer-Encoding`, and encode RFC-invalid non-ASCII
      bytes in headers using the MIME ``unknown-8bit`` character set, thus
      rendering them RFC-compliant.

      .. XXX: There should be an option that just does the RFC
         compliance transformation on headers but leaves CTE 8bit parts alone.

      If *unixfrom* is ``True``, print the envelope header delimiter used by
      the Unix mailbox format (see :mod:`mailbox`) before the first of the
      :rfc:`5322` headers of the root message object.  If the root object has
      no envelope header, craft a standard one.  The default is ``False``.
      Note that for subparts, no envelope header is ever printed.

      If *linesep* is not ``None``, use it as the separator character between
      all the lines of the flattened message.  If *linesep* is ``None`` (the
      default), use the value specified in the *policy*.

      .. XXX: flatten should take a *policy* keyword.


   .. method:: clone(fp)

      Return an independent clone of this :class:`BytesGenerator` instance with
      the exact same option settings, and *fp* as the new *outfp*.


   .. method:: write(s)

      Encode *s* using the ``ASCII`` codec and the ``surrogateescape`` error
      handler, and pass it to the *write* method of the *outfp* passed to the
      :class:`BytesGenerator`'s constructor.


As a convenience, :class:`~email.message.EmailMessage` provides the methods
:meth:`~email.message.EmailMessage.as_bytes` and ``bytes(aMessage)`` (a.k.a.
:meth:`~email.message.EmailMessage.__bytes__`), which simplify the generation of
a serialized binary representation of a message object.  For more detail, see
:mod:`email.message`.


Because strings cannot represent binary data, the :class:`Generator` class must
convert any binary data in any message it flattens to an ASCII compatible
format, by converting them to an ASCII compatible
:mailheader:`Content-Transfer_Encoding`.  Using the terminology of the email
RFCs, you can think of this as :class:`Generator` serializing to an I/O stream
that is not "8 bit clean".  In other words, most applications will want
to be using :class:`BytesGenerator`, and not :class:`Generator`.

.. class:: Generator(outfp, mangle_from_=None, maxheaderlen=None, *, \
                     policy=None)

   Return a :class:`Generator` object that will write any message provided
   to the :meth:`flatten` method, or any text provided to the :meth:`write`
   method, to the :term:`file-like object` *outfp*.  *outfp* must support a
   ``write`` method that accepts string data.

   If optional *mangle_from_* is ``True``, put a ``>`` character in front of
   any line in the body that starts with the exact string ``"From "``, that is
   ``From`` followed by a space at the beginning of a line.  *mangle_from_*
   defaults to the value of the :attr:`~email.policy.Policy.mangle_from_`
   setting of the *policy* (which is ``True`` for the
   :data:`~email.policy.compat32` policy and ``False`` for all others).
   *mangle_from_* is intended for use when messages are stored in Unix mbox
   format (see :mod:`mailbox` and `WHY THE CONTENT-LENGTH FORMAT IS BAD
   <https://www.jwz.org/doc/content-length.html>`_).

   If *maxheaderlen* is not ``None``, refold any header lines that are longer
   than *maxheaderlen*, or if ``0``, do not rewrap any headers.  If
   *manheaderlen* is ``None`` (the default), wrap headers and other message
   lines according to the *policy* settings.

   If *policy* is specified, use that policy to control message generation.  If
   *policy* is ``None`` (the default), use the policy associated with the
   :class:`~email.message.Message` or :class:`~email.message.EmailMessage`
   object passed to ``flatten`` to control the message generation.  See
   :mod:`email.policy` for details on what *policy* controls.

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

   .. versionchanged:: 3.6 The default behavior of the *mangle_from_*
      and *maxheaderlen* parameters is to follow the policy.


   .. method:: flatten(msg, unixfrom=False, linesep=None)

      Print the textual representation of the message object structure rooted
      at *msg* to the output file specified when the :class:`Generator`
      instance was created.

      If the :mod:`~email.policy` option :attr:`~email.policy.Policy.cte_type`
      is ``8bit``, generate the message as if the option were set to ``7bit``.
      (This is required because strings cannot represent non-ASCII bytes.)
      Convert any bytes with the high bit set as needed using an
      ASCII-compatible :mailheader:`Content-Transfer-Encoding`.  That is,
      transform parts with non-ASCII :mailheader:`Content-Transfer-Encoding`
      (:mailheader:`Content-Transfer-Encoding: 8bit`) to an ASCII compatible
      :mailheader:`Content-Transfer-Encoding`, and encode RFC-invalid non-ASCII
      bytes in headers using the MIME ``unknown-8bit`` character set, thus
      rendering them RFC-compliant.

      If *unixfrom* is ``True``, print the envelope header delimiter used by
      the Unix mailbox format (see :mod:`mailbox`) before the first of the
      :rfc:`5322` headers of the root message object.  If the root object has
      no envelope header, craft a standard one.  The default is ``False``.
      Note that for subparts, no envelope header is ever printed.

      If *linesep* is not ``None``, use it as the separator character between
      all the lines of the flattened message.  If *linesep* is ``None`` (the
      default), use the value specified in the *policy*.

      .. XXX: flatten should take a *policy* keyword.

      .. versionchanged:: 3.2
         Added support for re-encoding ``8bit`` message bodies, and the
         *linesep* argument.


   .. method:: clone(fp)

      Return an independent clone of this :class:`Generator` instance with the
      exact same options, and *fp* as the new *outfp*.


   .. method:: write(s)

      Write *s* to the *write* method of the *outfp* passed to the
      :class:`Generator`'s constructor.  This provides just enough file-like
      API for :class:`Generator` instances to be used in the :func:`print`
      function.


As a convenience, :class:`~email.message.EmailMessage` provides the methods
:meth:`~email.message.EmailMessage.as_string` and ``str(aMessage)`` (a.k.a.
:meth:`~email.message.EmailMessage.__str__`), which simplify the generation of
a formatted string representation of a message object.  For more detail, see
:mod:`email.message`.


The :mod:`!email.generator` module also provides a derived class,
:class:`DecodedGenerator`, which is like the :class:`Generator` base class,
except that non-\ :mimetype:`text` parts are not serialized, but are instead
represented in the output stream by a string derived from a template filled
in with information about the part.

.. class:: DecodedGenerator(outfp, mangle_from_=None, maxheaderlen=None, \
                            fmt=None, *, policy=None)

   Act like :class:`Generator`, except that for any subpart of the message
   passed to :meth:`Generator.flatten`, if the subpart is of main type
   :mimetype:`text`, print the decoded payload of the subpart, and if the main
   type is not :mimetype:`text`, instead of printing it fill in the string
   *fmt* using information from the part and print the resulting
   filled-in string.

   To fill in *fmt*, execute ``fmt % part_info``, where ``part_info``
   is a dictionary composed of the following keys and values:

   * ``type`` -- Full MIME type of the non-\ :mimetype:`text` part

   * ``maintype`` -- Main MIME type of the non-\ :mimetype:`text` part

   * ``subtype`` -- Sub-MIME type of the non-\ :mimetype:`text` part

   * ``filename`` -- Filename of the non-\ :mimetype:`text` part

   * ``description`` -- Description associated with the non-\ :mimetype:`text` part

   * ``encoding`` -- Content transfer encoding of the non-\ :mimetype:`text` part

   If *fmt* is ``None``, use the following default *fmt*:

      "[Non-text (%(type)s) part of message omitted, filename %(filename)s]"

   Optional *_mangle_from_* and *maxheaderlen* are as with the
   :class:`Generator` base class.


.. rubric:: Footnotes

.. [#] This statement assumes that you use the appropriate setting for
       ``unixfrom``, and that there are no :mod:`email.policy` settings calling for
       automatic adjustments (for example,
       :attr:`~email.policy.EmailPolicy.refold_source` must be ``none``, which is
       *not* the default).  It is also not 100% true, since if the message
       does not conform to the RFC standards occasionally information about the
       exact original text is lost during parsing error recovery.  It is a goal
       to fix these latter edge cases when possible.
