#!/usr/local/bin/python # -*- Mode: Python -*- import os import sys def EXIT (n): # don't use sys.exit, which will simply raise an exception. os._exit (n) def log (msg): path = os.path.join (os.environ['HOME'], 'mail_filter_log.txt') open (path, 'ab').write ( msg + ' $SENDER=%s RECIPIENT=%s\n' % ( os.environ['SENDER'], os.environ['RECIPIENT'] ) ) def build_filename (maildir): import socket import time dir_path = os.path.join (os.environ['HOME'], 'Maildir', maildir) if not os.path.isdir (dir_path): log ('calling "/var/qmail/bin/maildirmake %s"' % (dir_path)) os.system ('/var/qmail/bin/maildirmake %s' % (dir_path)) name = '%d.%d.%s:2' % ( int(time.time()), os.getpid(), socket.gethostname() ) return os.path.join (dir_path, 'new', name) def write_message (maildir): fname = build_filename (maildir) log ('fname=%r' % (fname,)) f = open (fname, 'wb') while 1: block = sys.stdin.read (16360) if not block: break else: f.write (block) f.close() def get_hash_from_rcpt (rcpt): user, host = rcpt.split ('@') parts = user.split ('-') if len(parts) > 1: hash = parts[1] else: hash = '00000' return hash def get_hash_from_sndr (sndr): user, host = sndr.split ('@') parts = host.split ('.') domain = parts[-2].lower() return domain, hashlib.sha1 (domain).hexdigest()[:5] import hashlib # domains that get their own box domain_box = { 'nightmare' : 'nightmare', } # sndr=xxx@yahoo.com rcpt=q-HASH@my.domain.com try: sndr = os.environ['SENDER'] rcpt = os.environ['RECIPIENT'] domain, hash0 = get_hash_from_sndr (sndr) hash1 = get_hash_from_rcpt (rcpt) log ('sndr=%r hash0=%r hash1=%r RCPT=%r' % (sndr, hash0, hash1, rcpt)) if hash0 == hash1: box = domain_box.get (domain, 'junk') write_message ('.q.%s' % box) else: write_message ('.q.badhash') EXIT (0) except: log ('an exception of some kind: %r' % (sys.exc_info(),)) EXIT (111)