You are here:  Home » Python » – 以各种格式处理邮箱 – Internet数据处理(Python教程)(参考资料)

mailbox– 以各种格式操作邮箱

源代码: Lib / mailbox.py


这个模块定义了两个类,MailboxMessage,foraccess和操作磁盘邮箱及其包含的消息.Mailbox提供了从键到消息的字典式映射.Message扩展了email.message模块的Message具有格式特定状态和行为的类。支持的邮箱格式为MaildirmboxMH,Babyl和MMDF .

也可以看看

模块email
代表和操纵信息.

Mailbox对象

class mailbox.Mailbox

邮箱,可以检查和修改.

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

Mailbox接口是字典式的,小密钥对应于消息。钥匙由发出Mailbox他们将被使用的实例,只对那个有意义Mailbox实例。即使相应的消息被修改,密钥也会继续识别消息,例如将其替换为另一条消息.

消息可以添加到Mailbox实例使用set-likemethod add()并使用del语句或set-likemethods remove()discard().

Mailbox接口语义以某些值得注意的方式与字典语义不同。每次请求消息时,都会有新的表示(通常是Message实例)是根据邮箱的当前状态生成的。同样,当一条消息添加到Mailbox例如,提供的消息表示的内容被复制。在任何情况下都不是对Mailbox实例

所保留的消息表示的引用//默认Mailbox迭代器迭代消息表示,而不是像默认字典迭代器那样的键。此外,在迭代期间修改amailbox是安全且定义良好的。创建迭代器后添加到邮箱的邮件将不会被查看者看到。在迭代器产生它们之前从邮箱中删除的消息将被静默跳过,但是如果相应的消息随后被删除,则使用迭代器中的键可能会导致KeyError异常.

Warning

修改可能被其他进程同时更改的邮箱时要非常谨慎。用于此类任务的最安全的邮箱格式是Maildir;尽量避免使用单文件格式,如mbox forconcurrent writing。如果你正在修改邮箱,你must通过调用lock()unlock()方法来锁定它before阅读文件中的任何消息或通过添加或删除消息进行任何更改。无法锁定邮箱会有丢失邮件或破坏整个邮箱的风险.

Mailbox实例有以下方法:

addmessage

添加message到邮箱并返回已分配给的密钥

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

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

remove (key)
__delitem__key
discardkey

从邮箱中删除对应key的消息.

如果不存在这样的消息,如果将//方法称为KeyErrorremove(),则会引发__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_byteskey

返回对应于key的消息的字节表示,如果不存在这样的消息,则选择KeyError异常.

新版本3.2.

get_string(key

返回对应于key的消息的字符串表示,如果不存在此类消息,则选择KeyError异常。主题通过email.message.Message将其转换为7位清洁表示

get_filekey)

返回与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)对的迭代。更新邮箱,以便对于每个给定的keymessage,对应于key被设置为message好像用__setitem__()。和__setitem__(),每个key必须已经对应邮箱中的邮件或者KeyError异常会被提出,所以一般来说这是不正确的argMailbox实例

注意

与字典不一样,不支持关键字参数.

flush ( )

将任何挂起的更改写入文件系统。对于一些 Mailbox子类,更改总是立即写入,flush()没有,但你仍然应该养成这种方法的习惯.

lock ( )

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

unlock(

释放邮箱上的锁,如果有的话

close)

刷邮箱,必要时解锁,关闭任何打开文件。Forsome Mailbox子类,这个方法什么都不做.

Maildir

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

用于Maildir格式的邮箱的Mailbox的子类。参数factory是一个可调用的对象,它接受类似文件的消息表示(其行为就像在二进制模式下打开一样)并返回一个自定义表示。如果factoryNone, MaildirMessage用作默认的消息表示。如果createTrue,那么邮箱会被创建,如果它是notexist

由于历史原因,dirname被命名为而不是path.

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

Maildir邮箱包含三个子目录,即:tmp,newcur。消息在tmp子目录中暂时创建,然后移动到new子目录tofinalize delivery。邮件用户代理可能随后将邮件移至cur子目录,并在其文件名附加的特殊“信息”部分中存储有关消息状态的信息.

还支持Courier邮件传输代理引入的样式的文件夹。如果"."是其名称中的第一个字符,则主邮箱的任何子目录都被视为文件夹。文件夹名称由Maildir表示,没有前导"."。每个文件夹本身都是Maildirmailbox,但不应包含其他文件夹。相反,使用"."指示逻辑嵌套来划分级别,例如“Archived.2005.07”.

注意

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

import mailboxmailbox.Maildir.colon = "!"

colon属性也可以基于每个实例设置.

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

list_folders

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

get_folderfolder

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

add_folderfolder

