| :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 | |
| 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". | |
| 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:`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. |