:mod:`email`: Generating MIME documents
---------------------------------------

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


One of the most common tasks is to generate the flat text of the email message
represented by a message object structure.  You will need to do this if you want
to send your message via the :mod:`smtplib` module or the :mod:`nntplib` module,
or print the message on the console.  Taking a message object structure and
producing a flat text document is the job of the :class:`Generator` class.

Again, 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 transformation from flat text, to a message
structure via the :class:`~email.parser.Parser` class, and back to flat text,
is idempotent (the input is identical to the output).  On the other hand, using
the Generator on a :class:`~email.message.Message` constructed by program may
result in changes to the :class:`~email.message.Message` object as defaults are
filled in.

:class:`bytes` output can be generated using the :class:`BytesGenerator` class.
If the message object structure contains non-ASCII bytes, this generator's
:meth:`~BytesGenerator.flatten` method will emit the original bytes.  Parsing a
binary message and then flattening it with :class:`BytesGenerator` should be
idempotent for standards compliant messages.

Here are the public methods of the :class:`Generator` class, imported from the
:mod:`email.generator` module:


.. class:: Generator(outfp, mangle_from_=True, maxheaderlen=78, *, \
                     policy=policy.default)

   The constructor for the :class:`Generator` class takes a :term:`file-like object`
   called *outfp* for an argument.  *outfp* must support the :meth:`write` method
   and be usable as the output file for the :func:`print` function.

   Optional *mangle_from_* is a flag that, when ``True``, puts a ``>`` character in
   front of any line in the body that starts exactly as ``From``, i.e. ``From``
   followed by a space at the beginning of the line.  This is the only guaranteed
   portable way to avoid having such lines be mistaken for a Unix mailbox format
   envelope header separator (see `WHY THE CONTENT-LENGTH FORMAT IS BAD
   <http://www.jwz.org/doc/content-length.html>`_ for details).  *mangle_from_*
   defaults to ``True``, but you might want to set this to ``False`` if you are not
   writing Unix mailbox format files.

   Optional *maxheaderlen* specifies the longest length for a non-continued header.
   When a header line is longer than *maxheaderlen* (in characters, with tabs
   expanded to 8 spaces), the header will be split as defined in the
   :class:`~email.header.Header` class.  Set to zero to disable header wrapping.
   The default is 78, as recommended (but not required) by :rfc:`2822`.

   The *policy* keyword specifies a :mod:`~email.policy` object that controls a
   number of aspects of the generator's operation.  The default policy
   maintains backward compatibility.

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

   The other public :class:`Generator` methods are:


   .. 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.  Subparts are visited depth-first and the resulting text will
      be properly MIME encoded.

      Optional *unixfrom* is a flag that forces the printing of the envelope
      header delimiter before the first :rfc:`2822` header of the root message
      object.  If the root object has no envelope header, a standard one is
      crafted.  By default, this is set to ``False`` to inhibit the printing of
      the envelope delimiter.

      Note that for subparts, no envelope header is ever printed.

      Optional *linesep* specifies the line separator character used to
      terminate lines in the output.  If specified it overrides the value
      specified by the ``Generator``\'s ``policy``.

      Because strings cannot represent non-ASCII bytes, ``Generator`` ignores
      the value of the :attr:`~email.policy.Policy.must_be_7bit`
      :mod:`~email.policy` setting and operates as if it were set ``True``.
      This means that messages parsed with a Bytes parser that have a
      :mailheader:`Content-Transfer-Encoding` of 8bit will be converted to a
      use a 7bit Content-Transfer-Encoding.  Non-ASCII bytes in the headers
      will be :rfc:`2047` encoded with a charset of `unknown-8bit`.

      .. 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.

   .. method:: write(s)

      Write the string *s* to the underlying file object, i.e. *outfp* passed to
      :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, see the :class:`~email.message.Message` methods
:meth:`~email.message.Message.as_string` and ``str(aMessage)``, a.k.a.
:meth:`~email.message.Message.__str__`, which simplify the generation of a
formatted string representation of a message object.  For more detail, see
:mod:`email.message`.

.. class:: BytesGenerator(outfp, mangle_from_=True, maxheaderlen=78, *, \
                          policy=policy.default)

   The constructor for the :class:`BytesGenerator` class takes a binary
   :term:`file-like object` called *outfp* for an argument.  *outfp* must
   support a :meth:`write` method that accepts binary data.

   Optional *mangle_from_* is a flag that, when ``True``, puts a ``>``
   character in front of any line in the body that starts exactly as ``From``,
   i.e. ``From`` followed by a space at the beginning of the line.  This is the
   only guaranteed portable way to avoid having such lines be mistaken for a
   Unix mailbox format envelope header separator (see `WHY THE CONTENT-LENGTH
   FORMAT IS BAD <http://www.jwz.org/doc/content-length.html>`_ for details).
   *mangle_from_* defaults to ``True``, but you might want to set this to
   ``False`` if you are not writing Unix mailbox format files.

   Optional *maxheaderlen* specifies the longest length for a non-continued
   header.  When a header line is longer than *maxheaderlen* (in characters,
   with tabs expanded to 8 spaces), the header will be split as defined in the
   :class:`~email.header.Header` class.  Set to zero to disable header
   wrapping.  The default is 78, as recommended (but not required) by
   :rfc:`2822`.

   The *policy* keyword specifies a :mod:`~email.policy` object that controls a
   number of aspects of the generator's operation.  The default policy
   maintains backward compatibility.

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

   The other public :class:`BytesGenerator` methods are:


   .. 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.  Subparts are visited depth-first and the resulting
      text will be properly MIME encoded.  If the :mod:`~email.policy` option
      :attr:`~email.policy.Policy.must_be_7bit` is ``False`` (the default),
      then any bytes with the high bit set in the original parsed message that
      have not been modified will be copied faithfully to the output.  If
      ``must_be_7bit`` is true, the bytes will be converted as needed using an
      ASCII content-transfer-encoding.  In particular, RFC-invalid non-ASCII
      bytes in headers will be encoded using the MIME ``unknown-8bit``
      character set, thus rendering them RFC-compliant.

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

      Messages parsed with a Bytes parser that have a
      :mailheader:`Content-Transfer-Encoding` of 8bit will be reconstructed
      as 8bit if they have not been modified.

      Optional *unixfrom* is a flag that forces the printing of the envelope
      header delimiter before the first :rfc:`2822` header of the root message
      object.  If the root object has no envelope header, a standard one is
      crafted.  By default, this is set to ``False`` to inhibit the printing of
      the envelope delimiter.

      Note that for subparts, no envelope header is ever printed.

      Optional *linesep* specifies the line separator character used to
      terminate lines in the output.  If specified it overrides the value
      specified by the ``Generator``\ 's ``policy``.

   .. method:: clone(fp)

      Return an independent clone of this :class:`BytesGenerator` instance with
      the exact same options.

   .. method:: write(s)

      Write the string *s* to the underlying file object.  *s* is encoded using
      the ``ASCII`` codec and written to the *write* method of the  *outfp*
      *outfp* passed to the :class:`BytesGenerator`'s constructor.  This
      provides just enough file-like API for :class:`BytesGenerator` instances
      to be used in the :func:`print` function.

   .. versionadded:: 3.2

The :mod:`email.generator` module also provides a derived class, called
:class:`DecodedGenerator` which is like the :class:`Generator` base class,
except that non-\ :mimetype:`text` parts are substituted with a format string
representing the part.


.. class:: DecodedGenerator(outfp[, mangle_from_=True, maxheaderlen=78, fmt=None)

   This class, derived from :class:`Generator` walks through all the subparts of a
   message.  If the subpart is of main type :mimetype:`text`, then it prints the
   decoded payload of the subpart. Optional *_mangle_from_* and *maxheaderlen* are
   as with the :class:`Generator` base class.

   If the subpart is not of main type :mimetype:`text`, optional *fmt* is a format
   string that is used instead of the message payload. *fmt* is expanded with the
   following keywords, ``%(keyword)s`` format:

   * ``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

   The default value for *fmt* is ``None``, meaning ::

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