Train screener on whitelisted messages.
This commit is contained in:
@@ -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.32 2005/10/14 16:17:31 customdesigned
|
||||||
|
# Auto whitelist refinements.
|
||||||
|
#
|
||||||
# Revision 1.31 2005/10/14 01:14:08 customdesigned
|
# Revision 1.31 2005/10/14 01:14:08 customdesigned
|
||||||
# Auto whitelist feature.
|
# Auto whitelist feature.
|
||||||
#
|
#
|
||||||
@@ -812,6 +815,7 @@ class bmsMilter(Milter.Milter):
|
|||||||
self.hidepath = False
|
self.hidepath = False
|
||||||
self.discard = False
|
self.discard = False
|
||||||
self.dspam = True
|
self.dspam = True
|
||||||
|
self.whitelist = False
|
||||||
self.reject_spam = True
|
self.reject_spam = True
|
||||||
self.data_allowed = True
|
self.data_allowed = True
|
||||||
self.trust_received = self.trusted_relay
|
self.trust_received = self.trusted_relay
|
||||||
@@ -1021,8 +1025,8 @@ class bmsMilter(Milter.Milter):
|
|||||||
return Milter.TEMPFAIL
|
return Milter.TEMPFAIL
|
||||||
self.add_header('Received-SPF',q.get_header(res,receiver))
|
self.add_header('Received-SPF',q.get_header(res,receiver))
|
||||||
self.spf = q
|
self.spf = q
|
||||||
if self.dspam and res == 'pass' and auto_whitelist.has_key(self.canon_from):
|
if res == 'pass' and auto_whitelist.has_key(self.canon_from):
|
||||||
self.dspam = False
|
self.whitelist = True
|
||||||
self.log("WHITELIST",self.canon_from)
|
self.log("WHITELIST",self.canon_from)
|
||||||
return Milter.CONTINUE
|
return Milter.CONTINUE
|
||||||
|
|
||||||
@@ -1241,7 +1245,7 @@ class bmsMilter(Milter.Milter):
|
|||||||
dspam.DSF_CHAINED|dspam.DSF_CLASSIFY)
|
dspam.DSF_CHAINED|dspam.DSF_CLASSIFY)
|
||||||
try:
|
try:
|
||||||
ds.process(headers)
|
ds.process(headers)
|
||||||
if ds.probability > 0.93 and self.dspam:
|
if ds.probability > 0.93 and self.dspam and not self.whitelist:
|
||||||
self.log('REJECT: X-DSpam-HeaderScore: %f' % ds.probability)
|
self.log('REJECT: X-DSpam-HeaderScore: %f' % ds.probability)
|
||||||
self.setreply('550','5.7.1','Your Message looks spammy')
|
self.setreply('550','5.7.1','Your Message looks spammy')
|
||||||
return Milter.REJECT
|
return Milter.REJECT
|
||||||
@@ -1348,6 +1352,9 @@ class bmsMilter(Milter.Milter):
|
|||||||
self.fp = None
|
self.fp = None
|
||||||
if len(self.recipients) > 1:
|
if len(self.recipients) > 1:
|
||||||
self.log("HONEYPOT:",rcpt,'SCREENED')
|
self.log("HONEYPOT:",rcpt,'SCREENED')
|
||||||
|
if self.whitelist:
|
||||||
|
# don't train when recipients includes honeypot
|
||||||
|
return False
|
||||||
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))
|
msg = mime.message_from_file(StringIO.StringIO(txt))
|
||||||
@@ -1362,7 +1369,7 @@ class bmsMilter(Milter.Milter):
|
|||||||
force_result=dspam.DSR_ISSPAM)
|
force_result=dspam.DSR_ISSPAM)
|
||||||
self.log("HONEYPOT:",rcpt)
|
self.log("HONEYPOT:",rcpt)
|
||||||
return Milter.DISCARD
|
return Milter.DISCARD
|
||||||
if not self.dspam:
|
if self.whitelist:
|
||||||
# Sender whitelisted: tag, but force as ham.
|
# Sender whitelisted: tag, but force as ham.
|
||||||
# User can change if actually spam.
|
# User can change if actually spam.
|
||||||
txt = ds.check_spam(user,txt,self.recipients,
|
txt = ds.check_spam(user,txt,self.recipients,
|
||||||
@@ -1392,6 +1399,13 @@ 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):
|
||||||
|
if self.whitelist:
|
||||||
|
# messages is whitelisted but looked like spam, Train on Error
|
||||||
|
self.log("TRAIN:",screener,'X-Dspam-Score: %f' % ds.probability)
|
||||||
|
# user can't correct anyway if really spam, so discard tag
|
||||||
|
ds.check_spam(screener,txt,self.recipients,
|
||||||
|
force_result=dspam.DSR_ISINNOCENT)
|
||||||
|
return False
|
||||||
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)
|
||||||
|
|||||||
Reference in New Issue
Block a user