email.generator
: 生成 MIME 文档
¶
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
smtplib.SMTP.sendmail()
或
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.
就像
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
policy
is used for both. That is, parsing the serialized byte stream via the
BytesParser
class and then regenerating the serialized byte stream using
BytesGenerator
should produce output identical to the input
[1]
. (On the other hand, using the generator on an
EmailMessage
constructed by program may result in changes to the
EmailMessage
object as defaults are filled in.)
生成器
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”.
email.generator.
BytesGenerator
(
outfp
,
mangle_from_=None
,
maxheaderlen=None
,
*
,
policy=None
)
¶
返回
BytesGenerator
object that will write any message provided to the
flatten()
method, or any surrogateescape encoded text provided to the
write()
method, to the
像文件对象
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
mangle_from_
setting of the
policy
(which is
True
为
compat32
policy and
False
for all others).
mangle_from_
is intended for use when messages are stored in unix mbox format (see
mailbox
and
WHY THE CONTENT-LENGTH FORMAT IS BAD
).
若
maxheaderlen
不是
None
, refold any header lines that are longer than
maxheaderlen
,或者若
0
, do not rewrap any headers. If
manheaderlen
is
None
(the default), wrap headers and other message lines according to the
policy
settings.
若
policy
is specified, use that policy to control message generation. If
policy
is
None
(the default), use the policy associated with the
Message
or
EmailMessage
object passed to
flatten
to control the message generation. See
email.policy
for details on what
policy
controls.
3.2 版新增。
3.3 版改变: 添加 policy keyword.
3.6 版改变: The default behavior of the mangle_from_ and maxheaderlen parameters is to follow the policy.
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
BytesGenerator
instance was created.
若
policy
option
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
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
Content-Transfer-Encoding
. That is, transform parts with non-ASCII
Content-Transfer-Encoding
(
Content-Transfer-Encoding: 8bit
) to an ASCII compatible
Content-Transfer-Encoding
, and encode RFC-invalid non-ASCII bytes in headers using the MIME
unknown-8bit
character set, thus rendering them RFC-compliant.
若
unixfrom
is
True
, print the envelope header delimiter used by the Unix mailbox format (see
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.
若
linesep
不是
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
.
clone
(
fp
)
¶
Return an independent clone of this
BytesGenerator
instance with the exact same option settings, and
fp
as the new
outfp
.
write
(
s
)
¶
编码
s
使用
ASCII
codec and the
surrogateescape
error handler, and pass it to the
write
方法在
outfp
passed to the
BytesGenerator
’s constructor.
As a convenience,
EmailMessage
provides the methods
as_bytes()
and
bytes(aMessage)
(a.k.a.
__bytes__()
), which simplify the generation of a serialized binary representation of a message object. For more detail, see
email.message
.
Because strings cannot represent binary data, the
生成器
class must convert any binary data in any message it flattens to an ASCII compatible format, by converting them to an ASCII compatible
Content-Transfer_Encoding
. Using the terminology of the email RFCs, you can think of this as
生成器
serializing to an I/O stream that is not “8 bit clean”. In other words, most applications will want to be using
BytesGenerator
, and not
生成器
.
email.generator.
生成器
(
outfp
,
mangle_from_=None
,
maxheaderlen=None
,
*
,
policy=None
)
¶
返回
生成器
object that will write any message provided to the
flatten()
method, or any text provided to the
write()
method, to the
像文件对象
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
mangle_from_
setting of the
policy
(which is
True
为
compat32
policy and
False
for all others).
mangle_from_
is intended for use when messages are stored in unix mbox format (see
mailbox
and
WHY THE CONTENT-LENGTH FORMAT IS BAD
).
若
maxheaderlen
不是
None
, refold any header lines that are longer than
maxheaderlen
,或者若
0
, do not rewrap any headers. If
manheaderlen
is
None
(the default), wrap headers and other message lines according to the
policy
settings.
若
policy
is specified, use that policy to control message generation. If
policy
is
None
(the default), use the policy associated with the
Message
or
EmailMessage
object passed to
flatten
to control the message generation. See
email.policy
for details on what
policy
controls.
3.3 版改变: 添加 policy keyword.
3.6 版改变: The default behavior of the mangle_from_ and maxheaderlen parameters is to follow the policy.
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
生成器
instance was created.
若
policy
option
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
Content-Transfer-Encoding
. That is, transform parts with non-ASCII
Cotnent-Transfer-Encoding
(
Content-Transfer-Encoding: 8bit
) to an ASCII compatible
Content-Transfer-Encoding
, and encode RFC-invalid non-ASCII bytes in headers using the MIME
unknown-8bit
character set, thus rendering them RFC-compliant.
若
unixfrom
is
True
, print the envelope header delimiter used by the Unix mailbox format (see
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.
若
linesep
不是
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
.
3.2 版改变:
Added support for re-encoding
8bit
message bodies, and the
linesep
自变量。
As a convenience,
EmailMessage
provides the methods
as_string()
and
str(aMessage)
(a.k.a.
__str__()
), which simplify the generation of a formatted string representation of a message object. For more detail, see
email.message
.
email.generator
module also provides a derived class,
DecodedGenerator
, which is like the
生成器
base class, except that non-
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.
email.generator.
DecodedGenerator
(
outfp
,
mangle_from_=None
,
maxheaderlen=None
,
fmt=None
,
*
,
policy=None
)
¶
Act like
生成器
, except that for any subpart of the message passed to
Generator.flatten()
, if the subpart is of main type
text
, print the decoded payload of the subpart, and if the main type is not
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
,其中
part_info
is a dictionary composed of the following keys and values:
type
– Full MIME type of the non-
text
part
maintype
– Main MIME type of the non-
text
part
subtype
– Sub-MIME type of the non-
text
part
filename
– Filename of the non-
text
part
description
– Description associated with the non-
text
part
encoding
– Content transfer encoding of the non-
text
part
若
fmt
is
None
, use the following default
fmt
:
“[Non-text (%(type)s) part of message omitted, filename %(filename)s]”
可选
_mangle_from_
and
maxheaderlen
are as with the
生成器
基类。
脚注
| [1] |
This statement assumes that you use the appropriate setting for
unixfrom
, and that there are no
policy
settings calling for automatic adjustments (for example,
refold_source
必须是
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.
|