aboutsummaryrefslogtreecommitdiffstats
path: root/Mailman/Bouncers
diff options
context:
space:
mode:
Diffstat (limited to 'Mailman/Bouncers')
-rw-r--r--Mailman/Bouncers/DSN.py9
-rw-r--r--Mailman/Bouncers/GroupWise.py4
-rw-r--r--Mailman/Bouncers/SimpleMatch.py24
-rw-r--r--Mailman/Bouncers/SimpleWarning.py6
4 files changed, 28 insertions, 15 deletions
diff --git a/Mailman/Bouncers/DSN.py b/Mailman/Bouncers/DSN.py
index e4d2f486..2eacd0f4 100644
--- a/Mailman/Bouncers/DSN.py
+++ b/Mailman/Bouncers/DSN.py
@@ -1,4 +1,4 @@
-# Copyright (C) 1998-2007 by the Free Software Foundation, Inc.
+# Copyright (C) 1998-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
@@ -89,6 +89,13 @@ def check(msg):
def process(msg):
+ # We've seen some fairly bogus DSNs, allegedly from postfix that are
+ # multipart/mixed with 3 subparts - a text/plain postfix like part, a
+ # message/delivery-status part and a message/rfc822 part with the original
+ # message. Deal with it as follows.
+ if (msg.is_multipart() and len(msg.get_payload()) == 3 and
+ msg.get_payload()[1].get_content_type() == 'message/delivery-status'):
+ return check(msg.get_payload()[1])
# A DSN has been seen wrapped with a "legal disclaimer" by an outgoing MTA
# in a multipart/mixed outer part.
if msg.is_multipart() and msg.get_content_subtype() == 'mixed':
diff --git a/Mailman/Bouncers/GroupWise.py b/Mailman/Bouncers/GroupWise.py
index 7ef31256..74116135 100644
--- a/Mailman/Bouncers/GroupWise.py
+++ b/Mailman/Bouncers/GroupWise.py
@@ -1,4 +1,4 @@
-# Copyright (C) 1998,1999,2000,2001,2002 by the Free Software Foundation, Inc.
+# Copyright (C) 1998-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
@@ -46,6 +46,8 @@ def find_textplain(msg):
def process(msg):
if msg.get_type() <> 'multipart/mixed' or not msg['x-mailer']:
return None
+ if msg['x-mailer'][:3].lower() not in ('nov', 'ntm', 'int'):
+ return None
addrs = {}
# find the first text/plain part in the message
textplain = find_textplain(msg)
diff --git a/Mailman/Bouncers/SimpleMatch.py b/Mailman/Bouncers/SimpleMatch.py
index 2e9c23b1..bd7124b6 100644
--- a/Mailman/Bouncers/SimpleMatch.py
+++ b/Mailman/Bouncers/SimpleMatch.py
@@ -1,4 +1,4 @@
-# Copyright (C) 1998-2007 by the Free Software Foundation, Inc.
+# Copyright (C) 1998-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
@@ -88,24 +88,24 @@ PATTERNS = [
_c('--- Original message follows\.'),
_c('<(?P<addr>[^>]*)>:')),
# googlemail.com
- (_c('Delivery to the following recipient failed'),
+ (_c('Delivery to the following recipient(s)? failed'),
_c('----- Original message -----'),
_c('^\s*(?P<addr>[^\s@]+@[^\s@]+)\s*$')),
- # kundenserver.de
- (_c('A message that you sent could not be delivered'),
+ # kundenserver.de, mxlogic.net
+ (_c('A message that you( have)? sent could not be delivered'),
_c('^---'),
_c('<(?P<addr>[^>]*)>')),
# another kundenserver.de
- (_c('A message that you sent could not be delivered'),
+ (_c('A message that you( have)? sent could not be delivered'),
_c('^---'),
_c('^(?P<addr>[^\s@]+@[^\s@:]+):')),
- # thehartford.com
- (_c('Delivery to the following recipients failed'),
+ # thehartford.com and amenworld.com
+ (_c('Del(i|e)very to the following recipient(s)? (failed|was aborted)'),
# this one may or may not have the original message, but there's nothing
# unique to stop on, so stop on the first line of at least 3 characters
# that doesn't start with 'D' (to not stop immediately) and has no '@'.
_c('^[^D][^@]{2,}$'),
- _c('^\s*(?P<addr>[^\s@]+@[^\s@]+)\s*$')),
+ _c('^\s*(. )?(?P<addr>[^\s@]+@[^\s@]+)\s*$')),
# and another thehartfod.com/hartfordlife.com
(_c('^Your message\s*$'),
_c('^because:'),
@@ -126,9 +126,9 @@ PATTERNS = [
(_c('^Invalid final delivery userid:'),
_c('^Original message follows.'),
_c('\s*(?P<addr>[^\s@]+@[^\s@]+)\s*$')),
- # E500_SMTP_Mail_Service@lerctr.org
- (_c('------ Failed Recipients ------'),
- _c('-------- Returned Mail --------'),
+ # E500_SMTP_Mail_Service@lerctr.org and similar
+ (_c('---- Failed Recipients ----'),
+ _c(' Mail ----'),
_c('<(?P<addr>[^>]*)>')),
# cynergycom.net
(_c('A message that you sent could not be delivered'),
@@ -196,7 +196,7 @@ def process(msg, patterns=None):
if mo:
addr = mo.group('addr')
if addr:
- addrs[mo.group('addr')] = 1
+ addrs[addr.strip('<>')] = 1
elif ecre.search(line):
break
if addrs:
diff --git a/Mailman/Bouncers/SimpleWarning.py b/Mailman/Bouncers/SimpleWarning.py
index 45012c16..34690625 100644
--- a/Mailman/Bouncers/SimpleWarning.py
+++ b/Mailman/Bouncers/SimpleWarning.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2001-2007 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
@@ -49,6 +49,10 @@ patterns = [
(_c('Delivery attempts will continue to be made'),
_c('.+'),
_c('(?P<addr>.+)')),
+ # Googlemail
+ (_c('THIS IS A WARNING MESSAGE ONLY'),
+ _c('Message will be retried'),
+ _c(r'\s*(?P<addr>\S+@\S+)\s*')),
# Next one goes here...
]