天天看點

第十二章:email-mailbox:管理email歸檔-mbox

13.3 mailbox:管理email歸檔

mailbox子產品定義了一個同樣API,用來通路采用本地磁盤格式存儲的郵件消息,包括:

maildir

mbox

MH

Baby1

MMDF

mailbox子產品提供了Mailbox和Message基類,每個郵箱格式分布包含相應的一對子類,以實作相應格式的有關細節。

13.3.1 mbox

mbox格式是文檔中展示的最簡單的格式,因為它完全是純文字的。每個郵箱都被存儲為一個檔案,并且所有消息都聯接在一起。每次遇到一個以"From"開頭的行時(“From"後面有一個空格),就會将其處理為一個新消息的開始。隻要這些字元出現在消息體中某一行的開頭,就會将其轉義,在這一行前面增加”>"字首。

13.3.1.1 建立mbox郵箱

将檔案名傳遞到構造函數來執行個體化mbox類。如果該檔案不存在,那麼在使用add()追加消息時會建立這個檔案。

import mailbox
import email.utils

from_addr = email.utils.formataddr(('Author','[email protected]'))
to_addr = email.utils.formataddr(('Recipient','[email protected]'))

payload = '''This is the body.
From (will not bve escaped).
There are 3 lines.
'''

mbox = mailbox.mbox('example.mbox')
mbox.lock()
try:
    msg = mailbox.mboxMessage()
    msg.set_unixfrom('author Sat Feb  7 01:05:34 2018')
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Subject'] = 'Sample message 1'
    msg.set_payload(payload)
    mbox.add(msg)
    mbox.flush()

    msg = mailbox.mboxMessage()
    msg.set_unixfrom('author')
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Subject'] = 'Sample message 2'
    msg.set_payload('This is the second body.\n')
    mbox.add(msg)
    mbox.flush()
finally:
    mbox.unlock()

print(open('example.mbox','r').read())
           

這個腳本的結果是一個新的郵箱檔案,其中包含兩個郵件消息。

第十二章:email-mailbox:管理email歸檔-mbox

13.3.1.2 讀取mbox郵箱

要讀取一個已有的郵箱,需要打開這個郵箱,像字典一樣處理這個mbox對象。鍵是郵箱執行個體定義的任意值,它們隻作為消息對象的内部辨別符,并不一定有實際意義。

import mailbox

mbox = mailbox.mbox('example.mbox')
for message in mbox:
    print(message['subject'])
           

打開的郵箱支援疊代器協定,不過真正的字典對象不同,郵箱的預設疊代器會處理值(values)而不是鍵(keys)。

第十二章:email-mailbox:管理email歸檔-mbox

13.3.1.3 從mbox郵箱删除消息

import mailbox

mbox = mailbox.mbox('example.mbox')
mbox.lock()
try:
    to_remove = []
    for key,msg in mbox.iteritems():
        if '2' in msg['subject']:
            print('Removing:',key)
            to_remove.append(key)
    for key in to_remove:
        mbox.remove(key)
finally:
    mbox.flush()
    mbox.close()

print(open('example.mbox','r').read())
           

可以使用lock()和unlock()方法來避免同時通路檔案可能導緻的問題,flush()強制将修改寫入磁盤。

第十二章:email-mailbox:管理email歸檔-mbox