From a420148b1e75d747acd17aacbd6bc3e8cbd43477 Mon Sep 17 00:00:00 2001 From: Stuart Gathman Date: Tue, 29 Jul 2008 21:59:29 +0000 Subject: [PATCH] Parse ESMTP params --- bms.py | 21 +++++++++++++++++++++ milter.cfg | 2 +- pymilter.spec | 6 +++--- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/bms.py b/bms.py index 39d0d9c..60f04f3 100644 --- a/bms.py +++ b/bms.py @@ -1,6 +1,9 @@ #!/usr/bin/env python # A simple milter that has grown quite a bit. # $Log$ +# Revision 1.122 2008/05/08 21:35:56 customdesigned +# Allow explicitly whitelisted email from banned_users. +# # Revision 1.121 2008/04/10 14:59:35 customdesigned # Configure gossip TTL. # @@ -496,6 +499,12 @@ def findsrs(fp): lastln = ln break +def param2dict(str): + pairs = [x.split('=',1) for x in str] + for e in pairs: + if len(e) < 2: e.append(None) + return dict([(k.upper(),v) for k,v in pairs]) + class SPFPolicy(object): "Get SPF policy by result from sendmail style access file." def __init__(self,sender): @@ -721,6 +730,9 @@ class bmsMilter(Milter.Milter): # of each message. def envfrom(self,f,*str): self.log("mail from",f,str) + #param = param2dict(str) + #self.envid = param.get('ENVID',None) + #self.mail_param = param self.fp = StringIO.StringIO() self.tempname = None self.mailfrom = f @@ -1077,6 +1089,15 @@ class bmsMilter(Milter.Milter): # track header mods separately from body mods - so use only # in emergencies. def envrcpt(self,to,*str): + try: + param = param2dict(str) + self.notify = param.get('NOTIFY','FAILURE,DELAY').upper().split(',') + if 'NEVER' in self.notify: self.notify = () + #self.rcpt_param = param + except: + self.log("REJECT: invalid PARAM:",to,str) + self.setreply('550','5.7.1','Invalid SRS signature') + return Milter.REJECT # mail to MAILER-DAEMON is generally spam that bounced if to.startswith(' 0.8.9-1