星期五, 7月 17, 2009

IMAP in Python - 4 (Scaning the Folder List)

IMAP支援多個mailbox,也就是多個folder。可以用protocol class中的list(ref, pattern)來取得。來看一下例子:

class IMAPLogic:
def __init__(self, proto):
self.proto = proto
self.factory = proto.factory
d = self.proto.login(self.factory.username, self.factory.password)
d.addCallback(lambda x: self.proto.list('', '*'))
d.addCallback(self.listresult)
d.addCallback(self.logout)
d.addCallback(self.stopreactor)
d.addErrback(self.errorhappened)

def listresult(self, data):
print "%-35s %-5s %-37s" % ('Mailbox Name', 'Delim', 'Mailbox Flags')
print '-' * 35, '-' * 5, '-' * 37
for box in data:
flags, delim, name = box
print "%-35s %-5s %-37s" % (name, delim, ','.join(flags))

可以看到呼叫了proto.list()並且傳了兩個參數,第一個是reference,有某些特殊用途,例如要取得Usenet等,大多時候是留白的;第二個參數是folder pattern,也就是要找的folder名字是什麼。在此支援wild card,所以*就表示了所有的folder都要。

來看一下程式輸出:

cacaegg@cacabook:~/workspace/NetworkProgram/src/IMAP$ tlist.py mx.mgt.ncu.edu.tw cacaegg
Enter password:
Mailbox Name Delim Mailbox Flags
----------------------------------- ----- -------------------------------------
virus-mail / \NoInferiors,\UnMarked
spam-mail / \NoInferiors,\UnMarked
mail-trash / \NoInferiors,\UnMarked
Sent Items / \NoInferiors,\UnMarked
Deleted Items / \NoInferiors,\UnMarked
Junk E-mail / \NoInferiors,\UnMarked
Drafts~ / \NoInferiors,\UnMarked
sent-mail-feb-2008 / \NoInferiors,\UnMarked
INBOX / \NoInferiors,\UnMarked

可以看到list()回傳的是"a list of tuples"。而每組tuple都有3個item,分別是folder name、Delimiter以及Flag。在此簡介一下常看到的flag:
\Noinferiors:沒有subfolder也不可能會有subfolder。
\Noselect:不能進行select or examine,也就是folder內沒有訊息。
\unmarked:沒有新訊息(相對的\marked就可能是有,不過要看server怎麼用)。

程式連結

沒有留言: