diff -u -x *.pyc -r ./Cgi/admindb.py /usr/local/mailman/Mailman/Cgi/admindb.py --- ./Cgi/admindb.py Wed Aug 30 16:54:22 2006 +++ /usr/local/mailman/Mailman/Cgi/admindb.py Fri Aug 10 01:53:24 2007 @@ -196,6 +196,11 @@ ' ' + _('Discard all messages marked Defer') )) + form.AddItem(Center( + CheckBox('reportspamalldefersp', 0).Format() + + ' ' + + _('Report all messages marked Defer as SPAM') + )) # Add a link back to the overview, if we're not viewing the overview! adminurl = mlist.GetScriptURL('admin', absolute=1) d = {'listname' : mlist.real_name, @@ -244,6 +249,11 @@ ' ' + _('Discard all messages marked Defer') )) + form.AddItem(Center( + CheckBox('reportspamalldefersp', 0).Format() + + ' ' + + _('Report all messages marked Defer as SPAM') + )) form.AddItem(Center(SubmitButton('submit', _('Submit All Data')))) doc.AddItem(mlist.GetMailmanFooter()) print doc.Format() @@ -302,11 +312,13 @@ radio = RadioButtonArray(id, (_('Defer'), _('Approve'), _('Reject'), - _('Discard')), + _('Discard'), + _('Spam')), values=(mm_cfg.DEFER, mm_cfg.SUBSCRIBE, mm_cfg.REJECT, - mm_cfg.DISCARD), + mm_cfg.DISCARD, + mm_cfg.SPAM), checked=0).Format() if addr not in mlist.ban_list: radio += '
' + CheckBox('ban-%d' % id, 1).Format() + \ @@ -361,11 +373,13 @@ RadioButtonArray(id, (_('Defer'), _('Approve'), _('Reject'), - _('Discard')), + _('Discard'), + _('Spam')), values=(mm_cfg.DEFER, mm_cfg.UNSUBSCRIBE, mm_cfg.REJECT, - mm_cfg.DISCARD), + mm_cfg.DISCARD, + mm_cfg.SPAM), checked=0), TextBox('comment-%d' % id, size=45) ]) @@ -401,9 +415,11 @@ left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2) btns = hacky_radio_buttons( 'senderaction-' + qsender, - (_('Defer'), _('Accept'), _('Reject'), _('Discard')), - (mm_cfg.DEFER, mm_cfg.APPROVE, mm_cfg.REJECT, mm_cfg.DISCARD), - (1, 0, 0, 0)) + (_('Defer'), _('Accept'), _('Reject'), + _('Discard'), _('Spam')), + (mm_cfg.DEFER, mm_cfg.APPROVE, mm_cfg.REJECT, + mm_cfg.DISCARD,mm_cfg.SPAM), + (1, 0, 0, 0, 0)) left.AddRow([btns]) left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2) left.AddRow([ @@ -633,13 +649,15 @@ # We can't use a RadioButtonArray here because horizontal placement can be # confusing to the user and vertical placement takes up too much # real-estate. This is a hack! - buttons = Table(cellspacing="5", cellpadding="0") - buttons.AddRow(map(lambda x, s=' '*5: s+x+s, - (_('Defer'), _('Approve'), _('Reject'), _('Discard')))) + buttons = Table(cellspacing="6", cellpadding="0") + buttons.AddRow(map(lambda x, s=' '*6: s+x+s, + (_('Defer'), _('Approve'), _('Reject'), + _('Discard'), _('Spam')))) buttons.AddRow([Center(RadioButton(id, mm_cfg.DEFER, 1)), Center(RadioButton(id, mm_cfg.APPROVE, 0)), Center(RadioButton(id, mm_cfg.REJECT, 0)), Center(RadioButton(id, mm_cfg.DISCARD, 0)), + Center(RadioButton(id, mm_cfg.SPAM, 0)), ]) t.AddRow([Bold(_('Action:')), buttons]) t.AddCellInfo(row+3, col-1, align='right') @@ -692,6 +710,10 @@ discardalldefersp = cgidata.getvalue('discardalldefersp', 0) except ValueError: discardalldefersp = 0 + try: + reportspamalldefersp = cgidata.getvalue('reportspamalldefersp', 0) + except ValueError: + reportspamalldefersp = 0 for sender in senderactions.keys(): actions = senderactions[sender] # Handle what to do about all this sender's held messages @@ -701,11 +723,19 @@ action = mm_cfg.DEFER if action == mm_cfg.DEFER and discardalldefersp: action = mm_cfg.DISCARD + elif action == mm_cfg.DEFER and reportspamalldefersp: + action = mm_cfg.SPAM if action in (mm_cfg.DEFER, mm_cfg.APPROVE, - mm_cfg.REJECT, mm_cfg.DISCARD): - preserve = actions.get('senderpreserve', 0) - forward = actions.get('senderforward', 0) - forwardaddr = actions.get('senderforwardto', '') + mm_cfg.REJECT, mm_cfg.DISCARD, + mm_cfg.SPAM): + if action == mm_cfg.SPAM: + preserve = mm_cfg.SPAM_STORE + forward = mm_cfg.SPAM_FORWARD + forwardaddr = mm_cfg.SPAM_FORWARD_ADDRESS + else: + preserve = actions.get('senderpreserve', 0) + forward = actions.get('senderforward', 0) + forwardaddr = actions.get('senderforwardto', '') comment = _('No reason given') bysender = helds_by_sender(mlist) for id in bysender.get(sender, []): @@ -759,7 +789,7 @@ continue if v not in (mm_cfg.DEFER, mm_cfg.APPROVE, mm_cfg.REJECT, mm_cfg.DISCARD, mm_cfg.SUBSCRIBE, mm_cfg.UNSUBSCRIBE, - mm_cfg.ACCEPT, mm_cfg.HOLD): + mm_cfg.ACCEPT, mm_cfg.HOLD, mm_cfg.SPAM): continue # Get the action comment and reasons if present. commentkey = 'comment-%d' % request_id diff -u -x *.pyc -r ./Defaults.py /usr/local/mailman/Mailman/Defaults.py --- ./Defaults.py Fri Aug 10 00:30:06 2007 +++ /usr/local/mailman/Mailman/Defaults.py Fri Aug 10 01:48:45 2007 @@ -167,6 +167,12 @@ # -owners address, unless the message is explicitly approved. KNOWN_SPAMMERS = [] +# Spam actions +# Default to store spam messages +SPAM_STORE = 1 +SPAM_FORWARD = 0 +SPAM_FORWARD_ADDRESS = 'spam2trainer@example.com' + ##### @@ -1220,6 +1226,7 @@ UNSUBSCRIBE = 5 ACCEPT = 6 HOLD = 7 +SPAM = 8 # Standard text field width TEXTFIELDWIDTH = 40 diff -u -x *.pyc -r ./ListAdmin.py /usr/local/mailman/Mailman/ListAdmin.py --- ./ListAdmin.py Sat Aug 27 03:40:17 2005 +++ /usr/local/mailman/Mailman/ListAdmin.py Fri Aug 10 00:50:36 2007 @@ -295,10 +295,13 @@ self.__refuse(_('Posting of your message titled "%(subject)s"'), sender, comment or _('[No reason given]'), lang=self.getMemberLanguage(sender)) - else: - assert value == mm_cfg.DISCARD + elif value == mm_cfg.DISCARD: # Discarded rejection = 'Discarded' + else: + assert value == mm_cfg.SPAM + # Spam reported + rejection = 'SpamReported' # Forward the message if forward and addr: # If we've approved the message, we need to be sure to craft a