18.11. rfc822 —解析 RFC 2822 邮件 Headers

从版本 2.3 开始不推荐使用:email软件包应优先于rfc822模块使用。提供此模块仅是为了保持向后兼容性,已在 Python 3 中删除。

该模块定义了一个类Message,该类表示 Internet 标准 RFC 2822所定义的“电子邮件”。 [1]这样的消息由消息头的集合和消息主体组成。该模块还定义了一个辅助类AddressList来解析 RFC 2822地址。请参阅 RFC,以获得有关 RFC 2822消息的特定语法的信息。

mailbox模块提供用于读取各种finally用户邮件程序产生的邮箱的类。

    • class * rfc822. Message(* file * [,* seekable *])
    • 使用 Importing 对象作为参数实例化Message实例。消息仅依赖于具有readline()方法的 Importing 对象;特别是普通文件对象。实例化从 Importing 对象中读取 Headers,直到分隔符行(通常为空行),并将其存储在实例中。Headers 之后的消息正文不会被使用。

此类可以与任何支持readline()方法的 Importing 对象一起使用。如果 Importing 对象具有搜索和告知Function,则rewindbody()方法将起作用;同样,非法行将被推回到 Importing 流中。如果 Importing 对象缺少搜索,但是具有可以推回 Importing 行的unread()方法,则Message将使用该方法推回非法行。因此,此类可用于解析来自缓冲流的消息。

可选的* seekable *参数是某些 stdio 库的解决方法,其中tell()在发现lseek()系统调用不起作用之前会丢弃缓冲的数据。为了获得最大的可移植性,应在将不可搜索对象(例如从套接字对象创建的文件对象)传入时,将 seekable 参数设置为零,以防止该初始tell()

从文件中读取的 Importing 行可以由 CR-LF 终止,也可以由单个换行终止。在存储行之前,将终止的 CR-LF 替换为单个换行。

所有 Headers 匹配均独立于大写或小写完成;例如m['From']m['from']m['FROM']都产生相同的结果。

    • class * rfc822. AddressList(* field *)
    • 您可以使用单个字符串参数(要解析的 RFC 2822地址的逗号分隔列表)实例化AddressList helper 类。 (参数None产生一个空列表.)
  • rfc822. quote(* str *)

    • 返回一个新字符串,在* str *中用反斜杠替换为两个反斜杠,并将双引号替换为反斜杠-双引号。
  • rfc822. unquote(* str *)

    • 返回一个新字符串,该字符串是* str 未引用版本。如果* str 结束并以双引号开头,则会将其删除。同样,如果 str *结束并以尖括号开头,则会将其删除。
  • rfc822. parseaddr(地址)

    • 将* address 解析为其组成的“真实名称”和“电子邮件地址”部分,该地址应该是某些包含地址的字段(例如 To Cc *)的值。返回该信息的 Tuples,除非解析失败,在这种情况下,将返回 2Tuples(None, None)
  • rfc822. dump_address_pair(* pair *)

    • parseaddr()的倒数,采用(realname, email_address)形式的 2Tuples,并返回适合* To Cc Headers 的字符串值。如果 pair *的第一个元素为 false,则第二个元素将原样返回。
  • rfc822. parsedate(* date *)

    • try根据 RFC 2822中的规则解析日期。但是,某些邮件程序未遵循指定的格式,因此parsedate()在这种情况下会try正确猜测。 * date *是包含 RFC 2822日期的字符串,例如'Mon, 20 Nov 1995 19:12:08 -0500'。如果成功解析日期,则parsedate()返回一个 9Tuples,可以直接传递给time.mktime();否则将返回None。请注意,结果 Tuples 的索引 6、7 和 8 不可用。
  • rfc822. parsedate_tz(* date *)

    • 执行与parsedate()相同的Function,但返回None或 10Tuples;前 9 个元素组成一个 Tuples,可以直接传递给time.mktime(),第十个是日期时区相对于 UTC 的偏移量(这是 Greenwich 标准时间的正式术语)。 (请注意,时区偏移量的符号与相同时区的time.timezone变量的符号相反;后一个变量遵循 POSIX 标准,而此模块遵循 RFC 2822。)如果 Importing 字符串没有时区,则最后一个元素返回的 Tuples 中的None。请注意,结果 Tuples 的索引 6、7 和 8 不可用。
  • rfc822. mktime_tz(* tuple *)

    • parsedate_tz()返回的 10Tuples 转换为 UTC 时间戳。如果 Tuples 中的时区项是None,则假定为本地时间。轻微不足:首先将前 8 个元素解释为本地时间,然后补偿时区差异;这可能会导致夏令时切换日期周围出现轻微错误。不用担心经常使用。

See also

  • Module email

  • 全面的电子邮件处理包;取代rfc822模块。

  • Module mailbox

  • 用于读取finally用户邮件程序产生的各种邮箱格式的类。

  • Module mimetools

  • rfc822.Message的子类,用于处理 MIME 编码的消息。

18.11.1. 讯息对象

