mailbox ---以各种格式操作邮箱

源代码: Lib/mailbox.py


这个模块定义了两个类, MailboxMessage ,用于访问和操作磁盘邮箱及其包含的消息。 Mailbox 提供类似字典的从键到消息的映射。 Message 扩展了 email.message 模块的 Message 用特定于格式的状态和行为初始化。支持的邮箱格式有maildir、mbox、mh、babyl和mmdf。

参见

模块 email

表示和操作消息。

Mailbox 物体

class mailbox.Mailbox

可以检查和修改的邮箱。

这个 Mailbox 类定义接口,不打算实例化。相反,格式特定的子类应该继承自 Mailbox 您的代码应该实例化一个特定的子类。

这个 Mailbox 接口类似字典,带有对应于消息的小键。密钥由 Mailbox 将使用它们的实例,并且仅对其有意义 Mailbox 实例。即使修改了相应的消息(例如用另一个消息替换消息),键也会继续标识消息。

消息可以添加到 Mailbox 使用set-like方法的实例 add() 并使用 del 语句或集合类方法 remove()discard() .

Mailbox 接口语义与词典语义在一些值得注意的方面有所不同。每次请求消息时,新的表示形式(通常是 Message 实例)是根据邮箱的当前状态生成的。同样,当消息添加到 Mailbox 实例,复制提供的消息表示形式的内容。在这两种情况下,都不是对由 Mailbox 实例。

默认值 Mailbox 迭代器迭代消息表示,而不是像默认字典迭代器那样迭代键。此外,在迭代期间修改邮箱是安全且定义良好的。迭代器将看不到在创建迭代器之后添加到邮箱的消息。虽然使用迭代器中的键可能会导致 KeyError 如果随后删除了相应的消息,则出现异常。

警告

在修改可能被其他进程同时更改的邮箱时要非常小心。用于此类任务的最安全的邮箱格式是maildir;尽量避免使用单文件格式(如mbox)进行并发写入。如果要修改邮箱,请 must 通过调用 lock()unlock() 方法 before 读取文件中的任何消息或通过添加或删除消息进行更改。如果不锁定邮箱,则有丢失邮件或损坏整个邮箱的风险。

Mailbox 实例具有以下方法:

add(message)

添加 消息 返回已分配给邮箱的密钥。

参数 消息 可能是 Message 实例 email.message.Message 实例、字符串、字节字符串或类似文件的对象(应以二进制模式打开)。如果 消息 是特定于适当格式的实例 Message 子类(例如,如果它是 mboxMessage 实例,这是一个 mbox 实例),使用其特定于格式的信息。否则,将使用格式特定信息的合理默认值。

在 3.2 版更改: 添加了对二进制输入的支持。

remove(key)
__delitem__(key)
discard(key)

删除对应的消息 key 从邮箱。

如果不存在此类消息,则 KeyError 如果方法被调用为 remove()__delitem__() 但如果方法被调用为 discard() . 行为 discard() 如果基础邮箱格式支持其他进程并发修改,则可能是首选。

__setitem__(key, message)

替换对应的消息 key 具有 消息 . 举起一个 KeyError 如果没有消息与 key .

和一样 add() 参数 消息 可能是 Message 实例 email.message.Message 实例、字符串、字节字符串或类似文件的对象(应以二进制模式打开)。如果 消息 是特定于适当格式的实例 Message 子类(例如,如果它是 mboxMessage 实例,这是一个 mbox 实例),使用其特定于格式的信息。否则,当前对应的消息的特定格式信息 key 保持不变。

iterkeys()
keys()

