Entry 1971

spamlearn

   

Submitted by anonymous on July 1, 2009 at 2:56 p.m.
Language: Python. Code size: 3.0 KB.

#! /usr/bin/env python2.5

import rfc822
import os
import re

spam={}
ham={}
db=open("/mail/learned_mail", "r+")
learned=db.readlines()
re_readmail=re.compile("^(.*):2,[A-R]*S.*$")

def spamd_user(mailfile):
        """Function to determine which userdb let this email thru"""
        mail=rfc822.Message(open(mailfile))
        try:
                return mail['X-Spam-Queue'][mail['X-Spam-Queue'].index("<")+1:mail['X-Spam-Queue'].index(">")]
        except:
                return None

def learn_mail(name):
        """Should we learn from this mail"""
        match= re_readmail.match(name)
        if match == None:
                return False
        elif match.groups()[0]+'\n' in learned:
                return False
        else:
                return True

def sa_learn(type, user, mailarray):
        """Call sa-learn for mailarray and learn them as typ in user's db"""
        for part in range(0,len(mailarray),50):
                #os.spawnvp(os.P_WAIT, "sa-learn", ["sa-learn", "-u "+user, "--dbpath="+os.path.join("/mail", user, ".spamassassin"), \
                #       "--"+type, "--no-sync"]+mailarray[part:part+50])
                print "sa-learn", ["sa-learn", "-u "+user, "--dbpath="+os.path.join("/mail", user, ".spamassassin"), "--"+type, "--no-sync"]+mailarray[part:part+50]
        os.spawnvp(os.P_WAIT, "sa-learn", ["sa-learn", "-u "+user, "--dbpath="+os.path.join("/mail", user, ".spamassassin"), "--sync"])

for usermaildir in filter(os.path.isdir, [os.path.join("/mail", namn, ".maildir") for namn in os.listdir("/mail")]):
        if os.path.isdir(os.path.join(usermaildir, "cur")):
                for mail in filter(learn_mail, \
                        [os.path.join(usermaildir, "cur",mailfile) for mailfile in os.listdir(os.path.join(usermaildir, "cur"))]):
                        try:
                                ham[spamd_user(mail)]+=[mail]
                        except:
                                ham[spamd_user(mail)]=[mail]
        if os.path.isdir(os.path.join(usermaildir, ".Junk/cur")):
                for mail in filter(learn_mail, \
                        [os.path.join(usermaildir, ".Junk/cur",mailfile) for mailfile in os.listdir(os.path.join(usermaildir, ".Junk/cur"))]):
                        try:
                                spam[spamd_user(mail)]+=[mail]
                        except:
                                spam[spamd_user(mail)]=[mail]

for spamassassinpath in filter(os.path.isdir, [os.path.join("/mail", namn, ".spamassassin") for namn in os.listdir("/mail")]):
        user=spamassassinpath[6:spamassassinpath.index("/",6)]
        if user in ham.keys():
                sa_learn("ham", user, ham[user])
                db.writelines([mail[:mail.index(":")]+"\n" for mail in ham[user]])
        if user in spam.keys():
                sa_learn("spam", user, spam[user])
                db.writelines([mail[:mail.index(":")]+"\n" for mail in spam[user]])

db.close()

This snippet took 0.02 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).