Check access_file at startup. Compress rcpt to log.

This commit is contained in:
Stuart Gathman
2007-04-13 17:20:09 +00:00
parent 9f40f265cd
commit e505d2bb28
+26 -4
View File
@@ -1,6 +1,9 @@
#!/usr/bin/env python
# A simple milter that has grown quite a bit.
# $Log$
# Revision 1.104 2007/04/05 17:59:07 customdesigned
# Stop querying gossip server twice.
#
# Revision 1.103 2007/04/02 18:37:25 customdesigned
# Don't disable gossip for temporary error.
#
@@ -442,6 +445,10 @@ class SPFPolicy(object):
else: acf = None
self.acf = acf
def close(self):
if self.acf:
self.acf.close()
def getPolicy(self,pfx):
acf = self.acf
if not acf: return None
@@ -702,6 +709,7 @@ class bmsMilter(Milter.Milter):
if self.user:
p = SPFPolicy('%s@%s'%(self.user,domain))
policy = p.getPolicy('smtp-auth:')
p.close()
else:
policy = None
if policy:
@@ -814,6 +822,7 @@ class bmsMilter(Milter.Milter):
res,code,txt = q.perm_error.ext # extended (lax processing) result
txt = 'EXT: ' + txt
p = SPFPolicy(q.s)
# FIXME: try:finally to close policy db, or reuse with lock
hres = None
if res not in ('pass','error','temperror'):
if self.mailfrom != '<>':
@@ -949,7 +958,7 @@ class bmsMilter(Milter.Milter):
if to.startswith('<MAILER-DAEMON@'):
self.log('REJECT: RCPT TO:',to,str)
return Milter.REJECT
self.log("rcpt to",to,str)
try:
t = parse_addr(to)
newaddr = False
if len(t) == 2:
@@ -1005,7 +1014,7 @@ class bmsMilter(Milter.Milter):
# don't check userlist if signed MFROM for now
userl = user.lower()
if users and not newaddr and not userl in users:
self.log('REJECT: RCPT TO:',to)
self.log('REJECT: RCPT TO:',to,str)
if gossip and self.umis:
gossip_node.feedback(self.umis,1)
return Milter.REJECT
@@ -1015,13 +1024,13 @@ class bmsMilter(Milter.Milter):
exempt_users = dspam_exempt.get(domain,())
if user in exempt_users or '' in exempt_users:
if self.blacklist:
self.log('REJECT: BLACKLISTED')
self.log('REJECT: BLACKLISTED, rcpt to',to,str)
self.setreply('550','5.7.1','Sending domain has been blacklisted')
return Milter.REJECT
self.dspam = False
if userl != 'postmaster' and self.umis \
and self.reputation < -50 and self.confidence > 1:
self.log('REJECT: REPUTATION')
self.log('REJECT: REPUTATION, rcpt to',to,str)
self.setreply('550','5.7.1','Your domain has been sending mostly spam')
return Milter.REJECT
@@ -1030,6 +1039,11 @@ class bmsMilter(Milter.Milter):
if not domain in dspam_reject:
self.reject_spam = False
except:
self.log("rcpt to",to,str)
raise
self.log("rcpt to",to,str)
self.smart_alias(to)
# get recipient after virtusertable aliasing
#rcpt = self.getsymval("{rcpt_addr}")
@@ -1713,6 +1727,13 @@ class bmsMilter(Milter.Milter):
return Milter.CONTINUE
def main():
if access_file:
try:
acf = anydbm.open(access_file,'r')
acf.close()
except:
milter_log.error('Unable to read: %s',access_file)
return
Milter.factory = bmsMilter
flags = Milter.CHGBODY + Milter.CHGHDRS + Milter.ADDHDRS
if wiretap_dest or smart_alias or dspam_userdir:
@@ -1727,6 +1748,7 @@ def main():
if __name__ == "__main__":
read_config(["/etc/mail/pymilter.cfg","milter.cfg"])
if dspam_dict:
import dspam # low level spam check
if dspam_userdir: