rfc822
rfc822 — Parse RFC 2822 mail headers
自2.3版弃用:email
应优先使用软件包rfc822
。此模块仅用于保持向后兼容性,并已在Python 3中删除。
该模块定义了一个类,Message
它表示由Internet标准RFC 2822
定义的“电子邮件消息” 。[1]这样的消息由一组消息头和一个消息体组成。该模块还定义了一个AddressList
用于解析RFC 2822
地址的助手类。有关RFC 2822
消息的特定语法的信息,请参阅RFC
。
该mailbox
模块提供读取由各种最终用户邮件程序生成的邮箱的类。
class rfc822.Message(file[, seekable])
一个Message
实例以输入对象作为参数实例化。消息仅依赖于具有readline()
方法的输入对象; 特别是普通的文件对象有资格。实例化从输入对象读取标题直到分隔符行(通常为空行)并将它们存储在实例中。邮件正文后面的标题未被占用。
这个类可以处理任何支持readline()
方法的输入对象。如果输入对象具有查找和告知能力,则该rewindbody()
方法将工作; 此外,非法行将被推回到输入流。如果输入对象没有查找,但有一种unread()
方法可以推回一行输入,Message
将使用它来推回非法行。因此,这个类可以用来解析来自缓冲流的消息。
可选的可搜索
参数作为某些stdio库的解决方法提供,其中tell()
丢弃数据库之前缓存数据,然后才发现lseek()
系统调用不起作用。为了获得最大的可移植性,您应该将seekable参数设置为零,以防止tell()
在传入不可见对象(如从套接字对象创建的文件对象)时阻止该初始值。
从文件中读取的输入行可以通过CR-LF或单个换行来终止; 在存储行之前,终止的CR-LF被单个换行符替换。
所有头部匹配都是独立于大写或小写的方式完成的; 例如m['From']
,m['from']
并且m['FROM']
全部产生相同的结果。
class rfc822.AddressList(field)
您可以AddressList
使用单个字符串参数实例化助手类,该参数是要解析的RFC 2822
地址的逗号分隔列表。(该参数None
产生一个空列表。)
rfc822.quote(str)
在str
中用反斜杠替换为反斜杠双引号替换为双引号。
rfc822.unquote(str)
返回一个不带引号
的str
的新字符串。如果str
结束并以双引号
开头,则会被剥离。同样,如果str
结束并以尖括号开始,它们将被剥离。
rfc822.parseaddr(address)
解析地址
应该是某个包含地址
的字段(例如“ 收件人”
或“ 抄送”)的值
,并将其作为其“真实姓名”和“电子邮件地址
”部分的组成部分。返回该信息的元组,除非解析失败,在这种情况下(None, None)
返回2元组。
rfc822.dump_address_pair(pair)
与此相反parseaddr()
,这需要表单的2元组(realname, email_address)
并返回适合于To
或Cc
标题的字符串值。如果pair
的第一个元素为false,则第二个元素将不加修改地返回。
rfc822.parsedate(date)
尝试根据RFC 2822中
的规则解析日期。但是,一些邮件程序不遵循指定的格式,因此parsedate()
在这种情况下尝试正确猜测。date
是一个包含RFC 2822
日期的字符串,例如'Mon, 20 Nov 1995 19:12:08 -0500'
。如果成功解析日期,则parsedate()
返回可直接传递给的9元组time.mktime(
否则None将被
退回。请注意,结果元组的索引6,7和8不可用。
rfc822.parsedate_tz(date)
执行与之相同的功能parsedate()
,但返回一个None
或一个10元组; 前9个元素组成一个可以直接传递的元组,time.mktime()
第十个元素是日期时区与UTC(这是格林威治标准时间的官方期限)的偏移量。(请注意,时区偏移的符号time.timezone
与同一时区的变量符号相反;后一个变量遵循POSIX标准,而此模块遵循RFC 2822。
)如果输入字符串没有时区,则最后一个元素返回的元组是None
。请注意,结果元组的索引6,7和8不可用。
rfc822.mktime_tz(tuple)
将返回的10元组parsedate_tz()
转换为UTC时间戳。如果元组中的时区项目是None
假设当地时间。小缺陷:首先将前8个元素解释为当地时间,然后补偿时区差异; 这可能会在夏令时切换日期时产生一个轻微的错误。不足以担心常用。
1.消息对象
一个Message
实例有以下方法:
Message.rewindbody()
寻找消息正文的开头。这只适用于文件对象可查找的情况。
Message.isheader(line)
如果该行是合法的RFC 2822
标题,则返回行的规范化字段名(将用于索引它的字典关键字); 否则返回None
(意味着解析应停止在这里,并将该行推回输入流)。在子类中重写此方法有时很有用。
Message.islast(line)
如果给定的行是消息应该停止的分隔符,则返回true。分隔符行被消耗,并且文件对象的读取位置立即位于它之后。默认情况下,此方法仅检查该行是否为空,但可以在子类中覆盖该行。
Message.iscomment(line)
如果给定的行应完全忽略则返回True
,仅跳过。默认情况下,这是一个始终返回的存根False
,但可以在子类中覆盖它。
Message.getallmatchingheaders(name)
返回包含所有与名称
匹配的标题的行列表(如果有的话)。每条物理线,无论是否为延续线,都是一个单独的列表项。如果没有标题匹配名称,
则返回空列表。
Message.getfirstmatchingheader(name)
返回包含第一个头匹配名称的
行及其延续行(如果有)的列表。None
如果没有标题匹配名称
,则返回。
Message.getrawheader(name)
在第一个头匹配名称中
返回一个由冒号后面的文本组成的字符串。这包括前导空白,尾随换行,以及内部换行和空白(如果存在任何延续线)。None
如果没有标题匹配名称
,则返回。
Message.getheader(name[, default])
返回由最后一个标题匹配名称
组成的单个字符串,但会删除前导空白和尾随空白。内部空白不被剥离。可选的默认
参数可用于指定不存在标题匹配名称
时返回的不同默认
值; 它默认
为None
。这是获得解析标题的首选方法。
Message.get(name[, default])
一种别名getheader()
,用于使界面与常规字典更加兼容。
Message.getaddr(name)
返回(full name, email address)
从返回的字符串解析的对getheader(name)
。如果不存在标题匹配名称
,则返回(None, None
否则全名和地址都是(可能是空的)字符串。
例如:如果m的第一个From头部包含该字符串'jack@cwi.nl (Jack Jansen)',m.getaddr('From')则将产生该对('Jack Jansen', 'jack@cwi.nl')。如果标题包含'Jack Jansen <jack@cwi.nl>',它会产生完全相同的结果。
Message.getaddrlist(name)
这与类似getaddr(list)
,但解析包含电子邮件地址列表的头(例如,To
头),并返回对的列表(full name, email address)
(即使头中只有一个地址)。如果没有标题匹配名称
,则返回一个空列表。
如果存在多个与指定标题相匹配的标题(例如,如果有多个Cc
标题),则所有标题都将被解析为地址。任何名称标题包含的连续行也被解析。
Message.getdate(name)
使用getheader()
并将其解析为与之兼容的9元组time.mktime(
请注意,字段6,7和8不可用。如果没有标题匹配名称,或
者它不可解析,则返回None。
日期解析似乎是一种黑色艺术,并不是所有的邮件都符合标准。虽然已经通过多种来源的大量电子邮件进行测试和发现,但该功能可能偶尔会产生不正确的结果。
Message.getdate_tz(name)
使用getheader()
并将其解析为10元组来检索标题; 前9个元素将与元组兼容time.mktime()
,而第10个元素是从UTC时间开始给出日期时区偏移量的数字。请注意,字段6,7和8不可用。类似于getdate()
,如果没有标题匹配名称
,或者它是不可解析的,则返回None
。
Message
实例还支持有限的映射接口。特别是:m[name]
像m.getheader(name)
但提出KeyError
,如果没有匹配的头; 并且len(m)
,m.get(name[, default])
,name in m
,m.keys()
,m.values()
m.items()
,和m.setdefault(name[, default])
行为如预期,与上述一个差setdefault()
使用一个空字符串作为默认值。Message
实例还支持映射可写接口m[name] = value
和del m[name]
。Message
对象不支持clear()
,copy()
,popitem()
,或update()
映射接口的方法。(支持get()
和setdefault()
仅在Python 2.2中添加。)
最后,Message
实例具有一些公共实例变量:
Message.headers
包含整个标题行集合的列表,按读取顺序排列(除了setitem调用可能会扰乱此顺序)。每行包含一个尾随的换行符。列表中不包含结束标题的空白行。
Message.fp
在实例化时传递的文件或文件类对象。这可以用来读取消息内容。
Message.unixfrom
Unix From
行,如果消息有一个,或者一个空字符串。这是在某些情况下重新生成邮件所需的,例如mbox
风格的邮箱文件。
2.地址列表对象
一个AddressList
实例有以下方法:
AddressList.__len__()
返回地址列表中的地址数量。
AddressList.__str__()
返回地址列表的规范化字符串表示。地址以“name”[host @ domain](mailto:host%40domain)形式呈现,以逗号分隔。
AddressList.__add__(alist)
返回AddressList
包含两个AddressList
操作数中所有地址的新实例,删除重复项(set union)。
AddressList.__iadd__(alist)
就地版本的__add__(
将这个AddressList实例
变成它自己和右手实例的联合,alist。
AddressList.__sub__(alist)
返回一个新AddressList
实例,其中包含左侧AddressList
操作数中不存在于右侧地址操作数中的每个地址(设置差异)。
AddressList.__isub__(alist)
版本__sub__()
,删除此列表中的地址也是alist
。
最后,AddressList
实例有一个公共实例变量:
AddressList.addresslist
元组字符串对的列表,每个地址一个。在每个成员中,第一个是规范化名称部分,第二个是实际路由地址('@'
-separated username-host.domain pair)。
注
1 | 该模块最初符合RFC 822,因此成为名称。此后,RFC 2822作为RFC 822的更新发布。该模块应被视为符合RFC 2822,尤其是在自RFC 822以来语法或语义已更改的情况下。 |
---|