Don't innoculate with SCREENED mail.

This commit is contained in:
Stuart Gathman
2005-08-18 03:36:54 +00:00
parent 2a4ab4e87c
commit d6ef1a4007
+16 -10
View File
@@ -1,6 +1,9 @@
#!/usr/bin/env python #!/usr/bin/env python
# A simple milter that has grown quite a bit. # A simple milter that has grown quite a bit.
# $Log$ # $Log$
# Revision 1.23 2005/08/17 19:35:27 customdesigned
# Send DSN before adding message to quarantine.
#
# Revision 1.22 2005/08/11 22:17:58 customdesigned # Revision 1.22 2005/08/11 22:17:58 customdesigned
# Consider SMTP AUTH connections internal. # Consider SMTP AUTH connections internal.
# #
@@ -665,7 +668,8 @@ class bmsMilter(Milter.Milter):
self.new_headers = [] self.new_headers = []
self.recipients = [] self.recipients = []
self.cbv_needed = None self.cbv_needed = None
t = parse_addr(f.lower()) t = parse_addr(f)
if len(t) == 2: t[1] = t[1].lower()
self.canon_from = '@'.join(t) self.canon_from = '@'.join(t)
# Check SMTP AUTH, also available: # Check SMTP AUTH, also available:
@@ -718,14 +722,13 @@ class bmsMilter(Milter.Milter):
if not (self.internal_connection or self.trusted_relay) \ if not (self.internal_connection or self.trusted_relay) \
and self.connectip and spf: and self.connectip and spf:
return self.check_spf() return self.check_spf()
self.spf = None
return Milter.CONTINUE return Milter.CONTINUE
def check_spf(self): def check_spf(self):
t = parse_addr(self.mailfrom)
if len(t) == 2: t[1] = t[1].lower()
receiver = self.receiver receiver = self.receiver
q = spf.query(self.connectip,'@'.join(t),self.hello_name,receiver=receiver, q = spf.query(self.connectip,self.canon_from,self.hello_name,
strict=False) receiver=receiver,strict=False)
q.set_default_explanation( q.set_default_explanation(
'SPF fail: see http://openspf.com/why.html?sender=%s&ip=%s' % (q.s,q.i)) 'SPF fail: see http://openspf.com/why.html?sender=%s&ip=%s' % (q.s,q.i))
res,code,txt = q.check() res,code,txt = q.check()
@@ -1154,23 +1157,26 @@ class bmsMilter(Milter.Milter):
screener = dspam_screener[self.id % len(dspam_screener)] screener = dspam_screener[self.id % len(dspam_screener)]
if not ds.check_spam(screener,txt,self.recipients, if not ds.check_spam(screener,txt,self.recipients,
classify=True,quarantine=False): classify=True,quarantine=False):
self.fp = None
if self.reject_spam: if self.reject_spam:
self.log("DSPAM:",screener, self.log("DSPAM:",screener,
'REJECT: X-DSpam-Score: %f' % ds.probability) 'REJECT: X-DSpam-Score: %f' % ds.probability)
self.setreply('550','5.7.1','Your Message looks spammy') self.setreply('550','5.7.1','Your Message looks spammy')
self.fp = None
return Milter.REJECT return Milter.REJECT
self.log("DSPAM:",screener,"SCREENED") self.log("DSPAM:",screener,"SCREENED")
if self.spf: if self.spf:
# check that sender accepts quarantine DSN # check that sender accepts quarantine DSN
msg = mime.message_from_file(StringIO.StringIO(txt)) self.fp.seek(0)
msg = mime.message_from_file(self.fp)
rc = self.send_dsn(self.spf,msg,'quarantine.txt') rc = self.send_dsn(self.spf,msg,'quarantine.txt')
del msg
if rc != Milter.CONTINUE: if rc != Milter.CONTINUE:
self.fp = None
return rc return rc
ds.check_spam(screener,txt,self.recipients,quarantine=True, del msg
force_result=dspam.DSR_ISSPAM) if not ds.check_spam(screener,txt,self.recipients,classify=True):
self.fp = None
return Milter.DISCARD return Milter.DISCARD
# Message no longer looks spammy, deliver normally. We lied in the DSN.
return modified return modified
def eom(self): def eom(self):