add files
This commit is contained in:
279
python-3.7.4-docs-html/_sources/library/email.generator.rst.txt
Normal file
279
python-3.7.4-docs-html/_sources/library/email.generator.rst.txt
Normal file
@@ -0,0 +1,279 @@
|
||||
: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".
|
||||
|
||||
|
||||
.. 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.
|
Reference in New Issue
Block a user