folder.py

来自「用python实现的邮件过滤器」· Python 代码 · 共 80 行

PY
80
字号
import ZODBfrom Persistence import Persistentfrom BTrees.OOBTree import OOBTree, OOSet, differenceimport emailimport mailboximport osimport statfrom pspam.message import PMessagetry:    True, Falseexcept NameError:    # Maintain compatibility with Python 2.2    True, False = 1, 0def factory(fp):    try:        return email.message_from_file(fp, PMessage)    except email.Errors.MessageError, msg:        print msg        return PMessage()class Folder(Persistent):    def __init__(self, path):        self.path = path        self.mtime = 0        self.size = 0        self.messages = OOBTree()    def _stat(self):        t = os.stat(self.path)        self.mtime = t[stat.ST_MTIME]        self.size = t[stat.ST_SIZE]    def changed(self):        t = os.stat(self.path)        if (t[stat.ST_MTIME] != self.mtime            or t[stat.ST_SIZE] != self.size):            return True        else:            return False    def read(self):        """Return messages added and removed from folder.        Two sets of message objects are returned.  The first set is        messages that were added to the folder since the last read.        The second set is the messages that were removed from the        folder since the last read.        The code assumes messages are added and removed but not edited.        """        mbox = mailbox.UnixMailbox(open(self.path, "rb"), factory)        self._stat()        cur = OOSet()        new = OOSet()        while 1:            msg = mbox.next()            if msg is None:                break            msgid = msg["message-id"]            cur.insert(msgid)            if not self.messages.has_key(msgid):                self.messages[msgid] = msg                new.insert(msg)        removed = difference(self.messages, cur)        for msgid in removed.keys():            del self.messages[msgid]        # XXX perhaps just return the OOBTree for removed?        return new, OOSet(removed.values())if __name__ == "__main__":    f = Folder("/home/jeremy/Mail/INBOX")

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?