| 
									
										
										
										
											2012-05-27 17:10:36 -04:00
										 |  |  | :mod:`email.generator`: Generating MIME documents
 | 
					
						
							|  |  |  | -------------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. module:: email.generator
 | 
					
						
							|  |  |  |    :synopsis: Generate flat text email messages from a message structure.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-11 15:02:54 -04:00
										 |  |  | **Source code:** :source:`Lib/email/generator.py`
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | --------------
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  | 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
 | 
					
						
							|  |  |  | the :mod:`nntplib` module, 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".
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-24 21:50:35 +08:00
										 |  |  | To accommodate reproducible processing of SMIME-signed messages
 | 
					
						
							| 
									
										
										
										
											2018-11-05 03:42:34 +05:30
										 |  |  | :class:`Generator` disables header folding for message parts of type
 | 
					
						
							|  |  |  | ``multipart/signed`` and all subparts.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. class:: BytesGenerator(outfp, mangle_from_=None, maxheaderlen=None, *, \
 | 
					
						
							|  |  |  |                           policy=None)
 | 
					
						
							| 
									
										
										
										
											2011-04-18 13:59:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  |    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
 | 
					
						
							| 
									
										
										
										
											2017-12-06 22:09:33 +05:30
										 |  |  |    <https://www.jwz.org/doc/content-length.html>`_).
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |    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.
 | 
					
						
							| 
									
										
										
										
											2011-04-18 13:59:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  |    .. versionadded:: 3.2
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  |    .. versionchanged:: 3.3 Added the *policy* keyword.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  |    .. versionchanged:: 3.6 The default behavior of the *mangle_from_*
 | 
					
						
							|  |  |  |       and *maxheaderlen* parameters is to follow the policy.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  |    .. method:: flatten(msg, unixfrom=False, linesep=None)
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  |       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
 | 
					
						
							| 
									
										
										
										
											2017-05-19 14:37:57 -06:00
										 |  |  |       :mailheader:`Content-Transfer-Encoding`
 | 
					
						
							|  |  |  |       (:mailheader:`Content-Transfer-Encoding: 8bit`) to an ASCII compatible
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  |       :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``.
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |       Note that for subparts, no envelope header is ever printed.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  |       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*.
 | 
					
						
							| 
									
										
										
										
											2010-10-23 22:19:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  |       .. XXX: flatten should take a *policy* keyword.
 | 
					
						
							| 
									
										
										
										
											2010-10-08 15:55:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:59:09 +00:00
										 |  |  |    .. method:: clone(fp)
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  |       Return an independent clone of this :class:`BytesGenerator` instance with
 | 
					
						
							|  |  |  |       the exact same option settings, and *fp* as the new *outfp*.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  |    .. method:: write(s)
 | 
					
						
							| 
									
										
										
										
											2010-10-08 15:55:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  |       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.
 | 
					
						
							| 
									
										
										
										
											2010-10-23 22:19:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  | 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`.
 | 
					
						
							| 
									
										
										
										
											2010-10-23 22:19:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-06 21:33:18 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  | 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
 | 
					
						
							| 
									
										
										
										
											2017-12-06 22:09:33 +05:30
										 |  |  |    <https://www.jwz.org/doc/content-length.html>`_).
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |    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.
 | 
					
						
							| 
									
										
										
										
											2011-04-18 13:59:37 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. versionchanged:: 3.3 Added the *policy* keyword.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  |    .. versionchanged:: 3.6 The default behavior of the *mangle_from_*
 | 
					
						
							|  |  |  |       and *maxheaderlen* parameters is to follow the policy.
 | 
					
						
							| 
									
										
										
										
											2010-10-23 22:19:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-18 13:59:37 -04:00
										 |  |  |    .. method:: flatten(msg, unixfrom=False, linesep=None)
 | 
					
						
							| 
									
										
										
										
											2010-10-23 22:19:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       Print the textual representation of the message object structure rooted
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  |       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,
 | 
					
						
							| 
									
										
										
										
											2019-05-06 14:57:17 -04:00
										 |  |  |       transform parts with non-ASCII :mailheader:`Content-Transfer-Encoding`
 | 
					
						
							| 
									
										
										
										
											2018-04-20 23:08:45 +03:00
										 |  |  |       (:mailheader:`Content-Transfer-Encoding: 8bit`) to an ASCII compatible
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  |       :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``.
 | 
					
						
							| 
									
										
										
										
											2010-10-23 22:19:56 +00:00
										 |  |  |       Note that for subparts, no envelope header is ever printed.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  |       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.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-23 22:19:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. method:: clone(fp)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  |       Return an independent clone of this :class:`Generator` instance with the
 | 
					
						
							|  |  |  |       exact same options, and *fp* as the new *outfp*.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-23 22:19:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. method:: write(s)
 | 
					
						
							| 
									
										
										
										
											2010-10-08 15:55:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  |       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.
 | 
					
						
							| 
									
										
										
										
											2010-10-08 15:55:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  | 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`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  | 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.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 17:57:06 -04:00
										 |  |  | .. class:: DecodedGenerator(outfp, mangle_from_=None, maxheaderlen=None, \
 | 
					
						
							|  |  |  |                             fmt=None, *, policy=None)
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  |    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.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  |    To fill in *fmt*, execute ``fmt % part_info``, where ``part_info``
 | 
					
						
							|  |  |  |    is a dictionary composed of the following keys and values:
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    * ``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
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  |    If *fmt* is ``None``, use the following default *fmt*:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       "[Non-text (%(type)s) part of message omitted, filename %(filename)s]"
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  |    Optional *_mangle_from_* and *maxheaderlen* are as with the
 | 
					
						
							| 
									
										
										
										
											2016-09-08 17:57:06 -04:00
										 |  |  |    :class:`Generator` base class.
 | 
					
						
							| 
									
										
										
										
											2012-05-15 22:07:52 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. rubric:: Footnotes
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-07 21:15:59 -04:00
										 |  |  | .. [#] This statement assumes that you use the appropriate setting for
 | 
					
						
							|  |  |  |        ``unixfrom``, and that there are no :mod:`policy` settings calling for
 | 
					
						
							|  |  |  |        automatic adjustments (for example,
 | 
					
						
							|  |  |  |        :attr:`~email.policy.Policy.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.
 |