#!/usr/bin/python import email import imaplib import logging import os.path import subprocess from ConfigParser import ConfigParser logging.basicConfig(format='%(levelname)s:%(funcName)s:%(message)s', level=logging.INFO) log = logging.getLogger('train_bogofilter') CMD_STR = "/usr/bin/bogofilter -%s" # imaplib.Debug = 4 def process_folder(proc_fld_name, bogofilter_param, end_fld_name, mark_seen=True): client.select(proc_fld_name) _, resp = client.search(None, "ALL") messages = resp[0].split() log.debug('messages = %s', messages) proc_msg_count = 0 for msgId in messages: log.debug('msgId = %s', msgId) typ, msg_data = client.fetch(msgId, '(RFC822)') msg = hparser.parsestr(msg_data[0][1]) ret = subprocess.Popen(CMD_STR % bogofilter_param, stdin=subprocess.PIPE, shell=True) ret.communicate(input=msg_data[0][1]) log.debug("ret.returncode = %s", ret.returncode) if ret.returncode == 0: del msg['X-Bogosity'] typ, newmsg = client.append(end_fld_name, '', '', msg.as_string(True)) log.debug("typ = %s", typ) log.debug("newmsg = %s", newmsg) # if mark_seen: # client.store(newmsg, '+FLAGS', r'(\Seen)') if typ != 'OK': raise IOError("Cannot store a message to the folder %s" % end_fld_name) else: client.store(msgId, '+FLAGS', r'(\Deleted)') proc_msg_count += 1 else: raise OSError("bogofilter finished with the returncode: %d" % ret) client.expunge() client.close() return proc_msg_count processedCounter = 0 hparser = email.Parser.Parser() config = ConfigParser() config.read(os.path.expanduser("~/.bogofilter-imap-train-rc")) login = config.get("imap-training", "login") password = config.get("imap-training", "password") server = config.get("imap-training", "server") client = imaplib.IMAP4_SSL(server) client.login(login, password) for box in [('Junk', 's', 'Trash', True), ('Ham', 'n', 'INBOX', False)]: log.debug('box = %s', box) # processedCounter += process_folder(box[0], box[1], box[2], box[3) processedCounter += process_folder(*box) client.logout() if processedCounter > 0: log.info("Processed %d spam messages.", processedCounter)