在线文档教程
Python

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)并返回适合于ToCc标题的字符串值。如果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 mm.keys()m.values() m.items(),和m.setdefault(name[, default])行为如预期,与上述一个差setdefault()使用一个空字符串作为默认值。Message实例还支持映射可写接口m[name] = valuedel 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以来语法或语义已更改的情况下。