创建一个名为folder的文件夹并返回一个表示它的Maildir实例.

remove_folder (folder)

删除名称为folder的文件夹。如果文件夹包含任何消息,则NotEmptyError异常将被提出,文件夹将不被删除.

clean ( )

邮箱中删除过去36小时内未访问过的临时文件。Maildir规范说邮件阅读程序应该偶尔这样做.

有些MailboxMaildir实现的方法值得特别说明:

addmessage
__setitem__key, message
updatearg

警告

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

flush ( )

对Maildir邮箱的所有更改都会立即应用,所以这个方法什么都不用.

lock ()
unlock ()

Maildir mailboxes不支持(或要求)锁定,所以这些方法没有.

close (

Maildir实例不保留任何打开文件,底层邮箱不支持锁定,所以这个方法什么都不做.

get_file (key)

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

另见

来自qmail的maildir手册页
格式的原始规格.
使用maildir格式
关于Maildir的发明人的说明。包括更新的名称创建方案和“info”语义的详细说明.
来自Courier的maildir手册页
格式的另一种说明。描述了支持文件夹的常见扩展.

mbox

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

对于mbox格式的邮箱,Mailbox的子类。参数factory是一个可调用的对象,它接受类似文件的消息表示(就像在二进制模式下打开一样)并返回一个自定义表示。如果factoryNone, mboxMessage用作默认的消息表示。如果createTrue,则创建邮箱如果它是notexist

这是mbox格式是在Unix系统上存储邮件的经典格式。mbox邮箱中的所有消息都存储在一个文件中,每行消息的开头由一行表示,其前五个字符为“From”.

存在mbox格式的几种变体以解决原始中的感知缺陷。为了兼容性,mbox实现原始格式,有时也称为mboxo。这意味着Content-Length标题(如果存在)被忽略,并且当存储消息时,消息体中一行开头的“From”的任何发生都转换为“> From”,尽管“> From”的出现不会转换为“From”“在阅读信息时

一些Mailboxmbox实现的方法值得特别说明:

get_filekey

在调用flush()后使用该文件close() mbox实例可能会产生不可预测的结果或引起异常情况.

lock (
unlock ()

使用三种锁定机制锁定,如果有的话,flock()lockf()系统调用.

另见

qbox的mbox手册页
格式及其变体的说明.
mbox手册页来自
格式的另一种说明,有锁定的详细信息
在Unix上配置Netscape Mail:为什么内容长度格式不好
使用原始mbox格式而不是变体的论据.
\”mbox“是一系列互不兼容的邮箱格式
mbox变种的历史.

MH

class mailbox.MHpath, factory=None, create=True

对于MH格式的邮箱,Mailbox的子类。参数factory是一个可调用的对象,它接受类似文件的消息表示(就像在二进制模式下打开一样)并返回一个自定义表示。如果factoryNone, MHMessage用作默认的消息表示。如果createTrue,则创建邮箱如果它是notexist

//MH是为邮件用户代理MH Message HandlingSystem发明的基于目录的邮箱格式。MH邮箱中的每条消息都驻留在自己的文件中。除邮件外,MH邮箱还可以包含其他MH邮箱(称为folders)。文件夹可以无限期嵌套。MH邮箱也支持sequences,它们是用于逻辑分组消息而不将其移动到子文件夹的命名列表。序列在文件中定义.mh_sequences在每个文件夹中

MHclass操纵MH邮箱,但它不会尝试编写所有MH 的行为。特别是它不会修改并且不受context.mh_profile用于存储其状态和配置的文件的影响.

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

list_folders

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

get_folderfolder

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

add_folderfolder

创建一个名为folder并返回MH实例代表它

remove_folderfolder

删除名称为的文件夹folder。如果文件夹包含任何消息,则NotEmptyError异常将被提出,文件夹将不会被删除.

get_sequences

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

set_sequences (sequences )

根据sequences,一个映射到键列表的名称字典,如get_sequences().

pack

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

注意

已经发出的密钥被此操作无效,不应随后使用.

有些MailboxMH实现的方法值得特别说明:

removekey
__delitem__key
discardkey

这些方法会立即删除该消息。通过在其名称前加上逗号来标记要删除的消息的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.Babylpath, factory=None, create=True

的子类Mailbox对于Babyl格式的邮箱。参数factory是一个可调用的对象,它接受类似文件的消息表示(其行为就像在二进制模式下打开一样)并返回一个自定义表示。如果factoryNone, BabylMessage用作默认的messagerepresentation。如果createTrue,则创建邮箱如果它是notexist

Babyl是由Emacs包含的Rmail邮件用户代理使用的单文件邮箱格式。消息的开头由包含两个字符Control-Underscore("\037")和Control-L("\014")的行指示。消息的结尾由nextwssage的开头指示,或者在最后一条消息的情况下,包含aControl-Underscore("\037")字符的行

在Babyl邮箱中的消息有两组标题,原始标题和所谓的可见标题。可见标题通常是原始标题的一个子集,已经重新格式化或删节以使其更具吸引力。Babyl邮箱中的每条消息还有一个labels的附带列表,或者记录有关themessage的额外信息的短字符串,并且在Babyl选项部分中保留了邮箱中找到的所有用户定义标签的列表.

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

get_labels

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

注意

检查实际的消息以确定邮箱中存在哪些标签,而不是查阅Babyloptions部分中的标签列表,但每当邮箱被修改时,Babyl部分都会更新.

一些MailboxBabyl实现的方法值得特别说明:

get_filekey

在Babyl邮箱中,邮件的标题不会与邮件正文相连。要生成类似文件的表示,将标题和正文一起复制到io.BytesIO实例,其API与afile相同。因此,类似文件的对象真正独立于底层邮箱,但与字符串表示相比不会节省内存.

lock
unlock

使用三种锁定机构 – 点锁定,如果有的话,flock()lockf()系统调用

参见

版本5 Babyl文件的格式
Babyl格式的规格.
用电子邮件阅读邮件
Rmail手册,包含有关Babyl语义的一些信息.

MMDF

class mailbox.MMDFpath, factory=None, create=True

的子类Mailbox对于MMDF格式的邮箱。参数factory是一个可调用的对象,它接受类似文件的消息表示(就像在二进制模式下打开一样)并返回一个自定义表示。如果factoryNone, MMDFMessage用作默认的messagerepresentation。如果createTrue,那么邮箱会被创建,如果它是notexist的

MMDF是为多渠道备忘录分发工具(一种邮件传输代理)发明的单文件邮箱格式。每条消息与mbox消息的形式相同,但在包含四个Control-A的行之前和之后被括起来("\001")人物。与mbox格式一样,每条消息的开始由一行表示,其前五个字符为“From”,但在存储消息时,“From”的其他出现不会转换为“> From”,因为额外的消息分隔符行会防止错误后续消息开始的事件.

一些MailboxMMDF实现的方法值得特别说明:

get_filekey

在调用flush()后使用该文件close() MMDF实例可能会产生不可预测的结果或引起异常情况.

lock (
unlock ()

使用三种锁定机制锁定,如果有的话,flock()lockf()系统调用.

另见

mmdf手册页来自
来自锡的文档中的MMDF格式规格,新闻阅读器.
MMDF
维基百科文章描述了多渠道备忘录DistributionFacility.

Message对象

class mailbox.Messagemessage=None

email.message模块的子类Messagemailbox.Message特定于addmailbox格式的状态和行为.

如果省略message,则新实例创建为默认的空状态。如果messageemail.message.Message实例,其内容被复制;此外,如果messageMessage实例,则在任何可能的情况下转换任何特定于格式的信息。如果message是一个字符串,一个字节字符串或一个文件,它应该包含一个 RFC 2822 – 兼容的消息,它被读取并解析。文件应该以二进制模式打开,但接受文本模式文件以便向后兼容.

子类提供的特定于格式的状态和行为各不相同,但一般情况下,只有特定于受支持的特定邮箱的属性(尽管可能属性特定于特定邮箱格式)。例如,不保留单文件邮箱格式的文件偏移量和基于目录的邮箱格式的文件名,因为它们仅适用于原始邮箱。但是要记录消息是由用户读取还是标记为重要消息,因为它适用于消息本身.

没有要求Message实例用于表示使用的消息检索Mailbox实例在某些情况下,生成Message表示所需的时间和内存可能是不可接受的。对于这种情况,Mailbox实例也提供字符串和类似文件的表示,并且当Mailbox实例初始化时可能指定自定义消息工厂.

MaildirMessage

class mailbox.MaildirMessage(message=None

具有Maildir特定行为的消息。参数messageMessage构造函数具有相同的意义.

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

标志 含义 说明
D 草稿 作品
F 标记 标记为重要
P 通过 转发,怨恨或反弹
ř 回复 的子类回复
S
Ť 丢弃 标记为后续删除

MaildirMessage实例提供以下方法:

get_subdir

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

注意

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

set_subdirsubdir,则会显示

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

get_flags ( )

返回一个字符串,指定当前设置的标志。如果themessage符合标准的Maildir格式,则结果是按字母顺序排列,每个字符为零或一次"D", "F", "P", "R", "S",和"T"。如果没有设置标志或者“info”包含experimentalsemantics,则返回空字符串.

set_flags (flags)

设置flags指定的标志并取消设置所有其他人。

add_flagflag

设置flag指定的标志而不更改其他标志。要一次添加多个标志,flag可能是一个超过一个字符的字符串。无论是否包含实验信息而不是旗帜,当前的“信息”都会被覆盖.

remove_flagflag

取消设置flag没有改变其他标志。要一次删除多个标志,flag也许是一个多个字符的字符串。如果“info”包含实验信息而不是标志,则当前的“info”不会被修改.

get_date ( )

将消息的发送日期作为浮点数表示,代表自纪元以来的秒数.

set_date (date)

将消息的发送日期设置为date,一个代表自纪元以来秒数的浮点数

get_info ()

返回包含消息“info”的字符串。这对于实现(即不是列表offlags)的“信息”非常有用.

set_infoinfo

将“info”设置为info,应该是一个字符串.

MaildirMessage实例基于mboxMessageMMDFMessage实例创建时,StatusX-Status标题被省略,下面的转换位置:

结果状态 mboxMessageMMDFMessage状态
“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实例时,会发生以下转换:

结果状态 BabylMessagestate
“cur”子目录 “看不见”标签
“cur”子目录和S标志 没有“看不见”的标签
P flag “转发”或“重新发送”标签
R flag “回答”标签
T flag “删除“label

mboxMessage

class mailbox.mboxMessagemessage=None

包含mbox特定行为的消息。参数messageMessage构造函数具有相同的含义.

mbox邮箱中的消息一起存储在一个文件中。Thesender的信封地址和传送时间通常存储在aline中,以“From”开头,用于指示消息的开始,尽管这些数据的实际格式存在很大差异。指示消息状态的标志,例如它是否已被读取或标记为重要,通常存储在StatusX-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_flagsflags

设置flags指定的标志并取消所有其他标志。参数flags应该是"R", "O", "D", "F""A".

add_flagflag

设置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.MHMessagemessage=None

具有MH特定行为的消息。参数messageMessage构造函数具有相同的含义.

MH消息不支持传统意义上的标记或标记,但它们支持序列,它们是逻辑分组。任意消息。Somemail读取程序(虽然不是标准的 mh nmh )使用序列的方式与其他格式的标志大致相同,如如下:

序列 说明
看不见 不读,但以前被MUA检测到
回复 回复
标记 标记为重要

MHMessage实例提供以下方法:

get_sequences

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

set_sequences (sequences)

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

add_sequencesequence

sequence添加到包含此消息的序列列表中

remove_sequence (sequence)

从包含此消息的序列列表中删除sequence.

MHMessage实例是基于MaildirMessage实例创建的,发生了以下转换:

结果状态 MaildirMessage状态
“看不见”序列 没有S标志
“回复”序列 R标志
“标记”序列 F标志

当基于一个MHMessage实例创建时mboxMessageMMDFMessage实例,StatusX-Status标题被省略,以下转换位置:

结果状态 mboxMessageMMDFMessage状态
“看不见”序列 没有R标志
“回答”序列 一面旗帜
“标记”序列 F标志

当基于MHMessage实例创建BabylMessage实例时,会发生以下转换:

结果状态 BabylMessage状态
“看不见”序列 “看不见的”标签
“回复”序列 “回答”标签

BabylMessage

class mailbox.BabylMessagemessage=None

带有Babyl特定的消息行为。参数messageMessage构造函数具有相同的意义.

某些消息标签,称为attributes,按惯例定义具有特殊含义。属性如下:

标签 说明
看不见 未读,但以前被MUA检测到
删除 标记为后续删除
归档 复制到另一个文件或邮箱
回答 回复
转发 转发
编辑 由用户修改
resent 重新发送

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

BabylMessage实例提供以下方法:

get_labels

返回消息上的标签列表。

set_labelslabels

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

add_labellabel

添加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实例是基于mboxMessageMMDFMessage实例创建的,StatusX-Status标题被省略,以下转换位置:

结果状态 mboxMessageMMDFMessage状态
“看不见”标签 没有R标志
“删除”标签 D flag
“answers”标签 一个标志

BabylMessage实例基于MHMessage实例创建时,发生以下转换:

结果状态 MHMessage状态
“看不见”标签 “看不见”序列
“回答“label ”回复“序列

MMDFMessage

class mailbox.MMDFMessagemessage=None

包含MMDF特定行为的消息。参数messageMessage构造函数

具有相同的含义。对于mbox邮箱中的消息,MMDF消息与这些地址和交付日期一起存储在初始行中以“From”开头。同样,指示消息状态的标志通常存储在StatusX-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_flagsflags

设置flags指定的标志并取消所有其他标志。参数flags应该是"R", "O", "D", "F""A".

add_flagflag

设置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()

评论被关闭。