Message实例具有以下方法:

  • Message. rewindbody ( )

    • 寻求到消息正文的开始。仅在文件对象可搜索时才有效。
  • Message. isheader(* line *)

    • 如果该行是合法的 RFC 2822Headers,则返回该行的规范化字段名(将用于为其索引的字典键);否则返回None(这意味着解析应在此处停止并将该行推回 Importing 流中)。有时在子类中重写此方法很有用。
  • Message. islast(* line *)

    • 如果给定的行是应该在其上停止 Message 的定界符,则返回 true。分隔符行被占用,并且文件对象的读取位置紧随其后。默认情况下,此方法仅检查该行是否为空白,但是您可以在子类中覆盖它。
  • Message. iscomment(* line *)

    • 如果应该完全忽略给定的行(仅略过),则返回True。默认情况下,该存根始终返回False,但是您可以在子类中覆盖它。
  • Message. getallmatchingheaders(* name *)

    • 返回包含与* name 匹配的所有标题的行列表(如果有)。每个物理行,无论是否是延续行,都是单独的列表项。如果没有标题匹配 name *,则返回空列表。
  • Message. getfirstmatchingheader(* name *)

    • 返回包含与* name 匹配的第一个 Headers 的行及其连续行(如果有)的列表。如果没有与 name *匹配的头,则返回None
  • Message. getrawheader(* name *)

    • 返回第一个匹配* name 的标题中冒号后的文本组成的单个字符串。这包括前导空格,尾随换行符以及内部换行符和空格(如果存在任何连续行)。如果没有与 name *匹配的头,则返回None
  • Message. getheader(* name * [,* default *])

    • 返回一个由最后一个与* name 匹配的头组成的字符串,但去除开头和结尾的空格。内部空格不会被剥离。可选的 default 参数可用于指定在没有与 name *匹配的 Headers 时要返回的其他默认值;默认为None。这是获取解析 Headers 的首选方法。
  • Message. get(* name * [,* default *])

    • getheader()的别名,以使界面与常规词典更加兼容。
  • Message. getaddr(* name *)

    • 返回由getheader(name)返回的字符串解析的Pair(full name, email address)。如果不存在与* name *匹配的头,则返回(None, None);否则,全名和地址均为(可能为空)字符串。

示例:如果* m 的第一个 From *Headers 包含字符串'[email protected] (Jack Jansen)',则m.getaddr('From')将产生对('Jack Jansen', '[email protected]')。如果 Headers 包含'Jack Jansen <[email protected]>',它将产生完全相同的结果。

  • Message. getaddrlist(* name *)
    • 这类似于getaddr(list),但是解析包含电子邮件地址列表的 Headers(例如* To Headers)并返回(full name, email address)对列表(即使 Headers 中只有一个地址)。如果没有与 name *匹配的标题,则返回一个空列表。

如果存在多个与命名 Headers 匹配的 Headers(例如,如果有多个* Cc *Headers),则会解析所有 Headers 以获取地址。命名 Headers 包含的任何连续行也会被解析。

  • Message. getdate(* name *)
    • 使用getheader()检索 Headers,并将其解析为与time.mktime()兼容的 9Tuples;请注意,字段 6、7 和 8 不可用。如果没有匹配* name *的 Headers,或者它是不可解析的,则返回None

日期解析似乎是一种妖术,并非所有邮件程序都遵守该标准。尽管已对它进行了测试,并且在来自许多来源的大量电子邮件中都发现它是正确的,但该Function有时仍可能会产生不正确的结果。

  • Message. getdate_tz(* name *)
    • 使用getheader()检索 Headers 并将其解析为 10 个 Tuples;前 9 个元素将使 Tuples 与time.mktime()兼容,第 10 个是给出日期时区与 UTC 的偏移量的数字。请注意,字段 6、7 和 8 不可用。与getdate()类似,如果没有匹配* name *的 Headers,或者它不可解析,则返回None

Message个实例还支持有限的 Map 接口。特别是:m[name]类似于m.getheader(name),但是如果没有匹配的 Headers 则引发KeyError;和len(m)m.get(name[, default])name in mm.keys()m.values() m.items()m.setdefault(name[, default])如预期的那样工作,不同之处在于setdefault()使用空字符串作为默认值。 Message实例还支持 Map 可写接口m[name] = valuedel m[name]Message对象不支持 Map 接口的clear()copy()popitem()update()方法。 (仅在 Python 2.2 中添加了对get()setdefault()的支持.)

最后,Message个实例具有一些公共实例变量:

  • Message. headers

    • 一个列表,其中包含整个标题行集,按照它们的读取 Sequences 排列(除了 setitem 调用可能会干扰此 Sequences)。每行都包含尾随换行符。终止标题的空白行不包含在列表中。
  • Message. fp

    • 在实例化时传递的文件或类似文件的对象。这可以用来读取消息内容。
  • Message. unixfrom

    • Unix From行(如果消息包含一个或一个空字符串)。在某些情况下,例如mbox样式的邮箱文件,需要重新生成邮件。

18.11.2. 地址列表对象

AddressList实例具有以下方法:

  • AddressList. __len__ ( )

    • 返回地址列表中的地址数。
  • AddressList. __str__ ( )

    • 返回地址列表的规范化字符串表示形式。地址以“名称” < host@domain >形式呈现,以逗号分隔。
  • AddressList. __add__(* alist *)

    • 返回一个新的AddressList实例,该实例包含两个AddressList操作数中的所有地址,并删除重复项(设置并集)。
  • AddressList. __iadd__(* alist *)

    • 就地版本的add();将此AddressList实例转换为自身和右侧实例* alist *的并集。
  • AddressList. __sub__(* alist *)

    • 返回一个新的AddressList实例,该实例包含左侧AddressList操作数中所有不存在于右侧地址操作数中的地址(设置差)。
  • AddressList. __isub__(* alist *)

    • sub()的就地版本,删除此列表中* alist *中的地址。

最后,AddressList个实例具有一个公共实例变量:

  • AddressList. addresslist
    • Tuples 字符串对的列表,每个地址一个。在每个成员中,第一个是规范名称部分,第二个是实际的路由地址('@'分隔的 username-host.domain 对)。

Footnotes

  • [1]
    • 此模块最初符合 RFC 822,因此命名为。从那时起, RFC 2822作为 RFC 822的更新发布。该模块应被视为 RFC 2822-符合标准,特别是在语法或语义自 RFC 822之后发生变化的情况下。