From 1355bcecbf14107106cb468c14637d88f6c787c9 Mon Sep 17 00:00:00 2001 From: Mark Sapiro Date: Sun, 22 Jun 2008 09:53:02 -0700 Subject: - Prepended list name to bounce log unrecognized bounce messages. - Improved bounce loop detection and handling in BounceRunner.py. --- Mailman/Queue/BounceRunner.py | 66 ++++++++++++++++++++++++++++--------------- NEWS | 6 +++- 2 files changed, 49 insertions(+), 23 deletions(-) diff --git a/Mailman/Queue/BounceRunner.py b/Mailman/Queue/BounceRunner.py index 11fe3fcb..6405c091 100644 --- a/Mailman/Queue/BounceRunner.py +++ b/Mailman/Queue/BounceRunner.py @@ -1,4 +1,4 @@ -# Copyright (C) 2001-2006 by the Free Software Foundation, Inc. +# Copyright (C) 2001-2008 by the Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -178,29 +178,45 @@ class BounceRunner(Runner, BounceMixin): # who the message was destined for. That make our job easy. # - the message could have been originally destined for a list owner, # but a list owner address itself bounced. That's bad, and for now - # we'll simply log the problem and attempt to deliver the message to - # the site owner. - # - the list owner could have set listname-bounces as the owner - # address. That's really bad as it results in a loop of ever + # we'll simply attempt to deliver the message to the site list + # owner. + # Note that this means that automated bounce processing doesn't work + # for the site list. Because we can't reliably tell to what address + # a non-VERP'd bounce was originally sent, we have to treat all + # bounces sent to the site list as potential list owner bounces. + # - the list owner could have set list-bounces (or list-admin) as the + # owner address. That's really bad as it results in a loop of ever # growing unrecognized bounce messages. We detect this based on the - # X-BeenThere header and handle it like a list owner bounce. No - # real bounce will have an X-BeenThere header for the list. - bts = [s.strip().lower() for s in msg.get_all('x-beenthere', [])] - if mlist.GetListEmail().lower() in bts: - bt = True - else: - bt = False - # All messages to list-owner@vdom.ain have their envelope sender set - # to site-owner@dom.ain (no virtual domain). Is this a bounce for a - # message to a list owner, coming to the site owner, or an owner - # notice sent directly to the -bounces address? - if msg.get('to', '') == Utils.get_site_email(extra='owner') or bt: + # fact that this message itself will be from the site bounces + # address. We then send this to the site list owner instead. + # Notices to list-owner have their envelope sender and From: set to + # the site-bounces address. Check if this is this a bounce for a + # message to a list owner, coming to site-bounces, or a looping + # message sent directly to the -bounces address. We have to do these + # cases separately, because sending to site-owner will reset the + # envelope sender. + # Is this a site list bounce? + if (mlist.internal_name().lower() == + mm_cfg.MAILMAN_SITE_LIST.lower()): # Send it on to the site owners, but craft the envelope sender to # be the -loop detection address, so if /they/ bounce, we won't # get stuck in a bounce loop. outq.enqueue(msg, msgdata, - recips=[Utils.get_site_email()], + recips=mlist.owner, + envsender=Utils.get_site_email(extra='loop'), + nodecorate=1, + ) + return + # Is this a possible looping message sent directly to a list-bounces + # address other than the site list? + # Use the From: because message may not have a unix_from. + if msg.get('from') == Utils.get_site_email(extra='bounces'): + # Just send it to the sitelist-owner address. If that bounces + # we'll handle it above. + outq.enqueue(msg, msgdata, + recips=[Utils.get_site_email(extra='owner')], envsender=Utils.get_site_email(extra='loop'), + nodecorate=1, ) return # List isn't doing bounce processing? @@ -227,8 +243,10 @@ class BounceRunner(Runner, BounceMixin): # If that still didn't return us any useful addresses, then send it on # or discard it. if not addrs: - syslog('bounce', 'bounce message w/no discernable addresses: %s', - msg.get('message-id')) + syslog('bounce', + '%s: bounce message w/no discernable addresses: %s', + mlist.internal_name(), + msg.get('message-id', 'n/a')) maybe_forward(mlist, msg) return # BAW: It's possible that there are None's in the list of addresses, @@ -330,8 +348,12 @@ For more information see: """), subject=_('Uncaught bounce notification'), tomoderators=0) - syslog('bounce', 'forwarding unrecognized, message-id: %s', + syslog('bounce', + '%s: forwarding unrecognized, message-id: %s', + mlist.internal_name(), msg.get('message-id', 'n/a')) else: - syslog('bounce', 'discarding unrecognized, message-id: %s', + syslog('bounce', + '%s: discarding unrecognized, message-id: %s', + mlist.internal_name(), msg.get('message-id', 'n/a')) diff --git a/NEWS b/NEWS index e90a79a3..320353e9 100644 --- a/NEWS +++ b/NEWS @@ -4,7 +4,7 @@ Copyright (C) 1998-2008 by the Free Software Foundation, Inc. Here is a history of user visible changes to Mailman. -2.1.11x (xx-Jun-2008) +2.1.11rc2 (23-Jun-2008) New Features @@ -15,6 +15,8 @@ Here is a history of user visible changes to Mailman. how long to keep bad and shunt queue entries and optionally, where to archive removed entries. + - Prepended list name to bounce log unrecognized bounce messages. + Bug fixes and other patches - Changed the preservation of unparseable messages to be conditional on @@ -77,6 +79,8 @@ Here is a history of user visible changes to Mailman. - Patched Danish message catalog for proper use of HTML entities per Jonas Smedegaard (1999966). + - Improved bounce loop detection and handling in BounceRunner.py. + Miscellaneous - Brad Knowles' mailman daily status report script updated to 0.0.18. -- cgit v1.2.3