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())
這個腳本的結果是一個新的郵箱檔案,其中包含兩個郵件消息。

13.3.1.2 讀取mbox郵箱
要讀取一個已有的郵箱,需要打開這個郵箱,像字典一樣處理這個mbox對象。鍵是郵箱執行個體定義的任意值,它們隻作為消息對象的内部辨別符,并不一定有實際意義。
import mailbox
mbox = mailbox.mbox('example.mbox')
for message in mbox:
print(message['subject'])
打開的郵箱支援疊代器協定,不過真正的字典對象不同,郵箱的預設疊代器會處理值(values)而不是鍵(keys)。
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()強制将修改寫入磁盤。