mirror of
https://github.com/python/cpython.git
synced 2024-12-03 14:55:56 +08:00
235 lines
11 KiB
ReStructuredText
235 lines
11 KiB
ReStructuredText
:mod:`email.generator`: 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=None)
|
|
|
|
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. If no *policy* is specified,
|
|
then the *policy* attached to the message object passed to :attr:`flatten`
|
|
is used.
|
|
|
|
.. 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 *msg*\'s or ``Generator``\'s ``policy``.
|
|
|
|
Because strings cannot represent non-ASCII bytes, if the policy that
|
|
applies when ``flatten`` is run has :attr:`~email.policy.Policy.cte_type`
|
|
set to ``8bit``, ``Generator`` will operate as if it were set to
|
|
``7bit``. 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.cte_type` is ``8bit`` (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
|
|
``cte_type`` is ``7bit``, the bytes will be converted as needed
|
|
using an ASCII-compatible 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]
|
|
|
|
|
|
.. rubric:: Footnotes
|
|
|
|
.. [#] This statement assumes that you use the appropriate setting for the
|
|
``unixfrom`` argument, and that you set maxheaderlen=0 (which will
|
|
preserve whatever the input line lengths were). It is also not strictly
|
|
true, since in many cases runs of whitespace in headers are collapsed
|
|
into single blanks. The latter is a bug that will eventually be fixed.
|