– 以各种格式处理邮箱 – Internet数据处理(Python教程)(参考资料)
mailbox
– 以各种格式操作邮箱
源代码: Lib / mailbox.py
这个模块定义了两个类,Mailbox
和Message
,foraccess和操作磁盘邮箱及其包含的消息.Mailbox
提供了从键到消息的字典式映射.Message
扩展了email.message
模块的Message
具有格式特定状态和行为的类。支持的邮箱格式为Maildir,mbox,MH,Babyl和MMDF .
也可以看看
- 模块
email
- 代表和操纵信息.
Mailbox
对象
- class
mailbox.
Mailbox
-
邮箱,可以检查和修改.
Mailbox
类定义一个接口,不打算实例化。相反,格式特定的子类应继承自Mailbox
并且你的代码应该实例化一个特定的子类.Mailbox
接口是字典式的,小密钥对应于消息。钥匙由发出Mailbox
他们将被使用的实例,只对那个有意义Mailbox
实例。即使相应的消息被修改,密钥也会继续识别消息,例如将其替换为另一条消息.消息可以添加到
Mailbox
实例使用set-likemethodadd()
并使用del
语句或set-likemethodsremove()
和discard()
.Mailbox
接口语义以某些值得注意的方式与字典语义不同。每次请求消息时,都会有新的表示(通常是Message
实例)是根据邮箱的当前状态生成的。同样,当一条消息添加到Mailbox
例如,提供的消息表示的内容被复制。在任何情况下都不是对Mailbox
实例所保留的消息表示的引用//默认
Mailbox
迭代器迭代消息表示,而不是像默认字典迭代器那样的键。此外,在迭代期间修改amailbox是安全且定义良好的。创建迭代器后添加到邮箱的邮件将不会被查看者看到。在迭代器产生它们之前从邮箱中删除的消息将被静默跳过,但是如果相应的消息随后被删除,则使用迭代器中的键可能会导致KeyError
异常.Warning
修改可能被其他进程同时更改的邮箱时要非常谨慎。用于此类任务的最安全的邮箱格式是Maildir;尽量避免使用单文件格式,如mbox forconcurrent writing。如果你正在修改邮箱,你must通过调用
lock()
和unlock()
方法来锁定它before阅读文件中的任何消息或通过添加或删除消息进行任何更改。无法锁定邮箱会有丢失邮件或破坏整个邮箱的风险.Mailbox
实例有以下方法:add
(message)-
添加message到邮箱并返回已分配给的密钥
Parameter message可能是
Message
实例,email.message.Message
实例,字符串,字节字符串或类似文件的对象(应该以二进制模式打开)。如果message是适当格式特定的Message
子类的实例(例如,如果它是mboxMessage
实例并且这是一个mbox
实例),则其格式特定信息被使用。否则,使用格式特定信息的合理默认值.在版本3.2中更改:添加了对二进制输入的支持.
remove
(key)__delitem__
(key)discard
(key)-
从邮箱中删除对应key的消息.
如果不存在这样的消息,如果将//方法称为
KeyError
或remove()
,则会引发__delitem__()
但如果方法被调用为discard()
,则不会引发任何异常。如果底层邮箱格式支持其他进程的并发修改,则discard()
的行为可能是首选.
__setitem__
(key, message )-
用key替换message对应的消息。如果没有消息已经对应
KeyError
,则提出key.异常与
add()
一样,参数message可能是Message
实例,email.message.Message
实例,字符串,字节串或类文件对象(应以二进制模式打开)。如果message是特定格式的Message
子类的实例(例如,如果它是mboxMessage
实例,这是一个mbox
实例),使用其格式特定的信息。否则,当前对应key的消息的格式特定信息保持不变.
iterkeys
()keys
()-
如果调用
iterkeys()
,则返回所有键上的迭代器或返回键列表叫keys()
.
itervalues
()__iter__
()values
()-
如果调用
itervalues()
或__iter__()
,则返回所有消息的表示形式的迭代器,如果调用values()
。消息被表示为适当格式的实例Message
子类无法在Mailbox
实例初始化时指定自定义消息工厂.注意
的行为
__iter__()
不像字典那样,字干过键.
iteritems
()items
()-
将迭代器返回(key, message)对,key是一把钥匙message是一个消息表示,如果被称为
iteritems()
或返回这样的对的列表,如果被称为items()
。这些消息被表示为适当格式的实例Message
子类除非在Mailbox
实例初始化时指定了自定义消息工厂.
get
(key, default=None)__getitem__
(key)-
返回对应key。如果不存在这样的消息,如果方法被调用为default则返回
get()
并且如果该方法被称为KeyError
则引发__getitem__()
。消息被表示为适当格式特定的Message
子类的实例,除非在Mailbox
实例初始化时指定了acustom消息工厂.
get_message
(key)-
返回对应于key的消息的表示,作为适当的特定于格式的
Message
子类的实例,如果不存在这样的消息则返回KeyError
异常.
get_bytes
(key)-
返回对应于key的消息的字节表示,如果不存在这样的消息,则选择
KeyError
异常.新版本3.2.
get_string
(key)-
返回对应于key的消息的字符串表示,如果不存在此类消息,则选择
KeyError
异常。主题通过email.message.Message
将其转换为7位清洁表示
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, message)对,其中key是一个键,message是一个消息表示,并删除相应的消息。如果邮箱是空的,请举起
KeyError
例外。除非在Message
实例初始化时指定了自定义消息工厂,否则Themessage表示为适当格式特定的Mailbox
子类的实例.
update
(arg)-
参数arg应该是key – to – message映射或(key, message)对的迭代。更新邮箱,以便对于每个给定的key和message,对应于key被设置为message好像用
__setitem__()
。和__setitem__()
,每个key必须已经对应邮箱中的邮件或者KeyError
异常会被提出,所以一般来说这是不正确的arg是Mailbox
实例注意
与字典不一样,不支持关键字参数.
flush
( )-
将任何挂起的更改写入文件系统。对于一些
Mailbox
子类,更改总是立即写入,flush()
没有,但你仍然应该养成这种方法的习惯.
lock
( )-
获取邮箱上的独占咨询锁,以便其他进程知道不要修改它。一个
ExternalClashError
如果锁定不可用则引发。使用的特定锁定机制取决于邮箱格式。在对内容进行任何修改之前,你应该always锁定邮箱.
unlock
()-
释放邮箱上的锁,如果有的话
close
()-
刷邮箱,必要时解锁,关闭任何打开文件。Forsome
Mailbox
子类,这个方法什么都不做.
Maildir
- class
mailbox.
Maildir
(dirname, factory=None, create=True) -
用于Maildir格式的邮箱的
Mailbox
的子类。参数factory是一个可调用的对象,它接受类似文件的消息表示(其行为就像在二进制模式下打开一样)并返回一个自定义表示。如果factory是None
,MaildirMessage
用作默认的消息表示。如果create是True
,那么邮箱会被创建,如果它是notexist由于历史原因,dirname被命名为而不是path.
Maildir是为qmail mailtransfer代理发明的基于目录的邮箱格式,现在受到其他程序的广泛支持。aMaildir邮箱中的消息存储在公共directorystructure中的单独文件中。这种设计允许Maildir邮箱被多个不相关的程序访问和修改而不会损坏数据,因此文件锁定是不必要的.
Maildir邮箱包含三个子目录,即:
tmp
,new
和cur
。消息在tmp
子目录中暂时创建,然后移动到new
子目录tofinalize delivery。邮件用户代理可能随后将邮件移至cur
子目录,并在其文件名附加的特殊“信息”部分中存储有关消息状态的信息.还支持Courier邮件传输代理引入的样式的文件夹。如果
"."
是其名称中的第一个字符,则主邮箱的任何子目录都被视为文件夹。文件夹名称由Maildir
表示,没有前导"."
。每个文件夹本身都是Maildirmailbox,但不应包含其他文件夹。相反,使用"."
指示逻辑嵌套来划分级别,例如“Archived.2005.07”.注意
Maildir规范要求使用冒号(
":"
)在某些消息文件名中。但是,某些操作系统不允许在文件名中使用此字符。如果您希望在suchan操作系统上使用类似Maildir的格式,则应指定另一个字符来使用。感叹号("!"
)是一个受欢迎的选择。例如:import mailboxmailbox.Maildir.colon = "!"
colon
属性也可以基于每个实例设置.Maildir
实例具有Mailbox
的所有方法,除了以下内容:list_folders
()-
返回所有文件夹的名称列表.
add_folder
(folder)-
创建一个名为folder的文件夹并返回一个表示它的
Maildir
实例.
remove_folder
(folder)-
删除名称为folder的文件夹。如果文件夹包含任何消息,则
NotEmptyError
异常将被提出,文件夹将不被删除.
clean
( )-
从邮箱中删除过去36小时内未访问过的临时文件。Maildir规范说邮件阅读程序应该偶尔这样做.
有些
Mailbox
由Maildir
实现的方法值得特别说明:add
(message)__setitem__
(key, message)update
(arg)
flush
( )-
对Maildir邮箱的所有更改都会立即应用,所以这个方法什么都不用.
lock
()unlock
()-
Maildir mailboxes不支持(或要求)锁定,所以这些方法没有.
close
()-
Maildir
实例不保留任何打开文件,底层邮箱不支持锁定,所以这个方法什么都不做.
get_file
(key)-
根据主机平台,当返回的文件保持打开状态时,可能无法修改或删除基础消息.
mbox
- class
mailbox.
mbox
(path, factory=None, create=True) -
对于mbox格式的邮箱,
Mailbox
的子类。参数factory是一个可调用的对象,它接受类似文件的消息表示(就像在二进制模式下打开一样)并返回一个自定义表示。如果factory是None
,mboxMessage
用作默认的消息表示。如果create是True
,则创建邮箱如果它是notexist这是mbox格式是在Unix系统上存储邮件的经典格式。mbox邮箱中的所有消息都存储在一个文件中,每行消息的开头由一行表示,其前五个字符为“From”.
存在mbox格式的几种变体以解决原始中的感知缺陷。为了兼容性,
mbox
实现原始格式,有时也称为mboxo。这意味着Content-Length标题(如果存在)被忽略,并且当存储消息时,消息体中一行开头的“From”的任何发生都转换为“> From”,尽管“> From”的出现不会转换为“From”“在阅读信息时一些
Mailbox
由mbox
实现的方法值得特别说明:get_file
(key)-
在调用
flush()
后使用该文件close()
mbox
实例可能会产生不可预测的结果或引起异常情况.
lock
()unlock
()-
使用三种锁定机制锁定,如果有的话,
flock()
和lockf()
系统调用.
另见
- qbox的mbox手册页
- 格式及其变体的说明.
- mbox手册页来自
- 格式的另一种说明,有锁定的详细信息
- 在Unix上配置Netscape Mail:为什么内容长度格式不好
- 使用原始mbox格式而不是变体的论据.
- \”mbox“是一系列互不兼容的邮箱格式
- mbox变种的历史.
MH
- class
mailbox.
MH
(path, factory=None, create=True) -
对于MH格式的邮箱,
Mailbox
的子类。参数factory是一个可调用的对象,它接受类似文件的消息表示(就像在二进制模式下打开一样)并返回一个自定义表示。如果factory是None
,MHMessage
用作默认的消息表示。如果create是True
,则创建邮箱如果它是notexist//MH是为邮件用户代理MH Message HandlingSystem发明的基于目录的邮箱格式。MH邮箱中的每条消息都驻留在自己的文件中。除邮件外,MH邮箱还可以包含其他MH邮箱(称为folders)。文件夹可以无限期嵌套。MH邮箱也支持sequences,它们是用于逻辑分组消息而不将其移动到子文件夹的命名列表。序列在文件中定义
.mh_sequences
在每个文件夹中MH
class操纵MH邮箱,但它不会尝试编写所有MH 的行为。特别是它不会修改并且不受context
或.mh_profile
用于存储其状态和配置的或文件的影响.MH
实例具有Mailbox
的所有方法以及以下内容:list_folders
()-
返回所有文件夹的名称列表.
get_folder
(folder)-
返回
MH
表示名称为的文件夹的实例folder。一个NoSuchMailboxError
如果文件夹不存在则引发异常.
add_folder
(folder)-
创建一个名为folder并返回
MH
实例代表它
remove_folder
(folder)-
删除名称为的文件夹folder。如果文件夹包含任何消息,则
NotEmptyError
异常将被提出,文件夹将不会被删除.
get_sequences
()-
返回映射到键列表的序列名称字典。如果有序列,则返回空字典.
set_sequences
(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 – 消息处理系统
- 主页 nmh ,原始的更新版本 mh .
- MH&nmh:用户电子邮件&程序员
- 一本GPL许可的书 mh 和NMH ,有关邮箱格式的一些信息.
Babyl
- class
mailbox.
Babyl
(path, factory=None, create=True) -
的子类
Mailbox
对于Babyl格式的邮箱。参数factory是一个可调用的对象,它接受类似文件的消息表示(其行为就像在二进制模式下打开一样)并返回一个自定义表示。如果factory是None
,BabylMessage
用作默认的messagerepresentation。如果create是True
,则创建邮箱如果它是notexistBabyl是由Emacs包含的Rmail邮件用户代理使用的单文件邮箱格式。消息的开头由包含两个字符Control-Underscore(
"\037"
)和Control-L("\014"
)的行指示。消息的结尾由nextwssage的开头指示,或者在最后一条消息的情况下,包含aControl-Underscore("\037"
)字符的行在Babyl邮箱中的消息有两组标题,原始标题和所谓的可见标题。可见标题通常是原始标题的一个子集,已经重新格式化或删节以使其更具吸引力。Babyl邮箱中的每条消息还有一个labels的附带列表,或者记录有关themessage的额外信息的短字符串,并且在Babyl选项部分中保留了邮箱中找到的所有用户定义标签的列表.
Babyl
实例具有Mailbox
的所有方法,除了以下内容:get_labels
()-
//返回邮箱中使用的所有用户定义标签的名称列表.
注意
检查实际的消息以确定邮箱中存在哪些标签,而不是查阅Babyloptions部分中的标签列表,但每当邮箱被修改时,Babyl部分都会更新.
一些
Mailbox
由Babyl
实现的方法值得特别说明:get_file
(key)-
在Babyl邮箱中,邮件的标题不会与邮件正文相连。要生成类似文件的表示,将标题和正文一起复制到
io.BytesIO
实例,其API与afile相同。因此,类似文件的对象真正独立于底层邮箱,但与字符串表示相比不会节省内存.
lock
()unlock
()-
使用三种锁定机构 – 点锁定,如果有的话,
flock()
和lockf()
系统调用
参见
- 版本5 Babyl文件的格式
- Babyl格式的规格.
- 用电子邮件阅读邮件
- Rmail手册,包含有关Babyl语义的一些信息.
MMDF
- class
mailbox.
MMDF
(path, factory=None, create=True) -
的子类
Mailbox
对于MMDF格式的邮箱。参数factory是一个可调用的对象,它接受类似文件的消息表示(就像在二进制模式下打开一样)并返回一个自定义表示。如果factory是None
,MMDFMessage
用作默认的messagerepresentation。如果create是True
,那么邮箱会被创建,如果它是notexist的MMDF是为多渠道备忘录分发工具(一种邮件传输代理)发明的单文件邮箱格式。每条消息与mbox消息的形式相同,但在包含四个Control-A的行之前和之后被括起来(
"\001"
)人物。与mbox格式一样,每条消息的开始由一行表示,其前五个字符为“From”,但在存储消息时,“From”的其他出现不会转换为“> From”,因为额外的消息分隔符行会防止错误后续消息开始的事件.一些
Mailbox
由MMDF
实现的方法值得特别说明:get_file
(key)-
在调用
flush()
后使用该文件close()
MMDF
实例可能会产生不可预测的结果或引起异常情况.
lock
()unlock
()-
使用三种锁定机制锁定,如果有的话,
flock()
和lockf()
系统调用.
另见
- mmdf手册页来自
- 来自锡的文档中的MMDF格式规格,新闻阅读器.
- MMDF
- 维基百科文章描述了多渠道备忘录DistributionFacility.
Message
对象
- class
mailbox.
Message
(message=None) -
email.message
模块的子类Message
。mailbox.Message
特定于addmailbox格式的状态和行为.如果省略message,则新实例创建为默认的空状态。如果message是
email.message.Message
实例,其内容被复制;此外,如果message是Message
实例,则在任何可能的情况下转换任何特定于格式的信息。如果message是一个字符串,一个字节字符串或一个文件,它应该包含一个 RFC 2822 – 兼容的消息,它被读取并解析。文件应该以二进制模式打开,但接受文本模式文件以便向后兼容.子类提供的特定于格式的状态和行为各不相同,但一般情况下,只有特定于受支持的特定邮箱的属性(尽管可能属性特定于特定邮箱格式)。例如,不保留单文件邮箱格式的文件偏移量和基于目录的邮箱格式的文件名,因为它们仅适用于原始邮箱。但是要记录消息是由用户读取还是标记为重要消息,因为它适用于消息本身.
没有要求
Message
实例用于表示使用的消息检索Mailbox
实例在某些情况下,生成Message
表示所需的时间和内存可能是不可接受的。对于这种情况,Mailbox
实例也提供字符串和类似文件的表示,并且当Mailbox
实例初始化时可能指定自定义消息工厂.
MaildirMessage
- class
mailbox.
MaildirMessage
(message=None) -
具有Maildir特定行为的消息。参数message与
Message
构造函数具有相同的意义.通常,邮件用户代理应用程序将
new
子目录中的所有消息移动到cur
子目录在用户第一次打开和关闭邮箱后,记录邮件是否旧,他们实际上是否已被阅读。cur
中的每条消息都在其文件名中添加了“info”部分,以存储有关其状态的信息。(某些邮件阅读器也可能在new
中的消息中添加“info”部分。)“信息”部分可以采用两种形式中的一种:它可以包含“2”,后面是标准化标志列表(例如,“2,FR”),或者它可以包含“1”,然后是所谓的实验信息。Maildir信息的标准标志如下:标志 含义 说明 D 草稿 作品 F 标记 标记为重要 P 通过 转发,怨恨或反弹 ř 回复 的子类回复 S 看 读 Ť 丢弃 标记为后续删除 MaildirMessage
实例提供以下方法:get_subdir
()-
返回“新”(如果消息应存储在
new
子目录)或“cur”(如果消息应该存储在cur
子目录).注意
消息通常是从
new
至cur
访问了其邮箱后,无论邮件是否已被阅读。如果msg
是"S" in msg.get_flags()
(True
.
set_subdir
)subdir,则会显示-
设置应存储消息的子目录。参数subdir必须是“new”或“cur”.
get_flags
( )-
返回一个字符串,指定当前设置的标志。如果themessage符合标准的Maildir格式,则结果是按字母顺序排列,每个字符为零或一次
"D"
,"F"
,"P"
,"R"
,"S"
,和"T"
。如果没有设置标志或者“info”包含experimentalsemantics,则返回空字符串.
set_flags
(flags)-
设置flags指定的标志并取消设置所有其他人。
add_flag
(flag)-
设置flag指定的标志而不更改其他标志。要一次添加多个标志,flag可能是一个超过一个字符的字符串。无论是否包含实验信息而不是旗帜,当前的“信息”都会被覆盖.
remove_flag
(flag)-
取消设置flag没有改变其他标志。要一次删除多个标志,flag也许是一个多个字符的字符串。如果“info”包含实验信息而不是标志,则当前的“info”不会被修改.
get_date
( )-
将消息的发送日期作为浮点数表示,代表自纪元以来的秒数.
set_date
(date)-
将消息的发送日期设置为date,一个代表自纪元以来秒数的浮点数
get_info
()-
返回包含消息“info”的字符串。这对于实现(即不是列表offlags)的“信息”非常有用.
set_info
(info)-
将“info”设置为info,应该是一个字符串.
当MaildirMessage
实例基于mboxMessage
或MMDFMessage
实例创建时,Status和X-Status标题被省略,下面的转换位置:
结果状态 | mboxMessage 或MMDFMessage 状态 |
---|---|
“cur”子目录 | O flag |
F flag | F flag |
R flag | 一个标志 |
S flag | R flag |
T flag | D flag |
当MaildirMessage
实例基于MHMessage
实例创建时,发生以下转换:
结果状态 | MHMessage 状态 |
---|---|
“cur”子目录 | “看不见”序列 |
“cur”子目录和S标志 | 没有“看不见的”序列 |
F标志 | “标记”序列 |
R标志 | “回答”序列 |
当基于MaildirMessage
实例创建BabylMessage
实例时,会发生以下转换:
结果状态 | BabylMessage state |
---|---|
“cur”子目录 | “看不见”标签 |
“cur”子目录和S标志 | 没有“看不见”的标签 |
P flag | “转发”或“重新发送”标签 |
R flag | “回答”标签 |
T flag | “删除“label |
mboxMessage
- class
mailbox.
mboxMessage
(message=None) -
包含mbox特定行为的消息。参数message与
Message
构造函数具有相同的含义.mbox邮箱中的消息一起存储在一个文件中。Thesender的信封地址和传送时间通常存储在aline中,以“From”开头,用于指示消息的开始,尽管这些数据的实际格式存在很大差异。指示消息状态的标志,例如它是否已被读取或标记为重要,通常存储在Status和X-Status headers.
mbox消息的常规标志中如下:
标志 含义 说明 R 阅读 阅读 O 老 以前被MUA发现 D 删除 标记为后续删除 F 标记 标记为重要 A 回答 回复 “R”和“O”标志存储在Status标题中,“D”,“F”,并且“A”标志存储在X-Status标题中。标志和标题通常按照提到的顺序出现.
mboxMessage
实例提供以下方法:get_from
()-
返回表示“From”的字符串标记mbox邮箱中的themessage开头的行。领先的“从”和后面的换行排除.
set_from
(from_, time_=None)-
将“从”行设置为from_,应该指定aleading“From”或尾随换行符。为方便起见,可以指定time_并将其格式化并附加到from_。如果指定了time_,它应该是
time.struct_time
实例,适合传递给time.strftime()
或True
的atup(使用time.gmtime()
).
get_flags
()-
返回一个字符串,指定当前设置的标志。如果themessage符合传统格式,则结果是按 的每个零或一次出现的顺序进行连接
"R"
,"O"
,"D"
,"F"
和"A"
.
set_flags
(flags)-
设置flags指定的标志并取消所有其他标志。参数flags应该是
"R"
,"O"
,"D"
,"F"
和"A"
.
add_flag
(flag)-
设置flag指定的标志而不更改其他标志。要一次添加多个标志,flag可能是一个多个字符的字符串.
remove_flag
(flag)-
取消设置flag指定的标志而不更改其他标志。Toremove一次不止一个标志,flag也许是一串多个字符
当mboxMessage
实例是基于MaildirMessage
实例创建的,根据MaildirMessage
实例的交付日期生成“From”行,以及以下转换前置位置:
结果状态 | MaildirMessage 状态 |
---|---|
R旗 | S旗 |
O旗 | “cur”子目录 |
D旗 | T旗 |
F旗 | F旗 |
一只旗 | R旗 |
当mboxMessage
实例是基于MHMessage
例如,发生以下转换:
结果状态 | MHMessage 状态 |
---|---|
R标志和O标志 | 没有“看不见”序列 |
O flag | “看不见”的序列 |
F flag | “标记”序列 |
一个标志 | “回复”序列 |
当mboxMessage
实例基于BabylMessage
实例创建时,发生以下转换:
结果状态 | BabylMessage 状态 |
---|---|
R标志和O标志 | 没有“看不见”标签 |
O标志 | “看不见”标签 |
D标志 | “已删除“标签 |
一个标志 | ”回答“标签 |
当Message
实例是基于MMDFMessage
例如,复制“From”行并且所有标志直接对应:
结果状态 | MMDFMessage 状态 |
---|---|
R标志 | R标志 |
O flag | O flag |
D flag | D flag |
F flag | F flag |
一个标志 | 一个标志 |
MHMessage
- class
mailbox.
MHMessage
(message=None) -
具有MH特定行为的消息。参数message与
Message
构造函数具有相同的含义.MH消息不支持传统意义上的标记或标记,但它们支持序列,它们是逻辑分组。任意消息。Somemail读取程序(虽然不是标准的 mh 和 nmh )使用序列的方式与其他格式的标志大致相同,如如下:
序列 说明 看不见 不读,但以前被MUA检测到 回复 回复 标记 标记为重要 MHMessage
实例提供以下方法:get_sequences
()-
返回包含此消息的序列名称列表.
set_sequences
(sequences)-
设置包含此消息的序列列表.
add_sequence
(sequence)-
将sequence添加到包含此消息的序列列表中
remove_sequence
(sequence)-
从包含此消息的序列列表中删除sequence.
当MHMessage
实例是基于MaildirMessage
实例创建的,发生了以下转换:
结果状态 | MaildirMessage 状态 |
---|---|
“看不见”序列 | 没有S标志 |
“回复”序列 | R标志 |
“标记”序列 | F标志 |
当基于一个MHMessage
实例创建时mboxMessage
或MMDFMessage
实例,Status和X-Status标题被省略,以下转换位置:
结果状态 | mboxMessage 或MMDFMessage 状态 |
---|---|
“看不见”序列 | 没有R标志 |
“回答”序列 | 一面旗帜 |
“标记”序列 | F标志 |
当基于MHMessage
实例创建BabylMessage
实例时,会发生以下转换:
结果状态 | BabylMessage 状态 |
---|---|
“看不见”序列 | “看不见的”标签 |
“回复”序列 | “回答”标签 |
BabylMessage
- class
mailbox.
BabylMessage
(message=None) -
带有Babyl特定的消息行为。参数message与
Message
构造函数具有相同的意义.某些消息标签,称为attributes,按惯例定义具有特殊含义。属性如下:
标签 说明 看不见 未读,但以前被MUA检测到 删除 标记为后续删除 归档 复制到另一个文件或邮箱 回答 回复 转发 转发 编辑 由用户修改 resent 重新发送 默认情况下,Rmail只显示头。但是,
BabylMessage
类使用原始标题,因为它们更完整。如果需要,可以显式访问可见标题.BabylMessage
实例提供以下方法:get_labels
()-
返回消息上的标签列表。
set_labels
(labels)-
将邮件上的标签列表设置为labels.
add_label
(label)-
添加label到邮件上的标签列表.
remove_label
(label)-
从邮件上的标签列表中删除label.
get_visible
()-
返回
Message
实例,其标题是消息的可见标题,其主体是空的.
set_visible
(visible)-
将消息的可见标题设置为与message中的标题相同。参数visible应该是
Message
实例,email.message.Message
实例,字符串或文件类对象(应该以文本模式打开).
update_visible
()-
当
BabylMessage
实例的原始标题被修改,可见标题不会自动修改为对应。这样可以对可见标题进行如下操作:每个可见的标题与相应的原始标题被设置为原始标题的值,每个可见的标题都没有相应的原始标题被删除,以及任何Date, From, Reply-To,To, CC,和Subject原始标题中存在但不显示可见标题的内容会添加到可见标题中.
当一个 BabylMessage
实例是基于MaildirMessage
例如,发生以下转换:
结果状态 | MaildirMessage 状态 |
---|---|
“看不见”标签 | 否S标志 |
“删除“ 标签 | T标志 |
“回答”标签 | R标志 |
“转发”标签 | P标志 |
当BabylMessage
实例是基于mboxMessage
或MMDFMessage
实例创建的,Status和X-Status标题被省略,以下转换位置:
结果状态 | mboxMessage 或MMDFMessage 状态 |
---|---|
“看不见”标签 | 没有R标志 |
“删除”标签 | D flag |
“answers”标签 | 一个标志 |
当BabylMessage
实例基于MHMessage
实例创建时,发生以下转换:
结果状态 | MHMessage 状态 |
---|---|
“看不见”标签 | “看不见”序列 |
“回答“label | ”回复“序列 |
MMDFMessage
- class
mailbox.
MMDFMessage
(message=None) -
包含MMDF特定行为的消息。参数message与
Message
构造函数具有相同的含义。对于mbox邮箱中的消息,MMDF消息与这些地址和交付日期一起存储在初始行中以“From”开头。同样,指示消息状态的标志通常存储在Status和X-Status headers.
MMDF消息的常规标志与mbox消息的标志相同,如下:
标志 含义 说明 R 阅读 读 Ø 老 之前被MUA检测到 D 删除 标记为后续删除 F 标记 标记为重要 A 回答 回复 “R”和“O”标志存储在Status标题中,“D”,“F”和“A”标志存储在X-Status标题中。标志和标题通常按照提到的顺序出现.
MMDFMessage
实例提供以下方法,这些方法与mboxMessage
:get_from
()-
返回表示“From”行的字符串,该行标记mbox邮箱中邮件的开头。排除领先的“From”和尾随换行.
set_from
(from_, time_=None)-
将“From”行设置为from_,应该指定,而不指定“From”或尾随换行符。为方便起见,可以指定time_并将其格式化并附加到from_。如果指定了time_,它应该是
time.struct_time
实例,适合传递给time.strftime()
或True
的atup(使用time.gmtime()
).
get_flags
()-
返回一个字符串,指定当前设置的标志。如果themessage符合传统格式,则结果是按 的每个零或一次出现的顺序进行连接
"R"
,"O"
,"D"
,"F"
和"A"
.
set_flags
(flags)-
设置flags指定的标志并取消所有其他标志。参数flags应该是
"R"
,"O"
,"D"
,"F"
和"A"
.
add_flag
(flag)-
设置flag指定的标志而不更改其他标志。要一次添加多个标志,flag可能是一个多个字符的字符串.
remove_flag
(flag)-
取消设置flag指定的标志而不更改其他标志。Toremove一次不止一个标志,flag也许是一串多个字符
当MMDFMessage
实例是基于MaildirMessage
实例创建的,根据MaildirMessage
实例的交付日期生成“From”行,以及以下转换前置位置:
结果状态 | MaildirMessage 状态 |
---|---|
R标志 | S标志 |
O flag | “cur”子目录 |
D flag | T标志 |
F标志 | F标志 |
一个标志 | R标志 |
当MMDFMessage
instance基于MHMessage
实例创建,发生以下转换:
结果状态 | MHMessage 状态 |
---|---|
R标志和O标志 | 没有“看不见的”序列 |
O flag | “看不见”序列 |
F标志 | “标记”序列 |
一个标志 | “回复”序列 |
当基于MMDFMessage
实例创建BabylMessage
实例时,会发生以下转换:
结果状态 | BabylMessage 状态 |
---|---|
R标志和O标志 | 没有“看不见”标签 |
O标志 | “看不见”标签 |
D标志 | “删除”标签 |
标志 | “回答”标签 |
当MMDFMessage
instance是基于创建的在mboxMessage
例如,复制“From”行并且所有标志直接对应:
结果状态 | mboxMessage 状态 |
---|---|
R标志 | R标志 |
O flag | O flag |
D flag | D flag |
F flag | F flag |
Aflag | 一个标志 |
异常
在mailbox
模块中定义了以下异常类:
- exception
mailbox.
Error
-
所有其他类的基类特定于模块的异常
- exception
mailbox.
NoSuchMailboxError
-
在预期但未找到邮箱时发生变化,例如在使用不存在的路径实例化
Mailbox
子类时(以及create参数设置为False
),或者打开不存在的文件夹时
- exception
mailbox.
NotEmptyError
-
当邮箱不为空但预计会丢失时,例如删除包含邮件的文件夹时。
- exception
mailbox.
ExternalClashError
-
当某个超出程序控制范围的邮箱相关条件导致无法继续时,如未能获取另一个程序已经锁定的锁定,或者当一个唯一生成的文件名已经存在时引发.
- exception
mailbox.
FormatError
-
当文件中的数据无法解析时引发,例如
MH
实例尝试读取损坏的.mh_sequences
文件。
例子
打印邮箱中所有邮件的主题的简单示例:seeminteresting:
import mailboxfor message in mailbox.mbox("~/mbox"): subject = message["subject"] # Could possibly be None. if subject and "python" in subject.lower(): print(subject)
要将所有邮件从Babyl邮箱复制到MH邮箱,请转换所有可转换的格式信息:
import mailboxdestination = mailbox.MH("~/Mail")destination.lock()for message in mailbox.Babyl("~/RMAIL"): destination.add(mailbox.MHMessage(message))destination.flush()destination.unlock()
此示例将来自多个邮件列表的邮件排序到不同的邮箱中,小心避免由于其他程序的并发修改导致的邮件损坏,由于程序中断导致的邮件丢失,或过早终止邮箱中格式错误的邮件:
import mailboximport email.errorslist_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()
评论被关闭。