maildir消息的文件名 - mailbox.Maildir

2 投票
1 回答
1691 浏览
提问于 2025-04-17 17:11

我想知道怎么安全地找到一个Maildir邮件的完整文件名和路径,最好是用标准的Python工具来处理Maildir。我想在删除邮件之前,把邮件文件写入一个tar文件。

我正在导入mailbox和tarfile这两个模块。

背景:

我有一个Maildir的列表,这个列表是从一个文本文件创建的。

我在遍历这些Maildir(简单化处理),创建一个要删除的邮件列表,然后有一个函数会逐个处理这些邮件,把它们添加到tar文件中,然后再删除这些邮件。

import mailbox
# Creating the list
for maildir in maildir_list
    inbox = mailbox.Maildir(maildir, factory=None, create=False)
      # Looping over folders, if (folder = Trash)
    for key,msg in inbox.iteritems():
        my_list.append(maildir, inbox, key, foldername

接着我会遍历这个列表,把邮件添加到tar文件中并删除(丢弃)它们。

    import tarfile,mailbox
    # _box is allready initialized in the previous function
    for _maildir, _box, _key, _foldername in __my_list:
        __msg = _box[_key]
        __subdir = __msg.get_subdir()
        __suffix   = mailbox.Maildir.colon + __msg.get_info()
        if __suffix == mailbox.Maildir.colon:
            __suffix = ''
        __file_name = "%s/.%s/%s/%s%s" % ( _maildir, _foldername, __subdir, _key, __suffix )

        try:
            tar.add(__file_name)
            _box.discard(_key)
        except Exception as inst:
            error_type = type(inst)
            log_text = "%s\: ERROR %s - %s" % (error_type, __file_name, inst)
            log_this( logKeySub, log_text )
            e.write(log_text + "\n")

我查阅了Python的文档,关于mailbox和email的部分,也在谷歌、StackOverflow等地方搜索过。目前我打算用_maildir、_foldername、_key和get_info()来构建路径和文件名。

编辑:根据t-8ch的评论,我做了一些调整:

for _maildir, _box, _key, _foldername in __my_list:
    try:
        __file = _box._toc[_key]
        __file_name = "%s/.%s/%s" % ( _maildir, _foldername, __file )
    except Exception as inst:
            error_type = type(inst) # Type Exception, inst.args, inst
            log_text = "%s\: ERROR with %s/.%s - %s - %s" % (error_type, _maildir, _foldername, _key, inst)
            log_this( logKeySub, log_text )
            e.write(log_text + "\n")
            continue

经过一次测试,发现这个方法运行得很好。

1 个回答

4

你可以使用 Maildir._toc。这个东西是一个字典,它把邮件的键(也就是邮件的标识)和对应文件的路径联系起来。这个字典是在 Maildir._refresh() 这个函数里创建的。这样做的好处是,只有在需要的时候才去读取邮件的文件,这样可以减少刷新所有邮件列表所需的时间(因为这个操作会很频繁)。

(我是在源代码里找到这个的)

撰写回答