Import initiale du filtre pour SpamAssassin
darcs-hash:20061018094706-9e428-7d102832ab415892a30d859e7c4b12623901a718.gz
This commit is contained in:
parent
c8018bb0bd
commit
6c689e4002
1 changed files with 94 additions and 0 deletions
94
mailman/Handlers/SpamAssassin_crans.py
Normal file
94
mailman/Handlers/SpamAssassin_crans.py
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
# Copyright (C) 2002-2003 by James Henstridge <james@daa.com.au>
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or
|
||||||
|
# modify it under the terms of the GNU General Public License
|
||||||
|
# as published by the Free Software Foundation; either version 2
|
||||||
|
# of the License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, US
|
||||||
|
|
||||||
|
"""Perform spam detection with SpamAssassin.
|
||||||
|
|
||||||
|
Messages are passed to a spamd (SpamAssassin) daemon for spam checking.
|
||||||
|
Depending on the score returned, messages may be rejected or held for
|
||||||
|
moderation.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import string
|
||||||
|
import spamd
|
||||||
|
|
||||||
|
from Mailman import mm_cfg
|
||||||
|
from Mailman import Errors
|
||||||
|
from Mailman.Logging.Syslog import syslog
|
||||||
|
from Mailman.Handlers import Hold
|
||||||
|
from Mailman.Handlers.Moderate import matches_p
|
||||||
|
|
||||||
|
SPAMD_HOST = getattr(mm_cfg, 'SPAMASSASSIN_HOST', '')
|
||||||
|
DISCARD_SCORE = getattr(mm_cfg, 'SPAMASSASSIN_DISCARD_SCORE', 10)
|
||||||
|
HOLD_SCORE = getattr(mm_cfg, 'SPAMASSASSIN_HOLD_SCORE', 5)
|
||||||
|
MEMBER_BONUS = getattr(mm_cfg, 'SPAMASSASSIN_MEMBER_BONUS', 2)
|
||||||
|
|
||||||
|
class SpamAssassinDiscard(Errors.DiscardMessage):
|
||||||
|
'''The message was scored above the discard threshold'''
|
||||||
|
reason = 'SpamAssassin identified this message as spam'
|
||||||
|
rejection = 'Your message has been discarded as spam'
|
||||||
|
|
||||||
|
class SpamAssassinHold(Errors.HoldMessage):
|
||||||
|
'''The message was scored above the hold threshold'''
|
||||||
|
def __init__(self, score=-1, symbols=''):
|
||||||
|
Errors.HoldMessage.__init__(self)
|
||||||
|
self.reason = 'SpamAssassin identified this message as possible ' \
|
||||||
|
'spam (score %g)' % score
|
||||||
|
self.rejection = 'Your message was held for moderation because ' \
|
||||||
|
'SpamAssassin gave the message a score of %g ' \
|
||||||
|
'for the following reasons:\n\n%s' % \
|
||||||
|
(score, symbols)
|
||||||
|
|
||||||
|
def check_message(mlist, message):
|
||||||
|
'''Check a message against a SpamAssassin spamd process.
|
||||||
|
Returns a tuple of the form (score, symbols)'''
|
||||||
|
try:
|
||||||
|
connection = spamd.SpamdConnection(SPAMD_HOST)
|
||||||
|
# identify as the mailing list, to allow storing per-list
|
||||||
|
# AWL and bayes databases.
|
||||||
|
connection.addheader('User', mlist.internal_name())
|
||||||
|
res = connection.check(spamd.SYMBOLS, message)
|
||||||
|
|
||||||
|
score = connection.getspamstatus()[1]
|
||||||
|
symbols = connection.response_message.replace(',', ', ')
|
||||||
|
|
||||||
|
return score, symbols
|
||||||
|
except spamd.error, ex:
|
||||||
|
syslog('error', 'spamd: %s' % str(ex))
|
||||||
|
return -1, ''
|
||||||
|
|
||||||
|
def process(mlist, msg, msgdata):
|
||||||
|
if msgdata.get('approved'):
|
||||||
|
return
|
||||||
|
|
||||||
|
score, symbols = check_message(mlist, str(msg))
|
||||||
|
|
||||||
|
if MEMBER_BONUS != 0:
|
||||||
|
for sender in msg.get_senders():
|
||||||
|
if mlist.isMember(sender) or \
|
||||||
|
matches_p(sender, mlist.accept_these_nonmembers):
|
||||||
|
score -= MEMBER_BONUS
|
||||||
|
break
|
||||||
|
|
||||||
|
if score > DISCARD_SCORE:
|
||||||
|
listname = mlist.real_name
|
||||||
|
sender = msg.get_sender()
|
||||||
|
syslog('vette', '%s post from %s discarded: '
|
||||||
|
'SpamAssassin score was %g (discard threshold is %g)'
|
||||||
|
% (listname, sender, score, DISCARD_SCORE))
|
||||||
|
raise SpamAssassinDiscard
|
||||||
|
elif score > HOLD_SCORE:
|
||||||
|
Hold.hold_for_approval(mlist, msg, msgdata,
|
||||||
|
SpamAssassinHold(score, symbols))
|
Loading…
Add table
Add a link
Reference in a new issue