如果调用为,则返回所有键的迭代器 iterkeys() 或者返回键列表(如果调用为 keys() .

itervalues()
__iter__()
values()

如果调用为,则在所有消息的表示上返回迭代器 itervalues()__iter__() 或返回此类表示的列表(如果调用为 values() . 这些消息表示为特定于适当格式的实例 Message 子类,除非在 Mailbox 实例已初始化。

注解

行为 __iter__() 与字典不同,字典迭代键。

iteritems()
items()

返回迭代器( key消息 配对,在哪里 key 是一把钥匙 消息 是消息表示形式,如果调用为 iteritems() 或返回此类对的列表(如果调用为 items() . 这些消息表示为特定于适当格式的实例 Message 子类,除非在 Mailbox 实例已初始化。

get(key, default=None)
__getitem__(key)

返回对应于 key . 如果不存在此类信息, default 如果方法被调用为 get() 和A KeyError 如果方法被调用为 __getitem__() . 该消息表示为特定于适当格式的实例 Message 子类,除非在 Mailbox 实例已初始化。

get_message(key)

返回对应于 key 作为特定格式的实例 Message 子类,或引发 KeyError 如果不存在此类消息,则出现异常。

get_bytes(key)

返回对应于 key 或提高 KeyError 如果不存在此类消息,则出现异常。

3.2 新版功能.

get_string(key)

返回对应于的消息的字符串表示形式 key 或提高 KeyError 如果不存在此类消息,则出现异常。消息通过 email.message.Message 将其转换为7bit clean表示。

get_file(key)

返回与 key 或提高 KeyError 如果不存在此类消息,则出现异常。类似文件的对象的行为类似于以二进制模式打开。一旦不再需要此文件,则应将其关闭。

在 3.2 版更改: 文件对象实际上是一个二进制文件;以前它是以文本模式错误返回的。此外,类似文件的对象现在支持上下文管理协议:您可以使用 with 语句自动关闭它。

注解

与其他消息表示不同,类文件表示并不一定独立于 Mailbox 创建它们或基础邮箱的实例。每个子类都提供了更具体的文档。

__contains__(key)

返回 True 如果 key 对应一条消息, False 否则。

__len__()

返回邮箱中的邮件数。

clear()

删除邮箱中的所有邮件。

pop(key, default=None)

返回对应于 key 删除信息。如果不存在此类消息,则返回 default . 该消息表示为特定于适当格式的实例 Message 子类,除非在 Mailbox 实例已初始化。

popitem()

返回任意( key消息 配对,在哪里 key 是一把钥匙 消息 是一个消息表示,并删除相应的消息。如果邮箱为空,则引发 KeyError 例外。该消息表示为特定于适当格式的实例 Message 子类,除非在 Mailbox 实例已初始化。

update(arg)

参数 arg 应该是 key - - 消息 映射或ITerable of( key消息 “对”。更新邮箱,以便为每个给定的 key消息 ,对应的消息 key 设置为 消息 仿佛用 __setitem__() . 和一样 __setitem__() ,每一个 key 必须已与邮箱中的邮件对应,否则 KeyError 将引发异常,因此通常它不适用于 arg 成为一个 Mailbox 实例。

注解

与字典不同,关键字参数不受支持。

flush()

将任何挂起的更改写入文件系统。对于一些 Mailbox 子类,更改总是立即写入,并且 flush() 什么都不做,但您仍然应该养成调用此方法的习惯。

lock()

获取邮箱上的独占通知锁,以便其他进程知道不要修改它。安 ExternalClashError 如果锁不可用,则引发。使用的特定锁定机制取决于邮箱格式。你应该 总是 在对邮箱内容进行任何修改之前,请先锁定邮箱。

unlock()

释放邮箱上的锁(如果有)。

close()

刷新邮箱,必要时将其解锁,然后关闭所有打开的文件。对于一些 Mailbox 子类,这个方法什么也不做。

Maildir

class mailbox.Maildir(dirname, factory=None, create=True)

一个子类 Mailbox 对于maildir格式的邮箱。参数 工厂 是一个可调用对象,它接受类似文件的消息表示(其行为类似于以二进制模式打开),并返回自定义表示。如果 工厂NoneMaildirMessage 用作默认消息表示形式。如果 创造True ,如果邮箱不存在,则创建该邮箱。

如果 创造True 以及 目录名 路径存在,它将被视为现有maildir,而不尝试验证其目录布局。

因为历史原因 目录名 是这样命名的,而不是 path .

maildir是为qmail mail transfer代理程序发明的一种基于目录的邮箱格式,现在被其他程序广泛支持。maildir邮箱中的邮件存储在公共目录结构中的单独文件中。这种设计允许多个不相关的程序访问和修改maildir邮箱,而不会损坏数据,因此文件锁定是不必要的。

maildir邮箱包含三个子目录,即: tmpnewcur . 消息在 tmp 然后移动到 new 要完成传递的子目录。邮件用户代理随后可以将邮件移动到 cur 子目录,并将有关消息状态的信息存储在附加到其文件名的特殊“信息”部分中。

也支持由Courier邮件传输代理引入的样式的文件夹。如果 '.' 是其名称中的第一个字符。文件夹名称由表示 Maildir 没有领导 '.' . 每个文件夹本身就是一个maildir邮箱,但不应包含其他文件夹。相反,使用 '.' 划分级别,例如“存档.2005.07”。

注解

maildir规范要求使用冒号 (':' )在某些消息文件名中。但是,某些操作系统不允许在文件名中使用此字符,如果希望在此类操作系统上使用类似maildir的格式,则应指定另一个字符来代替。感叹号 ('!' )是一个流行的选择。例如::

import mailbox
mailbox.Maildir.colon = '!'

这个 colon 属性也可以按实例设置。

Maildir 实例具有的所有方法 Mailbox 除以下内容外:

list_folders()

返回所有文件夹的名称列表。

get_folder(folder)

返回A Maildir 表示名称为的文件夹的实例 文件夹 . 一 NoSuchMailboxError 如果文件夹不存在,则引发异常。

add_folder(folder)

创建名称为的文件夹 文件夹 并返回 Maildir 表示它的实例。

remove_folder(folder)

删除名称为的文件夹 文件夹 . 如果文件夹包含任何邮件,则 NotEmptyError 将引发异常,并且不会删除文件夹。

clean()

从邮箱中删除过去36小时内未访问的临时文件。maildir规范指出,邮件读取程序应该偶尔这样做。

一些 Mailbox 方法实施者 Maildir 值得特别注意的是:

add(message)
__setitem__(key, message)
update(arg)

警告

这些方法根据当前进程ID生成唯一的文件名。使用多个线程时,可能会发生未检测到的名称冲突并导致邮箱损坏,除非协调线程以避免使用这些方法同时操作同一邮箱。

flush()

对maildir邮箱的所有更改都将立即应用,因此此方法不起任何作用。

lock()
unlock()

maildir邮箱不支持(或需要)锁定,因此这些方法不起任何作用。

close()

Maildir 实例不保留任何打开的文件,基础邮箱不支持锁定,因此此方法不做任何操作。

get_file(key)

根据主机平台的不同,在返回的文件保持打开状态时,可能无法修改或删除基础消息。

参见

maildir man page from Courier

格式的规范。描述支持文件夹的通用扩展名。

Using maildir format

发明人关于maildir的注释。包括更新的名称创建方案和“信息”语义的详细信息。

mbox

class mailbox.mbox(path, factory=None, create=True)

一个子类 Mailbox 对于mbox格式的邮箱。参数 工厂 是一个可调用对象,它接受类似文件的消息表示(其行为类似于以二进制模式打开),并返回自定义表示。如果 工厂NonemboxMessage 用作默认消息表示形式。如果 创造True ,如果邮箱不存在,则创建该邮箱。

mbox格式是在UNIX系统上存储邮件的经典格式。MBOX邮箱中的所有邮件都存储在一个文件中,每个邮件的开头都由前五个字符为“发件人”的行指示。

MBOX格式存在几种变化,以解决原始格式中的感知缺陷。为了兼容性, mbox 实现原始格式,有时称为 mboxo . 这意味着 Content-Length 如果存在标题,则忽略该标题,并且在消息正文中一行的开头出现的“from”在存储消息时转换为“>from”,尽管在读取消息时“>from”的出现没有转换为“from”。

一些 Mailbox 方法实施者 mbox 值得特别注意的是:

get_file(key)

调用后使用文件 flush()close()mbox 实例可能会产生不可预测的结果或引发异常。

lock()
unlock()

使用三种锁定机制——点锁定和 flock()lockf() 系统调用。

参见

mbox man page from tin

格式规范,包含有关锁定的详细信息。

Configuring Netscape Mail on Unix: Why The Content-Length Format is Bad

使用原始MBOX格式而不是变体的参数。

"mbox" is a family of several mutually incompatible mailbox formats

管理层收购变化的历史。

MH

class mailbox.MH(path, factory=None, create=True)

一个子类 Mailbox 对于MH格式的邮箱。参数 工厂 是一个可调用对象,它接受类似文件的消息表示(其行为类似于以二进制模式打开),并返回自定义表示。如果 工厂NoneMHMessage 用作默认消息表示形式。如果 创造True ,如果邮箱不存在,则创建该邮箱。

mh是为mh邮件处理系统(邮件用户代理)发明的基于目录的邮箱格式。MH邮箱中的每个邮件都驻留在自己的文件中。MH邮箱可以包含其他MH邮箱(调用 folders )除了信息。文件夹可以无限嵌套。MH邮箱也支持 sequences ,这是命名列表,用于在不将邮件移动到子文件夹的情况下对邮件进行逻辑分组。序列是在名为 .mh_sequences 在每个文件夹中。

这个 MH 类处理mh邮箱,但它不尝试模拟所有 mh 的行为。特别是,它不会修改,并且不受 context.mh_profile 由使用的文件 mh 存储其状态和配置。

MH 实例具有的所有方法 Mailbox 除以下内容外:

list_folders()

返回所有文件夹的名称列表。

get_folder(folder)

返回一 MH 表示名称为的文件夹的实例 文件夹 . 一 NoSuchMailboxError 如果文件夹不存在,则引发异常。

add_folder(folder)

创建名称为的文件夹 文件夹 归还 MH 表示它的实例。

remove_folder(folder)

删除名称为的文件夹 文件夹 . 如果文件夹包含任何邮件,则 NotEmptyError 将引发异常,并且不会删除文件夹。

get_sequences()

返回映射到键列表的序列名字典。如果没有序列,则返回空字典。

set_sequences(sequences)

根据重新定义邮箱中存在的序列 序列 ,映射到键列表的名称字典,如返回的 get_sequences() .

pack()

根据需要重命名邮箱中的邮件,以消除编号中的空白。序列列表中的条目会相应地更新。

注解

此操作将使已颁发的密钥无效,并且不应随后使用。

一些 Mailbox 方法实施者 MH 值得特别注意的是:

remove(key)
__delitem__(key)
discard(key)

这些方法会立即删除消息。不使用通过在消息名称前加逗号来标记要删除的消息的mh约定。

lock()
unlock()

使用三种锁定机制——点锁定和 flock()lockf() 系统调用。对于mh邮箱,锁定邮箱意味着锁定 .mh_sequences 文件,并且仅在影响它们的任何操作期间锁定单个消息文件。

get_file(key)

根据主机平台的不同,在返回的文件保持打开状态时,可能无法删除基础消息。

flush()

对mh邮箱的所有更改都将立即应用,因此此方法不起任何作用。

close()

MH 实例不保留任何打开的文件,因此此方法等效于 unlock() .

参见

nmh - Message Handling System

主页 nmh ,原始版本的更新版本 mh .

MH & nmh: Email for Users & Programmers

GPL授权书 mhnmh ,其中包含有关邮箱格式的一些信息。

Babyl

class mailbox.Babyl(path, factory=None, create=True)

一个子类 Mailbox 对于Babyl格式的邮箱。参数 工厂 是一个可调用对象,它接受类似文件的消息表示(其行为类似于以二进制模式打开),并返回自定义表示。如果 工厂NoneBabylMessage 用作默认消息表示形式。如果 创造True ,如果邮箱不存在,则创建该邮箱。

babyl是emacs中包含的rmail邮件用户代理使用的单个文件邮箱格式。消息的开头由包含两个字符的控制下划线的行指示。 ('\037' 和控制L ('\014' )消息的结尾由下一条消息的开头指示,如果是最后一条消息,则由包含控制下划线的行指示。 ('\037' 字符。

Babyl邮箱中的邮件有两组邮件头、原始邮件头和所谓的可见邮件头。可见头通常是原始头的一个子集,已重新格式化或删节以使其更具吸引力。Babyl邮箱中的每封邮件还附带一份 labels 或记录有关邮件的额外信息的短字符串,以及邮箱中找到的所有用户定义标签的列表保存在babyl选项部分。

Babyl 实例具有的所有方法 Mailbox 除以下内容外:

get_labels()

返回邮箱中使用的所有用户定义标签的名称列表。

注解

检查实际邮件以确定邮箱中存在哪些标签,而不是查看babyl选项部分中的标签列表,但只要修改邮箱,babyl部分就会更新。

一些 Mailbox 方法实施者 Babyl 值得特别注意的是:

get_file(key)

在Babyl邮箱中,邮件头不会与邮件正文相邻存储。要生成类似文件的表示,头和正文将一起复制到 io.BytesIO 实例的API与文件的API相同。因此,类似文件的对象确实独立于底层邮箱,但与字符串表示形式相比,它不会保存内存。

lock()
unlock()

使用三种锁定机制——点锁定和 flock()lockf() 系统调用。

参见

Format of Version 5 Babyl Files

Babyl格式的规范。

Reading Mail with Rmail

关于babyl语义的一些信息。

MMDF

class mailbox.MMDF(path, factory=None, create=True)

一个子类 Mailbox 对于mmdf格式的邮箱。参数 工厂 是一个可调用对象,它接受类似文件的消息表示(其行为类似于以二进制模式打开),并返回自定义表示。如果 工厂NoneMMDFMessage 用作默认消息表示形式。如果 创造True ,如果邮箱不存在,则创建该邮箱。

MMDF是为多通道备忘录分发设备(邮件传输代理)发明的单文件邮箱格式。每条消息的格式与MBOX消息相同,但前后用包含四个Control-A的行括起来 ('\001' 字符。与MBOX格式一样,每条消息的开头由一行指示,该行的前五个字符为“From”,但在存储消息时,“From”的附加出现次数不会转换为“>From”,因为附加的消息分隔符行可防止将这些出现次数误认为是后续消息的开头。

一些 Mailbox 方法实施者 MMDF 值得特别注意的是:

get_file(key)

调用后使用文件 flush()close()MMDF 实例可能会产生不可预测的结果或引发异常。

lock()
unlock()

使用三种锁定机制——点锁定和 flock()lockf() 系统调用。

参见

mmdf man page from tin

从新闻阅读器TIN文档中获得的MMDF格式规范。

MMDF

维基百科的一篇文章描述了多渠道备忘录分发工具。

Message 物体

class mailbox.Message(message=None)

的子类 email.message 模块的 Message . 亚类 mailbox.Message 添加邮箱格式特定的状态和行为。

如果 消息 如果省略,则在默认的空状态下创建新实例。如果 消息 是一个 email.message.Message 例如,复制其内容;此外,如果 消息 是一个 Message 实例。如果 消息 是字符串、字节字符串或文件,它应包含 RFC 2822 -兼容消息,它被读取和解析。文件应该以二进制模式打开,但为了向后兼容,文本模式文件被接受。

子类提供的特定于格式的状态和行为各不相同,但一般来说,只有不特定于特定邮箱的属性才受支持(尽管这些属性可能特定于特定邮箱格式)。例如,单个文件邮箱格式的文件偏移量和基于目录的邮箱格式的文件名不会保留,因为它们仅适用于原始邮箱。但是,诸如消息是否已被用户读取或标记为重要的状态将被保留,因为它应用于消息本身。

没有要求 Message 实例用于表示使用 Mailbox 实例。在某些情况下,生成 Message 陈述可能不可接受。在这种情况下, Mailbox 实例还提供类似于字符串和文件的表示,并且当 Mailbox 实例已初始化。

MaildirMessage

class mailbox.MaildirMessage(message=None)

具有maildir特定行为的消息。参数 消息Message 构造函数。

通常,邮件用户代理应用程序将 new 子目录到 cur 子目录,在用户第一次打开和关闭邮箱后,记录邮件是旧的,无论它们是否被实际读取。每个消息在 cur 在其文件名中添加了一个“信息”部分以存储有关其状态的信息。(有些邮件阅读器还可以在邮件中添加“信息”部分 new “信息”部分可以采用两种形式中的一种:它可以包含“2”,后面是标准化标志列表(例如,“2,fr”),或者它可以包含“1”,后面是所谓的实验信息。maildir消息的标准标志如下:

意义

解释

D

草稿

成分不足

F

标记的

标记为重要

P

通过

转发、重新发送或反弹

R

回答

答复对象

S

看到

T

蹂躏

标记为以后删除

MaildirMessage 实例提供以下方法:

get_subdir()

返回“new”(如果消息应存储在 new 子目录)或“cur”(如果消息应存储在 cur 子目录)。

注解

消息通常从 newcur 在访问其邮箱后,无论是否已读取邮件。一条消息 msg 如果 "S" in msg.get_flags()True .

set_subdir(subdir)

设置消息应存储在的子目录。参数 子迪尔 必须是“new”或“cur”。

get_flags()

返回一个指定当前设置的标志的字符串。如果消息符合标准maildir格式,则结果是按字母顺序将每个消息串联为零或出现一次 'D''F''P''R''S''T' . 如果没有设置标志或“info”包含实验语义,则返回空字符串。

set_flags(flags)

设置由指定的标志 flags 让其他人都不安。

add_flag(flag)

设置由指定的标志 flag 不更改其他标志。要一次添加多个标志, flag 可以是多个字符的字符串。不管当前的“信息”是否包含实验信息而不是标志,它都会被覆盖。

remove_flag(flag)

取消设置由指定的标志 flag 不更改其他标志。一次删除多个标志, flag 可能是由多个字符组成的字符串。如果“信息”包含实验信息而不是标志,则当前的“信息”不会被修改。

get_date()

以浮点数形式返回消息的传递日期,该浮点数表示自epoch以来的秒数。

set_date(date)

将邮件的传递日期设置为 date ,表示自纪元以来秒数的浮点数。

get_info()

返回包含消息“信息”的字符串。这对于访问和修改实验性的“信息”很有用(即,不是标记列表)。

set_info(info)

设置“信息” info ,应为字符串。

当A MaildirMessage 实例是基于 mboxMessageMMDFMessage 实例 StatusX-Status 将省略标题,并进行以下转换:

结果状态

mboxMessageMMDFMessage 状态

“cur”子目录

O旗

F旗

F旗

R旗

S旗

R旗

T旗

D旗

当A MaildirMessage 实例是基于 MHMessage 例如,发生以下转换:

结果状态

MHMessage 状态

“cur”子目录

“未打开”序列

“cur”子目录和s标志

无“未打开”序列

F旗

“标记”序列

R旗

“回复”顺序

当A MaildirMessage 实例是基于 BabylMessage 例如,发生以下转换:

结果状态

BabylMessage 状态

“cur”子目录

“看不见”的标签

“cur”子目录和s标志

无“未打开”标签

P标志

“转发”或“重新发送”标签

R旗

“已应答”标签

T旗

“删除”标签

mboxMessage

class mailbox.mboxMessage(message=None)

具有mbox特定行为的消息。参数 消息Message 构造函数。

mbox邮箱中的邮件存储在单个文件中。发送方的信封地址和交付时间通常存储在以“发件人”开头的行中,该行用于指示消息的开始,尽管在MBOX实现中,此数据的确切格式存在相当大的差异。指示消息状态的标志(例如消息是否已被读取或标记为重要)通常存储在 StatusX-Status 标题。

MBOX消息的常规标志如下:

意义

解释

R

O

旧的

以前被MUA检测到

D

删除

标记为以后删除

F

标记的

标记为重要

A

回答

答复对象

“R”和“O”标志存储在 Status 头和“d”、“f”和“a”标志存储在 X-Status 标题。标志和标题通常按上述顺序出现。

mboxMessage 实例提供以下方法:

get_from()

返回一个字符串,该字符串表示在mbox邮箱中标记邮件开头的“发件人”行。不包括前导“from”和尾随新行。

set_from(from_, time_=None)

将“从”行设置为 from_ ,指定时应不带前导“from”或尾随换行符。为了方便, time_ 可指定,并将适当格式化并附加到 from_ .如果 time_ 是指定的,它应该是 time.struct_time 例如,一个适合传递给 time.strftime()True (使用) time.gmtime()

get_flags()

返回一个指定当前设置的标志的字符串。如果消息符合常规格式,则结果是按以下顺序串联,即每一个 'R''O''D''F''A' .

set_flags(flags)

设置由指定的标志 flags 让其他人都不安。参数 flags 应该是以零个或多个出现次数的任意顺序的串联 'R''O''D''F''A' .

add_flag(flag)

设置由指定的标志 flag 不更改其他标志。要一次添加多个标志, flag 可以是多个字符的字符串。

remove_flag(flag)

取消设置由指定的标志 flag 不更改其他标志。一次删除多个标志, flag 可能是由多个字符组成的字符串。

当一个 mboxMessage 实例是基于 MaildirMessage 例如,根据 MaildirMessage 实例的交付日期,并进行以下转换:

结果状态

MaildirMessage 状态

R旗

S旗

O旗

“cur”子目录

D旗

T旗

F旗

F旗

R旗

当一个 mboxMessage 实例是基于 MHMessage 例如,发生以下转换:

结果状态

MHMessage 状态

R标志和O标志

无“未打开”序列

O旗

“未打开”序列

F旗

“标记”序列

“回复”顺序

当一个 mboxMessage 实例是基于 BabylMessage 例如,发生以下转换:

结果状态

BabylMessage 状态

R标志和O标志

无“未打开”标签

O旗

“看不见”的标签

D旗

“删除”标签

“已应答”标签

当A Message 实例是基于 MMDFMessage 例如,复制“From”行,所有标志直接对应:

结果状态

MMDFMessage 状态

R旗

R旗

O旗

O旗

D旗

D旗

F旗

F旗

MHMessage

class mailbox.MHMessage(message=None)

具有MH特定行为的消息。参数 消息Message 构造函数。

MH消息不支持传统意义上的标记或标志,但它们支持序列,这是任意消息的逻辑分组。一些邮件阅读程序(虽然不是标准的 mhnmh )使用序列的方式与标记用于其他格式的方式大致相同,如下所示:

序列

解释

看不见的

未读取,但以前由MUA检测到

回答

答复对象

标记的

标记为重要

MHMessage 实例提供以下方法:

get_sequences()

返回包含此消息的序列的名称列表。

set_sequences(sequences)

设置包含此消息的序列列表。

add_sequence(sequence)

添加 序列 包括此消息的序列列表。

remove_sequence(sequence)

去除 序列 从包含此消息的序列列表中。

当一个 MHMessage 实例是基于 MaildirMessage 例如,发生以下转换:

结果状态

MaildirMessage 状态

“未打开”序列

无S旗

“回复”顺序

R旗

“标记”序列

F旗

当一个 MHMessage 实例是基于 mboxMessageMMDFMessage 实例 StatusX-Status 将省略标题,并进行以下转换:

结果状态

mboxMessageMMDFMessage 状态

“未打开”序列

无R标志

“回复”顺序

“标记”序列

F旗

当一个 MHMessage 实例是基于 BabylMessage 例如,发生以下转换:

结果状态

BabylMessage 状态

“未打开”序列

“看不见”的标签

“回复”顺序

“已应答”标签

BabylMessage

class mailbox.BabylMessage(message=None)

婴儿特有行为的信息。参数 消息Message 构造函数。

某些消息标签,调用 attributes ,根据惯例被定义为具有特殊含义。属性如下:

标签

解释

看不见的

未读取,但以前由MUA检测到

删除

标记为以后删除

提出

已复制到其他文件或邮箱

回答

答复对象

转发的

转发的

编辑

用户修改

怨恨

怨恨

默认情况下,rmail仅显示可见的标题。这个 BabylMessage 但是,类使用原始头,因为它们更完整。如果需要,可以显式访问可见的头。

BabylMessage 实例提供以下方法:

get_labels()

返回邮件上的标签列表。

set_labels(labels)

将邮件上的标签列表设置为 标签 .

add_label(label)

添加 标签 到邮件上的标签列表。

remove_label(label)

去除 标签 从邮件上的标签列表中。

get_visible()

返回一 Message 实例,其头是消息的可见头,其主体为空。

set_visible(visible)

将邮件的可见邮件头设置为与中的邮件头相同 消息 . 参数 看得见的 应该是 Message 实例 email.message.Message 实例、字符串或类似文件的对象(应在文本模式下打开)。

update_visible()

当A BabylMessage 实例的原始头被修改,可见的头不会自动修改为对应的。此方法更新可见头,如下所示:每个具有相应原始头的可见头都被设置为原始头的值,每个没有相应原始头的可见头都被删除,并且 DateFromReply-ToToCCSubject 原始头中存在但不可见的头将添加到可见头中。

当A BabylMessage 实例是基于 MaildirMessage 例如,发生以下转换:

结果状态

MaildirMessage 状态

“看不见”的标签

无S旗

“删除”标签

T旗

“已应答”标签

R旗

“转发”标签

P标志

当A BabylMessage 实例是基于 mboxMessageMMDFMessage 实例 StatusX-Status 将省略标题,并进行以下转换:

结果状态

mboxMessageMMDFMessage 状态

“看不见”的标签

无R标志

“删除”标签

D旗

“已应答”标签

当A BabylMessage 实例是基于 MHMessage 例如,发生以下转换:

结果状态

MHMessage 状态

“看不见”的标签

“未打开”序列

“已应答”标签

“回复”顺序

MMDFMessage

class mailbox.MMDFMessage(message=None)

具有mmdf特定行为的消息。参数 消息Message 构造函数。

与mbox邮箱中的邮件一样,mmdf邮件以发件人地址和发送日期存储在以“发件人”开头的首行中。同样,指示消息状态的标志通常存储在 StatusX-Status 标题。

MMDF消息的常规标志与MBOX消息的相同,如下所示:

意义

解释

R

O

旧的

以前被MUA检测到

D

删除

标记为以后删除

F

标记的

标记为重要

A

回答

答复对象

“R”和“O”标志存储在 Status 头和“d”、“f”和“a”标志存储在 X-Status 标题。标志和标题通常按上述顺序出现。

MMDFMessage 实例提供以下方法,这些方法与 mboxMessage

get_from()

返回一个字符串,该字符串表示在mbox邮箱中标记邮件开头的“发件人”行。不包括前导“from”和尾随新行。

set_from(from_, time_=None)

将“从”行设置为 from_ ,指定时应不带前导“from”或尾随换行符。为了方便, time_ 可指定,并将适当格式化并附加到 from_ .如果 time_ 是指定的,它应该是 time.struct_time 例如,一个适合传递给 time.strftime()True (使用) time.gmtime()

get_flags()

返回一个指定当前设置的标志的字符串。如果消息符合常规格式,则结果是按以下顺序串联,即每一个 'R''O''D''F''A' .

set_flags(flags)

设置由指定的标志 flags 让其他人都不安。参数 flags 应该是以零个或多个出现次数的任意顺序的串联 'R''O''D''F''A' .

add_flag(flag)

设置由指定的标志 flag 不更改其他标志。要一次添加多个标志, flag 可以是多个字符的字符串。

remove_flag(flag)

取消设置由指定的标志 flag 不更改其他标志。一次删除多个标志, flag 可能是由多个字符组成的字符串。

当一个 MMDFMessage 实例是基于 MaildirMessage 例如,根据 MaildirMessage 实例的交付日期,并进行以下转换:

结果状态

MaildirMessage 状态

R旗

S旗

O旗

“cur”子目录

D旗

T旗

F旗

F旗

R旗

当一个 MMDFMessage 实例是基于 MHMessage 例如,发生以下转换:

结果状态

MHMessage 状态

R标志和O标志

无“未打开”序列

O旗

“未打开”序列

F旗

“标记”序列

“回复”顺序

当一个 MMDFMessage 实例是基于 BabylMessage 例如,发生以下转换:

结果状态

BabylMessage 状态

R标志和O标志

无“未打开”标签

O旗

“看不见”的标签

D旗

“删除”标签

“已应答”标签

当一个 MMDFMessage 实例是基于 mboxMessage 例如,复制“From”行,所有标志直接对应:

结果状态

mboxMessage 状态

R旗

R旗

O旗

O旗

D旗

D旗

F旗

F旗

例外情况

以下异常类是在 mailbox 模块:

exception mailbox.Error

所有其他特定于模块的异常的基础类。

exception mailbox.NoSuchMailboxError

当需要邮箱但找不到邮箱时引发,例如在实例化 Mailbox 具有不存在的路径的子类(以及 创造 参数设置为 False )或打开不存在的文件夹时。

exception mailbox.NotEmptyError

当邮箱不为空但预期为空时引发,例如删除包含邮件的文件夹时。

exception mailbox.ExternalClashError

当某些与邮箱相关的条件超出程序控制范围,导致无法继续时引发,例如无法获取另一个程序已持有锁的锁,或者已存在唯一生成的文件名。

exception mailbox.FormatError

当无法分析文件中的数据时引发,例如当 MH 实例尝试读取损坏的 .mh_sequences 文件。

实例

打印邮箱中所有邮件主题的简单示例:

import mailbox
for message in mailbox.mbox('~/mbox'):
    subject = message['subject']       # Could possibly be None.
    if subject and 'python' in subject.lower():
        print(subject)

要将Babyl邮箱中的所有邮件复制到MH邮箱,请转换所有可转换的特定格式信息:

import mailbox
destination = mailbox.MH('~/Mail')
destination.lock()
for message in mailbox.Babyl('~/RMAIL'):
    destination.add(mailbox.MHMessage(message))
destination.flush()
destination.unlock()

此示例将来自多个邮件列表的邮件分类到不同的邮箱中,注意避免由于其他程序同时修改而导致邮件损坏、由于程序中断而导致邮件丢失或由于邮箱中的邮件格式错误而过早终止:

import mailbox
import email.errors

list_names = ('python-list', 'python-dev', 'python-bugs')

boxes = {name: mailbox.mbox('~/email/%s' % name) for name in list_names}
inbox = mailbox.Maildir('~/Maildir', factory=None)

for key in inbox.iterkeys():
    try:
        message = inbox[key]
    except email.errors.MessageParseError:
        continue                # The message is malformed. Just leave it.

    for name in list_names:
        list_id = message['list-id']
        if list_id and name in list_id:
            # Get mailbox to use
            box = boxes[name]

            # Write copy to disk before removing original.
            # If there's a crash, you might duplicate a message, but
            # that's better than losing a message completely.
            box.lock()
            box.add(message)
            box.flush()
            box.unlock()

            # Remove original message
            inbox.lock()
            inbox.discard(key)
            inbox.flush()
            inbox.unlock()
            break               # Found destination, so stop looking.

for box in boxes.itervalues():
    box.close()