2

Maildir の標準的な Python ツールを使用して、Maildir メッセージの完全なファイル名とパスを安全に見つけるにはどうすればよいでしょうか。メールメッセージファイルを削除する前に tarfile に書き込みたいです。

メールボックスと tarfile をインポートしています (++)

環境:

Maildir のリスト (テキスト ファイルから作成)

Maildir をループして (簡略化)、削除するメールのリストを作成すると、関数がメールのリストを取得し、1 つずつメールを tarfile に追加してから、メールを削除します。

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

次に、リストをループしてメールを tarfile に追加し、削除 (破棄) します。

    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ドキュメントを調べ、Google、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

ドライランは、それが非常にうまく機能することを証明しました。

4

1 に答える 1

4

使用できますMaildir._toc。これは、メールのキーを対応するファイルのパスにマッピングする辞書です。このディクショナリは で構築されていMaildir._refresh()ます。これにより、必要に応じてのみメール ファイルの読み取りを延期できるため、すべてのメールのリストを更新する時間が短縮されます (これは頻繁に発生します)。

(これはソースで見つけました)

于 2013-03-04T22:41:17.430 に答える