mailbox
---以各种格式操作邮箱¶
源代码: Lib/mailbox.py
这个模块定义了两个类, Mailbox
和 Message
,用于访问和操作磁盘邮箱及其包含的消息。 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()
和AKeyError
如果方法被调用为__getitem__()
. 该消息表示为特定于适当格式的实例Message
子类,除非在Mailbox
实例已初始化。
- 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
实例。注解
与字典不同,关键字参数不受支持。
- lock()¶
获取邮箱上的独占通知锁,以便其他进程知道不要修改它。安
ExternalClashError
如果锁不可用,则引发。使用的特定锁定机制取决于邮箱格式。你应该 总是 在对邮箱内容进行任何修改之前,请先锁定邮箱。
- unlock()¶
释放邮箱上的锁(如果有)。
Maildir
¶
- class mailbox.Maildir(dirname, factory=None, create=True)¶
一个子类
Mailbox
对于maildir格式的邮箱。参数 工厂 是一个可调用对象,它接受类似文件的消息表示(其行为类似于以二进制模式打开),并返回自定义表示。如果 工厂 是None
,MaildirMessage
用作默认消息表示形式。如果 创造 是True
,如果邮箱不存在,则创建该邮箱。如果 创造 是
True
以及 目录名 路径存在,它将被视为现有maildir,而不尝试验证其目录布局。因为历史原因 目录名 是这样命名的,而不是 path .
maildir是为qmail mail transfer代理程序发明的一种基于目录的邮箱格式,现在被其他程序广泛支持。maildir邮箱中的邮件存储在公共目录结构中的单独文件中。这种设计允许多个不相关的程序访问和修改maildir邮箱,而不会损坏数据,因此文件锁定是不必要的。
maildir邮箱包含三个子目录,即:
tmp
,new
和cur
. 消息在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
如果文件夹不存在,则引发异常。
- remove_folder(folder)¶
删除名称为的文件夹 文件夹 . 如果文件夹包含任何邮件,则
NotEmptyError
将引发异常,并且不会删除文件夹。
- clean()¶
从邮箱中删除过去36小时内未访问的临时文件。maildir规范指出,邮件读取程序应该偶尔这样做。
一些
Mailbox
方法实施者Maildir
值得特别注意的是:- add(message)¶
- __setitem__(key, message)¶
- update(arg)¶
警告
这些方法根据当前进程ID生成唯一的文件名。使用多个线程时,可能会发生未检测到的名称冲突并导致邮箱损坏,除非协调线程以避免使用这些方法同时操作同一邮箱。
- flush()¶
对maildir邮箱的所有更改都将立即应用,因此此方法不起任何作用。
- get_file(key)¶
根据主机平台的不同,在返回的文件保持打开状态时,可能无法修改或删除基础消息。
参见
- maildir man page from Courier
格式的规范。描述支持文件夹的通用扩展名。
- Using maildir format
发明人关于maildir的注释。包括更新的名称创建方案和“信息”语义的详细信息。
mbox
¶
- class mailbox.mbox(path, factory=None, create=True)¶
一个子类
Mailbox
对于mbox格式的邮箱。参数 工厂 是一个可调用对象,它接受类似文件的消息表示(其行为类似于以二进制模式打开),并返回自定义表示。如果 工厂 是None
,mboxMessage
用作默认消息表示形式。如果 创造 是True
,如果邮箱不存在,则创建该邮箱。mbox格式是在UNIX系统上存储邮件的经典格式。MBOX邮箱中的所有邮件都存储在一个文件中,每个邮件的开头都由前五个字符为“发件人”的行指示。
MBOX格式存在几种变化,以解决原始格式中的感知缺陷。为了兼容性,
mbox
实现原始格式,有时称为 mboxo . 这意味着 Content-Length 如果存在标题,则忽略该标题,并且在消息正文中一行的开头出现的“from”在存储消息时转换为“>from”,尽管在读取消息时“>from”的出现没有转换为“from”。
参见
- 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格式的邮箱。参数 工厂 是一个可调用对象,它接受类似文件的消息表示(其行为类似于以二进制模式打开),并返回自定义表示。如果 工厂 是None
,MHMessage
用作默认消息表示形式。如果 创造 是True
,如果邮箱不存在,则创建该邮箱。mh是为mh邮件处理系统(邮件用户代理)发明的基于目录的邮箱格式。MH邮箱中的每个邮件都驻留在自己的文件中。MH邮箱可以包含其他MH邮箱(调用 folders )除了信息。文件夹可以无限嵌套。MH邮箱也支持 sequences ,这是命名列表,用于在不将邮件移动到子文件夹的情况下对邮件进行逻辑分组。序列是在名为
.mh_sequences
在每个文件夹中。这个
MH
类处理mh邮箱,但它不尝试模拟所有 mh 的行为。特别是,它不会修改,并且不受context
或.mh_profile
由使用的文件 mh 存储其状态和配置。- list_folders()¶
返回所有文件夹的名称列表。
- get_folder(folder)¶
返回一
MH
表示名称为的文件夹的实例 文件夹 . 一NoSuchMailboxError
如果文件夹不存在,则引发异常。
- remove_folder(folder)¶
删除名称为的文件夹 文件夹 . 如果文件夹包含任何邮件,则
NotEmptyError
将引发异常,并且不会删除文件夹。
- get_sequences()¶
返回映射到键列表的序列名字典。如果没有序列,则返回空字典。
- set_sequences(sequences)¶
根据重新定义邮箱中存在的序列 序列 ,映射到键列表的名称字典,如返回的
get_sequences()
.
- pack()¶
根据需要重命名邮箱中的邮件,以消除编号中的空白。序列列表中的条目会相应地更新。
注解
此操作将使已颁发的密钥无效,并且不应随后使用。
- lock()¶
- unlock()¶
使用三种锁定机制——点锁定和
flock()
和lockf()
系统调用。对于mh邮箱,锁定邮箱意味着锁定.mh_sequences
文件,并且仅在影响它们的任何操作期间锁定单个消息文件。
- get_file(key)¶
根据主机平台的不同,在返回的文件保持打开状态时,可能无法删除基础消息。
- flush()¶
对mh邮箱的所有更改都将立即应用,因此此方法不起任何作用。
参见
- nmh - Message Handling System
主页 nmh ,原始版本的更新版本 mh .
- MH & nmh: Email for Users & Programmers
GPL授权书 mh 和 nmh ,其中包含有关邮箱格式的一些信息。
Babyl
¶
- class mailbox.Babyl(path, factory=None, create=True)¶
一个子类
Mailbox
对于Babyl格式的邮箱。参数 工厂 是一个可调用对象,它接受类似文件的消息表示(其行为类似于以二进制模式打开),并返回自定义表示。如果 工厂 是None
,BabylMessage
用作默认消息表示形式。如果 创造 是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相同。因此,类似文件的对象确实独立于底层邮箱,但与字符串表示形式相比,它不会保存内存。
参见
- Format of Version 5 Babyl Files
Babyl格式的规范。
- Reading Mail with Rmail
关于babyl语义的一些信息。
MMDF
¶
- class mailbox.MMDF(path, factory=None, create=True)¶
一个子类
Mailbox
对于mmdf格式的邮箱。参数 工厂 是一个可调用对象,它接受类似文件的消息表示(其行为类似于以二进制模式打开),并返回自定义表示。如果 工厂 是None
,MMDFMessage
用作默认消息表示形式。如果 创造 是True
,如果邮箱不存在,则创建该邮箱。MMDF是为多通道备忘录分发设备(邮件传输代理)发明的单文件邮箱格式。每条消息的格式与MBOX消息相同,但前后用包含四个Control-A的行括起来 (
'\001'
字符。与MBOX格式一样,每条消息的开头由一行指示,该行的前五个字符为“From”,但在存储消息时,“From”的附加出现次数不会转换为“>From”,因为附加的消息分隔符行可防止将这些出现次数误认为是后续消息的开头。
参见
- 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
子目录)。注解
消息通常从
new
到cur
在访问其邮箱后,无论是否已读取邮件。一条消息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
实例是基于 mboxMessage
或 MMDFMessage
实例 Status 和 X-Status 将省略标题,并进行以下转换:
结果状态 |
|
---|---|
“cur”子目录 |
O旗 |
F旗 |
F旗 |
R旗 |
旗 |
S旗 |
R旗 |
T旗 |
D旗 |
当A MaildirMessage
实例是基于 MHMessage
例如,发生以下转换:
结果状态 |
|
---|---|
“cur”子目录 |
“未打开”序列 |
“cur”子目录和s标志 |
无“未打开”序列 |
F旗 |
“标记”序列 |
R旗 |
“回复”顺序 |
当A MaildirMessage
实例是基于 BabylMessage
例如,发生以下转换:
结果状态 |
|
---|---|
“cur”子目录 |
“看不见”的标签 |
“cur”子目录和s标志 |
无“未打开”标签 |
P标志 |
“转发”或“重新发送”标签 |
R旗 |
“已应答”标签 |
T旗 |
“删除”标签 |
mboxMessage
¶
- class mailbox.mboxMessage(message=None)¶
具有mbox特定行为的消息。参数 消息 与
Message
构造函数。mbox邮箱中的邮件存储在单个文件中。发送方的信封地址和交付时间通常存储在以“发件人”开头的行中,该行用于指示消息的开始,尽管在MBOX实现中,此数据的确切格式存在相当大的差异。指示消息状态的标志(例如消息是否已被读取或标记为重要)通常存储在 Status 和 X-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
实例的交付日期,并进行以下转换:
结果状态 |
|
---|---|
R旗 |
S旗 |
O旗 |
“cur”子目录 |
D旗 |
T旗 |
F旗 |
F旗 |
旗 |
R旗 |
当一个 mboxMessage
实例是基于 MHMessage
例如,发生以下转换:
结果状态 |
|
---|---|
R标志和O标志 |
无“未打开”序列 |
O旗 |
“未打开”序列 |
F旗 |
“标记”序列 |
旗 |
“回复”顺序 |
当一个 mboxMessage
实例是基于 BabylMessage
例如,发生以下转换:
结果状态 |
|
---|---|
R标志和O标志 |
无“未打开”标签 |
O旗 |
“看不见”的标签 |
D旗 |
“删除”标签 |
旗 |
“已应答”标签 |
当A Message
实例是基于 MMDFMessage
例如,复制“From”行,所有标志直接对应:
结果状态 |
|
---|---|
R旗 |
R旗 |
O旗 |
O旗 |
D旗 |
D旗 |
F旗 |
F旗 |
旗 |
旗 |
MHMessage
¶
- class mailbox.MHMessage(message=None)¶
具有MH特定行为的消息。参数 消息 与
Message
构造函数。MH消息不支持传统意义上的标记或标志,但它们支持序列,这是任意消息的逻辑分组。一些邮件阅读程序(虽然不是标准的 mh 和 nmh )使用序列的方式与标记用于其他格式的方式大致相同,如下所示:
序列
解释
看不见的
未读取,但以前由MUA检测到
回答
答复对象
标记的
标记为重要
MHMessage
实例提供以下方法:- get_sequences()¶
返回包含此消息的序列的名称列表。
- set_sequences(sequences)¶
设置包含此消息的序列列表。
- add_sequence(sequence)¶
添加 序列 包括此消息的序列列表。
- remove_sequence(sequence)¶
去除 序列 从包含此消息的序列列表中。
当一个 MHMessage
实例是基于 MaildirMessage
例如,发生以下转换:
结果状态 |
|
---|---|
“未打开”序列 |
无S旗 |
“回复”顺序 |
R旗 |
“标记”序列 |
F旗 |
当一个 MHMessage
实例是基于 mboxMessage
或 MMDFMessage
实例 Status 和 X-Status 将省略标题,并进行以下转换:
结果状态 |
|
---|---|
“未打开”序列 |
无R标志 |
“回复”顺序 |
旗 |
“标记”序列 |
F旗 |
当一个 MHMessage
实例是基于 BabylMessage
例如,发生以下转换:
结果状态 |
|
---|---|
“未打开”序列 |
“看不见”的标签 |
“回复”顺序 |
“已应答”标签 |
BabylMessage
¶
- class mailbox.BabylMessage(message=None)¶
婴儿特有行为的信息。参数 消息 与
Message
构造函数。某些消息标签,调用 attributes ,根据惯例被定义为具有特殊含义。属性如下:
标签
解释
看不见的
未读取,但以前由MUA检测到
删除
标记为以后删除
提出
已复制到其他文件或邮箱
回答
答复对象
转发的
转发的
编辑
用户修改
怨恨
怨恨
默认情况下,rmail仅显示可见的标题。这个
BabylMessage
但是,类使用原始头,因为它们更完整。如果需要,可以显式访问可见的头。BabylMessage
实例提供以下方法:- get_labels()¶
返回邮件上的标签列表。
- set_labels(labels)¶
将邮件上的标签列表设置为 标签 .
- add_label(label)¶
添加 标签 到邮件上的标签列表。
- remove_label(label)¶
去除 标签 从邮件上的标签列表中。
- set_visible(visible)¶
将邮件的可见邮件头设置为与中的邮件头相同 消息 . 参数 看得见的 应该是
Message
实例email.message.Message
实例、字符串或类似文件的对象(应在文本模式下打开)。
- update_visible()¶
当A
BabylMessage
实例的原始头被修改,可见的头不会自动修改为对应的。此方法更新可见头,如下所示:每个具有相应原始头的可见头都被设置为原始头的值,每个没有相应原始头的可见头都被删除,并且 Date , From , Reply-To , To , CC 和 Subject 原始头中存在但不可见的头将添加到可见头中。
当A BabylMessage
实例是基于 MaildirMessage
例如,发生以下转换:
结果状态 |
|
---|---|
“看不见”的标签 |
无S旗 |
“删除”标签 |
T旗 |
“已应答”标签 |
R旗 |
“转发”标签 |
P标志 |
当A BabylMessage
实例是基于 mboxMessage
或 MMDFMessage
实例 Status 和 X-Status 将省略标题,并进行以下转换:
结果状态 |
|
---|---|
“看不见”的标签 |
无R标志 |
“删除”标签 |
D旗 |
“已应答”标签 |
旗 |
当A BabylMessage
实例是基于 MHMessage
例如,发生以下转换:
结果状态 |
|
---|---|
“看不见”的标签 |
“未打开”序列 |
“已应答”标签 |
“回复”顺序 |
MMDFMessage
¶
- class mailbox.MMDFMessage(message=None)¶
具有mmdf特定行为的消息。参数 消息 与
Message
构造函数。与mbox邮箱中的邮件一样,mmdf邮件以发件人地址和发送日期存储在以“发件人”开头的首行中。同样,指示消息状态的标志通常存储在 Status 和 X-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
实例的交付日期,并进行以下转换:
结果状态 |
|
---|---|
R旗 |
S旗 |
O旗 |
“cur”子目录 |
D旗 |
T旗 |
F旗 |
F旗 |
旗 |
R旗 |
当一个 MMDFMessage
实例是基于 MHMessage
例如,发生以下转换:
结果状态 |
|
---|---|
R标志和O标志 |
无“未打开”序列 |
O旗 |
“未打开”序列 |
F旗 |
“标记”序列 |
旗 |
“回复”顺序 |
当一个 MMDFMessage
实例是基于 BabylMessage
例如,发生以下转换:
结果状态 |
|
---|---|
R标志和O标志 |
无“未打开”标签 |
O旗 |
“看不见”的标签 |
D旗 |
“删除”标签 |
旗 |
“已应答”标签 |
当一个 MMDFMessage
实例是基于 mboxMessage
例如,复制“From”行,所有标志直接对应:
结果状态 |
|
---|---|
R旗 |
R旗 |
O旗 |
O旗 |
D旗 |
D旗 |
F旗 |
F旗 |
旗 |
旗 |
例外情况¶
以下异常类是在 mailbox
模块:
- exception mailbox.Error¶
所有其他特定于模块的异常的基础类。
- exception mailbox.NoSuchMailboxError¶
当需要邮箱但找不到邮箱时引发,例如在实例化
Mailbox
具有不存在的路径的子类(以及 创造 参数设置为False
)或打开不存在的文件夹时。
- exception mailbox.NotEmptyError¶
当邮箱不为空但预期为空时引发,例如删除包含邮件的文件夹时。
- exception mailbox.ExternalClashError¶
当某些与邮箱相关的条件超出程序控制范围,导致无法继续时引发,例如无法获取另一个程序已持有锁的锁,或者已存在唯一生成的文件名。
实例¶
打印邮箱中所有邮件主题的简单示例:
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()