email.message: Representing an email message
email.message: Representing an email message
email
包中的中心类是Message
从email.message
模块导入的类。它是email
对象模型的基类。Message
提供了设置和查询标题字段以及访问消息体的核心功能。
从概念上讲,一个Message
对象由标题
和有效载荷组成
。标题
是RFC 2822
风格的字段名称和值,其中字段名称和值由冒号分隔。冒号不是字段名称或字段值的一部分。
标题以保存案例的形式存储和返回,但不区分大小写。也可能有一个信封头,也称为Unix-From
头或From_
头。负载是简单消息对象的字符串或Message
MIME容器文档的对象列表(例如multipart / *
和message / rfc822
)。
Message
对象提供一个用于访问消息头的映射样式接口,以及一个用于访问头和净荷的显式接口。它为生成消息对象树的平面文本表示,访问常用头参数以及递归遍历对象树提供了便利的方法。
这里是这个Message
类的方法:
class email.message.Message
构造函数不带任何参数。
as_string([unixfrom])
将整个消息以字符串的形式展平。当可选的unixfrom
是True
,信封头包含在返回的字符串中。unixfrom
默认为False
。Message
如果需要填充默认值以完成对字符串的转换(例如,可能会生成或修改MIME边界),则消除该消息可能会触发更改。
请注意,此方法是为了方便而提供的,可能并不总是按照您想要的方式格式化消息。例如,默认情况下,它会破坏以其开头的行From
。为了更灵活,实例化一个Generator
实例并flatten()
直接使用它的方法。例如:
from cStringIO import StringIO
from email.generator import Generator
fp = StringIO()
g = Generator(fp, mangle_from_=False, maxheaderlen=60)
g.flatten(msg)
text = fp.getvalue()
__str__()
相当于as_string(unixfrom=True)
。
is_multipart()
返回True
如果消息的有效载荷子的列表Message
对象,否则返回False
。当is_multipart()
返回False
时,有效载荷应该是一个字符串对象。
set_unixfrom(unixfrom)
将消息的信封头设置为unixfrom
,它应该是一个字符串。
get_unixfrom()
返回消息的信封头。默认为None
如果信封头从未设置。
attach(payload)
将给定的有效负载
添加到当前有效负载
,该有效负载
必须是调用前的对象None
列表Message
。调用之后,有效负载
将始终是Message
对象列表。如果你想将有效负载
设置为标量对象(例如字符串),请set_payload()
改为使用。
get_payload([i[, decode]])
返回当前的有效载荷,这将是一个列表Message
,当对象is_multipart()
是True
时,或者一个字符串is_multipart()
是False
。如果有效载荷是一个列表,并且您改变了列表对象,那么您可以修改消息的有效载荷。
使用可选参数i
,get_payload()
将返回有效负载的第i
个元素,如果is_multipart()
是从零开始计数True
。一个IndexError
如果将提高我
是大于或等于在所述有效载荷的项目数小于0或。如果有效负载是一个字符串(即is_multipart()
是False
)并且我
给出,一个TypeError
上升。
根据Content-Transfer-Encoding
标头,可选解码
是指示是否应解码
有效载荷的标志。当和消息不是多部分时,如果该头部的值为或,则有效载荷将被解码
。如果使用其他编码,或Content-Transfer-Encoding
标头丢失,或者有效负载具有伪造的base64数据,则有效负载将按原样返回(未解码
)。如果消息是多部分并且解码
标记是,则返回。解码
的默认值是。Truequoted-printablebase64TrueNoneFalse
set_payload(payload[, charset])
将整个消息对象的有效载荷
设置为有效载荷
。确保有效载荷
不变量是客户的责任。可选字符集
设置消息的默认字符集
; set_charset()
详情请参阅。
在版本2.2.2中更改:添加了charset
参数。
set_charset(charset)
将有效负载的字符集设置为charset
,它可以是Charset
实例(请参阅email.charset
),命名字符集的字符串或None
。如果它是一个字符串,它将被转换为一个Charset
实例。如果charset
是None
,则该charset
参数将从Content-Type
头中删除(该消息不会被修改)。其他任何东西都会生成一个TypeError
。
如果没有现有的MIME-Version
标头,则会添加一个。如果没有现有的Content-Type
标头,则会添加一个值为text / plain
的值。Content-Type
头是否已经存在,其charset
参数将被设置为charset.output_charset
。如果charset.input_charset
和charset.output_charset
不同,负载将被重新编码到output_charset
。如果没有现有的Content-Transfer-Encoding
头部,则有效载荷将在需要时使用指定的进行传输编码Charset
,并且将添加具有适当值的头部。如果一个Content-Transfer-Encoding
头已经存在,假定已经使用该Content-Transfer-Encoding
正确地编码了有效载荷,并且没有被修改。
该消息将被假定为text / *
类型,有效负载可以是unicode或使用charset.input_charset
编码。当生成消息的纯文本表示时,它将被编码或转换为charset.output_charset
并在需要时正确传输编码。将根据需要添加MIME头(MIME版本
,内容类型
,内容传输编码
)。
2.2.2版中的新功能。
get_charset()
返回Charset
与消息有效负载相关的实例。
2.2.2版中的新功能。
以下方法实现一个类似映射的接口来访问消息的RFC 2822
标头。请注意,这些方法和普通映射(即字典)界面之间存在一些语义差异。例如,在字典中没有重复的键,但这里可能有重复的消息标题。另外,在字典中,对返回的键没有保证的顺序keys()
,但是在Message
对象中,标题总是按照它们在原始消息中出现的顺序返回,或者在稍后添加到消息中。任何删除然后重新添加的标题总是附加到标题列表的末尾。
这些语义差异是有意的,并且偏向于最大的方便。
Note that in all cases, any envelope header present in the message is not included in the mapping interface.
__len__()
返回标题的总数,包括重复项。
__contains__(name)
如果消息对象具有名为name
的字段,则返回true 。匹配不区分大小写,名称
不应包含尾部冒号。用于in
操作员,例如:
if 'message-id' in myMessage:
print 'Message-ID:', myMessage['message-id']
__getitem__(name)
返回指定标题字段的值。名称
不应包含冒号字段分隔符。如果标题丢失,None
则返回; a KeyError
永远不会升起。
请注意,如果命名字段在消息头中多次出现,那么将返回那些字段值中的哪些值是未定义的。使用该get_all()
方法获取所有现存命名标题的值。
__setitem__(name, val)
将字段添加到带有字段名称
和值val
的消息中。该字段附加到消息现有字段的末尾。
请注意,这并不能
覆盖或删除任何现有的头名称
相同。如果要确保新标题是带有字段名称
名称
的消息中唯一存在的标题,请先删除该字段,例如:
del msg['subject']
msg['subject'] = 'Python roolz!'
__delitem__(name)
从消息的标题中删除所有出现的具有名称
名称
的字段。如果名称
字段不存在于标题中,则不会引发异常。
has_key(name)
如果消息包含名为name
的头字段,则返回true,否则返回false。
keys()
返回所有消息标题字段名称的列表。
values()
返回所有消息字段值的列表。
items()
返回包含所有消息的字段标题和值的2元组列表。
get(name[, failobj])
返回指定标题字段的值。这与__getitem__()
除了如果命名标题丢失(缺省为)时返回可选failobj
相同None
。
以下是一些其他有用的方法:
get_all(name[, failobj])
返回名为name
的字段的所有值的列表。如果消息中没有这样的标题,则返回failobj
(默认为None
)。
add_header(_name, _value, **_params)
扩展标题设置。__setitem__()
除了可以提供额外的头部参数作为关键字参数之外,此方法类似。_name
是要添加的标题字段,而_value
是标题的主要
值。
对于关键字参数字典_params
中的每个项目,都将该关键字作为参数名称,并将下划线转换为破折号(因为破折号在Python标识符中是非法的)。通常,该参数将被添加,key="value"
除非该值为None
,在这种情况下,只有该键将被添加。如果该值包含非ASCII字符,则必须将其指定为格式中的三元组(CHARSET, LANGUAGE, VALUE)
,其中CHARSET
是指定用于对值进行编码的字符集的字符串,LANGUAGE
通常可以设置为None
空字符串(请参阅RFC 2231
for其他可能性),并且VALUE
是包含非ASCII码点的字符串值。
这是一个例子:
msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')
这将添加一个看起来像的标题
Content-Disposition: attachment; filename="bud.gif"
非ASCII字符的示例:
msg.add_header('Content-Disposition', 'attachment',
filename=('iso-8859-1', '', 'Fußballer.ppt'))
哪产生
Content-Disposition: attachment; filename*="iso-8859-1''Fu%DFballer.ppt"
replace_header(_name, _value)
替换标题。替换消息中找到的与_name
匹配的第一个标头,保留标头顺序和字段名称大小写。如果找不到匹配的标题,KeyError
则会引发。
2.2.2版中的新功能。
get_content_type()
返回消息的内容类型。将返回的字符串强制为maintype / subtype
形式的小写字母
。如果消息中没有Content-Type
头,则get_default_type()
返回给定的默认类型。由于根据RFC 2045
,消息始终有一个默认类型,get_content_type()
将始终返回一个值。
RFC 2045
将消息的默认类型定义为 text / plain,
除非它出现在 multipart / digest
容器中,在这种情况下,它将是 message / rfc822
。如果 Content-Type
头的类型规范无效,则 RFC 2045
要求默认类型为 text / plain
。
2.2.2版中的新功能。
get_content_maintype()
返回消息的主要内容类型。这是返回的字符串的maintype
部分get_content_type()
。
2.2.2版中的新功能。
get_content_subtype()
返回消息的子内容类型。这是返回的字符串的子类型
部分get_content_type()
。
2.2.2版中的新功能。
get_default_type()
返回默认的内容类型。除了作为多部分/摘要
容器的子部分的
消息之外,大多数消息具有默认的文本/纯文本
内容类型。这样的子部分有一个默认的内容类型的消息/ rfc822
。
2.2.2版中的新功能。
set_default_type(ctype)
设置默认的内容类型。ctype
应该是text / plain
或message / rfc822
,尽管这不是强制执行的。默认内容类型不存储在Content-Type
标头中。
2.2.2版中的新功能。
get_params([failobj[, header[, unquote]]])
以列表形式返回消息的Content-Type
参数。返回列表的元素是键/值对的2元组,在'='
符号上分割。左侧'='
是键,右侧是值。如果'='
参数中没有任何符号,则值为空字符串,否则该值get_param()
如上所述,如果可选unquote
为True
(默认值),则为未引用。
如果没有Content-Type
标头,可选的failobj
是要返回的对象。可选标题
是要搜索的标题
而不是Content-Type
。
改变在2.2.2版本:引文结束
参数添加。
get_param(param[, failobj[, header[, unquote]]])
以字符串形式返回Content-Type
头的参数param
的值。如果消息没有Content-Type
头或者没有这样的参数,则返回failobj
(默认为None
)。
可选标题(
如果给出)指定要使用的消息标题而不是Content-Type
。
参数键始终不区分大小写。返回值可以是字符串,也可以是参数为RFC 2231
编码的3元组。当它是一个三元组时,值的元素就是这种形式(CHARSET, LANGUAGE, VALUE)
。请注意这两个CHARSET
和LANGUAGE
可能None
,在这种情况下,你应该考虑VALUE
在被编码us-ascii
字符集。你通常可以忽略LANGUAGE
。
如果您的应用程序不关心参数是否按RFC 2231
编码,则可以通过调用email.utils.collapse_rfc2231_value()
传入返回值来折叠参数值get_param()
。当值是一个元组时,这将返回一个适当解码的Unicode字符串,或者如果原始字符串不是,则返回原始字符串。例如:
rawparam = msg.get_param('foo')
param = email.utils.collapse_rfc2231_value(rawparam)
在任何情况下,VALUE
除非设置unquote
,否则参数值(返回的字符串或3元组中的项目)始终未加引号False
。
在版本2.2.2中进行了更改:添加了unquote
参数,以及可能的三元组返回值。
set_param(param, value[, header[, requote[, charset[, language]]]])
在Content-Type
标题中设置一个参数。如果参数已经存在于标题中,它的值
将被替换为值
。如果尚未为此消息定义Content-Type
头,则它将被设置为text / plain
,并且新参数值
将按照RFC 2045
进行追加。
可选标题
指定Content-Type
的替代标题
,除非可选的重新标记
为False
(默认为True
),否则将根据需要引用所有参数。
如果指定了可选字符集
,则参数将根据RFC 2231
进行编码。可选语言
指定RFC 2231
语言
,默认为空字符串。这两个字符集
和语言
应弦。
2.2.2版中的新功能。
del_param(param[, header[, requote]])
从Content-Type
标题
中完全删除给定的参数。标题
将在没有参数或其值的情况下被重写。除非所有的值将被引用作为必要重新报价
为False
(默认为True
)。可选标题
指定Content-Type
的替代方案。
2.2.2版中的新功能。
set_type(type[, header][, requote])
设置Content-Type
标题的主类型
和子类型
。类型
必须是maintype / subtype
形式的字符串,否则ValueError
会引发。
此方法替换Content-Type
标头,保留
所有参数。如果重新编号是,则会保留
False
现有标题的引用,否则参数将被引用(默认值)。
可以在标题
参数中指定一个替代标头
。当Content-Type
头
被设置时,还添加了MIME-Version
头
。
2.2.2版中的新功能。
get_filename([failobj])
返回消息filename
的Content-Disposition
头的参数值。如果标题没有filename
参数,则此方法回退到查找Content-Type
标题name
上的参数。如果两者都未找到,或者标题丢失,则返回failobj
。返回的字符串将始终不加引号。email.utils.unquote()
get_boundary([failobj])
返回消息boundary
的Content-Type
头的参数值,或者如果头丢失或没有参数,则返回failobj
boundary
。返回的字符串将始终不加引号email.utils.unquote()
。
set_boundary(boundary)
将Content-Type
标头的boundary
参数设置为边界
。将在必要时总是引用边界
。如果消息对象没有Content-Type
头部,则引发A.set_boundary()HeaderParseError
请注意,使用这种方法比删除旧的稍微不同的内容类型
头并添加一个新通过的新的边界add_header()
,因为set_boundary()
保留的顺序的Content-Type
标头的列表标题。但是,它并没有
保留这可能是存在于原始任何连续行的Content-Type
首部。
get_content_charset([failobj])
返回Content-Type
头部的charset
参数,强制为小写。如果没有Content-Type
标头,或者该标头没有参数,则返回failobj
。charset
请注意,此方法与get_charset()
返回Charset
消息正文的默认编码的实例不同。
2.2.2版中的新功能。
get_charsets([failobj])
返回包含消息中字符集名称的列表。如果消息是多部分
,那么列表将包含有效载荷中每个子部分的一个元素,否则它将是长度为1的列表。
列表中的每个项目都是一个字符串,它是表示子部分charset
的Content-Type
标题中的参数值。但是,如果子部分没有Content-Type
标头,没有charset
参数,或者不是文本
主MIME类型,则返回列表中的该项目将为failobj
。
walk()
该walk()
方法是一个通用的生成器,可用于以深度优先遍历顺序遍历消息对象树的所有部分和子部分。您通常会将其walk()
用作for
循环中的迭代器; 每次迭代都会返回下一个子部分。
以下是一个打印多部分消息结构的每个部分的MIME类型的示例:
>>> for part in msg.walk():
... print part.get_content_type()
multipart/report
text/plain
message/delivery-status
text/plain
text/plain
message/rfc822
改变在2.5版本:先前不赞成的方法get_type()
,get_main_type()
以及get_subtype()
被拆除。
Message
对象还可以选择包含两个实例属性,这些属性可以在生成MIME消息的纯文本时使用。
preamble
MIME文档的格式允许标题后面的空白行和第一个多段边界字符串之间的文本。通常,这个文本在MIME感知的邮件阅读器中是不可见的,因为它不属于标准的MIME装甲。但是,查看邮件的原始文本时,或者在非MIME的阅读器中查看邮件时,可以看到该文本。
在序言
属性包含MIME文件这导致额外的装甲文本。当在Parser
标题后面但在第一个边界字符串之前发现一些文本时,它会将该文本分配给该消息的前导
属性。当Generator
写出MIME消息的纯文本表示,并且它发现消息具有前导
属性时,它将在头和第一个边界之间的区域中写入该文本。请参阅email.parser
并email.generator
了解详情。
请注意,如果消息对象没有前导码
,则前导码
属性将为None
。
epilogue
的尾声
属性作用方式与相同的前导码
属性,不同之处在于它包含的最后一个边界和消息的结束之间出现的文本。
在版本2.5中更改:您不需要将尾声设置为空字符串,以便Generator
在文件末尾打印换行符。
defects
该缺陷
属性包含的所有解析此消息时发现的问题的列表。请参阅有关email.errors
可能的解析缺陷
的详细说明。
2.4版本中的新功能。