aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
author <>2003-01-02 05:25:50 +0000
committer <>2003-01-02 05:25:50 +0000
commitb132a73f15e432eaf43310fce9196ca0c0651465 (patch)
treec15f816ba7c4de99fef510e3bd75af0890d47441 /tests
downloadmailman2-b132a73f15e432eaf43310fce9196ca0c0651465.tar.gz
mailman2-b132a73f15e432eaf43310fce9196ca0c0651465.tar.xz
mailman2-b132a73f15e432eaf43310fce9196ca0c0651465.zip
This commit was manufactured by cvs2svn to create branch
'Release_2_1-maint'.
Diffstat (limited to '')
-rw-r--r--tests/.cvsignore1
-rw-r--r--tests/EmailBase.py75
-rw-r--r--tests/Makefile.in83
-rw-r--r--tests/TestBase.py53
-rw-r--r--tests/bounces/.cvsignore1
-rw-r--r--tests/bounces/Makefile.in68
-rw-r--r--tests/bounces/bounce_01.txt95
-rw-r--r--tests/bounces/bounce_02.txt36
-rw-r--r--tests/bounces/bounce_03.txt109
-rw-r--r--tests/bounces/dsn_01.txt217
-rw-r--r--tests/bounces/dsn_02.txt187
-rw-r--r--tests/bounces/dsn_03.txt144
-rw-r--r--tests/bounces/dsn_04.txt202
-rw-r--r--tests/bounces/dsn_05.txt125
-rw-r--r--tests/bounces/dsn_06.txt122
-rw-r--r--tests/bounces/dsn_07.txt121
-rw-r--r--tests/bounces/dsn_08.txt131
-rw-r--r--tests/bounces/dsn_09.txt89
-rw-r--r--tests/bounces/dsn_10.txt66
-rw-r--r--tests/bounces/dsn_11.txt176
-rw-r--r--tests/bounces/dumbass_01.txt109
-rw-r--r--tests/bounces/exim_01.txt58
-rw-r--r--tests/bounces/groupwise_01.txt151
-rw-r--r--tests/bounces/groupwise_02.txt186
-rw-r--r--tests/bounces/hotpop_01.txt181
-rw-r--r--tests/bounces/llnl_01.txt203
-rw-r--r--tests/bounces/microsoft_01.txt108
-rw-r--r--tests/bounces/microsoft_02.txt119
-rw-r--r--tests/bounces/netscape_01.txt123
-rw-r--r--tests/bounces/newmailru_01.txt112
-rw-r--r--tests/bounces/postfix_01.txt123
-rw-r--r--tests/bounces/postfix_02.txt60
-rw-r--r--tests/bounces/postfix_03.txt145
-rw-r--r--tests/bounces/postfix_04.txt240
-rw-r--r--tests/bounces/postfix_05.txt231
-rw-r--r--tests/bounces/qmail_01.txt103
-rw-r--r--tests/bounces/sendmail_01.txt146
-rw-r--r--tests/bounces/simple_01.txt153
-rw-r--r--tests/bounces/simple_02.txt118
-rw-r--r--tests/bounces/simple_03.txt68
-rw-r--r--tests/bounces/simple_04.txt105
-rw-r--r--tests/bounces/sina_01.txt128
-rw-r--r--tests/bounces/smtp32_01.txt97
-rw-r--r--tests/bounces/smtp32_02.txt96
-rw-r--r--tests/bounces/smtp32_03.txt92
-rw-r--r--tests/bounces/yahoo_01.txt47
-rw-r--r--tests/bounces/yahoo_02.txtbin0 -> 2212 bytes
-rw-r--r--tests/bounces/yahoo_03.txt98
-rw-r--r--tests/bounces/yahoo_04.txt150
-rw-r--r--tests/bounces/yahoo_05.txt150
-rw-r--r--tests/bounces/yahoo_06.txt105
-rw-r--r--tests/bounces/yahoo_07.txt112
-rw-r--r--tests/bounces/yahoo_08.txt129
-rw-r--r--tests/bounces/yahoo_09.txt165
-rw-r--r--tests/bounces/yale_01.txt422
-rw-r--r--tests/fblast.py60
-rw-r--r--tests/msgs/.cvsignore1
-rw-r--r--tests/msgs/Makefile.in68
-rw-r--r--tests/msgs/bad_01.txt62
-rw-r--r--tests/msgs/nimda.txt43
-rwxr-xr-xtests/onebounce.py94
-rw-r--r--tests/test_bounces.py175
-rw-r--r--tests/test_handlers.py1741
-rw-r--r--tests/test_lockfile.py45
-rw-r--r--tests/test_membership.py380
-rw-r--r--tests/test_message.py102
-rw-r--r--tests/test_runners.py120
-rw-r--r--tests/test_safedict.py103
-rw-r--r--tests/test_security_mgr.py261
-rw-r--r--tests/testall.py40
70 files changed, 10029 insertions, 0 deletions
diff --git a/tests/.cvsignore b/tests/.cvsignore
new file mode 100644
index 00000000..f3c7a7c5
--- /dev/null
+++ b/tests/.cvsignore
@@ -0,0 +1 @@
+Makefile
diff --git a/tests/EmailBase.py b/tests/EmailBase.py
new file mode 100644
index 00000000..1dffe032
--- /dev/null
+++ b/tests/EmailBase.py
@@ -0,0 +1,75 @@
+# Copyright (C) 2001,2002 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
+# 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, USA.
+
+"""Base class for tests that email things.
+"""
+
+import socket
+import asyncore
+import smtpd
+
+from Mailman import mm_cfg
+
+from TestBase import TestBase
+
+
+
+MSGTEXT = None
+
+class OneShotChannel(smtpd.SMTPChannel):
+ def smtp_QUIT(self, arg):
+ smtpd.SMTPChannel.smtp_QUIT(self, arg)
+ raise asyncore.ExitNow
+
+
+class SinkServer(smtpd.SMTPServer):
+ def handle_accept(self):
+ conn, addr = self.accept()
+ channel = OneShotChannel(self, conn, addr)
+
+ def process_message(self, peer, mailfrom, rcpttos, data):
+ global MSGTEXT
+ MSGTEXT = data
+
+
+
+class EmailBase(TestBase):
+ def setUp(self):
+ TestBase.setUp(self)
+ # Second argument tuple is ignored.
+ self._server = SinkServer(('localhost', mm_cfg.SMTPPORT),
+ ('localhost', 25))
+
+ def tearDown(self):
+ self._server.close()
+ TestBase.tearDown(self)
+
+ def _readmsg(self):
+ global MSGTEXT
+ # Save and unlock the list so that the qrunner process can open it and
+ # lock it if necessary. We'll re-lock the list in our finally clause
+ # since that if an invariant of the test harness.
+ self._mlist.Unlock()
+ try:
+ try:
+ # timeout is in milliseconds, see asyncore.py poll3()
+ asyncore.loop(timeout=30.0)
+ MSGTEXT = None
+ except asyncore.ExitNow:
+ pass
+ return MSGTEXT
+ finally:
+ self._mlist.Lock()
diff --git a/tests/Makefile.in b/tests/Makefile.in
new file mode 100644
index 00000000..f04397c4
--- /dev/null
+++ b/tests/Makefile.in
@@ -0,0 +1,83 @@
+# Copyright (C) 2001 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
+# 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, USA.
+
+# NOTE: Makefile.in is converted into Makefile by the configure script
+# in the parent directory. Once configure has run, you can recreate
+# the Makefile by running just config.status.
+
+# Variables set by configure
+
+VPATH= @srcdir@
+srcdir= @srcdir@
+bindir= @bindir@
+prefix= @prefix@
+exec_prefix= @exec_prefix@
+
+CC= @CC@
+CHMOD= @CHMOD@
+INSTALL= @INSTALL@
+
+DEFS= @DEFS@
+
+# Customizable but not set by configure
+
+OPT= @OPT@
+CFLAGS= $(OPT) $(DEFS)
+TESTDIR= $(prefix)/tests
+SHELL= /bin/sh
+
+TEST_MODULES= $(srcdir)/test*.py $(srcdir)/*Base.py
+EXECS= $(srcdir)/onebounce.py $(srcdir)/fblast.py
+
+# Modes for directories and executables created by the install
+# process. Default to group-writable directories but
+# user-only-writable for executables.
+DIRMODE= 775
+EXEMODE= 755
+FILEMODE= 644
+INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE)
+
+# Directories make should decend into
+SUBDIRS= bounces msgs
+
+# Rules
+all:
+
+install:
+ for f in $(TEST_MODULES); \
+ do \
+ $(INSTALL) -m $(FILEMODE) $$f $(TESTDIR); \
+ done
+ for f in $(EXECS); \
+ do \
+ $(INSTALL) -m $(EXEMODE) $$f $(TESTDIR); \
+ done
+ for d in $(SUBDIRS); \
+ do \
+ (cd $$d; $(MAKE) install); \
+ done
+
+finish:
+
+clean:
+
+distclean:
+ -rm *.pyc
+ -rm Makefile
+ @for d in $(SUBDIRS); \
+ do \
+ (cd $$d; $(MAKE) distclean); \
+ done
diff --git a/tests/TestBase.py b/tests/TestBase.py
new file mode 100644
index 00000000..816abaa2
--- /dev/null
+++ b/tests/TestBase.py
@@ -0,0 +1,53 @@
+# Copyright (C) 2001,2002 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
+# 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, USA.
+
+"""Test base class which handles creating and deleting a test list.
+"""
+
+import os
+import shutil
+import unittest
+
+from Mailman import MailList
+from Mailman import Utils
+from Mailman import mm_cfg
+
+
+
+class TestBase(unittest.TestCase):
+ def setUp(self):
+ mlist = MailList.MailList()
+ mlist.Create('_xtest', 'test@dom.ain', 'xxxxx')
+ mlist.host_name = 'dom.ain'
+ mlist.web_page_url = 'http://www.dom.ain/mailman/'
+ mlist.Save()
+ # This leaves the list in a locked state
+ self._mlist = mlist
+
+ def tearDown(self):
+ self._mlist.Unlock()
+ listname = self._mlist.internal_name()
+ for dirtmpl in ['lists/%s',
+ 'archives/private/%s',
+ 'archives/private/%s.mbox',
+ 'archives/public/%s',
+ 'archives/public/%s.mbox',
+ ]:
+ dir = os.path.join(mm_cfg.VAR_PREFIX, dirtmpl % listname)
+ if os.path.islink(dir):
+ os.unlink(dir)
+ elif os.path.isdir(dir):
+ shutil.rmtree(dir)
diff --git a/tests/bounces/.cvsignore b/tests/bounces/.cvsignore
new file mode 100644
index 00000000..f3c7a7c5
--- /dev/null
+++ b/tests/bounces/.cvsignore
@@ -0,0 +1 @@
+Makefile
diff --git a/tests/bounces/Makefile.in b/tests/bounces/Makefile.in
new file mode 100644
index 00000000..120832d3
--- /dev/null
+++ b/tests/bounces/Makefile.in
@@ -0,0 +1,68 @@
+# Copyright (C) 2001 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
+# 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 Licenseo
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+# NOTE: Makefile.in is converted into Makefile by the configure script
+# in the parent directory. Once configure has run, you can recreate
+# the Makefile by running just config.status.
+
+# Variables set by configure
+
+VPATH= @srcdir@
+srcdir= @srcdir@
+bindir= @bindir@
+prefix= @prefix@
+exec_prefix= @exec_prefix@
+
+CC= @CC@
+CHMOD= @CHMOD@
+INSTALL= @INSTALL@
+
+DEFS= @DEFS@
+
+# Customizable but not set by configure
+
+OPT= @OPT@
+CFLAGS= $(OPT) $(DEFS)
+BOUNCEDIR= $(prefix)/tests/bounces
+SHELL= /bin/sh
+
+BOUNCE_FILES= $(srcdir)/*.txt
+
+
+# Modes for directories and executables created by the install
+# process. Default to group-writable directories but
+# user-only-writable for executables.
+DIRMODE= 775
+EXEMODE= 755
+FILEMODE= 644
+INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE)
+
+# Rules
+all:
+
+install:
+ for f in $(BOUNCE_FILES); \
+ do \
+ $(INSTALL) -m $(FILEMODE) $$f $(BOUNCEDIR); \
+ done
+
+finish:
+
+clean:
+
+distclean:
+ -rm *.pyc
+ -rm Makefile
diff --git a/tests/bounces/bounce_01.txt b/tests/bounces/bounce_01.txt
new file mode 100644
index 00000000..ab7f45d4
--- /dev/null
+++ b/tests/bounces/bounce_01.txt
@@ -0,0 +1,95 @@
+From VM Wed Feb 7 14:01:33 2001
+X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
+ [nil "" "6" "February" "2001" "14:41:27" "GMT" "\"Jetmail System\" <>" "\"Jetmail System\" <>" nil "48" "Mail Error" "^From:" nil nil "2" nil nil nil nil nil]
+ nil)
+Return-Path: <python-list-admin@python.org>
+Delivered-To: bwarsaw@wooz.org
+Received: from digicool.com (host15.digitalcreations.d.subnet.rcn.com [208.59.6.15])
+ by mail.wooz.org (Postfix) with ESMTP id 1AE74D37AC
+ for <barry@wooz.org>; Tue, 6 Feb 2001 01:41:50 -0500 (EST)
+Received: from <python-list-admin@python.org>
+ by digicool.com (CommuniGate Pro RULES 3.3.2)
+ with RULES id 1443386; Tue, 06 Feb 2001 01:43:53 -0500
+Received: from ns2.digicool.com ([216.164.72.2] verified)
+ by digicool.com (CommuniGate Pro SMTP 3.3.2)
+ with ESMTP id 1443385 for barry@mail.digicool.com; Tue, 06 Feb 2001 01:43:53 -0500
+Received: from mail.python.org (mail.python.org [63.102.49.29])
+ by ns2.digicool.com (8.9.3/8.9.3) with ESMTP id BAA24701
+ for <barry@digicool.com>; Tue, 6 Feb 2001 01:42:30 -0500
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 14Q1pg-0006hx-00
+ for barry@digicool.com; Tue, 06 Feb 2001 01:42:32 -0500
+Received: from host2.btamail.net.cn ([202.106.196.72] helo=btamail.net.cn)
+ by mail.python.org with smtp (Exim 3.21 #1)
+ id 14Q1oj-0006ek-00
+ for python-list-admin@python.org; Tue, 06 Feb 2001 01:41:33 -0500
+Message-Id: <E14Q1oj-0006ek-00@mail.python.org>
+Precedence: bulk
+List-Help: <mailto:python-list-request@python.org?subject=help>
+List-Post: <mailto:python-list@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=subscribe>
+List-Id: General discussion list for the Python programming language <python-list.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/python-list/>
+From: "Jetmail System" <>
+Sender: python-list-owner@python.org
+To: python-list-admin@python.org
+Subject: Mail Error
+Date: 06 Feb 2001 14:41:27 GMT
+X-Autogenerated: Mirror
+X-Mirrored-by: <python-list-admin@python.org>
+X-BeenThere: python-list@python.org
+X-Mailman-Version: 2.0.1 (101270)
+
+Your mail cannot be delivered to the following address(es):
+
+ dylan "(0), ErrMsg=mail box space not enough, account=dylan "
+
+Please check the above address(es) and then try again.
+
+---- Header of the source mail attached ----
+
+Received: from bjmx2.163.net([202.108.255.253]) by btamail.net.cn(JetMail 2.5.3.0)
+ with SMTP id jmb3a800bb6; Tue, 6 Feb 2001 06:41:26 -0000
+Received: by bjmx2.163.net (Postfix)
+ id ; Tue, 6 Feb 2001 06:31:28 +0800 (CST)
+Received: from mail.python.org (mail.python.org [63.102.49.29])
+ by bjmx2.163.net (Postfix) with ESMTP id A468F1CB4210C
+ for <windchi@163.net>; Tue, 6 Feb 2001 06:31:27 +0800 (CST)
+Received: from mail.python.org (localhost.localdomain [127.0.0.1])
+ by mail.python.org (Postfix) with ESMTP
+ id 1B087E827; Mon, 5 Feb 2001 17:31:27 -0500 (EST)
+Delivered-To: mm+python-list@python.org
+Received: from onca.catsden.net (unknown [216.218.194.20])
+ by mail.python.org (Postfix) with ESMTP id F004BE72E
+ for <python-list@python.org>; Mon, 5 Feb 2001 17:30:44 -0500 (EST)
+Received: from localhost (chris@localhost)
+ by onca.catsden.net (8.9.3/8.9.3) with ESMTP id OAA28446;
+ Mon, 5 Feb 2001 14:23:15 -0800
+From: <chris@onca.catsden.net>
+To: Sam Wun <swun@esec.com.au>
+Cc: <python-list@python.org>
+Subject: Re: sorting on IP addresses
+In-Reply-To: <3A7F26CB.BE85C96F@esec.com.au>
+Message-ID: <Pine.LNX.4.30.0102051415240.27504-100000@onca.catsden.net>
+MIME-Version: 1.0
+Content-Type: TEXT/PLAIN; charset=US-ASCII
+Sender: python-list-admin@python.org
+Errors-To: python-list-admin@python.org
+X-BeenThere: python-list@python.org
+X-Mailman-Version: 2.0.1 (101270)
+Precedence: bulk
+List-Help: <mailto:python-list-request@python.org?subject=help>
+List-Post: <mailto:python-list@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=subscribe>
+List-Id: General discussion list for the Python programming language <python-list.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/python-list/>
+Date: Mon, 5 Feb 2001 14:23:15 -0800 (PST)
+
+
diff --git a/tests/bounces/bounce_02.txt b/tests/bounces/bounce_02.txt
new file mode 100644
index 00000000..0f7d7f32
--- /dev/null
+++ b/tests/bounces/bounce_02.txt
@@ -0,0 +1,36 @@
+From: E500_SMTP_Mail_Service@lerctr.org
+To: <macarthur1975-bounces@lerctr.org>
+Subject: Returned Mail - Error During Delivery
+Date: Wed, 20 Nov 2002 19:58:47 -0500 (EST)
+X-Virus-Scanned: by amavisd-milter (http://amavis.org/)
+
+------ Failed Recipients ------
+
+<acinsp1@midsouth.rr.com>: Requested action not taken: mailbox unavailable. [SMTP Error Code 550]
+-------- Returned Mail --------
+
+Received: from tnmx01.mgw.rr.com(24.165.200.11) by tnav01.midsouth.rr.com via csmap
+ id 26013; Wed, 20 Nov 2002 19:58:47 -0500 (EST)
+Received: from lerami.lerctr.org (lerami.lerctr.org [207.158.72.11])
+ by tnmx01.mgw.rr.com (8.12.5/8.12.5) with ESMTP id gAL0wLBM020447
+ for <acinsp1@midsouth.rr.com>; Wed, 20 Nov 2002 19:58:21 -0500 (EST)
+Received: from lerami.lerctr.org (localhost [127.0.0.1])
+ by lerami.lerctr.org (8.12.6/8.12.6/20020902/$Revision: 5940 $) with ESMTP id gAL0wHwV016400
+ for <acinsp1@midsouth.rr.com>; Wed, 20 Nov 2002 18:58:18 -0600 (CST)
+MIME-Version: 1.0
+Content-Type: text/plain; charset="us-ascii"
+Content-Transfer-Encoding: 7bit
+Subject: You have been unsubscribed from the MacArthur1975 mailing list
+From: macarthur1975-bounces@lerctr.org
+To: acinsp1@midsouth.rr.com
+Message-ID: <mailman.0.1037840296.16399.macarthur1975@lerctr.org>
+Date: Wed, 20 Nov 2002 18:58:16 -0600
+Precedence: bulk
+X-BeenThere: macarthur1975@lerctr.org
+X-Mailman-Version: 2.1b4
+List-Id: MacArthur Class of 1975 Discussion <macarthur1975.lerctr.org>
+X-List-Administrivia: yes
+Sender: macarthur1975-bounces@lerctr.org
+Errors-To: macarthur1975-bounces@lerctr.org
+X-Virus-Scanned: by amavisd-milter (http://amavis.org/)
+
diff --git a/tests/bounces/bounce_03.txt b/tests/bounces/bounce_03.txt
new file mode 100644
index 00000000..fc62dcab
--- /dev/null
+++ b/tests/bounces/bounce_03.txt
@@ -0,0 +1,109 @@
+Received: from tele-punt-22.mail.demon.net ([194.217.242.7])
+ by mail.python.org with esmtp (Exim 4.05)
+ id 18GwM4-0000D4-00
+ for mailman-users-admin@python.org; Wed, 27 Nov 2002 02:11:28 -0500
+Received: from root by tele-punt-22.mail.demon.net with local (Exim 2.12 #1)
+ id 18GwLf-0003ka-00
+ for mailman-users-admin@python.org; Wed, 27 Nov 2002 07:11:03 +0000
+Subject: Mail delivery failure
+Message-Id: <E18GwLf-0003ka-00@tele-punt-22.mail.demon.net>
+From: Mail Delivery System <Mailer-Daemon@tele-punt-22.mail.demon.net>
+To: mailman-users-admin@python.org
+Date: Wed, 27 Nov 2002 07:11:03 +0000
+X-Spam-Status: No, hits=-2.5 required=5.0
+ tests=FROM_MAILER_DAEMON,MAILER_DAEMON,MAILTO_WITH_SUBJ,SPAM_PHRASE_03_05
+X-Spam-Level:
+
+This message was created automatically by mail delivery
+software. A message that you sent could not be delivered
+to all of its recipients.
+
+The following message, addressed to 'james@jeborall.demon.co.uk',
+failed because it has not been collected after 30 days
+
+Here is a copy of the first part of the message, including
+all headers.
+
+---- START OF RETURNED MESSAGE ----
+Received: from punt-2.mail.demon.net by mailstore for james@jeborall.demon.co.uk
+ id 1035738253:20:01723:229; Sun, 27 Oct 2002 17:04:13 GMT
+Received: from mail.python.org ([12.155.117.29]) by punt-2.mail.demon.net
+ id aa2004462; 27 Oct 2002 17:02 GMT
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 4.05)
+ id 185qn2-0007ru-00; Sun, 27 Oct 2002 12:01:28 -0500
+Date: Sun, 27 Oct 2002 12:00:04 -0500
+Message-ID: <20021027170004.27298.9909.Mailman@mail.python.org>
+From: mailman-users-request@python.org
+Subject: Mailman-Users digest, Vol 1 #2344 - 14 msgs
+Reply-to: mailman-users@python.org
+X-Mailer: Mailman v2.0.13 (101270)
+MIME-version: 1.0
+Content-type: multipart/mixed; boundary=10.0.11.1.506.27298.1035738004.364.17787
+To: mailman-users@python.org
+Sender: mailman-users-admin@python.org
+Errors-To: mailman-users-admin@python.org
+X-BeenThere: mailman-users@python.org
+X-Mailman-Version: 2.0.13 (101270)
+Precedence: bulk
+List-Help: <mailto:mailman-users-request@python.org?subject=help>
+List-Post: <mailto:mailman-users@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=subscribe>
+List-Id: Mailman mailing list management users <mailman-users.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/mailman-users/>
+
+--10.0.11.1.506.27298.1035738004.364.17787
+Content-type: text/plain; charset=us-ascii
+Content-description: Masthead (Mailman-Users digest, Vol 1 #2344)
+
+Send Mailman-Users mailing list submissions to
+ mailman-users@python.org
+
+To subscribe or unsubscribe via the World Wide Web, visit
+ http://mail.python.org/mailman/listinfo/mailman-users
+or, via email, send a message with subject or body 'help' to
+ mailman-users-request@python.org
+
+You can reach the person managing the list at
+ mailman-users-admin@python.org
+
+When replying, please edit your Subject line so it is more specific
+than "Re: Contents of Mailman-Users digest..."
+
+
+--10.0.11.1.506.27298.1035738004.364.17787
+Content-type: text/plain; charset=us-ascii
+Content-description: Today's Topics (14 msgs)
+
+Today's Topics:
+
+ 1. RELEASED Mailman 2.1 beta 4 (Barry A. Warsaw)
+ 2. bin/arch not working (Aparajita Fishman)
+ 3. Can't receive mail (Aparajita Fishman)
+ 4. I have the same problem with the list not sending mail..but
+ getting confirmations... (jared sanders)
+ 5. Re: RELEASED Mailman 2.1 beta 4 (Jeremy Portzer)
+ 6. Re: I have the same problem with the list not sending mail..but getting confirmations... (Aparajita Fishman)
+ 7. 2.1b4 problem (Fuzzy)
+ 8. inetd doesn't start mailman...? (Nick Arnett)
+ 9. Re: rejecting non-subscriber postings (G. Armour Van Horn)
+ 10. Re: No public lists? (Armando Soto Baeza)
+ 11. Re: No public lists? (Armando Soto Baeza)
+ 12. Re: I have the same problem with the list not sending mail..but getting confirmations... (Armando Soto Baeza)
+ 13. Re: Can't subscribe via web (Armando Soto Baeza)
+
+--10.0.11.1.506.27298.1035738004.364.17787
+Content-type: multipart/digest; boundary="__--__--"
+
+--__--__--
+
+Message: 1
+MIME-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+Content-Transfer-Encoding: 7bit
+Message-ID: <15802.52753.139705.927733@gargle.gargle.HOWL>
+---- MESSAGE TRUNCATED ----
+
diff --git a/tests/bounces/dsn_01.txt b/tests/bounces/dsn_01.txt
new file mode 100644
index 00000000..d09768c6
--- /dev/null
+++ b/tests/bounces/dsn_01.txt
@@ -0,0 +1,217 @@
+From VM Wed Oct 4 02:03:34 2000
+Return-Path: <jpython-interest-admin@python.org>
+Delivered-To: zzzzz@mail.wooz.org
+Received: from ns1.beopen.com (unknown [208.185.174.104])
+ by mail.wooz.org (Postfix) with ESMTP id 0E701D37D5
+ for <yyyyy@wooz.org>; Tue, 3 Oct 2000 18:33:46 -0400 (EDT)
+Received: from dinsdale.python.org (dinsdale.cnri.reston.va.us [132.151.1.21])
+ by ns1.beopen.com (8.9.3/8.9.3) with ESMTP id PAA65588
+ for <zzzzz@beopen.com>; Tue, 3 Oct 2000 15:34:07 -0700 (PDT)
+ (envelope-from jpython-interest-admin@python.org)
+Received: from dinsdale.python.org (localhost [127.0.0.1])
+ by dinsdale.python.org (Postfix) with ESMTP id D2E691CC09
+ for <zzzzz@beopen.com>; Tue, 3 Oct 2000 18:32:02 -0400 (EDT)
+Delivered-To: jpython-interest-admin@python.org
+Received: from mta01f.seamail.go.com (mta01f.seamail.go.com [204.202.140.193])
+ by dinsdale.python.org (Postfix) with ESMTP id D33DA1CD8E
+ for <jpython-interest-admin@python.org>; Tue, 3 Oct 2000 18:31:09 -0400 (EDT)
+Received: from msg00.seamail.go.com (msg00.seamail.go.com [10.212.0.32])
+ by mta01.seamail.go.com
+ (Sun Internet Mail Server sims.4.0.2000.05.17.04.13.p6) with ESMTP id
+ <0G1V0040VJN3RY@mta01.seamail.go.com> for jpython-interest-admin@python.org;
+ Tue, 3 Oct 2000 14:57:04 -0700 (PDT)
+Received: from process-daemon by msg00.seamail.go.com
+ (Sun Internet Mail Server sims.4.0.2000.05.17.04.13.p6)
+ id <0G1V00701JN2C7@msg00.seamail.go.com> for
+ jpython-interest-admin@python.org; Tue, 03 Oct 2000 14:57:02 -0700 (PDT)
+Received: from msg00.seamail.go.com
+ (Sun Internet Mail Server sims.4.0.2000.05.17.04.13.p6)
+ id <0G1V00703JN1C6@msg00.seamail.go.com>; Tue, 03 Oct 2000 14:57:02 -0700 (PDT)
+Message-id: <0G1V0070AJN2C6@msg00.seamail.go.com>
+MIME-version: 1.0
+Content-type: MULTIPART/REPORT;
+ BOUNDARY="Boundary_(ID_+h6gzBCYzjhP3wCVCkWTrg)"; REPORT-TYPE=DELIVERY-STATUS
+Errors-To: jpython-interest-owner@python.org
+Precedence: bulk
+List-Help: <mailto:jpython-interest-request@python.org?subject=help>
+List-Post: <mailto:jpython-interest@python.org>
+List-Subscribe: <http://www.python.org/mailman/listinfo/jpython-interest>, <mailto:jpython-interest-request@python.org?subject=subscribe>
+List-Id: Python for the Java<SUP><FONT SIZE=-2>TM</FONT></SUP> Platform <jpython-interest.python.org>
+List-Unsubscribe: <http://www.python.org/mailman/listinfo/jpython-interest>, <mailto:jpython-interest-request@python.org?subject=unsubscribe>
+List-Archive: <http://www.python.org/pipermail/jpython-interest/>
+From: Internet Mail Delivery <postmaster@go.com>
+Sender: jpython-interest-owner@python.org
+To: jpython-interest-admin@python.org
+Subject: Delivery Notification: Delivery has failed
+Date: Tue, 03 Oct 2000 14:57:02 -0700 (PDT)
+X-BeenThere: jpython-interest@python.org
+X-Mailman-Version: 2.0beta6
+
+
+--Boundary_(ID_+h6gzBCYzjhP3wCVCkWTrg)
+Content-type: text/plain; charset=ISO-8859-1
+Content-transfer-encoding: 7BIT
+
+This report relates to a message you sent with the following header fields:
+
+ Message-id: <F1218V8zDv60gxapzha000001ae@hotmail.com>
+ Date: Tue, 03 Oct 2000 19:28:29 +0000 (GMT)
+ From: heiho1@hotmail.com
+ To: thaank@nl.packardbell.org, jpython-interest@python.org
+ Subject: [JPython] Re: JPython testing framework
+
+Your message cannot be delivered to the following recipients:
+
+ Recipient address: JimmyMcEgypt@sims-ms-daemon
+ Original address: JimmyMcEgypt@go.com
+ Reason: recipient reached disk quota
+
+
+--Boundary_(ID_+h6gzBCYzjhP3wCVCkWTrg)
+Content-type: message/DELIVERY-STATUS
+
+Reporting-MTA: dns;msg00.seamail.go.com
+
+Action: failed
+Status: 5.0.0 (recipient reached disk quota)
+Original-recipient: rfc822;JimmyMcEgypt@go.com
+Final-recipient: rfc822;JimmyMcEgypt@sims-ms-daemon
+
+--Boundary_(ID_+h6gzBCYzjhP3wCVCkWTrg)
+Content-type: MESSAGE/RFC822
+
+Return-path: jpython-interest-admin@python.org
+Received: from sims-ms-daemon by msg00.seamail.go.com
+ (Sun Internet Mail Server sims.4.0.2000.05.17.04.13.p6)
+ id <0G1V00703JN1C6@msg00.seamail.go.com>; Tue, 03 Oct 2000 14:57:01 -0700 (PDT)
+Received: from mta01.seamail.go.com (mta01.seamail.go.com [10.212.0.193])
+ by msg00.seamail.go.com
+ (Sun Internet Mail Server sims.4.0.2000.05.17.04.13.p6) with ESMTP id
+ <0G1V00L69JG1BD@msg00.seamail.go.com> for JimmyMcEgypt@sims-ms-daemon
+ (ORCPT rfc822;JimmyMcEgypt@go.com); Tue, 03 Oct 2000 14:56:57 -0700 (PDT)
+Received: from dinsdale.python.org (dinsdale.cnri.reston.va.us [132.151.1.21])
+ by mta01.seamail.go.com
+ (Sun Internet Mail Server sims.4.0.2000.05.17.04.13.p6) with ESMTP id
+ <0G1V004NTCTFPX@mta01.seamail.go.com> for JimmyMcEgypt@msg00.seamail.go.com
+ (ORCPT rfc822;JimmyMcEgypt@go.com); Tue, 03 Oct 2000 12:29:39 -0700 (PDT)
+Received: from dinsdale.python.org (localhost [127.0.0.1])
+ by dinsdale.python.org (Postfix) with ESMTP id 76FC61CF28; Tue,
+ 03 Oct 2000 15:29:27 -0400 (EDT)
+Received: from hotmail.com (f121.pav1.hotmail.com [64.4.31.121])
+ by dinsdale.python.org (Postfix) with ESMTP id AFF4D1CD11 for
+ <jpython-interest@python.org>; Tue, 03 Oct 2000 15:28:28 -0400 (EDT)
+Received: from mail pickup service by hotmail.com with Microsoft SMTPSVC; Tue,
+ 03 Oct 2000 12:28:29 -0700
+Received: from 206.41.27.49 by pv1fd.pav1.hotmail.msn.com with HTTP; Tue,
+ 03 Oct 2000 19:28:29 +0000 (GMT)
+Date: Tue, 03 Oct 2000 19:28:29 +0000 (GMT)
+From: heiho1@hotmail.com
+Subject: [JPython] Re: JPython testing framework
+X-Originating-IP: [206.41.27.49]
+Sender: jpython-interest-admin@python.org
+To: thaank@nl.packardbell.org, jpython-interest@python.org
+Errors-to: jpython-interest-admin@python.org
+Message-id: <F1218V8zDv60gxapzha000001ae@hotmail.com>
+MIME-version: 1.0
+Content-type: text/plain; format=flowed
+Content-transfer-encoding: 7BIT
+Precedence: bulk
+Delivered-to: jpython-interest@python.org
+X-BeenThere: jpython-interest@python.org
+X-Mailman-Version: 2.0beta6
+List-Post: <mailto:jpython-interest@python.org>
+List-Subscribe: <http://www.python.org/mailman/listinfo/jpython-interest>,
+ <mailto:jpython-interest-request@python.org?subject=subscribe>
+List-Unsubscribe: <http://www.python.org/mailman/listinfo/jpython-interest>,
+ <mailto:jpython-interest-request@python.org?subject=unsubscribe>
+List-Archive: <http://www.python.org/pipermail/jpython-interest/>
+List-Help: <mailto:jpython-interest-request@python.org?subject=help>
+List-Id: Python for the Java<SUP><FONT SIZE=-2>TM</FONT></SUP> Platform
+ <jpython-interest.python.org>
+X-OriginalArrivalTime: 03 Oct 2000 19:28:29.0320 (UTC)
+ FILETIME=[1BD98080:01C02D70]
+
+Otto,
+
+Thanks for the reply. I remembered hearing of this PyUnit but had lost
+track of it for a while. I just visited the sourceforge homepage:
+
+http://pyunit.sourceforge.net/pyunit.html
+
+I'm pretty sure that PyUnit [as its coded to Python 1.5.2] should be
+workable with JPython, but the web page says:
+
+"""
+PyUnit cannot be used with JPython, the users of which should probably use
+JUnit and create JPython subclasses of its TestCase class. I haven't tried
+doing this.
+"""
+
+Now, I don't see why this would be the case, so I'm going to download PyUnit
+and sniff around. Are any of these modifications you mentioned to get
+PyUnit running under JPython published on the Web anywhere? I'd like to
+take a look, as they would probably save me some time.
+
+Thanks again,
+
+James
+
+>
+>James,
+>
+>I'm using PyUnit from within JPython to drive unit tests that test a Java
+>applications. Some minor changes had to be made to PyUnit to make it work
+>with JPython, and the testrunner only works textually. But nevertheless,
+>it's a much better option than using JUnit from within JPython.
+>
+>-Otto Perdeck
+>
+>
+>Hello all,
+>
+>I've used JPython for close to two years and I find the language to be
+>indispensable. The recent, protracted silence regarding the "official"
+>status of JPython has concerned me quite a bit as I didn't want this
+>language to die out when it shows such promise.
+>
+>I hope that BeOpen and CNRI can come to an agreement that will benefit the
+>community as a whole.
+>
+>Regardless, my major use of JPython [due to the status of the 1.1 release
+>and its errata (not an attack on Finn Bock, just an engineer not willing to
+>deploy certain software on "unofficial" patches)] has been to facilitate
+>prototyping and [almost ;)] XP style repetitive testing. My interest is if
+>a JPython testing framework exists? Something that is a JUnit for JPython,
+>but with functional level testing as well [similar to what Inline-Standard
+>provides: http://www.inline-software.com/products/datasheet.html but not
+>restricted to EJBs].
+>
+>If not, what is the interest of the JPython mailing list on collaborating
+>to
+>produce such an entity [maybe sourceforge.net]?
+>
+>Also, has anybody played around with AspectJ [ www.aspectj.org very cool
+>stuff ;)] and JPython? It seems that AOP and JPython could be a pretty
+>good
+>one-two punch for knocking out larger scale Java problems.
+>
+>James Richards
+>Java Software Engineer
+>
+>
+>- Tjitske Haank & Otto Perdeck
+
+_________________________________________________________________________
+Get Your Private, Free E-mail from MSN Hotmail at http://www.hotmail.com.
+
+Share information about yourself, create your own public profile at
+http://profiles.msn.com.
+
+
+_______________________________________________
+JPython-Interest maillist - JPython-Interest@python.org
+http://www.python.org/mailman/listinfo/jpython-interest
+
+--Boundary_(ID_+h6gzBCYzjhP3wCVCkWTrg)--
+
+
diff --git a/tests/bounces/dsn_02.txt b/tests/bounces/dsn_02.txt
new file mode 100644
index 00000000..3525605f
--- /dev/null
+++ b/tests/bounces/dsn_02.txt
@@ -0,0 +1,187 @@
+From VM Tue Dec 26 18:03:42 2000
+Return-Path: <python-list-admin@python.org>
+Received: from ns2.digicool.com ([216.164.72.2] verified)
+ by digicool.com (CommuniGate Pro SMTP 3.3.1)
+ with ESMTP id 399952 for xxxxx@mail.digicool.com; Tue, 26 Dec 2000 16:49:08 -0500
+Received: from mail.python.org (starship.python.net [63.102.49.30])
+ by ns2.digicool.com (8.9.3/8.9.3) with ESMTP id QAA00928
+ for <xxxxx@digicool.com>; Tue, 26 Dec 2000 16:49:01 -0500
+Received: from ns1.zope.org (localhost.localdomain [127.0.0.1])
+ by mail.python.org (Postfix) with ESMTP id 0CE1CE9B2
+ for <xxxxx@digicool.com>; Tue, 26 Dec 2000 16:48:01 -0500 (EST)
+Delivered-To: mm+python-list-admin@python.org
+Received: from cata.hud.ac.uk (cata.hud.ac.uk [161.112.232.16])
+ by mail.python.org (Postfix) with ESMTP id 5398EE9B2
+ for <python-list-admin@python.org>; Tue, 26 Dec 2000 16:47:33 -0500 (EST)
+Received: from hud.ac.uk by cata.hud.ac.uk id <13167-0@cata.hud.ac.uk>;
+ Tue, 26 Dec 2000 21:47:28 +0000
+Message-Type: Delivery Report
+X400-Received: by /PRMD=UK.AC/ADMD= /C=GB/; Relayed;
+ Tue, 26 Dec 2000 21:47:27 +0000
+X400-Received: by mta cata.hud.ac.uk in /PRMD=UK.AC/ADMD= /C=GB/; Relayed;
+ Tue, 26 Dec 2000 21:47:27 +0000
+X400-MTS-Identifier: [/PRMD=UK.AC/ADMD= /C=GB/;cata.hud.a:131600:20001226214727]
+Message-ID: <"cata.hud.a:131600:20001226214727"@hud.ac.uk>
+Content-Identifier: RE: A Q conce...
+MIME-Version: 1.0
+Content-Type: multipart/report; boundary="---Multi-Part-Report-Level-1-1-13166"
+Errors-To: python-list-owner@python.org
+Precedence: bulk
+List-Help: <mailto:python-list-request@python.org?subject=help>
+List-Post: <mailto:python-list@python.org>
+List-Subscribe: <http://www.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=subscribe>
+List-Id: General discussion list for the Python programming language <python-list.python.org>
+List-Unsubscribe: <http://www.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=unsubscribe>
+List-Archive: <http://www.python.org/pipermail/python-list/>
+From: postmaster@hud.ac.uk
+Sender: python-list-owner@python.org
+To: python-list-admin@python.org
+Subject: Delivery Report (failure) for zzzzz@zeus.hud.ac.uk
+Date: Tue, 26 Dec 2000 21:47:28 +0000
+X-BeenThere: python-list@python.org
+X-Mailman-Version: 2.0
+
+
+-----Multi-Part-Report-Level-1-1-13166
+
+This report relates to your message:
+Subject: RE: A Q concerning map (a comparison to Maple V),
+ Message-ID: <LNBBLJKPBEHFEDALKOLCMEEDIFAA.tim.one@home.com>,
+ To: <python-list@python.org>
+
+of Tue, 26 Dec 2000 21:47:27 +0000
+
+Your message was not delivered to:
+ zzzzz@zeus.hud.ac.uk
+for the following reason:
+Diagnostic was Unable to transfer, Message timed out
+Information Message timed out
+
+The Original Message follows:
+
+-----Multi-Part-Report-Level-1-1-13166
+Content-Type: message/delivery-status
+
+Reporting-MTA: x400; mta cata.hud.ac.uk in /PRMD=UK.AC/ADMD= /C=GB/
+Arrival-Date: Sat, 23 Dec 2000 21:44:56 +0000
+DSN-Gateway: dns; cata.hud.ac.uk
+X400-Conversion-Date: Tue, 26 Dec 2000 21:47:28 +0000
+Original-Envelope-Id: [/PRMD=UK.AC/ADMD= /C=GB/;<LNBBLJKPBEHFEDALKOLCMEEDIFAA.ti]
+X400-Content-Identifier: RE: A Q conce...
+X400-Content-Type: 822
+X400-Encoded-Info: ia5-text
+X400-Content-Correlator: Subject: RE: A Q concerning map (a comparison to Maple V),
+ Message-ID: <LNBBLJKPBEHFEDALKOLCMEEDIFAA.tim.one@home.com>,
+ To: <python-list@python.org>
+
+Original-Recipient: rfc822; zzzzz@zeus.hud.ac.uk
+Final-Recipient: x400; /S=zzzzz/OU=zeus/O=hud/PRMD=UK.AC/ADMD= /C=GB/
+X400-Originally-Specified-Recipient-Number: 1
+Action: failed
+Diagnostic-Code: Reason 1 (Unable-To-Transfer); Diagnostic 5 (Maximum-Time-Expired)
+Status: 4.4.7
+X400-Supplementary-Info: "Message timed out"
+X400-Last-Trace: Sat, 23 Dec 2000 21:44:56 +0000
+
+-----Multi-Part-Report-Level-1-1-13166
+Content-Type: message/rfc822
+
+Received: from mail.python.org (actually host starship.python.net)
+ by cata.hud.ac.uk with SMTP (Mailer); Sat, 23 Dec 2000 21:44:56 +0000
+Received: from ns1.zope.org (localhost.localdomain [127.0.0.1])
+ by mail.python.org (Postfix) with ESMTP id 9200FEB18;
+ Sat, 23 Dec 2000 13:10:09 -0500 (EST)
+Delivered-To: mm+python-list@python.org
+Received: from mail.rdc1.md.home.com (ha1.rdc1.md.home.com [24.2.2.66])
+ by mail.python.org (Postfix) with ESMTP id 9FA2AEC45
+ for <python-list@python.org>; Sat, 23 Dec 2000 12:35:46 -0500 (EST)
+Received: from cj569191b ([65.1.136.53])
+ by mail.rdc1.md.home.com (InterMail vM.4.01.03.00 201-229-121)
+ with SMTP
+ id <20001223173546.KSYS10139.mail.rdc1.md.home.com@cj569191b>
+ for <python-list@python.org>; Sat, 23 Dec 2000 09:35:46 -0800
+From: Tim Peters <tim.one@home.com>
+To: python-list <python-list@python.org>
+Subject: RE: A Q concerning map (a comparison to Maple V)
+Message-ID: <LNBBLJKPBEHFEDALKOLCMEEDIFAA.tim.one@home.com>
+MIME-Version: 1.0
+Content-Type: text/plain; charset="iso-8859-1"
+Content-Transfer-Encoding: 7bit
+X-Priority: 3 (Normal)
+X-MSMail-Priority: Normal
+X-Mailer: Microsoft Outlook IMO, Build 9.0.2416 (9.0.2911.0)
+X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4522.1200
+In-Reply-To: <3A448735.4DF3C95C@schneider-kamp.de>
+Importance: Normal
+Sender: python-list-admin@python.org
+Errors-To: python-list-admin@python.org
+X-BeenThere: python-list@python.org
+X-Mailman-Version: 2.0
+Precedence: bulk
+List-Help: <mailto:python-list-request@python.org?subject=help>
+List-Post: <mailto:python-list@python.org>
+List-Subscribe: <http://www.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=subscribe>
+List-Id: General discussion list for the Python programming language
+ <python-list.python.org>
+List-Unsubscribe: <http://www.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=unsubscribe>
+List-Archive: <http://www.python.org/pipermail/python-list/>
+Date: Sat, 23 Dec 2000 12:35:50 -0500
+
+[Franz GEIGER]
+> > map(replace, ["abc", "cde"], "c", "C");
+> > instead of having to create a lambda function.
+> > Wouldn't it make sense to have that in Python too? Do there come
+> > more such opportunities into your mind?
+
+[Peter Schneider-Kamp]
+> If I get you right you intend this to mean:
+>
+> map(replace, ["abc", "cde"], ["c"]*2, ["C"]*2)
+>
+> So basically your proposal is to reuse map parameters
+> which are no sequences in every iteration over the
+> parameters who are,
+
+It's hard to tell for sure, but that was my guess too. In array languages,
+this kind of thing is ubiquitous and is often called "scalar broadcast"
+(where a scalar is any atomic value (as opposed to an array), and is
+"broadcast" to every position of the arrays in which it's combined via some
+operation).
+
+There was a long debate about this a few years ago on c.l.py, where I
+championed scalar broadcast in map specifically. It collapsed under its own
+hideous weight when-- as such things always do <wink> --that originally
+modest goal got hijacked by people seeking to extend the semantics to every
+corner of the language. That won't happen.
+
+> ...
+> But how would you decide if "abc" is a sequence parameter
+> or not?
+
+That is a problem! Kinda. Mostly people want to broadcast numbers (as in
+Franz's original example), and there's no problem there. A cheap workaround
+for sequences that are desired to be treated as scalars would have been to
+introduce a new builtin scalar() function, that simply hid the
+"sequenceness" of its argument from map.
+
+Note that the listcomps in 2.0 make scalar broadcast much easier to spell;
+e.g.
+
+ [replace(x, "c", "C") for x in ("abc", "cde")]
+ [x**2 + 5 for x in L]
+
+So the better solution is not to extend map, but to forget it <0.9 wink>.
+
+a-life-strategy-of-universal-applicability-ly y'rs - tim
+
+
+--
+http://www.python.org/mailman/listinfo/python-list
+
+-----Multi-Part-Report-Level-1-1-13166--
+
+
diff --git a/tests/bounces/dsn_03.txt b/tests/bounces/dsn_03.txt
new file mode 100644
index 00000000..4e4fef05
--- /dev/null
+++ b/tests/bounces/dsn_03.txt
@@ -0,0 +1,144 @@
+From VM Fri Feb 9 13:30:37 2001
+Return-Path: <python-list-admin@python.org>
+Delivered-To: zzzzz@wwwww.org
+Received: from digicool.com (host15.digitalcreations.d.subnet.rcn.com [208.59.6.15])
+ by mail.wwwww.org (Postfix) with ESMTP id 1E50CD37AC
+ for <yyyyy@wwwww.org>; Thu, 8 Feb 2001 07:31:12 -0500 (EST)
+Received: from <python-list-admin@python.org>
+ by digicool.com (CommuniGate Pro RULES 3.3.2)
+ with RULES id 1450363; Thu, 08 Feb 2001 07:33:30 -0500
+Received: from ns2.digicool.com ([216.164.72.2] verified)
+ by digicool.com (CommuniGate Pro SMTP 3.3.2)
+ with ESMTP id 1450362 for yyyyy@mail.digicool.com; Thu, 08 Feb 2001 07:33:30 -0500
+Received: from mail.python.org (mail.python.org [63.102.49.29])
+ by ns2.digicool.com (8.9.3/8.9.3) with ESMTP id HAA17520
+ for <yyyyy@digicool.com>; Thu, 8 Feb 2001 07:32:00 -0500
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 14QqF1-0002hJ-00
+ for yyyyy@digicool.com; Thu, 08 Feb 2001 07:32:03 -0500
+Received: from [194.78.23.194] (helo=pigeon.advalvas.be)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 14QqCJ-0002UN-00
+ for python-list-admin@python.org; Thu, 08 Feb 2001 07:29:15 -0500
+Message-Id: <12334670553230@pigeon.advalvas.be>
+Mime-Version: 1.0
+Content-Type: multipart/report; report-type=delivery-status; boundary="==_12334670553231@pigeon.advalvas.be==_"
+Precedence: bulk
+List-Help: <mailto:python-list-request@python.org?subject=help>
+List-Post: <mailto:python-list@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=subscribe>
+List-Id: General discussion list for the Python programming language <python-list.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/python-list/>
+From: "postmaster@advalvas.be" <postmaster@advalvas.be>
+Sender: python-list-owner@python.org
+To: "python-list-admin@python.org" <python-list-admin@python.org>
+Subject: Failed mail: exceeded maximum incoming message size
+Date: Thu, 8 Feb 2001 13:33:46 +0100
+X-Autogenerated: Mirror
+X-Mirrored-by: <python-list-admin@python.org>
+X-Mailer: NTMail v5.06.0014
+X-BeenThere: python-list@python.org
+X-Mailman-Version: 2.0.1 (101270)
+
+This is a MIME-encapsulated message
+
+--==_12334670553231@pigeon.advalvas.be==_
+Content-Type: text/plain; charset="us-ascii"
+Content-Transfer-Encoding: 7bit
+Content-Disposition: inline
+
+Your message was not delivered to
+
+ ddd.kkk@advalvas.be
+
+This mail message has exceeded the maximum incoming message size.
+
+
+--==_12334670553231@pigeon.advalvas.be==_
+Content-Type: message/delivery-status
+Content-Transfer-Encoding: 7bit
+Content-Disposition: inline
+
+Reporting-MTA: dns;pigeon.net7.be
+
+Final-Recipient: rfc822;ddd.kkk@advalvas.be
+Action: failure
+Status: 553 Exceeded maximum inbound message size
+
+
+--==_12334670553231@pigeon.advalvas.be==_
+Content-Type: message/rfc822
+Content-Transfer-Encoding: 7bit
+Content-Disposition: inline
+
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 14Qq5S-0001zk-00; Thu, 08 Feb 2001 07:22:10 -0500
+Received: from [193.123.0.194] (helo=intrepid.trisystems.co.uk)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 14Qq2n-0001kA-00
+ for python-list@python.org; Thu, 08 Feb 2001 07:19:25 -0500
+Received: by intrepid with Internet Mail Service (5.5.2650.21)
+ id <11PN1RRB>; Thu, 8 Feb 2001 12:21:16 -0000
+Message-ID: <31575A892FF6D1118F5800600846864D5B17D1@intrepid>
+From: Simon Brunning <Sssss@trisystems.co.uk>
+To: 'Ggggg Wwwww' <ggg@pppeval.be>, Python Mailling list
+ <python-list@python.org>
+Subject: RE: None assigment
+MIME-Version: 1.0
+X-Mailer: Internet Mail Service (5.5.2650.21)
+Content-Type: text/plain
+Sender: python-list-admin@python.org
+Errors-To: python-list-admin@python.org
+X-BeenThere: python-list@python.org
+X-Mailman-Version: 2.0.1 (101270)
+Precedence: bulk
+List-Help: <mailto:python-list-request@python.org?subject=help>
+List-Post: <mailto:python-list@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=subscribe>
+List-Id: General discussion list for the Python programming language <python-list.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/python-list/>
+Date: Thu, 8 Feb 2001 12:20:27 -0000
+
+> From: Ggggg Wwwww [SMTP:ggg@pppeval.be]
+> While playing a bit with python 2.0, I found that I can assign some value
+> to None
+(snip)
+> If it is a feature (I suppose it is not a bug :), what is the interest of
+> this ?
+
+Feature. 'None' is just a label, and just like any other label, you can
+always assign to it. I'm not aware of any way of preventing a label from
+being assigned to.
+
+Doesn't make it a good idea, though...
+
+Cheers,
+TriSystems Ltd.
+sssss@trisystems.co.uk
+
+
+
+
+
+-----------------------------------------------------------------------
+The information in this email is confidential and may be legally privileged.
+It is intended solely for the addressee. Access to this email by anyone else
+is unauthorised. If you are not the intended recipient, any disclosure,
+copying, distribution, or any action taken or omitted to be taken in
+reliance on it, is prohibited and may be unlawful. TriSystems Ltd. cannot
+accept liability for statements made which are clearly the senders own.
+
+--
+http://mail.python.org/mailman/listinfo/python-list
+
+--==_12334670553231@pigeon.advalvas.be==_--
+
+
diff --git a/tests/bounces/dsn_04.txt b/tests/bounces/dsn_04.txt
new file mode 100644
index 00000000..9bea9758
--- /dev/null
+++ b/tests/bounces/dsn_04.txt
@@ -0,0 +1,202 @@
+From VM Sat Jun 30 11:29:01 2001
+X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
+ [nil "Saturday" "30" "June" "2001" "00:21:42" "+0200" "PMDF e-Mail Interconnect" "postmaster@yogi.urz.unibas.ch" nil "147" "Delivery Notification: Delivery has failed" "^From:" nil nil "6" nil nil nil nil nil]
+ nil)
+Return-Path: <python-list-admin@python.org>
+Delivered-To: barry@wooz.org
+Received: from digicool.com (unknown [63.100.190.15])
+ by mail.wooz.org (Postfix) with ESMTP id 2852FD36EC
+ for <barry@wooz.org>; Fri, 29 Jun 2001 18:21:58 -0400 (EDT)
+Received: from <python-list-admin@python.org>
+ by digicool.com (CommuniGate Pro RULES 3.4)
+ with RULES id 2122693; Fri, 29 Jun 2001 18:23:52 -0400
+Received: from ns2.digicool.com ([63.100.190.2] verified)
+ by digicool.com (CommuniGate Pro SMTP 3.4)
+ with ESMTP id 2122692 for barry@mail.digicool.com; Fri, 29 Jun 2001 18:23:52 -0400
+Received: from mail.python.org (mail.python.org [63.102.49.29])
+ by ns2.digicool.com (8.9.3/8.9.3) with ESMTP id SAA15102
+ for <barry@digicool.com>; Fri, 29 Jun 2001 18:22:00 -0400
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 15G6eH-0006NJ-00
+ for barry@digicool.com; Fri, 29 Jun 2001 18:22:01 -0400
+Received: from [131.152.1.4] (helo=yogi.urz.unibas.ch)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 15G6d4-0006Lg-00
+ for python-list-admin@python.org; Fri, 29 Jun 2001 18:20:46 -0400
+Received: from PROCESS-DAEMON by yogi.urz.unibas.ch (PMDF V5.2-29 #33343)
+ id <01K5CWRKUM2O8X1X1D@yogi.urz.unibas.ch> for python-list-admin@python.org;
+ Sat, 30 Jun 2001 00:21:44 +0200
+Received: from yogi.urz.unibas.ch (PMDF V5.2-29 #33343)
+ id <01K5CWRINUF48X46F4@yogi.urz.unibas.ch>; Sat, 30 Jun 2001 00:21:42 +0200
+Message-id: <01K5CWRJIDYU8X46F4@yogi.urz.unibas.ch>
+MIME-version: 1.0
+Content-type: MULTIPART/REPORT;
+ BOUNDARY="Boundary_(ID_MUSA353qRe9PeqtdeP14tg)"; REPORT-TYPE=DELIVERY-STATUS
+Precedence: bulk
+List-Help: <mailto:python-list-request@python.org?subject=help>
+List-Post: <mailto:python-list@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=subscribe>
+List-Id: General discussion list for the Python programming language <python-list.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/python-list/>
+From: PMDF e-Mail Interconnect <postmaster@yogi.urz.unibas.ch>
+Sender: python-list-owner@python.org
+To: python-list-admin@python.org
+Subject: Delivery Notification: Delivery has failed
+Date: Sat, 30 Jun 2001 00:21:42 +0200
+X-Autogenerated: Mirror
+X-Mirrored-by: <python-list-admin@python.org>
+X-BeenThere: python-list@python.org
+X-Mailman-Version: 2.0.5 (101270)
+
+
+--Boundary_(ID_MUSA353qRe9PeqtdeP14tg)
+Content-type: text/plain; charset=us-ascii
+Content-language: EN-US
+
+This report relates to a message you sent with the following header fields:
+
+ Message-id: <Pine.LNX.4.31.0106300001530.2750-100000@athlon.de>
+ Date: Sat, 30 Jun 2001 00:18:49 +0200 (CEST)
+ From: Carsten Geckeler <uioziaremwpl@spammotel.com>
+ To: Python <python-list@python.org>
+ Subject: Re: Augmented Assignement (was: Re: PEP scepticism)
+
+Your message cannot be delivered to the following recipients:
+
+ Recipient address: HAASM@yogi.urz.unibas.ch
+ Original address: max.haas@unibas.ch
+%MAIL-E-OPENOUT, error opening !AS as output
+-RMS-E-CRE, ACP file create failed
+-SYSTEM-F-EXDISKQUOTA, disk quota exceeded
+
+
+--Boundary_(ID_MUSA353qRe9PeqtdeP14tg)
+Content-type: message/DELIVERY-STATUS
+
+Original-envelope-id: 0GFP00202Q2DR3@mailhub.unibas.ch
+Reporting-MTA: dns;yogi.urz.unibas.ch
+
+Action: failed
+Status: 5.0.0
+Original-recipient: rfc822;max.haas@unibas.ch
+Final-recipient: rfc822;HAASM@yogi.urz.unibas.ch
+
+--Boundary_(ID_MUSA353qRe9PeqtdeP14tg)
+Content-type: MESSAGE/RFC822
+
+Return-path: python-list-admin@python.org
+Received: from yogi.urz.unibas.ch by yogi.urz.unibas.ch (PMDF V5.2-29 #33343)
+ id <01K5CWRINUF48X46F4@yogi.urz.unibas.ch>
+ (original mail from python-list-admin@python.org); Sat,
+ 30 Jun 2001 00:21:42 +0200
+Received: from maser.urz.unibas.ch ([131.152.1.5])
+ by yogi.urz.unibas.ch (PMDF V5.2-29 #33343)
+ with ESMTP id <01K5CWRGK0V68X4CRC@yogi.urz.unibas.ch> for
+ HAASM@yogi.urz.unibas.ch (ORCPT rfc822;max.haas@unibas.ch); Sat,
+ 30 Jun 2001 00:21:38 +0200
+Received: from DIRECTORY-DAEMON.mailhub.unibas.ch by mailhub.unibas.ch
+ (PMDF V6.0-24 #41480) id <0GFP00201Q2DR3@mailhub.unibas.ch> for
+ HAASM@yogi.urz.unibas.ch (ORCPT max.haas@unibas.ch); Sat,
+ 30 Jun 2001 00:20:37 +0200 (MET DST)
+Received: from mail.python.org (mail.python.org [63.102.49.29])
+ by mailhub.unibas.ch (PMDF V6.0-24 #41480)
+ with ESMTP id <0GFP00BEAQ2C5Y@mailhub.unibas.ch> for max.haas@unibas.ch; Sat,
+ 30 Jun 2001 00:20:37 +0200 (MET DST)
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1) id 15G6bK-0006HW-00; Fri,
+ 29 Jun 2001 18:18:58 -0400
+Received: from [134.2.34.92] (helo=nemesis.jura.uni-tuebingen.de ident=qmailr)
+ by mail.python.org with smtp (Exim 3.21 #1)
+ id 15G6Zp-0006Ee-00 for python-list@python.org; Fri, 29 Jun 2001 18:17:25 -0400
+Received: (qmail 31643 invoked from network); Fri, 29 Jun 2001 22:17:24 +0000
+Received: from justitia.jura.uni-tuebingen.de (mail@134.2.34.12)
+ by nemesis.jura.uni-tuebingen.de with SMTP; Fri, 29 Jun 2001 22:17:24 +0000
+Received: from s-gec3 by justitia.jura.uni-tuebingen.de with local
+ (Exim 3.12 #1 (Debian)) id 15G6Zo-0002Zx-00 for <python-list@python.org>; Sat,
+ 30 Jun 2001 00:17:24 +0200
+Date: Sat, 30 Jun 2001 00:18:49 +0200 (CEST)
+From: Carsten Geckeler <uioziaremwpl@spammotel.com>
+Subject: Re: Augmented Assignement (was: Re: PEP scepticism)
+In-reply-to: <ubsn7hte7.fsf@ctwd0143.fitlinxx.com>
+Sender: python-list-admin@python.org
+To: Python <python-list@python.org>
+Errors-to: python-list-admin@python.org
+Message-id: <Pine.LNX.4.31.0106300001530.2750-100000@athlon.de>
+MIME-version: 1.0
+Content-type: TEXT/PLAIN; charset=US-ASCII
+Precedence: bulk
+X-BeenThere: python-list@python.org
+X-Mailman-Version: 2.0.5 (101270)
+List-Post: <mailto:python-list@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=subscribe>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/python-list/>
+List-Help: <mailto:python-list-request@python.org?subject=help>
+List-Id: General discussion list for the Python programming language
+ <python-list.python.org>
+
+On 29 Jun 2001, David Bolen wrote:
+
+> Carsten Geckeler <uioziaremwpl@spammotel.com> writes:
+>
+> > The problem which some people have with augmented assignment is not that
+> > they exist, but that they do not work as they expect (at least from the
+> > POV of some readers). I expect that
+> > ident op= expr
+> > works like
+> > ident = ident op expr
+> >
+> > At least that's what I'd have expectd comming from other programming
+> > languages.
+>
+> Of course, one interesting point is that while you may think the above
+> if coming from, say, C, what "ident = ident op expr" means in C is not
+> what "ident = ident op expr" means in Python.
+
+Yes, that's completely true. I can accept, that Python work differently
+in many cases. Actually I love Python's object stuff. That's something
+more natural that in many other languages. And I can accept, that objects
+(which are bound to different variable names) can be changed (like with
+l.extend).
+
+The point is not that Python differs from C (or other languages), but that
+the two statements above work differently. I can accept that, of course
+(well I have to, I thing ;) ). But, when I write the following three
+statements,
+ l = l + [3, 4]
+ l += [3, 4]
+ l.extend([3,4])
+it seems more logical to me, that the first two do the same than the last
+two. I know, of course, that the last two do the same. But anyway, the
+first two just _look_ more the same.
+
+> In C it has the result of changing data (in either case) that is
+> stored in a named location ident, in Python the long form just rebinds
+> the reference ident to a new object and doesn't touch the original
+> object. The short form can actually get closer to the C idiom if the
+> object is mutable.
+>
+> So I wonder if some of the confusion is people familiar with other
+> language's augmented assignment trying to extrapolate that into Python
+> and then running into the pre-existing differences in assignment
+> versus binding?
+
+No, that's at least no problem for me (see above).
+
+Cheers, Carsten
+--
+Carsten Geckeler
+
+
+--
+http://mail.python.org/mailman/listinfo/python-list
+
+--Boundary_(ID_MUSA353qRe9PeqtdeP14tg)--
+
+
diff --git a/tests/bounces/dsn_05.txt b/tests/bounces/dsn_05.txt
new file mode 100644
index 00000000..73331578
--- /dev/null
+++ b/tests/bounces/dsn_05.txt
@@ -0,0 +1,125 @@
+From VM Wed Mar 21 22:20:23 2001
+X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
+ [nil "Thursday" "22" "March" "2001" "02:52:34" "+0100" "postmaster@relay.atlas.cz" "postmaster@relay.atlas.cz" nil "76" "Message delayed (pkocmid@atlas.cz)" "^From:" nil nil "3" nil nil nil nil nil]
+ nil)
+Return-Path: <python-list-admin@python.org>
+Delivered-To: bwarsaw@wooz.org
+Received: from digicool.com (host15.digitalcreations.d.subnet.rcn.com [208.59.6.15])
+ by mail.wooz.org (Postfix) with ESMTP id 97D9ED37AC
+ for <barry@wooz.org>; Wed, 21 Mar 2001 21:34:33 -0500 (EST)
+Received: from <python-list-admin@python.org>
+ by digicool.com (CommuniGate Pro RULES 3.4)
+ with RULES id 1706776; Wed, 21 Mar 2001 21:39:26 -0500
+Received: from ns2.digicool.com ([216.164.72.2] verified)
+ by digicool.com (CommuniGate Pro SMTP 3.4)
+ with ESMTP id 1706775 for barry@mail.digicool.com; Wed, 21 Mar 2001 21:39:26 -0500
+Received: from mail.python.org (mail.python.org [63.102.49.29])
+ by ns2.digicool.com (8.9.3/8.9.3) with ESMTP id VAA12152
+ for <barry@digicool.com>; Wed, 21 Mar 2001 21:36:03 -0500
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 14fuxH-0002AK-00
+ for barry@digicool.com; Wed, 21 Mar 2001 21:36:03 -0500
+Received: from [195.119.187.242] (helo=cuk.atlas.cz)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 14fuwk-00028x-00
+ for python-list-admin@python.org; Wed, 21 Mar 2001 21:35:31 -0500
+Message-Id: <B0008606065@cuk.atlas.cz>
+MIME-Version: 1.0
+Content-Type: multipart/report; report-type=delivery-status; boundary="45817/808/985225954/VOPmail/cuk.atlas.cz"
+Precedence: bulk
+List-Help: <mailto:python-list-request@python.org?subject=help>
+List-Post: <mailto:python-list@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=subscribe>
+List-Id: General discussion list for the Python programming language <python-list.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/python-list/>
+From: postmaster@relay.atlas.cz
+Sender: python-list-owner@python.org
+To: python-list-admin@python.org
+Subject: Message delayed (pkocmid@atlas.cz)
+Date: Thu, 22 Mar 2001 02:52:34 +0100
+X-Autogenerated: Mirror
+X-Mirrored-by: <python-list-admin@python.org>
+X-BeenThere: python-list@python.org
+X-Mailman-Version: 2.0.3 (101270)
+
+--45817/808/985225954/VOPmail/cuk.atlas.cz
+Content-Type: text/plain
+
+Your message has been delayed and is still awaiting delivery
+to the following recipient(s):
+
+pkocmid@atlas.cz
+Message delayed
+
+
+Your message is delayed
+Message for domain atlas.cz delayed at relay.atlas.cz.
+Unable to deliver to domain for 12 hours.
+Will continue trying for 96 hours.
+No action is required on your part.
+Last attempt failed because:
+Can't connect to host
+
+
+--45817/808/985225954/VOPmail/cuk.atlas.cz
+Content-Type: message/delivery-status
+
+Reporting-MTA: dns; cuk.atlas.cz
+Received-From-MTA: dns; mail.python.org (unverified [63.102.49.29])
+Arrival-Date: Wed, 21 Mar 2001 15:08:54 +0100
+
+Final-Recipient: rfc822; pkocmid@atlas.cz
+Action: delayed
+Status: 4.4.1 (Persistent transient failure - routing/network: no answer from host)
+Will-Retry-Until: Mon, 26 Mar 2001 03:42:45 +0100
+
+--45817/808/985225954/VOPmail/cuk.atlas.cz
+Content-Type: message/rfc822-headers
+
+Received: from mail.python.org (unverified [63.102.49.29]) by cuk.atlas.cz
+ (Vircom SMTPRS 4.5.186) with ESMTP id <B0008514592@cuk.atlas.cz> for <pkocmid@atlas.cz>;
+ Wed, 21 Mar 2001 15:08:54 +0100
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 14fjGM-0007PZ-00; Wed, 21 Mar 2001 09:06:58 -0500
+Path: news.baymountain.net!uunet!ash.uu.net!sac.uu.net!newsfeed.attap.net!enews.sgi.com!feeder.via.net!news.he.net!typhoon.aracnet.com!not-for-mail
+From: Daniel Klein <danielk@aracnet.com>
+Newsgroups: comp.lang.python
+Subject: Re: Pick Systems D3 Database
+Message-ID: <pfchbtkf3j0p7prf0sp45vi21fro3bs7ad@4ax.com>
+References: <rG%t6.555$45.2416@newsfeeds.bigpond.com>
+X-Newsreader: Forte Agent 1.8/32.548
+MIME-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+Content-Transfer-Encoding: 7bit
+Lines: 25
+NNTP-Posting-Host: 216.99.212.46
+X-Complaints-To: news@aracnet.com
+X-Trace: typhoon.aracnet.com 985183028 216.99.212.46 (Wed, 21 Mar 2001 05:57:08 PST)
+NNTP-Posting-Date: Wed, 21 Mar 2001 05:57:08 PST
+Organization: Aracnet Internet
+Xref: news.baymountain.net comp.lang.python:93719
+To: python-list@python.org
+Sender: python-list-admin@python.org
+Errors-To: python-list-admin@python.org
+X-BeenThere: python-list@python.org
+X-Mailman-Version: 2.0.3 (101270)
+Precedence: bulk
+List-Help: <mailto:python-list-request@python.org?subject=help>
+List-Post: <mailto:python-list@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=subscribe>
+List-Id: General discussion list for the Python programming language <python-list.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/python-list/>
+Date: Wed, 21 Mar 2001 06:05:14 -0800
+
+--45817/808/985225954/VOPmail/cuk.atlas.cz--
+
+
+
diff --git a/tests/bounces/dsn_06.txt b/tests/bounces/dsn_06.txt
new file mode 100644
index 00000000..22f69760
--- /dev/null
+++ b/tests/bounces/dsn_06.txt
@@ -0,0 +1,122 @@
+From VM Mon Jul 2 04:05:06 2001
+X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
+ [nil "Sunday" "1" "July" "2001" "16:07:50" "+0200" "Mail Delivery Service" "mailadm@thales-is.com" nil "72" "Delivery Status Notification (Mail Delivery Delayed)" "^From:" nil nil "7" nil nil nil nil nil]
+ nil)
+Return-Path: <python-list-admin@python.org>
+Delivered-To: barry@wooz.org
+Received: from digicool.com (unknown [63.100.190.15])
+ by mail.wooz.org (Postfix) with ESMTP id 1F5FED36EC
+ for <barry@wooz.org>; Sun, 1 Jul 2001 10:07:00 -0400 (EDT)
+Received: from <python-list-admin@python.org>
+ by digicool.com (CommuniGate Pro RULES 3.4)
+ with RULES id 2125237; Sun, 01 Jul 2001 10:08:57 -0400
+Received: from ns2.digicool.com ([63.100.190.2] verified)
+ by digicool.com (CommuniGate Pro SMTP 3.4)
+ with ESMTP id 2125244 for barry@mail.digicool.com; Sun, 01 Jul 2001 10:08:57 -0400
+Received: from mail.python.org (mail.python.org [63.102.49.29])
+ by ns2.digicool.com (8.9.3/8.9.3) with ESMTP id KAA26383
+ for <barry@digicool.com>; Sun, 1 Jul 2001 10:07:00 -0400
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 15GhsL-0001Ey-00
+ for barry@digicool.com; Sun, 01 Jul 2001 10:07:01 -0400
+Received: from [195.101.39.226] (helo=gwsmtp.thomson-csf.com)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 15GhrZ-0001D4-00
+ for python-list-admin@python.org; Sun, 01 Jul 2001 10:06:13 -0400
+Received: by gwsmtp.thomson-csf.com (NPlex 5.1.053) id 3B3CE20D00005041 for python-list-admin@python.org; Sun, 1 Jul 2001 16:07:50 +0200
+Message-ID: <3B3CE20D0000503F@gwsmtp.thomson-csf.com>
+MIME-Version: 1.0
+Content-Type: Multipart/Report; report-type=delivery-status; boundary="=========3B3CE20D00004815/gwsmtp.thomson-csf.com"
+Precedence: bulk
+List-Help: <mailto:python-list-request@python.org?subject=help>
+List-Post: <mailto:python-list@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=subscribe>
+List-Id: General discussion list for the Python programming language <python-list.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/python-list/>
+From: Mail Delivery Service <mailadm@thales-is.com>
+Sender: python-list-owner@python.org
+To: python-list-admin@python.org
+Subject: Delivery Status Notification (Mail Delivery Delayed)
+Date: Sun, 1 Jul 2001 16:07:50 +0200
+X-Autogenerated: Mirror
+X-Mirrored-by: <python-list-admin@python.org>
+X-BeenThere: python-list@python.org
+X-Mailman-Version: 2.0.5 (101270)
+
+This multi-part MIME message contains a Delivery Status Notification.
+If you can see this text, your mail client may not be able to understand MIME
+formatted messages or DSNs (see RFC 2045 through 2049 for general MIME
+information and RFC 1891 through 1894 for DSN specific information).
+
+--=========3B3CE20D00004815/gwsmtp.thomson-csf.com
+Content-Type: text/plain; charset=us-ascii
+
+ - This is only a notification about a delay in the delivery of your message.
+ - There is no need to resend your message at this time.
+ - The following recipients have not yet received your message:
+
+hao-nghi.au@fr.thalesgroup.com; Action: Delayed
+
+ - The server will continue trying for up to 21 hours.
+
+
+--=========3B3CE20D00004815/gwsmtp.thomson-csf.com
+Content-Type: Message/Delivery-Status
+
+Reporting-MTA: dns; gwsmtp.thomson-csf.com
+Received-from-MTA: dns; mail.python.org (63.102.49.29)
+Arrival-Date: Sun, 1 Jul 2001 13:07:44 +0200
+
+Final-Recipient: rfc822; hao-nghi.au@fr.thalesgroup.com
+Action: Delayed
+Status: 4.4.0 (other or undefined network or routing status)
+Will-Retry-Until: Mon, 2 Jul 2001 13:07:44 +0200
+
+--=========3B3CE20D00004815/gwsmtp.thomson-csf.com
+Content-Type: Text/RFC822-headers
+
+Return-Path: <python-list-admin@python.org>
+Received: from mail.python.org (63.102.49.29) by gwsmtp.thomson-csf.com (NPlex 5.1.053)
+ id 3B3CE20D00004815 for hao-nghi.au@fr.thalesgroup.com; Sun, 1 Jul 2001 13:07:44 +0200
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 15Gf3C-0005ft-00; Sun, 01 Jul 2001 07:06:02 -0400
+Path: news.baymountain.net!uunet!ash.uu.net!dca.uu.net!feed2.onemain.com!feed1.onemain.com!news-spur1.maxwell.syr.edu!news.maxwell.syr.edu!newsfeed00.sul.t-online.de!newsfeed01.sul.t-online.de!t-online.de!fu-berlin.de!hahn.informatik.hu-berlin.de!not-for-mail
+From: Martin von Loewis <loewis@informatik.hu-berlin.de>
+Newsgroups: comp.lang.python
+Subject: Re: GCC 3.0, Standard ABI & C++/Python Integration
+Organization: Humboldt University Berlin, Department of Computer Science
+Lines: 8
+Message-ID: <j4d77kvs79.fsf@informatik.hu-berlin.de>
+References: <mailman.993664666.10985.python-list@python.org>
+NNTP-Posting-Host: pandora.informatik.hu-berlin.de
+X-Trace: hahn.informatik.hu-berlin.de 993984634 26083 141.20.23.176 (1 Jul 2001 10:50:34 GMT)
+X-Complaints-To: news@hahn.informatik.hu-berlin.de
+NNTP-Posting-Date: 1 Jul 2001 10:50:34 GMT
+X-Newsreader: Gnus v5.7/Emacs 20.7
+Xref: news.baymountain.net comp.lang.python:110477
+To: python-list@python.org
+Sender: python-list-admin@python.org
+Errors-To: python-list-admin@python.org
+X-BeenThere: python-list@python.org
+X-Mailman-Version: 2.0.5 (101270)
+Precedence: bulk
+List-Help: <mailto:python-list-request@python.org?subject=help>
+List-Post: <mailto:python-list@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=subscribe>
+List-Id: General discussion list for the Python programming language <python-list.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/python-list/>
+Date: 01 Jul 2001 12:50:34 +0200
+
+
+--=========3B3CE20D00004815/gwsmtp.thomson-csf.com--
+
+
+
diff --git a/tests/bounces/dsn_07.txt b/tests/bounces/dsn_07.txt
new file mode 100644
index 00000000..2e5a0e5d
--- /dev/null
+++ b/tests/bounces/dsn_07.txt
@@ -0,0 +1,121 @@
+From VM Wed Aug 1 17:56:11 2001
+X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
+ [nil "Thursday" "2" "August" "2001" "08:02:07" "+1200" "postmaster@Parliament.govt.nz" "postmaster@Parliament.govt.nz" nil "73" "Message delayed (david.farrar@parliament.govt.nz)" "^From:" "mailman-users-admin@python.org" "mailman-users-admin@python.org" "8" nil nil nil nil nil]
+ nil)
+Return-Path: <mailman-users-admin@python.org>
+Delivered-To: barry@wooz.org
+Received: from digicool.com (unknown [63.100.190.15])
+ by mail.wooz.org (Postfix) with ESMTP id D431ED35F0
+ for <barry@wooz.org>; Wed, 1 Aug 2001 16:26:59 -0400 (EDT)
+Received: from <mailman-users-admin@python.org>
+ by digicool.com (CommuniGate Pro RULES 3.4)
+ with RULES id 2462291; Wed, 01 Aug 2001 16:27:02 -0400
+Received: from smtp.zope.com ([63.100.190.10] verified)
+ by digicool.com (CommuniGate Pro SMTP 3.4)
+ with ESMTP id 2462289 for barry@mail.zope.com; Wed, 01 Aug 2001 16:27:02 -0400
+Received: from mail.python.org (mail.python.org [63.102.49.29])
+ by smtp.zope.com (8.11.2/8.11.2) with ESMTP id f71KR2X19854
+ for <barry@zope.com>; Wed, 1 Aug 2001 16:27:02 -0400
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 15S2a4-0003D5-00; Wed, 01 Aug 2001 16:27:00 -0400
+Received: from [203.97.232.93] (helo=ns1.parliament.govt.nz)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 15S2Z4-0003Bh-00
+ for mailman-users-admin@python.org; Wed, 01 Aug 2001 16:25:59 -0400
+Message-Id: <Tcb61e85d551eb3e8b4@ns1.parliament.govt.nz>
+MIME-Version: 1.0
+Content-Type: multipart/report; report-type=delivery-status; boundary="23/89/996696127/MAILsweeper/ns1.parliament.govt.nz"
+Precedence: bulk
+List-Help: <mailto:mailman-users-request@python.org?subject=help>
+List-Post: <mailto:mailman-users@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=subscribe>
+List-Id: Mailman mailing list management users <mailman-users.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/mailman-users/>
+From: postmaster@Parliament.govt.nz
+Sender: mailman-users-owner@python.org
+To: mailman-users-admin@python.org
+Subject: Message delayed (david.farrar@parliament.govt.nz)
+Date: Thu, 2 Aug 2001 08:02:07 +1200
+X-Autogenerated: Mirror
+X-Mirrored-by: <mailman-users-admin@python.org>
+X-BeenThere: mailman-users@python.org
+X-Mailman-Version: 2.0.6 (101270)
+
+--23/89/996696127/MAILsweeper/ns1.parliament.govt.nz
+Content-Type: text/plain
+
+Your message has been delayed and is still awaiting delivery
+to the following recipient(s):
+
+david.farrar@Parliament.govt.nz
+(Was addressed to david.farrar@parliament.govt.nz)
+Message delayed
+
+
+Your message is delayed
+Message for domain parliament.govt.nz delayed at Parliament.govt.nz.
+Unable to deliver to domain for 6 hours.
+Will continue trying for 66 hours.
+No action is required on your part.
+Last attempt failed because:
+Can't connect to host
+
+
+--23/89/996696127/MAILsweeper/ns1.parliament.govt.nz
+Content-Type: message/delivery-status
+
+Reporting-MTA: dns; ns1.parliament.govt.nz
+Received-From-MTA: dns; mail.python.org (unverified [63.102.49.29])
+Arrival-Date: Thu, 2 Aug 2001 02:00:22 +1200
+
+Final-Recipient: rfc822; david.farrar@parliament.govt.nz
+Action: delayed
+Status: 4.4.1 (Persistent transient failure - routing/network: no answer from host)
+Will-Retry-Until: Sun, 5 Aug 2001 02:02:05 +1200
+
+--23/89/996696127/MAILsweeper/ns1.parliament.govt.nz
+Content-Type: message/rfc822-headers
+
+Received: from mail.python.org (unverified) by ns1.parliament.govt.nz
+ (Content Technologies SMTPRS 4.1.5) with ESMTP id <Tcb61e85d551d68b75d@ns1.parliament.govt.nz> for <david.farrar@parliament.govt.nz>;
+ Thu, 2 Aug 2001 02:00:22 +1200
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 15RvjO-00089v-00; Wed, 01 Aug 2001 09:08:10 -0400
+Received: from [144.122.169.16] (helo=robot.metu.edu.tr)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 15Rvie-00086Z-00
+ for mailman-users@python.org; Wed, 01 Aug 2001 09:07:26 -0400
+Received: from localhost (ceyhun@localhost)
+ by robot.metu.edu.tr (8.11.2/8.11.2) with ESMTP id f71DBH312336
+ for <mailman-users@python.org>; Wed, 1 Aug 2001 16:11:18 +0300
+From: <ceyhun@robot.metu.edu.tr>
+To: <mailman-users@python.org>
+Message-ID: <Pine.LNX.4.33.0108011605240.12261-100000@robot.metu.edu.tr>
+MIME-Version: 1.0
+Content-Type: TEXT/PLAIN; charset=US-ASCII
+Subject: [Mailman-Users] Hi there,
+Sender: mailman-users-admin@python.org
+Errors-To: mailman-users-admin@python.org
+X-BeenThere: mailman-users@python.org
+X-Mailman-Version: 2.0.6 (101270)
+Precedence: bulk
+List-Help: <mailto:mailman-users-request@python.org?subject=help>
+List-Post: <mailto:mailman-users@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=subscribe>
+List-Id: Mailman mailing list management users <mailman-users.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/mailman-users/>
+Date: Wed, 1 Aug 2001 16:11:17 +0300 (EEST)
+X-Mime-Type: Plain
+
+--23/89/996696127/MAILsweeper/ns1.parliament.govt.nz--
+
+
+
diff --git a/tests/bounces/dsn_08.txt b/tests/bounces/dsn_08.txt
new file mode 100644
index 00000000..8d4d3b8b
--- /dev/null
+++ b/tests/bounces/dsn_08.txt
@@ -0,0 +1,131 @@
+Return-Path: <zope-admin@zope.org>
+Received: from smtp.zope.com ([63.100.190.10] verified)
+ by digicool.com (CommuniGate Pro SMTP 3.4)
+ with ESMTP id 2769384 for mj@mail.zope.com; Thu, 04 Oct 2001 04:48:48 -0400
+Received: from mail.python.org (mail.python.org [63.102.49.29])
+ by smtp.zope.com (8.11.2/8.11.2) with ESMTP id f948k0X28835
+ for <mj@zope.com>; Thu, 4 Oct 2001 04:46:00 -0400
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 15p48n-0001n2-00
+ for mj@zope.com; Thu, 04 Oct 2001 04:46:01 -0400
+Received: from [212.84.234.29] (helo=daswort.innominate.com)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 15p48K-0001ku-00
+ for zope-admin@zope.org; Thu, 04 Oct 2001 04:45:32 -0400
+Received: from mate.bln.innominate.de (cerberus.berlin.innominate.de [212.84.234.251])
+ by daswort.innominate.com (Postfix) with ESMTP id BC8F2272F7
+ for <zope-admin@zope.org>; Thu, 4 Oct 2001 09:45:26 +0000 (GMT)
+Received: by mate.bln.innominate.de (Postfix)
+ id 27AD62CB3A; Thu, 4 Oct 2001 10:45:28 +0200 (CEST)
+Date: Thu, 4 Oct 2001 10:45:28 +0200 (CEST)
+From: MAILER-DAEMON@innominate.de (Mail Delivery System)
+Subject: Delayed Mail (still being retried)
+To: zope-admin@zope.org
+MIME-Version: 1.0
+Content-Type: multipart/report; report-type=delivery-status;
+ boundary="A216D2D16B.1002185128/mate.bln.innominate.de"
+Message-Id: <20011004084528.27AD62CB3A@mate.bln.innominate.de>
+Sender: zope-owner@zope.org
+Errors-To: zope-owner@zope.org
+X-BeenThere: zope@zope.org
+X-Mailman-Version: 2.0.6 (101270)
+Precedence: bulk
+List-Help: <mailto:zope-request@zope.org?subject=help>
+List-Post: <mailto:zope@zope.org>
+List-Subscribe: <http://lists.zope.org/mailman/listinfo/zope>,
+ <mailto:zope-request@zope.org?subject=subscribe>
+List-Id: Users of the Z Object Publishing Environment <zope.zope.org>
+List-Unsubscribe: <http://lists.zope.org/mailman/listinfo/zope>,
+ <mailto:zope-request@zope.org?subject=unsubscribe>
+List-Archive: <http://lists.zope.org/pipermail/zope/>
+
+This is a MIME-encapsulated message.
+
+--A216D2D16B.1002185128/mate.bln.innominate.de
+Content-Description: Notification
+Content-Type: text/plain
+
+This is the Postfix program at host mate.bln.innominate.de.
+
+####################################################################
+# THIS IS A WARNING ONLY. YOU DO NOT NEED TO RESEND YOUR MESSAGE. #
+####################################################################
+
+Your message could not be delivered for 0.2 hours.
+It will be retried until it is 5.0 days old.
+
+For further assistance, please send mail to <postmaster>
+
+ The Postfix program
+
+<news-list.zope@localhost.bln.innominate.de>: temporary failure. Command
+ output: avpcheck: unable to connect to avp daemon: Connection refused
+
+--A216D2D16B.1002185128/mate.bln.innominate.de
+Content-Description: Delivery error report
+Content-Type: message/delivery-status
+
+Reporting-MTA: dns; mate.bln.innominate.de
+Arrival-Date: Thu, 4 Oct 2001 10:20:46 +0200 (CEST)
+
+Final-Recipient: rfc822; news-list.zope@localhost.bln.innominate.de
+Action: delayed
+Status: 4.0.0
+Diagnostic-Code: X-Postfix; temporary failure. Command output: avpcheck: unable
+ to connect to avp daemon: Connection refused
+Will-Retry-Until: Tue, 9 Oct 2001 10:20:46 +0200 (CEST)
+
+--A216D2D16B.1002185128/mate.bln.innominate.de
+Content-Description: Undelivered Message Headers
+Content-Type: text/rfc822-headers
+
+Received: from daswort.innominate.com (daswort.innominate.com [212.84.234.29])
+ by mate.bln.innominate.de (Postfix) with ESMTP id A216D2D16B
+ for <news-list.zope@innominate.de>; Thu, 4 Oct 2001 10:20:46 +0200 (CEST)
+Received: from mail.python.org (mail.python.org [63.102.49.29])
+ by daswort.innominate.com (Postfix) with ESMTP id 8106A284DD
+ for <news-list.zope@innominate.de>; Thu, 4 Oct 2001 04:42:06 +0000 (GMT)
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 15ozMj-000236-00; Wed, 03 Oct 2001 23:40:05 -0400
+Received: from [65.32.1.43] (helo=smtp-server6.tampabay.rr.com)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 15ozMQ-00021c-00
+ for zope@zope.org; Wed, 03 Oct 2001 23:39:46 -0400
+Received: from tlc2 (242850hfc162.tampabay.rr.com [24.28.50.162])
+ by smtp-server6.tampabay.rr.com (8.11.2/8.11.2) with SMTP id f943dcd28305;
+ Wed, 3 Oct 2001 23:39:42 -0400 (EDT)
+From: "Trevor Toenjes" <zope@toenjes.com>
+To: "Martijn Pieters" <mj@zope.com>,
+ "Trevor Toenjes" <zope@toenjes.com>
+Cc: <zope@zope.org>
+Subject: RE: [Zope] what is error_message and how do I alter it??
+Message-ID: <NEBBLDPBKLOKNHPAEECGAENDCIAA.zope@toenjes.com>
+MIME-Version: 1.0
+Content-Type: text/plain;
+ charset="iso-8859-1"
+Content-Transfer-Encoding: 7bit
+X-Priority: 3 (Normal)
+X-MSMail-Priority: Normal
+X-Mailer: Microsoft Outlook IMO, Build 9.0.2416 (9.0.2910.0)
+Importance: Normal
+X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2314.1300
+In-Reply-To: <20011003223154.D27261@zope.com>
+Sender: zope-admin@zope.org
+Errors-To: zope-admin@zope.org
+X-BeenThere: zope@zope.org
+X-Mailman-Version: 2.0.6 (101270)
+Precedence: bulk
+List-Help: <mailto:zope-request@zope.org?subject=help>
+List-Post: <mailto:zope@zope.org>
+List-Subscribe: <http://lists.zope.org/mailman/listinfo/zope>,
+ <mailto:zope-request@zope.org?subject=subscribe>
+List-Id: Users of the Z Object Publishing Environment <zope.zope.org>
+List-Unsubscribe: <http://lists.zope.org/mailman/listinfo/zope>,
+ <mailto:zope-request@zope.org?subject=unsubscribe>
+List-Archive: <http://lists.zope.org/pipermail/zope/>
+Date: Wed, 3 Oct 2001 23:41:18 -0400
+
+--A216D2D16B.1002185128/mate.bln.innominate.de--
+
diff --git a/tests/bounces/dsn_09.txt b/tests/bounces/dsn_09.txt
new file mode 100644
index 00000000..c24fc14d
--- /dev/null
+++ b/tests/bounces/dsn_09.txt
@@ -0,0 +1,89 @@
+Received: by main.nlenet.net (mbox bob)
+ (with Cubic Circle's cucipop (v1.31 1998/05/13) Sun Nov 4 02:46:01 2001)
+X-From_: postmaster@btconnect.com Sun Nov 4 02:45:50 2001
+>From bob Sun Nov 4 02:45:50 2001
+Return-Path: <postmaster@btconnect.com>
+Delivered-To: bob@nlenet.net
+Received: from c2bapps1.btconnect.com (c2bapps1.btconnect.com [193.113.209.21])
+ by main.nlenet.net (Postfix) with SMTP id ED8D113D126
+ for <bob@nleaudio.com>; Sun, 4 Nov 2001 02:45:49 -0500 (EST)
+Received: from btconnect.com by c2bapps1.btconnect.com id <g.02673-0@c2bapps1.btconnect.com>; Sun, 4 Nov 2001 07:45:32 +0000
+Message-Type: Delivery Report
+X400-Received: by /ADMD= /C=WW/; Relayed; Sun, 4 Nov 2001 07:45:31 +0000
+X400-Received: by mta c2bapps1-hme1 in /ADMD= /C=WW/; Relayed; Sun, 4 Nov 2001 07:45:31 +0000
+X400-MTS-Identifier: [/ADMD= /C=WW/;c2bapps1.b:026710:20011104074531]
+From: postmaster@btconnect.com
+To: bob@nleaudio.com
+Subject: Delivery Report (failure) for pr@allen-heath.com
+Date: Sun, 4 Nov 2001 07:45:32 +0000
+Message-ID: <"c2bapps1.b:026710:20011104074531"@btconnect.com>
+Content-Identifier: test
+MIME-Version: 1.0
+Content-Type: multipart/report; boundary="---Multi-Part-Report-Level-1-1-2672"
+X-Mozilla-Status: 8001
+X-Mozilla-Status2: 00000000
+X-UIDL: 34456246710d0000
+
+
+-----Multi-Part-Report-Level-1-1-2672
+
+This report relates to your message:
+Subject: test,
+ Message-ID: <3BE4F1EC.8306C281@nleaudio.com>,
+ To: pr@allen-heath.com
+
+of Sun, 4 Nov 2001 07:45:31 +0000
+
+Your message was not delivered to:
+ pr@allen-heath.com
+for the following reason:
+Diagnostic was Unable to transfer, -1
+Information MTA '62.6.150.133' gives error message 5.7.1 Unable to relay for pr@allen-heath.com
+
+The Original Message follows:
+
+-----Multi-Part-Report-Level-1-1-2672
+Content-Type: message/delivery-status
+
+Reporting-MTA: x400; mta c2bapps1-hme1 in /ADMD= /C=WW/
+Arrival-Date: Sun, 4 Nov 2001 07:45:00 +0000
+DSN-Gateway: dns; c2bapps1.btconnect.com
+X400-Conversion-Date: Sun, 4 Nov 2001 07:45:32 +0000
+Original-Envelope-Id: [/ADMD= /C=WW/;<3BE4F1EC.8306C281@nleaudio.com>]
+X400-Content-Identifier: test
+X400-Encoded-Info: ia5-text
+X400-Content-Correlator: Subject: test,
+ Message-ID: <3BE4F1EC.8306C281@nleaudio.com>,
+ To: pr@allen-heath.com
+
+Original-Recipient: rfc822; pr@allen-heath.com
+Final-Recipient: x400; /RFC-822=pr(a)allen-heath.com/ADMD= /C=WW/
+X400-Originally-Specified-Recipient-Number: 1
+Action: failed
+Diagnostic-Code: Reason 1 (Unable-To-Transfer); Diagnostic -1 (Unknown)
+Status: 5.0.0
+X400-Supplementary-Info: "MTA '62.6.150.133' gives error message 5.7.1 Unable to relay for pr(a)allen-heath.com"
+X400-Last-Trace: Sun, 4 Nov 2001 07:45:00 +0000
+
+-----Multi-Part-Report-Level-1-1-2672
+Content-Type: message/rfc822
+
+Received: from ns.nlenet.net by c2bapps1 with SMTP (XT-PP); Sun, 4 Nov 2001 07:45:00 +0000
+Received: from nleaudio.com (66-133-142-213.roc.frontiernet.net [66.133.142.213])
+ by ns.nlenet.net (Postfix) with ESMTP id E354A770C
+ for <pr@allen-heath.com>; Sun, 4 Nov 2001 02:44:57 -0500 (EST)
+Message-ID: <3BE4F1EC.8306C281@nleaudio.com>
+Date: Sun, 04 Nov 2001 02:44:44 -0500
+From: "Bob Puff@NLE" <bob@nleaudio.com>
+X-Mailer: Mozilla 4.78 [en] (Win95; U)
+X-Accept-Language: en
+MIME-Version: 1.0
+To: pr@allen-heath.com
+Subject: test
+Content-Type: text/plain; charset=us-ascii
+Content-Transfer-Encoding: 7bit
+
+test, please disregard.
+
+-----Multi-Part-Report-Level-1-1-2672--
+
diff --git a/tests/bounces/dsn_10.txt b/tests/bounces/dsn_10.txt
new file mode 100644
index 00000000..d37aa174
--- /dev/null
+++ b/tests/bounces/dsn_10.txt
@@ -0,0 +1,66 @@
+Return-Path: <>
+From: MAILER-DAEMON@example.com (Mail Delivery System)
+Message-ID: <20021021152058.7A58560E24@brainy.example.com>
+MIME-Version: 1.0
+Content-Type: multipart/report; report-type=delivery-status;
+ boundary="AA0C160E1D.1035213658/brainy.example.com"
+Content-Transfer-Encoding: 8bit
+Subject: Undelivered Mail Returned to Sender
+Date: 21 Oct 2002 15:20:58 GMT
+To: somelist-bounces@listi.example.com
+
+This is a MIME-encapsulated message.
+
+--AA0C160E1D.1035213658/brainy.example.com
+Content-Description: Notification
+Content-Type: text/plain
+
+This is the Postfix program at host brainy.example.com.
+
+I'm sorry to have to inform you that the message returned
+below could not be delivered to one or more destinations.
+
+For further assistance, please send mail to <postmaster>
+
+If you do so, please include this problem report. You can
+delete your own text from the message returned below.
+
+ The Postfix program
+
+<anne.person@dom.ain>: host mx.dom.ain[192.168.1.100] said: 550 {mx001-rz3}
+ <anne.person@dom.ain>... User unknown or not available - Empfaenger
+ unbekannt oder nicht erreichbar (in reply to RCPT TO command)
+
+--AA0C160E1D.1035213658/brainy.example.com
+Content-Description: Delivery error report
+Content-Type: message/delivery-status
+
+Reporting-MTA: dns; brainy.example.com
+Arrival-Date: Mon, 21 Oct 2002 17:20:56 +0200 (CEST)
+
+Final-Recipient: rfc822; anne.person@dom.ain
+Action: failed
+Status: 5.0.0
+Diagnostic-Code: X-Postfix; host mx.dom.ain[192.168.1.100] said: 550
+ {mx001-rz3} <anne.person@dom.ain>... User unknown or not available -
+ Empfaenger unbekannt oder nicht erreichbar (in reply to RCPT TO command)
+
+--AA0C160E1D.1035213658/brainy.example.com
+Content-Description: Undelivered Message
+Content-Type: message/rfc822
+Content-Transfer-Encoding: 8bit
+
+From: b.a.dude@example.com (Peer Heinlein)
+Message-ID: <200210211625.12753.b.a.dude@example.com>
+X-Gateway: ZCONNECT UU example.com [DUUCP vom 25.09.2000], RFC1036/822 UU
+ example.com [DUUCP vom 25.09.2000]
+MIME-Version: 1.0
+Content-Type: text/plain; charset=iso-8859-1
+Content-Transfer-Encoding: 8bit
+Subject: [lb] Probleme =?iso-8859-15?q?gel=F6st?=, Bugs gefunden
+Date: 21 Oct 2002 14:25:12 GMT
+To: people@example.com
+
+A message about stuff.
+
+--AA0C160E1D.1035213658/brainy.example.com--
diff --git a/tests/bounces/dsn_11.txt b/tests/bounces/dsn_11.txt
new file mode 100644
index 00000000..f3e8acaa
--- /dev/null
+++ b/tests/bounces/dsn_11.txt
@@ -0,0 +1,176 @@
+Date: Sat, 26 Oct 2002 22:00:26 +0900 (JST)
+From: Mail Delivery Subsystem <MAILER-DAEMON@example.com>
+Message-Id: <200210261300.WAA27079@example.com>
+To: <mailman-developers-bounces@python.org>
+MIME-Version: 1.0
+Content-Type: multipart/report; report-type=delivery-status;
+ boundary="WAA27079.1035637226/example.com"
+Subject: Returned mail: User unknown
+Auto-Submitted: auto-generated (failure)
+X-Scanned-By: MIMEDefang 2.16 (www . roaringpenguin . com / mimedefang)
+X-Spam-Status: No, hits=-4.0 required=5.0
+ tests=ATTACH_DS,FAILURE_NOTICE_1,FAILURE_NOTICE_2,FROM_MAILER_DAEMON,MAILER_DAEMON,RCVD_IN_RFCI,SPAM_PHRASE_00_01
+X-Spam-Level:
+
+This is a MIME-encapsulated message
+
+--WAA27079.1035637226/example.com
+
+The original message was received at Sat, 26 Oct 2002 22:00:24 +0900 (JST)
+from mailhub-nyc3-hme0.ny.ssmb.com [162.124.148.17]
+
+ ----- The following addresses had permanent fatal errors -----
+<joem@example.com>
+joem@example.com
+ (expanded from: <joem@example.com>)
+joem@example.com
+ (expanded from: joem@example.com)
+joem@example.com
+ (expanded from: joem@example.com)
+joem@example.com
+ (expanded from: joem@example.com)
+joem@example.com
+ (expanded from: joem@example.com)
+joem@example.com
+ (expanded from: joem@example.com)
+joem@example.com
+ (expanded from: joem@example.com)
+joem@example.com
+ (expanded from: joem@example.com)
+joem@example.com
+ (expanded from: joem@example.com)
+joem@example.com
+ (expanded from: joem@example.com)
+
+ ----- Transcript of session follows -----
+554 joem@example.com... aliasing/forwarding loop broken (11 aliases deep; 10 max)
+550 joem@example.com... User unknown
+550 joem@example.com... User unknown
+550 joem@example.com... User unknown
+550 joem@example.com... User unknown
+550 joem@example.com... User unknown
+550 joem@example.com... User unknown
+550 joem@example.com... User unknown
+550 joem@example.com... User unknown
+550 joem@example.com... User unknown
+550 joem@example.com... User unknown
+550 <joem@example.com>... User unknown
+
+--WAA27079.1035637226/example.com
+Content-Type: message/delivery-status
+
+Reporting-MTA: dns; example.com
+Received-From-MTA: DNS; mailhub-nyc3-hme0.ny.ssmb.com
+Arrival-Date: Sat, 26 Oct 2002 22:00:24 +0900 (JST)
+
+Final-Recipient: RFC822; <joem@example.com>
+Action: failed
+Status: 5.1.1
+Last-Attempt-Date: Sat, 26 Oct 2002 22:00:26 +0900 (JST)
+
+Final-Recipient: RFC822; <joem@example.com>
+X-Actual-Recipient: RFC822; joem@example.com
+Action: failed
+Status: 5.1.1
+Last-Attempt-Date: Sat, 26 Oct 2002 22:00:26 +0900 (JST)
+
+Final-Recipient: RFC822; <joem@example.com>
+X-Actual-Recipient: RFC822; joem@example.com
+Action: failed
+Status: 5.1.1
+Last-Attempt-Date: Sat, 26 Oct 2002 22:00:26 +0900 (JST)
+
+Final-Recipient: RFC822; <joem@example.com>
+X-Actual-Recipient: RFC822; joem@example.com
+Action: failed
+Status: 5.1.1
+Last-Attempt-Date: Sat, 26 Oct 2002 22:00:26 +0900 (JST)
+
+Final-Recipient: RFC822; <joem@example.com>
+X-Actual-Recipient: RFC822; joem@example.com
+Action: failed
+Status: 5.1.1
+Last-Attempt-Date: Sat, 26 Oct 2002 22:00:26 +0900 (JST)
+
+Final-Recipient: RFC822; <joem@example.com>
+X-Actual-Recipient: RFC822; joem@example.com
+Action: failed
+Status: 5.1.1
+Last-Attempt-Date: Sat, 26 Oct 2002 22:00:26 +0900 (JST)
+
+Final-Recipient: RFC822; <joem@example.com>
+X-Actual-Recipient: RFC822; joem@example.com
+Action: failed
+Status: 5.1.1
+Last-Attempt-Date: Sat, 26 Oct 2002 22:00:26 +0900 (JST)
+
+Final-Recipient: RFC822; <joem@example.com>
+X-Actual-Recipient: RFC822; joem@example.com
+Action: failed
+Status: 5.1.1
+Last-Attempt-Date: Sat, 26 Oct 2002 22:00:26 +0900 (JST)
+
+Final-Recipient: RFC822; <joem@example.com>
+X-Actual-Recipient: RFC822; joem@example.com
+Action: failed
+Status: 5.1.1
+Last-Attempt-Date: Sat, 26 Oct 2002 22:00:26 +0900 (JST)
+
+Final-Recipient: RFC822; <joem@example.com>
+X-Actual-Recipient: RFC822; joem@example.com
+Action: failed
+Status: 5.1.1
+Last-Attempt-Date: Sat, 26 Oct 2002 22:00:26 +0900 (JST)
+
+Final-Recipient: RFC822; <joem@example.com>
+X-Actual-Recipient: RFC822; joem@example.com
+Action: failed
+Status: 5.1.1
+Last-Attempt-Date: Sat, 26 Oct 2002 22:00:26 +0900 (JST)
+
+--WAA27079.1035637226/example.com
+Content-Type: text/rfc822-headers
+
+Return-Path: <mailman-developers-bounces@python.org>
+Received: from mailhub-nyc3.ny.ssmb.com (mailhub-nyc3-hme0.ny.ssmb.com [162.124.148.17])
+ by example.com (8.8.8+Sun/8.8.8) with ESMTP id WAA27077
+ for <joem@example.com>; Sat, 26 Oct 2002 22:00:24 +0900 (JST)
+Received: from imbarc-nj01.nj.ssmb.com (imbarc-nj01-1.nj.ssmb.com [150.110.115.169])
+ by mailhub-nyc3.ny.ssmb.com (8.9.3/8.9.3/SSMB-HUB) with ESMTP id JAA01226
+ for <joem@example.com>; Sat, 26 Oct 2002 09:00:23 -0400 (EDT)
+Received: from imbavirus-nj02.nj.ssmb.com (imbavirus-nj02-1.nj.ssmb.com [150.110.235.232])
+ by imbarc-nj01.nj.ssmb.com (8.12.4/8.12.4/SSMB_QQQ_IN/1.1) with ESMTP id g9QD0ZtR020988
+ for <joem@example.com>; Sat, 26 Oct 2002 09:00:35 -0400 (EDT)
+Received: (from uucp@localhost)
+ by imbavirus-nj02.nj.ssmb.com (8.11.0/8.11.0/SSMB_AV/1.1) id g9QD0GF15020
+ for <joem@example.com>; Sat, 26 Oct 2002 09:00:16 -0400 (EDT)
+Received: from nodnsquery(199.67.177.248) by imbavirus-nj02.nj.ssmb.com via csmap (V4.1)
+ id srcAAA5gaqvD; Sat, 26 Oct 02 09:00:15 -0400
+Received: from mail.python.org (mail.python.org [12.155.117.29])
+ by imbaspam-nj04.iplex.ssmb.com (8.12.5/8.12.5/SSMB_EXT/evision: 1.13 $) with ESMTP id g9QD0FnI008045
+ for <joem@example.com>; Sat, 26 Oct 2002 09:00:15 -0400 (EDT)
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 4.05)
+ id 185QXq-0004y2-00
+ for joem@example.com; Sat, 26 Oct 2002 09:00:02 -0400
+MIME-Version: 1.0
+Content-Type: text/plain; charset="us-ascii"
+Content-Transfer-Encoding: 7bit
+From: mailman-developers-request@python.org
+To: joem@example.com
+Subject: confirm e70bc3961da9f415027185c8634596f7b226815a
+Message-ID: <mailman.0.1035637201.19036.mailman-developers@python.org>
+Date: Sat, 26 Oct 2002 09:00:01 -0400
+Precedence: bulk
+X-BeenThere: mailman-developers@python.org
+X-Mailman-Version: 2.1b4
+X-List-Administrivia: yes
+List-Id: GNU Mailman developers <mailman-developers.python.org>
+Sender: mailman-developers-bounces@python.org
+Errors-To: mailman-developers-bounces@python.org
+X-Spam-Score: -1.1 () NO_REAL_NAME
+X-Scanned-By: MIMEDefang 2.16 (www . roaringpenguin . com / mimedefang)
+
+--WAA27079.1035637226/example.com--
+
+
diff --git a/tests/bounces/dumbass_01.txt b/tests/bounces/dumbass_01.txt
new file mode 100644
index 00000000..c4e40d4b
--- /dev/null
+++ b/tests/bounces/dumbass_01.txt
@@ -0,0 +1,109 @@
+From VM Tue Dec 26 22:41:02 2000
+Return-Path: <python-list-admin@python.org>
+Received: from ns2.digicool.com ([216.164.72.2] verified)
+ by digicool.com (CommuniGate Pro SMTP 3.3.1)
+ with ESMTP id 400019 for xxxxx@mail.digicool.com; Tue, 26 Dec 2000 18:02:35 -0500
+Received: from mail.python.org (starship.python.net [63.102.49.30])
+ by ns2.digicool.com (8.9.3/8.9.3) with ESMTP id SAA02602
+ for <xxxxx@digicool.com>; Tue, 26 Dec 2000 18:02:28 -0500
+Received: from ns1.zope.org (localhost.localdomain [127.0.0.1])
+ by mail.python.org (Postfix) with ESMTP id 9D20DE71C
+ for <xxxxx@digicool.com>; Tue, 26 Dec 2000 12:47:01 -0500 (EST)
+Delivered-To: mm+python-list-admin@python.org
+Received: from mail1.microsoft.com (mail1.microsoft.com [131.107.3.125])
+ by mail.python.org (Postfix) with SMTP id 23085E950
+ for <python-list-admin@python.org>; Tue, 26 Dec 2000 12:46:03 -0500 (EST)
+Received: from 157.54.9.101 by mail1.microsoft.com (InterScan E-Mail VirusWall NT); Tue, 26 Dec 2000 09:43:37 -0800 (Pacific Standard Time)
+Received: from inet-imc-01.redmond.corp.microsoft.com ([157.54.9.101]) by inet-imc-01.redmond.corp.microsoft.com with Microsoft SMTPSVC(5.0.2195.1600);
+ Tue, 26 Dec 2000 09:44:45 -0800
+Received: from mail1.microsoft.com ([157.54.7.20]) by inet-imc-01.redmond.corp.microsoft.com with Microsoft SMTPSVC(5.0.2195.1600);
+ Tue, 26 Dec 2000 09:44:44 -0800
+MIME-Version: 1.0
+Content-Type: multipart/mixed;
+ boundary="------------InterScan_NT_MIME_Boundary"
+Message-ID: <INET-IMC-01r6j6TKAB0000313a@inet-imc-01.redmond.corp.microsoft.com>
+Errors-To: python-list-owner@python.org
+Precedence: bulk
+List-Help: <mailto:python-list-request@python.org?subject=help>
+List-Post: <mailto:python-list@python.org>
+List-Subscribe: <http://www.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=subscribe>
+List-Id: General discussion list for the Python programming language <python-list.python.org>
+List-Unsubscribe: <http://www.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=unsubscribe>
+List-Archive: <http://www.python.org/pipermail/python-list/>
+From: inetgw1@microsoft.com
+Sender: python-list-owner@python.org
+To: <python-list-admin@python.org>
+Subject: Mail could not be delivered
+Date: 26 Dec 2000 09:44:44 -0800
+X-OriginalArrivalTime: 26 Dec 2000 17:44:44.0596 (UTC) FILETIME=[8852FF40:01C06F63]
+X-BeenThere: python-list@python.org
+X-Mailman-Version: 2.0
+
+
+--------------InterScan_NT_MIME_Boundary
+Content-type: text/plain
+
+****** Message from InterScan E-Mail VirusWall NT ******
+
+The following mail could not be delivered.
+Reason: Exceeded Maximum Delivery Attempts. Verify that the recipient address is correct.
+
+***************** End of message ***************
+
+--------------InterScan_NT_MIME_Boundary
+Content-type: message/rfc822
+
+Received: from 63.102.49.30 by mail1.microsoft.com (InterScan E-Mail VirusWall NT); Mon, 25 Dec 2000 08:40:09 -0800 (Pacific Standard Time)
+Received: from ns1.zope.org (localhost.localdomain [127.0.0.1])
+ by mail.python.org (Postfix) with ESMTP
+ id 80C4BE86C; Mon, 25 Dec 2000 11:41:09 -0500 (EST)
+Path: news.baymountain.net!uunet!ash.uu.net!news.netins.net!news-spur1.maxwell.syr.edu!news.maxwell.syr.edu!howland.erols.net!panix!news.panix.com!panix2.panix.com!not-for-mail
+From: aahz@panix.com (Aahz Maruch)
+Newsgroups: comp.lang.python
+Subject: Season's greetings (was Re: Some Python 2.1 ideas)
+Organization: The Cat & Dragon
+Lines: 13
+Message-ID: <927suu$r5l$1@panix2.panix.com>
+References: <925tl301ub0@news1.newsguy.com> <mailman.977688488.25438.python-list@python.org> <20001225150250.6FA06A84F@darjeeling.zadka.site.co.il> <mailman.977760789.10224.python-list@python.org>
+NNTP-Posting-Host: panix2.panix.com
+X-Trace: news.panix.com 977762079 17648 166.84.0.227 (25 Dec 2000 16:34:39 GMT)
+X-Complaints-To: abuse@panix.com
+NNTP-Posting-Date: 25 Dec 2000 16:34:39 GMT
+Xref: news.baymountain.net comp.lang.python:81985
+To: python-list@python.org
+Sender: python-list-admin@python.org
+Errors-To: python-list-admin@python.org
+X-BeenThere: python-list@python.org
+X-Mailman-Version: 2.0
+Precedence: bulk
+List-Help: <mailto:python-list-request@python.org?subject=help>
+List-Post: <mailto:python-list@python.org>
+List-Subscribe: <http://www.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=subscribe>
+List-Id: General discussion list for the Python programming language <python-list.python.org>
+List-Unsubscribe: <http://www.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=unsubscribe>
+List-Archive: <http://www.python.org/pipermail/python-list/>
+Date: 25 Dec 2000 08:34:38 -0800
+
+In article <mailman.977760789.10224.python-list@python.org>,
+Bob Alexander <bobalex@home.com> wrote:
+>
+>P.S. Merry Christmas!
+
+Bah, humbug.
+--
+ --- Aahz (Copyright 2000 by aahz@pobox.com)
+
+Androgynous poly kinky vanilla queer het <*> http://www.rahul.net/aahz/
+Hugs and backrubs -- I break Rule 6
+
+'"Crisp" is a good quality for crackers; less so for pot roast.' --pnh
+--
+http://www.python.org/mailman/listinfo/python-list
+
+--------------InterScan_NT_MIME_Boundary--
+
+
diff --git a/tests/bounces/exim_01.txt b/tests/bounces/exim_01.txt
new file mode 100644
index 00000000..42ceb0b0
--- /dev/null
+++ b/tests/bounces/exim_01.txt
@@ -0,0 +1,58 @@
+Received: from localhost (k298r.balpol.tudelft.nl) [127.0.0.1]
+ by stereo.rotzorg.org with esmtp (Exim 2.05 #1 (Debian))
+ id 11SrFm-000595-00; Mon, 20 Sep 1999 02:24:22 +0200
+Received: from mail by stereo.rotzorg.org with local (Exim 2.05 #1 (Debian))
+ id 11SrFM-00058o-00; Mon, 20 Sep 1999 02:23:56 +0200
+X-Failed-Recipients: delangen@its.tudelft.nl
+From: Mail Delivery System <Mailer-Daemon@rotzorg.org>
+To: lanparty-helden-admin@rotzorg.org
+Subject: Mail delivery failed: returning message to sender
+Message-Id: <E11SrFM-00058o-00@stereo.rotzorg.org>
+Date: Mon, 20 Sep 1999 02:23:56 +0200
+Status: RO
+Content-Length: 1544
+Lines: 42
+
+This message was created automatically by mail delivery software.
+
+A message that you sent could not be delivered to all of its recipients. The
+following address(es) failed:
+
+ delangen@its.tudelft.nl:
+ SMTP error from remote mailer after RCPT TO:
+ <delangen@its.tudelft.nl>:
+ host mailhost1.et.tudelft.nl [130.161.33.163]:
+ 553 5.1.1 unknown or illegal user:
+ delangen@its.tudelft.nl
+
+----- This is a copy of the message, including all the headers. ------
+
+Return-path: <lanparty-helden-admin@rotzorg.org>
+Received: from localhost (k298r.balpol.tudelft.nl) [127.0.0.1]
+ by stereo.rotzorg.org with esmtp (Exim 2.05 #1 (Debian))
+ id 11SrFJ-00058j-00; Mon, 20 Sep 1999 02:23:53 +0200
+Received: from sgr by stereo.rotzorg.org with local (Exim 2.05 #1 (Debian))
+ id 11SrEp-00058U-00; Mon, 20 Sep 1999 02:23:23 +0200
+Date: Mon, 20 Sep 1999 02:23:22 +0200
+From: Sendy <sgr@rotzorg.org>
+To: lanparty-helden@rotzorg.org
+Message-ID: <19990920022322.A19735@stereo.rotzorg.org>
+Reply-To: sendy@dds.nl
+Mime-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+X-Mailer: Mutt 0.95.3i
+Subject: [Lanparty-helden] test
+Sender: lanparty-helden-admin@rotzorg.org
+Errors-To: lanparty-helden-admin@rotzorg.org
+X-Mailman-Version: 1.0rc2
+Precedence: bulk
+List-Id: Mailinglist voor de KB Lanparty organisatoren <lanparty-helden.rotzorg.
+org>
+X-BeenThere: lanparty-helden@rotzorg.org
+
+
+
+_______________________________________________
+Lanparty-helden mailing list - Lanparty-helden@rotzorg.org
+http://rotzorg.org/mailman/listinfo/lanparty-helden
+
diff --git a/tests/bounces/groupwise_01.txt b/tests/bounces/groupwise_01.txt
new file mode 100644
index 00000000..68101ba0
--- /dev/null
+++ b/tests/bounces/groupwise_01.txt
@@ -0,0 +1,151 @@
+From VM Fri Jul 20 14:14:47 2001
+X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
+ [nil "Friday" "20" "July" "2001" "11:09:00" "-0700" "System Administrator" "postmaster@mainex1.asu.edu" nil "93" "Undeliverable: [Mailman-Users] [ alexandria-Bugs-442987 ] mailman bug" "^From:" "mailman-users-admin@python.org" "mailman-users-admin@python.org" "7" nil nil nil nil nil]
+ nil)
+Return-Path: <mailman-users-admin@python.org>
+Delivered-To: barry@wooz.org
+Received: from digicool.com (unknown [63.100.190.15])
+ by mail.wooz.org (Postfix) with ESMTP id 2193BD35F0
+ for <barry@wooz.org>; Fri, 20 Jul 2001 14:11:42 -0400 (EDT)
+Received: from <mailman-users-admin@python.org>
+ by digicool.com (CommuniGate Pro RULES 3.4)
+ with RULES id 2267275; Fri, 20 Jul 2001 14:11:10 -0400
+Received: from ns2.digicool.com ([63.100.190.2] verified)
+ by digicool.com (CommuniGate Pro SMTP 3.4)
+ with ESMTP id 2267274 for barry@mail.digicool.com; Fri, 20 Jul 2001 14:11:10 -0400
+Received: from mail.python.org (mail.python.org [63.102.49.29])
+ by ns2.digicool.com (8.9.3/8.9.3) with ESMTP id OAA18755
+ for <barry@digicool.com>; Fri, 20 Jul 2001 14:11:40 -0400
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 15NekX-00065F-00; Fri, 20 Jul 2001 14:11:41 -0400
+Received: from [129.219.110.73] (helo=post2.inre.asu.edu)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 15Nejg-0005zp-00
+ for mailman-users-admin@python.org; Fri, 20 Jul 2001 14:10:48 -0400
+Received: from conversion.post2.inre.asu.edu by asu.edu (PMDF V6.0-24 #47347)
+ id <0GGS00E01AF3DP@asu.edu> for mailman-users-admin@python.org; Fri,
+ 20 Jul 2001 11:09:03 -0700 (MST)
+Received: from mainex1.asu.edu (mainex1.asu.edu [129.219.10.200])
+ by asu.edu (PMDF V6.0-24 #47347) with ESMTP id <0GGS00E5WAF396@asu.edu> for
+ mailman-users-admin@python.org; Fri, 20 Jul 2001 11:09:03 -0700 (MST)
+Received: by mainex1.asu.edu with Internet Mail Service (5.5.2653.19)
+ id <3MQDQNK7>; Fri, 20 Jul 2001 11:09:02 -0700
+Message-id: <803148826976D411ADA600B0D03D6E2806F867BF@mainex1.asu.edu>
+MIME-version: 1.0
+Content-type: multipart/mixed; boundary="Boundary_(ID_T1d1xFzw5I4c8zjm3AkzoA)"
+Precedence: bulk
+List-Help: <mailto:mailman-users-request@python.org?subject=help>
+List-Post: <mailto:mailman-users@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=subscribe>
+List-Id: Mailman mailing list management users <mailman-users.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/mailman-users/>
+From: System Administrator <postmaster@mainex1.asu.edu>
+Sender: mailman-users-owner@python.org
+To: mailman-users-admin@python.org
+Subject: Undeliverable: [Mailman-Users] [ alexandria-Bugs-442987 ] mailman bug
+Date: Fri, 20 Jul 2001 11:09:00 -0700
+X-Autogenerated: Mirror
+X-Mirrored-by: <mailman-users-admin@python.org>
+X-Mailer: Internet Mail Service (5.5.2653.19)
+X-MS-Embedded-Report:
+X-BeenThere: mailman-users@python.org
+X-Mailman-Version: 2.0.5 (101270)
+
+This message is in MIME format. Since your mail reader does not understand
+this format, some or all of this message may not be legible.
+
+--Boundary_(ID_T1d1xFzw5I4c8zjm3AkzoA)
+Content-type: text/plain
+
+Your message
+
+ To: mailman-users@python.org
+ Subject: [Mailman-Users] [ alexandria-Bugs-442987 ] mailman bug
+ Sent: Fri, 20 Jul 2001 08:53:08 -0700
+
+did not reach the following recipient(s):
+
+thoff@MAINEX1.ASU.EDU on Fri, 20 Jul 2001 11:08:59 -0700
+ The recipient name is not recognized
+ The MTS-ID of the original message is: c=us;a= ;p=arizona state
+un;l=MAINEX101072018083MQDQNKX
+ MSEXCH:IMS:Arizona State University:MAIN:MAINEX1 0 (000C05A6) Unknown
+Recipient
+
+
+
+--Boundary_(ID_T1d1xFzw5I4c8zjm3AkzoA)
+Content-type: message/rfc822
+
+Date: Fri, 20 Jul 2001 08:53:08 -0700
+From: Marc MERLIN <marc@merlins.org>
+Subject: [Mailman-Users] [ alexandria-Bugs-442987 ] mailman bug
+To: mailman-users@python.org
+Message-id: <20010720085308.H17468@magic.merlins.org>
+MIME-version: 1.0
+X-Mailer: Internet Mail Service (5.5.2653.19)
+Content-type: text/plain
+X-MS-Embedded-Report:
+List-Subscribe: <http://mail.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=subscribe>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=unsubscribe>
+List-Help: <mailto:mailman-users-request@python.org?subject=help>
+
+Anyone has a clue about this error?
+
+----- Forwarded message from noreply@sourceforge.net -----
+
+To: noreply@sourceforge.net
+From: noreply@sourceforge.net
+Subject: [ alexandria-Bugs-442987 ] mailman bug
+Date: Fri, 20 Jul 2001 07:47:39 -0700
+
+Initial Comment:
+-----Forwarded Message-----
+From: rtfs-project-admin@lists.sourceforge.net
+To: rtfs-project-admin@lists.sourceforge.net
+Subject: Unexpected Mailman error
+
+
+An unexpected Mailman error has occurred in
+MailCommandHandler.ParseMailCommands(). Here is the
+traceback:
+
+Traceback (innermost last):
+ File
+"/var/local/mailman/Mailman/MailCommandHandler.py",
+line 221, in ParseMailCommands
+ self.__dispatch[cmd](args, line, msg)
+ File
+"/var/local/mailman/Mailman/MailCommandHandler.py",
+line 362, in ProcessSetCmd
+ self.ConfirmUserPassword(sender, args[2])
+ File "/var/local/mailman/Mailman/SecurityManager.py",
+line 140, in ConfirmUserPassword
+ raise Errors.MMBadUserError
+MMBadUserError
+
+----------------------------------------------------------------------
+
+----- End forwarded message -----
+
+--
+Microsoft is to operating systems & security ....
+ .... what McDonalds is to gourmet
+cooking
+
+Home page: http://marc.merlins.org/ | Finger marc_f@merlins.org for PGP
+key
+
+------------------------------------------------------
+Mailman-Users maillist - Mailman-Users@python.org
+http://mail.python.org/mailman/listinfo/mailman-users
+
+--Boundary_(ID_T1d1xFzw5I4c8zjm3AkzoA)--
+
+
diff --git a/tests/bounces/groupwise_02.txt b/tests/bounces/groupwise_02.txt
new file mode 100644
index 00000000..3abfdf86
--- /dev/null
+++ b/tests/bounces/groupwise_02.txt
@@ -0,0 +1,186 @@
+From MAILER-DAEMON Thu Jul 11 15:53:40 2002
+Envelope-to: mailman-developers-bounces@python.org
+Received: from [200.61.188.243] (helo=m3srv02)
+ by mail.python.org with esmtp (Exim 4.05)
+ id 17Sk0S-0004e9-00
+ for mailman-developers-bounces@python.org; Thu, 11 Jul 2002 15:53:40 -0400
+Received: from thedc02.thebas.com ([10.1.1.3]) by m3srv02 with Microsoft
+ SMTPSVC(5.0.2195.4905);
+ Thu, 11 Jul 2002 17:00:06 -0300
+Received: by thedc02.thebas.com with Internet Mail Service (5.5.2653.19)
+ id <NZ5X2T9R>; Thu, 11 Jul 2002 16:55:03 -0300
+Message-ID: <1E774123429CC84995E7DA78FED5F49D408FEF@thedc02.thebas.com>
+From: System Administrator <postmaster@thebas.com>
+To: mailman-developers-bounces@python.org
+Subject: Undeliverable: [Mailman-Developers] RELEASED Mailman 2.0.12
+Date: Thu, 11 Jul 2002 16:55:03 -0300
+MIME-Version: 1.0
+X-Mailer: Internet Mail Service (5.5.2653.19)
+X-MS-Embedded-Report:
+Content-Type: multipart/mixed;
+ boundary="----_=_NextPart_000_01C22914.D8CBF488"
+X-OriginalArrivalTime: 11 Jul 2002 20:00:06.0562 (UTC)
+ FILETIME=[8D8C2820:01C22915]
+
+This message is in MIME format. Since your mail reader does not understand
+this format, some or all of this message may not be legible.
+
+------_=_NextPart_000_01C22914.D8CBF488
+Content-Type: text/html;
+ charset="iso-8859-1"
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
+<HTML>
+<HEAD>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+<META NAME="Generator" CONTENT="MS Exchange Server version 5.5.2653.12">
+<TITLE>Undeliverable: [Mailman-Developers] RELEASED Mailman 2.0.12</TITLE>
+</HEAD>
+<BODY>
+
+<P><FONT SIZE=2>Your message<BR>
+<BR>
+&nbsp; To:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailman-announce@python.org<BR>
+&nbsp; Cc:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailman-developers@python.org; mailman-users@python.org<BR>
+&nbsp; Subject: [Mailman-Developers] RELEASED Mailman 2.0.12<BR>
+&nbsp; Sent:&nbsp;&nbsp;&nbsp; Thu, 11 Jul 2002 16:52:33 -0300<BR>
+<BR>
+did not reach the following recipient(s):<BR>
+<BR>
+omarmo@thebas.com on Thu, 11 Jul 2002 16:54:54 -0300<BR>
+&nbsp;&nbsp;&nbsp; The recipient name is not recognized<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The MTS-ID of the original message is: c=us;a= ;p=thebas sa;l=THEDC020207111954NZ5X2T9P<BR>
+&nbsp;&nbsp;&nbsp; MSEXCH:IMS:Thebas sa:CENTRAL:THEDC02 0 (000C05A6) Unknown Recipient<BR>
+</FONT>
+</P>
+
+<P><FONT FACE="Arial" SIZE=2 COLOR="#000000"></FONT>&nbsp;
+
+</BODY>
+</HTML>
+------_=_NextPart_000_01C22914.D8CBF488
+Content-Type: message/rfc822
+
+Message-ID: <15661.57857.753290.942668@anthem.wooz.org>
+From: barry@zope.com
+To: mailman-announce@python.org
+Cc: mailman-developers@python.org, mailman-users@python.org
+Subject: [Mailman-Developers] RELEASED Mailman 2.0.12
+Date: Thu, 11 Jul 2002 16:52:33 -0300
+MIME-Version: 1.0
+X-Mailer: Internet Mail Service (5.5.2653.19)
+X-MS-Embedded-Report:
+List-Help: <mailto:mailman-developers-request@python.org?subject=help>
+List-Subscribe: <http://mail.python.org/mailman-21/listinfo/mailman-developers>,<mailto:mailman-developers-request@python.org?subject=subscribe>
+List-Unsubscribe: <http://mail.python.org/mailman-21/listinfo/mailman-developers>,<mailto:mailman-developers-request@python.org?subject=unsubscribe>
+Content-Type: text/html;
+ charset="iso-8859-1"
+Content-Transfer-Encoding: quoted-printable
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
+<HTML>
+<HEAD>
+<META HTTP-EQUIV=3D"Content-Type" CONTENT=3D"text/html; =
+charset=3Diso-8859-1">
+<META NAME=3D"Generator" CONTENT=3D"MS Exchange Server version =
+5.5.2653.12">
+<TITLE>[Mailman-Developers] RELEASED Mailman 2.0.12</TITLE>
+</HEAD>
+<BODY>
+<BR>
+
+<P><FONT SIZE=3D2>I' released Mailman 2.0.12 which fixes a cross-site =
+scripting</FONT>
+<BR><FONT SIZE=3D2>vulnerability, among other changes.&nbsp; I =
+recommend that folks upgrade</FONT>
+<BR><FONT SIZE=3D2>their 2.0.x systems to this new version.&nbsp; See =
+below for a NEWS file</FONT>
+<BR><FONT SIZE=3D2>excerpt.</FONT>
+</P>
+
+<P><FONT SIZE=3D2>As usual, I've made both full source tarballs and =
+patches available.</FONT>
+<BR><FONT SIZE=3D2>See</FONT>
+</P>
+
+<P><FONT SIZE=3D2>&nbsp;&nbsp;&nbsp; <A =
+HREF=3D"http://sourceforge.net/project/showfiles.php?group_id=3D103" =
+TARGET=3D"_blank">http://sourceforge.net/project/showfiles.php?group_id=3D=
+103</A></FONT>
+</P>
+
+<P><FONT SIZE=3D2>for links to download all the patches and the source =
+tarball.&nbsp; If you</FONT>
+<BR><FONT SIZE=3D2>decide to install the patches, please do read the =
+release notes first:</FONT>
+</P>
+
+<P><FONT SIZE=3D2>&nbsp;&nbsp;&nbsp; <A =
+HREF=3D"http://sourceforge.net/project/shownotes.php?release_id=3D97760"=
+ =
+TARGET=3D"_blank">http://sourceforge.net/project/shownotes.php?release_i=
+d=3D97760</A></FONT>
+</P>
+
+<P><FONT SIZE=3D2>See also:</FONT>
+</P>
+
+<P><FONT SIZE=3D2>&nbsp;&nbsp;&nbsp; <A =
+HREF=3D"http://www.gnu.org/software/mailman" =
+TARGET=3D"_blank">http://www.gnu.org/software/mailman</A></FONT>
+<BR><FONT SIZE=3D2>&nbsp;&nbsp;&nbsp; <A HREF=3D"http://www.list.org" =
+TARGET=3D"_blank">http://www.list.org</A></FONT>
+<BR><FONT SIZE=3D2>&nbsp;&nbsp;&nbsp; <A HREF=3D"http://mailman.sf.net" =
+TARGET=3D"_blank">http://mailman.sf.net</A></FONT>
+</P>
+
+<P><FONT SIZE=3D2>Cheers,</FONT>
+<BR><FONT SIZE=3D2>-Barry</FONT>
+</P>
+
+<P><FONT SIZE=3D2>-------------------- snip snip =
+--------------------</FONT>
+<BR><FONT SIZE=3D2>2.0.12 (02-Jul-2002)</FONT>
+</P>
+
+<P><FONT SIZE=3D2>&nbsp;&nbsp;&nbsp; - Implemented a guard against some =
+reply loops and 'bot</FONT>
+<BR><FONT SIZE=3D2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subscription =
+attacks.&nbsp; Specifically, if a message to -request</FONT>
+<BR><FONT SIZE=3D2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; has a Precedence: =
+bulk (or list, or junk) header, the command is</FONT>
+<BR><FONT SIZE=3D2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ignored.&nbsp; =
+Well-behaved 'bots should always include such a</FONT>
+<BR><FONT SIZE=3D2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; header.</FONT>
+</P>
+
+<P><FONT SIZE=3D2>&nbsp;&nbsp;&nbsp; - Changes to the configure script =
+so that you can pass in the mail</FONT>
+<BR><FONT SIZE=3D2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; host and web host by =
+setting the environment variables MAILHOST</FONT>
+<BR><FONT SIZE=3D2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and WWWHOST =
+respectively.&nbsp; configure will also exit if it can't</FONT>
+<BR><FONT SIZE=3D2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; figure out these =
+values (usually due to broken dns).</FONT>
+</P>
+
+<P><FONT SIZE=3D2>&nbsp;&nbsp;&nbsp; - Closed another minor cross-site =
+scripting vulnerability.</FONT>
+</P>
+<BR>
+
+<P><FONT =
+SIZE=3D2>_______________________________________________</FONT>
+<BR><FONT SIZE=3D2>Mailman-Developers mailing list</FONT>
+<BR><FONT SIZE=3D2>Mailman-Developers@python.org</FONT>
+<BR><FONT SIZE=3D2><A =
+HREF=3D"http://mail.python.org/mailman-21/listinfo/mailman-developers" =
+TARGET=3D"_blank">http://mail.python.org/mailman-21/listinfo/mailman-dev=
+elopers</A></FONT>
+</P>
+
+</BODY>
+</HTML>
+------_=_NextPart_000_01C22914.D8CBF488--
+
+
diff --git a/tests/bounces/hotpop_01.txt b/tests/bounces/hotpop_01.txt
new file mode 100644
index 00000000..970c3998
--- /dev/null
+++ b/tests/bounces/hotpop_01.txt
@@ -0,0 +1,181 @@
+>From daemon Tue Nov 13 13:43:50 2001
+Return-Path: <scr-admin@socal-raves.org>
+Received: from westmail2.West.Sun.COM (westmail2.West.Sun.COM [129.153.100.30])
+ by angus.west.sun.com (8.11.4+Sun/8.11.4) with ESMTP id fADLhna07541
+ for <scr-listmaster@angus.west.sun.com>; Tue, 13 Nov 2001 13:43:49 -0800 (PST)
+Received: from pheriche.sun.com (pheriche.Central.Sun.COM [129.147.5.34])
+ by westmail2.West.Sun.COM (8.9.3+Sun/8.9.3/ENSMAIL,v2.1p1) with ESMTP id NAA21411
+ for <scr-listmaster@angus.west.sun.com>; Tue, 13 Nov 2001 13:43:49 -0800 (PST)
+Received: from babylon.socal-raves.org (ip-209-85-222-117.dreamhost.com [209.85.222.117])
+ by pheriche.sun.com (8.9.3+Sun/8.9.3) with ESMTP id OAA24699
+ for <scr-listmaster@angus.west.sun.com>; Tue, 13 Nov 2001 14:43:44 -0700 (MST)
+Received: by babylon.socal-raves.org (Postfix)
+ id 7153B51D5B; Tue, 13 Nov 2001 13:42:35 -0800 (PST)
+Delivered-To: dmick-lm@babylon.socal-raves.org
+Received: from babylon.socal-raves.org (localhost [127.0.0.1])
+ by babylon.socal-raves.org (Postfix) with ESMTP id 5E63D51B8A
+ for <listmaster@socal-raves.org>; Tue, 13 Nov 2001 13:42:35 -0800 (PST)
+Delivered-To: scr-admin@socal-raves.org
+Received: from kitkat.hotpop.com (kitkat.hotpop.com [204.57.55.30])
+ by babylon.socal-raves.org (Postfix) with ESMTP id DEC4D51B8A
+ for <scr-admin@socal-raves.org>; Tue, 13 Nov 2001 13:42:32 -0800 (PST)
+Received: from hotpop.com (unknown [204.57.55.31])
+ by kitkat.hotpop.com (Postfix) with SMTP id 53D27324D3
+ for <scr-admin@socal-raves.org>; Tue, 13 Nov 2001 21:43:27 +0000 (UTC)
+From: MAILER-DAEMON@HotPOP.com (Mail Delivery System)
+Subject: Undelivered Mail Returned to Sender
+MIME-Version: 1.0
+Content-Type: multipart/mixed;
+ boundary="------------1903.1005687801/HotPOP.com"
+Message-Id: <20011113214327.53D27324D3@kitkat.hotpop.com>
+Date: Tue, 13 Nov 2001 21:43:27 +0000 (UTC)
+To: undisclosed-recipients: ;
+Sender: scr-owner@socal-raves.org
+Errors-To: scr-owner@socal-raves.org
+X-BeenThere: scr@socal-raves.org
+X-Mailman-Version: 2.1a3+
+Precedence: bulk
+List-Help: <mailto:scr-request@socal-raves.org?subject=help>
+List-Post: <mailto:scr@socal-raves.org>
+List-Subscribe: <http://socal-raves.org/mailman/listinfo/scr>,
+ <mailto:scr-request@socal-raves.org?subject=subscribe>
+List-Id: SoCal-Raves <scr.socal-raves.org>
+List-Unsubscribe: <http://socal-raves.org/mailman/listinfo/scr>,
+ <mailto:scr-request@socal-raves.org?subject=unsubscribe>
+List-Archive: <http://socal-raves.org/mailman/private/scr/>
+Content-Length: 5470
+Status: O
+X-Status: $$$$
+X-UID: 0000014497
+
+This is a MIME-encapsulated message.
+
+--------------1903.1005687801/HotPOP.com
+Content-Description: Notification
+Content-Type: text/plain
+
+Undeliverable Address: allensmithee@hotpop.com
+
+Reason: The email you sent to the address specified
+above has been returned because the recipient is over disk quota. This
+account will not be able to receive any email until the account owner
+removes some email from the server.
+
+
+System Contact: postmaster@HotPOP.com
+
+
+Original message attached (Max 5k)
+
+--------------1903.1005687801/HotPOP.com
+Content-Description: Undelivered Message
+Content-Type: message/rfc822
+
+Received: from babylon.socal-raves.org (ip-209-85-222-117.dreamhost.com
+ [209.85.222.117])
+ by mx1.hotpop.com (Postfix) with ESMTP
+ id 3F802249091;
+ Tue, 13 Nov 2001 20:48:57 +0000 (UTC)
+Received: from babylon.socal-raves.org (localhost [127.0.0.1])
+ by babylon.socal-raves.org (Postfix) with ESMTP
+ id 62A6E51D4C; Tue, 13 Nov 2001 12:47:47 -0800 (PST)
+Delivered-To: scr-post@babylon.socal-raves.org
+Received: by babylon.socal-raves.org (Postfix, from userid 60001)
+ id D4A4551D4C; Tue, 13 Nov 2001 12:47:43 -0800 (PST)
+Delivered-To: scr@socal-raves.org
+Received: from mail24.bigmailbox.com (mail24.bigmailbox.com
+ [209.132.220.207]) by babylon.socal-raves.org (Postfix) with ESMTP id
+ 0750D51B8A for <scr@socal-raves.org>; Tue, 13 Nov 2001 12:47:43 -0800
+ (PST)
+Received: (from www@localhost) by mail24.bigmailbox.com (8.10.0/8.10.0)
+ id fADKmeG21560; Tue, 13 Nov 2001 12:48:40 -0800
+Date: Tue, 13 Nov 2001 12:48:40 -0800
+Message-Id: <200111132048.fADKmeG21560@mail24.bigmailbox.com>
+Content-Type: text/plain
+Content-Disposition: inline
+Content-Transfer-Encoding: 8bit
+X-Mailer: MIME-tools 4.104 (Entity 4.116)
+Mime-Version: 1.0
+X-Originating-Ip: [192.76.84.68]
+From: "Jim C" <globalenergymusik@housemusic.com>
+To: scr@socal-raves.org, fitrhaper@aol.com, pbrock@odin.ac.hmc.edu
+Subject: RE: Re: [scr] scary
+Sender: scr-admin@socal-raves.org
+Errors-To: scr-admin@socal-raves.org
+X-BeenThere: scr@socal-raves.org
+X-Mailman-Version: 2.1a3+
+Precedence: bulk
+List-Help: <mailto:scr-request@socal-raves.org?subject=help>
+List-Post: <mailto:scr@socal-raves.org>
+List-Subscribe: <http://socal-raves.org/mailman/listinfo/scr>,
+ <mailto:scr-request@socal-raves.org?subject=subscribe>
+List-Id: SoCal-Raves <scr.socal-raves.org>
+List-Unsubscribe: <http://socal-raves.org/mailman/listinfo/scr>,
+ <mailto:scr-request@socal-raves.org?subject=unsubscribe>
+List-Archive: <http://socal-raves.org/mailman/private/scr/>
+
+[demime could not interpret encoding binary - treating as plain text]
+Hi New to the List. Just curious. What would you have the government do instead? I see alot of passion over this topic so I assume you have an alternative to Ashcroft. These are tough times, and call for quick and concise thinking, Gov is doing its best, Do we have anything better in mind that can be implemented in a short amount of time like this is.?
+
+> FitRhapER@aol.comDate: Tue, 13 Nov 2001 00:39:20 EST
+> Re: [scr] scary pbrock@odin.ac.hmc.edu, scr@socal-raves.org
+>argh! That makes me so angry. Every time i see another people happily not
+>questioning anything and going along with the government for some idiotic
+>reason (i cant really figure out why people happily go along with things, i
+>guess just less stress or something) it just disheartens me further. Why
+>don't these people see just a bit further. I mean it's not hard to see how
+>this could be misused is it? And alot of these people wont be convinced
+>otherwise. You tell them the facts. They give you the obivious retort (the
+>one they've been spoon fed), you show them how that could be side stepped to
+>hurt the innocent, they give you another answer (usually one they thought up
+>themselves, oo how clever), you again show em how this is
+>wrong/unconstitutional/gonna fuck everything up. They give you a "yeah well,
+>the government needs to stop terrorism somehow!" kind of answer.
+>
+>grrrr. *slap* WAKE UP BITCH!!! then they ask you why your eyes are all glazed
+>over and you're smiling funny.
+>
+>peace
+>olly the limey
+>
+>> i know many mudders who think the goverenment is being perfectly
+>> reasonable and that everything about the war and the new laws is
+>> correct. one girl lives like a few doors down from me and it just cracks
+>> me up....
+>>
+>> jesus i can understand not hating everyth9ing, but being happy with every
+>> action the government is taking now just boggles my mind
+>>
+>> on an unrelated note./......
+>>
+>> i like buffy songs...yay buffy songs
+>>
+>> ,tricia
+>>
+>> AIM amphitrite27
+>>
+>> http://www.geocities.com/amphitrite27/index.html
+>>
+>> I wanted a perfect ending. Now I've learned, the hard way, that some poems
+>> don't rhyme, and some stories don't have a clear beginning, middle, and
+>> end. Life is about not knowing, having to change, taking the moment and
+>> making the best of it without knowing what's going to happen next.
+>> ~Gilda Radner
+>_______________________________________________
+>For event info, list questions, or to unsubscribe, see http://www.socal-raves.org/
+
+
+
+
+------------------------------------------------------------
+House music all night long...
+<a href="http://www.housemusic.com">http://www.housemusic.com</a>
+_______________________________________________
+For event info, list questions, or to unsubscribe, see http://www.socal-raves.org/
+
+
+
+--------------1903.1005687801/HotPOP.com--
+
+
+
diff --git a/tests/bounces/llnl_01.txt b/tests/bounces/llnl_01.txt
new file mode 100644
index 00000000..9a6de7f9
--- /dev/null
+++ b/tests/bounces/llnl_01.txt
@@ -0,0 +1,203 @@
+From VM Mon May 28 12:27:07 2001
+X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
+ [nil "Sunday" "27" "May" "2001" "14:25:17" "-0700" "Automated response from LLNL postmaster" "postmaster@llnl.gov" nil "153" "FAILED MAIL to \"trotts1\" regarding \"[ANNOUNCE] wxPython 2.3.0\"" "^From:" nil nil "5" nil nil nil nil nil]
+ nil)
+Return-Path: <python-announce-list-admin@python.org>
+Delivered-To: barry@wooz.org
+Received: from digicool.com (unknown [63.100.190.15])
+ by mail.wooz.org (Postfix) with ESMTP id 307A8D38E0
+ for <barry@wooz.org>; Sun, 27 May 2001 17:26:43 -0400 (EDT)
+Received: from <python-announce-list-admin@python.org>
+ by digicool.com (CommuniGate Pro RULES 3.4)
+ with RULES id 1985528; Sun, 27 May 2001 17:27:06 -0400
+Received: from ns2.digicool.com ([63.100.190.2] verified)
+ by digicool.com (CommuniGate Pro SMTP 3.4)
+ with ESMTP id 1985527 for barry@mail.digicool.com; Sun, 27 May 2001 17:27:06 -0400
+Received: from mail.python.org (mail.python.org [63.102.49.29])
+ by ns2.digicool.com (8.9.3/8.9.3) with ESMTP id RAA21782
+ for <barry@digicool.com>; Sun, 27 May 2001 17:26:42 -0400
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 15483f-000890-00
+ for barry@digicool.com; Sun, 27 May 2001 17:26:43 -0400
+Received: from [128.115.41.100] (helo=pierce.llnl.gov)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 15482m-00086w-00
+ for python-announce-list-admin@python.org; Sun, 27 May 2001 17:25:48 -0400
+Received: (from postmaster@localhost)
+ by pierce.llnl.gov (8.8.8/LLNL-3.0.2/llnl.gov-5.1)
+ id OAA03843; Sun, 27 May 2001 14:25:17 -0700 (PDT)
+Message-Id: <200105272125.OAA03843@pierce.llnl.gov>
+Precedence: bulk
+List-Help: <mailto:python-announce-list-request@python.org?subject=help>
+List-Post: <mailto:python-announce-list@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/python-announce-list>,
+ <mailto:python-announce-list-request@python.org?subject=subscribe>
+List-Id: Announcement-only list for the Python programming language <python-announce-list.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/python-announce-list>,
+ <mailto:python-announce-list-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/python-announce-list/>
+From: postmaster@llnl.gov (Automated response from LLNL postmaster)
+Sender: python-announce-list-owner@python.org
+To: python-announce-list-admin@python.org
+Subject: FAILED MAIL to "trotts1" regarding "[ANNOUNCE] wxPython 2.3.0"
+Date: Sun, 27 May 2001 14:25:17 -0700 (PDT)
+X-Autogenerated: Mirror
+X-Mirrored-by: <python-announce-list-admin@python.org>
+X-BeenThere: python-announce-list@python.org
+X-Mailman-Version: 2.0.5 (101270)
+
+The standard form of email address at LLNL is lastnameNumber@llnl.gov
+although individuals may choose an alternate email address. The address to
+which your message was addressed, trotts1@llnl.gov, did not exactly match an
+LLNL email address.
+
+The following locator information may be of help in finding another means
+of contacting "trotts1":
+
+ Judy L. Trotter +1 925-423-5635 trotter4@llnl.gov
+ L-149
+
+
+Original message as received is as follows:
+========================================================================
+>Return-Path: <python-announce-list-admin@python.org>
+>Received: from smtp-in-2.llnl.gov (smtp-in-2.llnl.gov [128.115.249.72]) by pierce.llnl.gov (8.8.8/LLNL-3.0.2/llnl.gov-5.1) with ESMTP id OAA03514 for <trotts1@llnl.gov>; Sun, 27 May 2001 14:21:25 -0700 (PDT)
+>Received: from mail.python.org (localhost [127.0.0.1]) by smtp-in-2.llnl.gov (8.9.3/8.9.3/LLNL-gateway-1.0) with ESMTP id OAA20597 for <trotts1@llnl.gov>; Sun, 27 May 2001 14:21:23 -0700 (PDT)
+>Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org) by mail.python.org with esmtp (Exim 3.21 #1) id 1547yA-0007w7-00; Sun, 27 May 2001 17:21:02 -0400
+>Path: news.baymountain.net!not-for-mail
+>From: "Robin Dunn" <robin@alldunn.com>
+>Newsgroups: comp.lang.python.announce
+>Subject: [ANNOUNCE] wxPython 2.3.0
+>Organization: Baymountain
+>Lines: 150
+>Message-ID: <mailman.990998285.30333.clpa-moderators@python.org>
+>NNTP-Posting-Host: mail.python.org
+>X-Trace: news.baymountain.net 990998285 26598 63.102.49.29 (27 May 2001 21:18:05 GMT)
+>X-Complaints-To: abuse@baymountain.net
+>NNTP-Posting-Date: 27 May 2001 21:18:05 GMT
+>X-Priority: 3
+>X-MSMail-Priority: Normal
+>X-Mailer: Microsoft Outlook Express 5.50.4133.2400
+>X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400
+>X-BeenThere: clpa-moderators@python.org
+>X-Mailman-Version: 2.0.5 (101270)
+>Precedence: bulk
+>X-BeenThere: clpa-moderators@python.org
+>Xref: news.baymountain.net comp.lang.python.announce:1064
+>X-Originally-To: <wx-announce@lists.wxwindows.org>, <python-announce-list@python.org>, <python-list@python.org>
+>To: python-announce-list@python.org
+>Sender: python-announce-list-admin@python.org
+>Errors-To: python-announce-list-admin@python.org
+>X-BeenThere: python-announce-list@python.org
+>List-Help: <mailto:python-announce-list-request@python.org?subject=help>
+>List-Post: <mailto:python-announce-list@python.org>
+>List-Subscribe: <http://mail.python.org/mailman/listinfo/python-announce-list>, <mailto:python-announce-list-request@python.org?subject=subscribe>
+>List-Id: Announcement-only list for the Python programming language <python-announce-list.python.org>
+>List-Unsubscribe: <http://mail.python.org/mailman/listinfo/python-announce-list>, <mailto:python-announce-list-request@python.org?subject=unsubscribe>
+>List-Archive: <http://mail.python.org/pipermail/python-announce-list/>
+>Date: Fri, 25 May 2001 10:24:51 -0700
+>
+>wxPython 2.3.0 is now available for download. Unfortunately the shell
+>server at sourceforge is down for a few days and so I can't update the
+>wxPython.org web page, but in the meantime you can get the files directly
+>from
+>
+>http://sourceforge.net/project/showfiles.php?group_id=10718.
+>
+>Sources and binaries for win32 and Linux for Python 1.5.2, 2.0 and 2.1 are
+>available. (The win32 binaries with "-hybrid" in the name are built with
+>extra debugging code enabled so some things that caused mysterious problems
+>before will now pop-up a slightly less mysterious message dialog.)
+>
+>There have been a large number of changes for this release. I'll include
+>the relevant portion of CHANGES.txt here:
+>
+>
+>
+>Removed initial startup dependency on the OpenGL DLLs so only the
+>glcanvasc.pyd depends on them, (on wxMSW.)
+>
+>Changed wxFont, wxPen, wxBrush to not implicitly use the
+>wxThe[Font|Pen|Brush]List objects behind the scenes, but to use normal
+>ctor and dtors.
+>
+>Exposed the wxThe[Font|Pen|Brush]List to wxPython.
+>
+>Also added wxTheColourDatabase and added a library module (in the
+>wxPython.lib.colourdb module) to load LOTS more colour names into the
+>colour database.
+>
+>Added wxWakeUpMainThread, wxMutexGuiEnter, wxMutexGuiLeave,
+>wxMutexGuiLocker and wxThread_IsMain to assist with dealing with GUI
+>access from non-GUI threads.
+>
+>wxPyOnDemandOutputWindow is now (more) thread safe if non-GUI threads
+>use print, sys.stdout.write, etc.
+>
+>Added CreateTextSizer and CreateButtonSizer to wxDialog
+>
+>Added wxPython/lib/infoframe.py from Chris Fama. It contains a class
+>that can be used in place of wxPyOnDemandOutputWindow.
+>
+>Added colourselect.py, imagebrowser.py and an updated calendar.py to
+>wxPython/lib from Lorne White.
+>
+>Added patch to wxPoint_LIST_helper from Tim Hochberg that should make
+>it gobs faster in certain situations.
+>
+>Added tools that will take an image file in a wx supported format and
+>convert it to data embedded in a Python source file. The image is
+>converted to XPM format which is essentially a list of strings
+>containing info about each pixel. The image's transparency mask is
+>included, if there is one, or a mask can be added if a mask colour is
+>specified on the command line. It is then pickled and optionally
+>compressed and written to a Python source file along with functions to
+>convert it to either a wxBitmap or a wxImage. See
+>wxPython/demo/images.py for examples, and wxPython/Tools/img2py.py for
+>the implementation.
+>
+>Fixed wxStyledTextCtrl to be much faster on wxGTK. There was some
+>experimental code that got left in place that ended up causing way too
+>many refreshes.
+>
+>A couple more hacks in my_distutils.py so wxPython can be built with
+>the distutils that comes with Python 2.1.
+>
+>Added a ton of missing methods for wxPrintData.
+>
+>Switched to InnoSetup for MSW distributions.
+>
+>Added wxToggleButton.
+>
+>Fixed bug that prevented wxTreeCtrl.OnCompareItems from being called.
+>
+>Added some methods to wxGrid:
+> GetCellHighlightPenWidth
+> GetCellHighlightROPenWidth
+> SetCellHighlightPenWidth
+> SetCellHighlightROPenWidth
+> GetGridWindow
+> GetGridRowLabelWindow
+> GetGridColLabelWindow
+> GetGridCornerLabelWindow
+>
+>Added wxGetClientDisplayRect which on wxMSW returns a wxRect
+>representing the area on screen not occupied by the taskbar and such.
+>On other platforms it is equivallent to wxGetDisplaySize.
+>
+>
+>***---***---***---***---***---***---***---***---***---***---***---
+> Implemented the first phase of OOR (Original Object Return). See
+> the text in the demo for more details of what this means, but in a
+> nutshell methods such as wxWindow.GetParent or FindWindowById will
+> now return a shadow object of the proper type if it can. By
+> "proper type" I mean that if the wxWindow pointer returned from
+> FindWindowById really points to a wxButton then the Python object
+> constructed will be of a wxButtonPtr class instead of wxWindowPtr
+> as before. This should reduce or eliminiate the need for
+> wxPyTypeCast. (Woo Hoo!) The objects returned are still not the
+> original Python object, but that is the next step. (Although it
+
+
+
diff --git a/tests/bounces/microsoft_01.txt b/tests/bounces/microsoft_01.txt
new file mode 100644
index 00000000..92465f78
--- /dev/null
+++ b/tests/bounces/microsoft_01.txt
@@ -0,0 +1,108 @@
+Return-Path: <MAILER-DAEMON>
+Received: from bkb01-ims-01.ikon.com (bkb01-ims-01.ikon.com [205.145.1.251])
+ by plaidworks.com (8.12.2/8.12.2) with ESMTP id g94LJbkw021463
+ for <pit-penguins-bounces@plaidworks.com>; Fri, 4 Oct 2002 14:19:37 -0700 (PDT)
+Received: by bkb01-ims-01.ikon.com with Internet Mail Service (5.5.2656.59)
+ id <4C3HZXG8>; Fri, 4 Oct 2002 17:12:36 -0400
+Message-ID: <44136F3E78E1C44EB52A3F95C986EAED09DB0AAB@BKB02-IMS-01.ikon.org>
+From: System Administrator <postmaster@IKON.com>
+To: pit-penguins-bounces@plaidworks.com
+Subject: Undeliverable: RE: Waiver draft results explained
+Date: Fri, 4 Oct 2002 17:12:35 -0400
+MIME-Version: 1.0
+X-Mailer: Internet Mail Service (5.5.2656.59)
+X-MS-Embedded-Report:
+Content-Type: multipart/mixed;
+ boundary="----_=_NextPart_000_01C26BEA.C2970D56"
+
+This message is in MIME format. Since your mail reader does not understand
+this format, some or all of this message may not be legible.
+
+------_=_NextPart_000_01C26BEA.C2970D56
+Content-Type: text/plain;
+ charset="iso-8859-1"
+
+Your message
+
+ To: pit-penguins@plaidworks.com
+ Subject: RE: Waiver draft results explained
+ Sent: Fri, 4 Oct 2002 17:10:56 -0400
+
+did not reach the following recipient(s):
+
+c=US;a= ;p=IKON;o=Nexus2;dda:SMTP=DJBENNETT@IKON.COM; on Fri, 4 Oct 2002
+17:12:28 -0400
+ The recipient name is not recognized
+ The MTS-ID of the original message is: c=us;a=
+;p=ikon;l=BKB02-IMS-010210042112TX06SNVK
+ MSEXCH:IMS:IKON:Nexus2:BKB02-IMS-01 0 (000C05A6) Unknown Recipient
+
+
+
+------_=_NextPart_000_01C26BEA.C2970D56
+Content-Type: message/rfc822
+
+Message-ID: <5.1.1.5.2.20021004224506.00bd9ff8@mail.chello.se>
+From: Mikael Hedberg <mhedberg@chello.se>
+To: pit-penguins@plaidworks.com
+Subject: RE: Waiver draft results explained
+Date: Fri, 4 Oct 2002 17:10:56 -0400
+MIME-Version: 1.0
+X-Mailer: Internet Mail Service (5.5.2656.59)
+X-MS-Embedded-Report:
+List-Help: <mailto:pit-penguins-request@plaidworks.com?subject=help>
+List-Subscribe: <http://plaidworks.com/mailman/listinfo/pit-penguins>,<mailto:pit-penguins-request@plaidworks.com?subject=subscribe>
+List-Unsubscribe: <http://plaidworks.com/mailman/listinfo/pit-penguins>,<mailto:pit-penguins-request@plaidworks.com?subject=unsubscribe>
+Content-Type: text/plain;
+ charset="iso-8859-1"
+
+
+OK, one more time...slowly:
+
+Youngsters like Berry, Meloche and TK are no longer exempt from regular
+season waivers. Hence, they'd have to pass through waivers to be sent down
+to WBS.
+
+Now, during the waiver draft, to claim a player you must also unprotect one
+of your own players. This is different from the regular waivers, where any
+team can claim any player without giving up anything but the waiver fee.
+This means teams are more reluctant to claim guys, since they run the risk
+of losing one of their own players.
+
+However, if a player was to pass through the waiver draft *unclaimed*, he
+would also count as having passed regular waivers -- and then be allowed to
+be sent down immidiately. This was most definitely Patrick's reasoning for
+Meloche and TK -- he said as much yesterday -- and probably also for Berry;
+ie. management wanted them playing in the minors, and this was the best
+chance of getting them there. The only other option would be to keep them
+on the big team for the entire season.
+
+Also, if Washington ever wants to send Berry down, they must put him
+through waivers, where the Pens have the option of claiming him back -- and
+would then, as the original owning team, be free to send him down to THEIR
+minor club without putting him on waivers (NHL CBA, article 13.20, I
+believe).
+
+Personally, I think this whole Rick Berry issue has been totally blown out
+of proportion. It's not like he's the second coming of Ray Bourque or even
+Scott Stevens. He's a borderline NHL:er who probably would've played out
+most of the season in the minors anyway (seeing as how Penguins management
+weren't too high on him after camp). While I can't say I feel content to
+lose one asset of the Kasparaitis trade already, the reasoning behind this
+move is sound, and all you Pittsburgh/Mario/CP-bashers are really making a
+chicken out of a feather here.
+
+__________________________________________________________________
+ Mikael Hedberg mhedberg@chello.se
+
+ "It does not do to leave a live dragon out of your calculations,
+ if you live near one." ---J.R.R. Tolkien
+
+_______________________________________________
+Do not post admin requests to the list. They will be ignored.
+pit-penguins mailing list
+pit-penguins@plaidworks.com
+http://plaidworks.com/mailman/listinfo/pit-penguins
+
+------_=_NextPart_000_01C26BEA.C2970D56--
+
diff --git a/tests/bounces/microsoft_02.txt b/tests/bounces/microsoft_02.txt
new file mode 100644
index 00000000..3c6c5416
--- /dev/null
+++ b/tests/bounces/microsoft_02.txt
@@ -0,0 +1,119 @@
+Precedence: bulk
+List-Help: <mailto:mailman-users-request@python.org?subject=help>
+List-Post: <mailto:mailman-users@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=subscribe>
+List-Id: Mailman mailing list management users <mailman-users.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/mailman-users/>
+From: System Administrator <postmaster@ball.com>
+Sender: mailman-users-owner@python.org
+To: mailman-users-admin@python.org
+Subject: Undeliverable: [Mailman-Users] Virus in ma mail ... these are the
+ headers....
+Date: Fri, 18 Oct 2002 09:13:31 -0600
+X-Mailer: Internet Mail Service (5.5.2653.19)
+X-MS-Embedded-Report:
+X-Spam-Status: No, hits=-5.0 required=5.0 tests=FROM_MAILER_DAEMON,MIME_NULL_BLOCK,ATTACH_RFC822
+X-Spam-Level:
+X-BeenThere: mailman-users@python.org
+X-Mailman-Version: 2.0.13 (101270)
+
+This message is in MIME format. Since your mail reader does not understand
+this format, some or all of this message may not be legible.
+
+------_=_NextPart_000_01C276B8.EB5EB90E
+Content-Type: text/plain;
+ charset="iso-8859-1"
+
+Your message
+
+ To: K12
+ Cc: Mailman; RedHat Mail List
+ Subject: [Mailman-Users] Virus in ma mail ... these are the headers....
+ Sent: Fri, 18 Oct 2002 09:25:07 -0600
+
+did not reach the following recipient(s):
+
+MDMOORE@BALL.COM on Fri, 18 Oct 2002 09:13:24 -0600
+ The recipient name is not recognized
+ The MTS-ID of the original message is: c=us;a=
+;p=ball;l=AEROMSG2021018151347W14KQ9
+ MSEXCH:IMS:BALL:AEROSPACE:AEROMSG2 0 (000C05A6) Unknown Recipient
+
+
+
+
+------_=_NextPart_000_01C276B8.EB5EB90E
+Content-Type: message/rfc822
+
+Message-ID: <NGBBLKFIDENNFHKFMGAIGEMNCJAA.badmangabriel@lycos.co.uk>
+From: Angel Gabriel <badmangabriel@lycos.co.uk>
+To: K12 <k12osn@redhat.com>
+Cc: Mailman <mailman-users@python.org>, RedHat Mail List
+ <redhat-install-list@redhat.com>
+Subject: [Mailman-Users] Virus in ma mail ... these are the headers....
+Date: Fri, 18 Oct 2002 09:25:07 -0600
+MIME-Version: 1.0
+X-Mailer: Internet Mail Service (5.5.2653.19)
+X-MS-Embedded-Report:
+List-Help: <mailto:mailman-users-request@python.org?subject=help>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/mailman-users>,<mailto:mailman-users-request@python.org?subject=subscribe>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/mailman-users>,<mailto:mailman-users-request@python.org?subject=unsubscribe>
+Content-Type: text/plain;
+ charset="iso-8859-1"
+
+This is a continuation of my viral problem.... I'm guessing that this person
+was either infected by my, or infected me.... but how do I notify them??
+These are the headers of one of the problem mails. Is there anything I can
+do?
+
+Return-Path: <friends@shakeit.net>
+Received: from smtp.lycos.co.uk (croy-gw1.homechoice.co.uk [212.187.250.18])
+
+ by mailbox-8.st1.spray.net (Postfix) with SMTP id 7E1E3252DF
+ for <badmangabriel@lycos.co.uk>; Fri, 18 Oct 2002 17:01:29 +0200
+(DST)
+From: werfriends <friends@shakeit.net>
+To: badmangabriel@lycos.co.uk
+Subject: Bullshit Screensaver to ur friends !!
+Date: Fri,18 Oct 2002 16:03:06 PM
+X-Mailer: Microsoft Outlook Express 5.50.4133.2400
+MIME-Version: 1.0
+Content-Type: multipart/mixed;
+ boundary=simqlgr
+Message-Id: <20021018150129.7E1E3252DF@mailbox-8.st1.spray.net>
+
+
+
+***
+
+Not everyone is touched by an Angel......and those that are, never forget
+the experience.
+
+***
+
+If you want guest list for bare club nights.....
+http://raw-talent.hopto.org/mailman/clubnights
+<http://raw-talent.hopto.org/mailman/clubnights>
+
+***
+
+Can you sing, dance, MC, DJ, do you have talent? Send an email to
+sign-me@raw-talent.hopto.org
+
+***
+
+
+---
+Outgoing mail is certified Virus Free.
+Checked by AVG anti-virus system ( http://www.grisoft.com
+<http://www.grisoft.com> ).
+Version: 6.0.394 / Virus Database: 224 - Release Date: 10/3/02
+
+
+
+------_=_NextPart_000_01C276B8.EB5EB90E--
+
+
diff --git a/tests/bounces/netscape_01.txt b/tests/bounces/netscape_01.txt
new file mode 100644
index 00000000..adcde15b
--- /dev/null
+++ b/tests/bounces/netscape_01.txt
@@ -0,0 +1,123 @@
+Received: by master.kde.org id <S742399AbQEZVQS>;
+ Fri, 26 May 2000 23:16:18 +0200
+Received: from nmail.corel.com ([209.167.40.11]:48557 "EHLO nsmail.corel.com")
+ by master.kde.org with ESMTP id <S742400AbQEZVP6>;
+ Fri, 26 May 2000 23:15:58 +0200
+To: kde-core-devel-admin@master.kde.org
+From: Mail Administrator <Postmaster@nsmail.corel.com>
+Reply-To: Mail Administrator <Postmaster@nsmail.corel.com>
+Subject: Mail System Error - Returned Mail
+Date: Fri, 26 May 2000 17:14:07 -0400
+Message-ID: <20000526211407.AAB24445@nsmail.corel.com>
+MIME-Version: 1.0
+Content-Type: multipart/report; report-type=delivery-status;
+ Boundary="===========================_ _= 461730(24445)"
+Sender: kde-core-devel-admin@master.kde.org
+Resent-Sender: kde-core-devel-admin@master.kde.org
+Resent-From: kde-core-devel@master.kde.org
+X-Mailing-List: <kde-core-devel@master.kde.org>
+Errors-To: kde-core-devel-admin@master.kde.org
+X-BeenThere: kde-core-devel@master.kde.org
+X-Mailman-Version: 2.0beta2
+Precedence: bulk
+List-Id: KDE's core development crew <kde-core-devel.master.kde.org>
+Resent-Date: Fri, 26 May 2000 23:16:18 +0200
+Return-Path: <kde-core-devel-admin@master.kde.org>
+X-Orcpt: rfc822;coolo@kde.org
+X-Mozilla-Status: 8001
+X-Mozilla-Status2: 00000000
+
+--===========================_ _= 461730(24445)
+Content-Type: text/plain; charset=us-ascii
+Content-Transfer-Encoding: 7bit
+
+This Message was undeliverable due to the following reason:
+
+Your message was not delivered because the destination computer was
+not reachable within the allowed queue period. The amount of time
+a message is queued before it is returned depends on local configura-
+tion parameters.
+
+Most likely there is a network problem that prevented delivery, but
+it is also possible that the computer is turned off, or does not
+have a mail system running right now.
+
+Your message was not delivered within 2 days.
+Host corel.com is not responding.
+
+The following recipients did not receive your message:
+
+ <aaaaa@corel.com>
+The following recipients did not receive your message:
+
+ <bbbbb@corel.com>
+
+Please reply to Postmaster@nsmail.corel.com
+if you feel this message to be in error.
+
+
+--===========================_ _= 461730(24445)
+Content-Type: message/delivery-status
+Content-Disposition: inline
+Content-Transfer-Encoding: 7bit
+
+
+Reporting-MTA: dns; nsmail.corel.com
+Received-From-MTA: dns; [120.2.1.9] [120.2.1.9]
+Arrival-Date: Wed, 24 May 2000 16:50:34 -0400
+
+--===========================_ _= 461730(24445)
+Content-Type: message/rfc822
+Content-Disposition: inline
+Content-Transfer-Encoding: 7bit
+
+Received: from fwsb1 ([120.2.1.9]) by nsmail.corel.com
+ (Netscape Messaging Server 3.61) with SMTP id AAA41D0
+ for <philipr@corel.com>; Wed, 24 May 2000 16:50:34 -0400
+Received: by master.kde.org id <S741513AbQEXUuI>;
+ Wed, 24 May 2000 22:50:08 +0200
+Received: from smtp.mail.yahoo.com ([128.11.68.32]:5906 "HELO
+ smtp.mail.yahoo.com") by master.kde.org with SMTP
+ id <S741709AbQEXUtl>; Wed, 24 May 2000 22:49:41 +0200
+Received: from pec-151-5.tnt7.b2.uunet.de (HELO yahoo.com) (149.225.151.5)
+ by smtp.mail.yahoo.com with SMTP; 24 May 2000 12:29:34 -0700
+X-Apparently-From: <gigafalk@yahoo.com>
+Message-ID: <392C2D67.C072CDA8@yahoo.com>
+Date: Wed, 24 May 2000 21:28:39 +0200
+From: Falk Brettschneider <gigafalk@yahoo.com>
+Organization: FBI (Falk Brettschneider International)
+X-Mailer: Mozilla 4.7 [de] (X11; I; Linux 2.2.13 i686)
+X-Accept-Language: en
+MIME-Version: 1.0
+To: kde-core-devel@kde.org
+Subject: private classes in KDE
+Content-Type: text/plain; charset=us-ascii
+Content-Transfer-Encoding: 7bit
+Sender: kde-core-devel-admin@master.kde.org
+Resent-Sender: kde-core-devel-admin@master.kde.org
+Resent-From: kde-core-devel@master.kde.org
+X-Mailing-List: <kde-core-devel@master.kde.org>
+Errors-To: kde-core-devel-admin@master.kde.org
+X-BeenThere: kde-core-devel@master.kde.org
+X-Mailman-Version: 2.0beta2
+Precedence: bulk
+Reply-To: kde-core-devel@master.kde.org
+List-Id: KDE's core development crew <kde-core-devel.master.kde.org>
+Resent-Date: Wed, 24 May 2000 22:50:08 +0200
+
+Hi,
+
+Can I move a class away from the public classes of KDE to a private
+header/source file of KDE when one of the public classes declares this
+private candidate as friend class?
+
+Thanks + Bye,
+ F@lk
+
+
+
+__________________________________________________
+Do You Yahoo!?
+Talk to your friends online with Yahoo! Messenger.
+http://im.yahoo.com
+--===========================_ _= 461730(24445)--
diff --git a/tests/bounces/newmailru_01.txt b/tests/bounces/newmailru_01.txt
new file mode 100644
index 00000000..7802c151
--- /dev/null
+++ b/tests/bounces/newmailru_01.txt
@@ -0,0 +1,112 @@
+From VM Thu Dec 7 15:07:27 2000
+Return-Path: <python-list-admin@python.org>
+Delivered-To: bxxxxx@mail.wooz.org
+Received: from dinsdale.python.org (dinsdale.python.org [132.151.1.21])
+ by mail.wooz.org (Postfix) with ESMTP id 276A9D37DB
+ for <yyyyy@wooz.org>; Thu, 7 Dec 2000 15:03:20 -0500 (EST)
+Received: from dinsdale.python.org (localhost [127.0.0.1])
+ by dinsdale.python.org (Postfix) with ESMTP id 13CF11CFD2
+ for <yyyyy@wooz.org>; Thu, 7 Dec 2000 14:58:02 -0500 (EST)
+Delivered-To: python-list-admin@python.org
+Received: from grif.newmail.ru (grif.newmail.ru [212.48.140.154])
+ by dinsdale.python.org (Postfix) with SMTP id D9F021CFD2
+ for <python-list-admin@python.org>; Thu, 7 Dec 2000 14:57:26 -0500 (EST)
+Received: (qmail 1933 invoked for bounce); 7 Dec 2000 19:57:26 -0000
+Content-Type: text/plain; charset=koi8-r
+Message-Id: <20001207195726.D9F021CFD2@dinsdale.python.org>
+Errors-To: python-list-owner@python.org
+Precedence: bulk
+List-Help: <mailto:python-list-request@python.org?subject=help>
+List-Post: <mailto:python-list@python.org>
+List-Subscribe: <http://www.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=subscribe>
+List-Id: General discussion list for the Python programming language <python-list.python.org>
+List-Unsubscribe: <http://www.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=unsubscribe>
+List-Archive: <http://www.python.org/pipermail/python-list/>
+From: MAILER-DAEMON@grif.newmail.ru
+Sender: python-list-owner@python.org
+To: python-list-admin@python.org
+Subject: failure notice
+Date: 7 Dec 2000 19:57:26 -0000
+X-BeenThere: python-list@python.org
+X-Mailman-Version: 2.0
+
+This is the machine generated message from mail service.
+Unfortunately, we were not able to deliver your message to the following address(es):
+
+üÔÏ ÓÏÏÂÝÅÎÉÅ ÓÏÚÄÁÎÏ Á×ÔÏÍÁÔÉÞÅÓËÉ mail-ÓÅÒ×ÉÓÏÍ.
+ë ÓÏÖÁÌÅÎÉÀ, ÎÅ×ÏÚÍÏÖÎÏ ÄÏÓÔÁ×ÉÔØ ÓÏÏÂÝÅÎÉÅ ÐÏ ÓÌÅÄÕÀÝÅÍÕ ÁÄÒÅÓÕ:
+
+<zzzzz@newmail.ru>:
+This person's account is exceeding their quota.
+
+--- Below the next line is a copy of the message.
+--- îÉÖÅ ÜÔÏÊ ÌÉÎÉÉ ÎÁÈÏÄÉÔÓÑ ËÏÐÉÑ ÓÏÏÂÝÅÎÉÑ.
+
+Return-Path: <python-list-admin@python.org>
+Received: (qmail 1924 invoked from network); 7 Dec 2000 19:57:26 -0000
+Received: from unknown (HELO dinsdale.python.org) (132.151.1.21)
+ by grif.newmail.ru with SMTP; 7 Dec 2000 19:57:26 -0000
+Received: from dinsdale.python.org (localhost [127.0.0.1])
+ by dinsdale.python.org (Postfix) with ESMTP
+ id 8E2A81CD7A; Thu, 7 Dec 2000 14:56:18 -0500 (EST)
+Message-ID: <3A2FEB05.5E9531C4@san.rr.com>
+From: Darren New <dnew@san.rr.com>
+Organization: Bookshelves and file cabinets?
+X-Mailer: Mozilla 4.06 [en] (WinNT; U)
+MIME-Version: 1.0
+Newsgroups: comp.lang.python
+Subject: Re: Python Origins
+References: <90k3pq$50p$1@nnrp1.deja.com> <3A2DD2CA.14A5D7E2@engcorp.com> <90l3j9$4bn$1@kapsel.intranet> <udzoi9cedt.fsf@box.home.de> <KHOX5.3213$TU6.94362@ptah.visi.com>
+Content-Type: text/plain; charset=us-ascii
+Content-Transfer-Encoding: 7bit
+Lines: 22
+NNTP-Posting-Host: 204.210.39.121
+X-Complaints-To: abuse@rr.com
+X-Trace: typhoon.san.rr.com 976218885 204.210.39.121 (Thu, 07 Dec 2000 11:54:45 PST)
+NNTP-Posting-Date: Thu, 07 Dec 2000 11:54:45 PST
+Path: news!uunet!ash.uu.net!hermes.visi.com!news-out.visi.com!cyclone-sjo1.usenetserver.com!news-out.usenetserver.com!cyclone-west.rr.com!news.rr.com!news-west.rr.com!lsnws01.we.mediaone.net!cyclone-LA3.rr.com!typhoon.san.rr.com.POSTED!not-for-mail
+Xref: news comp.lang.python:121135
+To: python-list@python.org
+Sender: python-list-admin@python.org
+Errors-To: python-list-admin@python.org
+X-BeenThere: python-list@python.org
+X-Mailman-Version: 2.0
+Precedence: bulk
+List-Help: <mailto:python-list-request@python.org?subject=help>
+List-Post: <mailto:python-list@python.org>
+List-Subscribe: <http://www.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=subscribe>
+List-Id: General discussion list for the Python programming language <python-list.python.org>
+List-Unsubscribe: <http://www.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=unsubscribe>
+List-Archive: <http://www.python.org/pipermail/python-list/>
+Date: Thu, 07 Dec 2000 19:54:45 GMT
+
+Grant Edwards wrote:
+> If a person who speaks two languages is "bilingual" and a
+> person who speaks three languages is "trilingual", then what do
+> you call a person who only speaks one langage?
+>
+> American!
+
+Yah. We just export our culture to y'all. ;-)
+
+Actually, we don't all speak the same language. We can just all understand
+each other.
+
+The traveling salesman saw "grits" on the menu. He asked the waitress "What
+are grits?" She said "They're extra." "But what *are* they?" he asked
+again. "They're fifty cents" she answered. "Yes, I'll have the grits,
+please."
+
+--
+Darren New / Senior MTS & Free Radical / Invisible Worlds Inc.
+San Diego, CA, USA (PST). Cryptokeys on demand.
+Personal malapropism generator free with purchase!
+Steganography: The manual is hidden in the source code.
+--
+http://www.python.org/mailman/listinfo/python-list
+
+
diff --git a/tests/bounces/postfix_01.txt b/tests/bounces/postfix_01.txt
new file mode 100644
index 00000000..186cc763
--- /dev/null
+++ b/tests/bounces/postfix_01.txt
@@ -0,0 +1,123 @@
+From VM Tue Oct 3 18:16:48 2000
+Return-Path: <mailman-developers-admin@python.org>
+Delivered-To: zzzzz@mail.wooz.org
+Received: from ns1.beopen.com (unknown [208.185.174.104])
+ by mail.wooz.org (Postfix) with ESMTP id 0C841D37D5
+ for <yyyyy@wooz.org>; Tue, 3 Oct 2000 18:08:44 -0400 (EDT)
+Received: from dinsdale.python.org (dinsdale.cnri.reston.va.us [132.151.1.21])
+ by ns1.beopen.com (8.9.3/8.9.3) with ESMTP id PAA65355
+ for <zzzzz@beopen.com>; Tue, 3 Oct 2000 15:09:08 -0700 (PDT)
+ (envelope-from mailman-developers-admin@python.org)
+Received: from dinsdale.python.org (localhost [127.0.0.1])
+ by dinsdale.python.org (Postfix) with ESMTP id 2EF421CDC9
+ for <zzzzz@beopen.com>; Tue, 3 Oct 2000 18:07:03 -0400 (EDT)
+Delivered-To: mailman-developers-admin@python.org
+Received: by dinsdale.python.org (Postfix) via BOUNCE
+ id 7CE611CE55; Tue, 3 Oct 2000 18:06:58 -0400 (EDT)
+MIME-Version: 1.0
+Content-Type: multipart/mixed;
+ boundary="BDD021CF6B.970610818/dinsdale.python.org"
+Message-Id: <20001003220658.7CE611CE55@dinsdale.python.org>
+Errors-To: mailman-developers-owner@python.org
+Precedence: bulk
+List-Help: <mailto:mailman-developers-request@python.org?subject=help>
+List-Post: <mailto:mailman-developers@python.org>
+List-Subscribe: <http://www.python.org/mailman/listinfo/mailman-developers>, <mailto:mailman-developers-request@python.org?subject=subscribe>
+List-Id: Mailman mailing list developers <mailman-developers.python.org>
+List-Unsubscribe: <http://www.python.org/mailman/listinfo/mailman-developers>, <mailto:mailman-developers-request@python.org?subject=unsubscribe>
+List-Archive: <http://www.python.org/pipermail/mailman-developers/>
+From: MAILER-DAEMON@python.org (Mail Delivery System)
+Sender: mailman-developers-owner@python.org
+To: mailman-developers-admin@python.org
+Subject: Undelivered Mail Returned to Sender
+Date: Tue, 3 Oct 2000 18:06:58 -0400 (EDT)
+X-BeenThere: mailman-developers@python.org
+X-Mailman-Version: 2.0beta6
+
+This is a MIME-encapsulated message.
+
+--BDD021CF6B.970610818/dinsdale.python.org
+Content-Description: Notification
+Content-Type: text/plain
+
+This is the Postfix program at host dinsdale.python.org.
+
+I'm sorry to have to inform you that the message returned
+below could not be delivered to one or more destinations.
+
+For further assistance, please contact <postmaster@python.org>
+
+If you do so, please include this problem report. You can
+delete your own text from the message returned below.
+
+ The Postfix program
+
+<xxxxx@local.ie>: host mail.local.ie[195.7.46.14] said: 550 5.1.1
+ <xxxxx@local.ie>... User unknown
+
+
+--BDD021CF6B.970610818/dinsdale.python.org
+Content-Description: Undelivered Message
+Content-Type: message/rfc822
+
+Received: from dinsdale.python.org (localhost [127.0.0.1])
+ by dinsdale.python.org (Postfix) with ESMTP
+ id BDD021CF6B; Tue, 3 Oct 2000 18:03:05 -0400 (EDT)
+Delivered-To: mailman-developers@python.org
+Received: from public.lists.apple.com (public.lists.apple.com [17.254.0.151])
+ by dinsdale.python.org (Postfix) with ESMTP id D05861CDC9
+ for <mailman-developers@python.org>; Tue, 3 Oct 2000 18:02:10 -0400 (EDT)
+Received: from [17.216.27.250] (A17-216-27-250.apple.com [17.216.27.250])
+ by public.lists.apple.com (8.9.1a/8.9.1) with ESMTP id PAA50322
+ ; Tue, 3 Oct 2000 15:09:09 -0700
+Mime-Version: 1.0
+Message-Id: <p04330122b60007b33216@[17.216.27.250]>
+To: mailman-developers@python.org
+From: Chuq Von Rospach <chuqui@plaidworks.com>
+Content-Type: text/plain; charset="us-ascii" ; format="flowed"
+Subject: [Mailman-Developers] broken CVS!
+Sender: mailman-developers-admin@python.org
+Errors-To: mailman-developers-admin@python.org
+X-BeenThere: mailman-developers@python.org
+X-Mailman-Version: 2.0beta6
+Precedence: bulk
+List-Help: <mailto:mailman-developers-request@python.org?subject=help>
+List-Post: <mailto:mailman-developers@python.org>
+List-Subscribe: <http://www.python.org/mailman/listinfo/mailman-developers>, <mailto:mailman-developers-request@python.org?subject=subscribe>
+List-Id: Mailman mailing list developers <mailman-developers.python.org>
+List-Unsubscribe: <http://www.python.org/mailman/listinfo/mailman-developers>, <mailto:mailman-developers-request@python.org?subject=unsubscribe>
+List-Archive: <http://www.python.org/pipermail/mailman-developers/>
+Date: Tue, 3 Oct 2000 15:01:50 -0700
+
+
+I just updated to the current CVS, and it's broken:
+
+Traceback (innermost last):
+ File "/home/mailman/cron/qrunner", line 85, in ?
+ from Mailman import MailList
+ File "/home/mailman/Mailman/MailList.py", line 45, in ?
+ from Mailman.Archiver import Archiver
+ File "/home/mailman/Mailman/Archiver/__init__.py", line 17, in ?
+ from Archiver import *
+ File "/home/mailman/Mailman/Archiver/Archiver.py", line 33, in ?
+ from Mailman import Mailbox
+ File "/home/mailman/Mailman/Mailbox.py", line 43
+ <<<<<<< Mailbox.py
+ ^
+SyntaxError: invalid syntax
+
+
+--
+Chuq Von Rospach - Plaidworks Consulting (mailto:chuqui@plaidworks.com)
+Apple Mail List Gnome (mailto:chuq@apple.com)
+
+You seem a decent fellow. I hate to die.
+
+_______________________________________________
+Mailman-Developers mailing list
+Mailman-Developers@python.org
+http://www.python.org/mailman/listinfo/mailman-developers
+
+--BDD021CF6B.970610818/dinsdale.python.org--
+
+
diff --git a/tests/bounces/postfix_02.txt b/tests/bounces/postfix_02.txt
new file mode 100644
index 00000000..c4065816
--- /dev/null
+++ b/tests/bounces/postfix_02.txt
@@ -0,0 +1,60 @@
+From VM Wed Dec 27 22:11:47 2000
+Return-Path: <>
+Delivered-To: xxxxx@mail.wooz.org
+Received: by mail.wooz.org (Postfix) via BOUNCE
+ id 68CBFD37E7; Wed, 27 Dec 2000 20:42:55 -0500 (EST)
+MIME-Version: 1.0
+Content-Type: multipart/mixed;
+ boundary="17E1DD37E0.977967775/mail.wooz.org"
+Message-Id: <20001228014255.68CBFD37E7@mail.wooz.org>
+From: MAILER-DAEMON@mail.wooz.org (Mail Delivery System)
+To: xxxxx@mail.wooz.org
+Subject: Undelivered Mail Returned to Sender
+Date: Wed, 27 Dec 2000 20:42:55 -0500 (EST)
+
+This is a MIME-encapsulated message.
+
+--17E1DD37E0.977967775/mail.wooz.org
+Content-Description: Notification
+Content-Type: text/plain
+
+This is the Postfix program at host mail.wooz.org.
+
+I'm sorry to have to inform you that the message returned
+below could not be delivered to one or more destinations.
+
+For further assistance, please contact <postmaster@mail.wooz.org>
+
+If you do so, please include this problem report. You can
+delete your own text from the message returned below.
+
+ The Postfix program
+
+<yyyyy@digicool.com>: Name service error for domain digicool.com: Host not
+ found, try again
+
+
+--17E1DD37E0.977967775/mail.wooz.org
+Content-Description: Undelivered Message
+Content-Type: message/rfc822
+
+Received: by mail.wooz.org (Postfix, from userid 889)
+ id 17E1DD37E0; Fri, 22 Dec 2000 20:06:42 -0500 (EST)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+Content-Transfer-Encoding: 7bit
+Message-ID: <14915.64162.965657.699956@anthem.concentric.net>
+Date: Fri, 22 Dec 2000 20:06:42 -0500
+To: yyyyy@digicool.com
+Subject: testing to yyyyy
+X-Mailer: VM 6.84 under 21.1 (patch 12) "Channel Islands" XEmacs Lucid
+X-Attribution: BAW
+X-Oblique-Strategy: You don't have to be ashamed of using your own ideas
+X-Url: http://www.wooz.org/yyyyy
+From: yyyyy@digicool.com (Yyyyy A. Zzzzz)
+
+
+hello yyyyy
+
+--17E1DD37E0.977967775/mail.wooz.org--
+
diff --git a/tests/bounces/postfix_03.txt b/tests/bounces/postfix_03.txt
new file mode 100644
index 00000000..5204712c
--- /dev/null
+++ b/tests/bounces/postfix_03.txt
@@ -0,0 +1,145 @@
+From VM Fri Feb 9 13:30:31 2001
+Return-Path: <python-list-admin@python.org>
+Delivered-To: xxxxxx@zzzz.org
+Received: from digicool.com (host15.digitalcreations.d.subnet.rcn.com [208.59.6.15])
+ by mail.zzzz.org (Postfix) with ESMTP id 3B39FD37AC
+ for <yyyyy@zzzz.org>; Thu, 8 Feb 2001 06:57:08 -0500 (EST)
+Received: from <python-list-admin@python.org>
+ by digicool.com (CommuniGate Pro RULES 3.3.2)
+ with RULES id 1450267; Thu, 08 Feb 2001 06:59:26 -0500
+Received: from ns2.digicool.com ([216.164.72.2] verified)
+ by digicool.com (CommuniGate Pro SMTP 3.3.2)
+ with ESMTP id 1450266 for yyyyy@mail.digicool.com; Thu, 08 Feb 2001 06:59:21 -0500
+Received: from mail.python.org (mail.python.org [63.102.49.29])
+ by ns2.digicool.com (8.9.3/8.9.3) with ESMTP id GAA16165
+ for <yyyyy@digicool.com>; Thu, 8 Feb 2001 06:57:51 -0500
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 14Qphy-0000Sk-00
+ for yyyyy@digicool.com; Thu, 08 Feb 2001 06:57:54 -0500
+Received: from [212.55.105.23] (helo=proxy.ggggg.com)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 14Qpgv-0000O4-00
+ for python-list-admin@python.org; Thu, 08 Feb 2001 06:56:49 -0500
+Received: by proxy.ggggg.com (Postfix on SuSE Linux 6.4 (i386)) via BOUNCE
+ id 7EA84D1046; Thu, 8 Feb 2001 14:00:07 +0100 (CET)
+MIME-Version: 1.0
+Content-Type: multipart/mixed;
+ boundary="11D14D1045.981637207/proxy.ggggg.com"
+Message-Id: <20010208130007.7EA84D1046@proxy.ggggg.com>
+Precedence: bulk
+List-Help: <mailto:python-list-request@python.org?subject=help>
+List-Post: <mailto:python-list@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=subscribe>
+List-Id: General discussion list for the Python programming language <python-list.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/python-list/>
+From: MAILER-DAEMON@proxy.ggggg.com (Mail Delivery System)
+Sender: python-list-owner@python.org
+To: python-list-admin@python.org
+Subject: Undelivered Mail Returned to Sender
+Date: Thu, 8 Feb 2001 14:00:07 +0100 (CET)
+X-Autogenerated: Mirror
+X-Mirrored-by: <python-list-admin@python.org>
+X-BeenThere: python-list@python.org
+X-Mailman-Version: 2.0.1 (101270)
+
+This is a MIME-encapsulated message.
+
+--11D14D1045.981637207/proxy.ggggg.com
+Content-Description: Notification
+Content-Type: text/plain
+
+This is the Postfix on SuSE Linux 6.4 (i386) program at host proxy.ggggg.com.
+
+I'm sorry to have to inform you that the message returned
+below could not be delivered to one or more destinations.
+
+For further assistance, please contact <postmaster@proxy.ggggg.com>
+
+If you do so, please include this problem report. You can
+delete your own text from the message returned below.
+
+ The Postfix on SuSE Linux 6.4 (i386) program
+
+<ttttt@ggggg.com>: Command died with status 17: "/usr/sbin/amavis". Command
+ output: Can't use an undefined value as a symbol reference at
+ /usr/sbin/amavis line 1178.
+
+
+--11D14D1045.981637207/proxy.ggggg.com
+Content-Description: Undelivered Message
+Content-Type: message/rfc822
+
+Received: from mail.i-s-o.net (mail.i-s-o.net [212.55.96.66])
+ by proxy.ggggg.com (Postfix on SuSE Linux 6.4 (i386)) with SMTP id 11D14D1045
+ for <ttttt@ggggg.com>; Thu, 8 Feb 2001 14:00:06 +0100 (CET)
+Received: (qmail 14297 invoked by uid 0); 8 Feb 2001 11:56:43 -0000
+Received: from mail.python.org (63.102.49.29)
+ by mail.i-s-o.net with SMTP; 8 Feb 2001 11:56:43 -0000
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 14QpgG-0000Lg-00; Thu, 08 Feb 2001 06:56:08 -0500
+Received: from [194.183.224.20] (helo=relay.ppppp.net)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 14QpeE-0000DS-00
+ for python-list@python.org; Thu, 08 Feb 2001 06:54:03 -0500
+Received: from hercule.ppppp.be (hercule.ppppp.be [194.183.229.151])
+ by relay.ppppp.net (8.11.0/8.11.0) with ESMTP id f18Bruv05655
+ for <python-list@python.org>; Thu, 8 Feb 2001 12:53:56 +0100 (MET)
+From: Gregoire Welraeds <greg@ppppp.be>
+X-Sender: gwelr@localhost
+To: Python Mailling list <python-list@python.org>
+Subject: None assigment
+Message-ID: <Pine.BSF.4.21.0102081248050.4685-100000@localhost>
+MIME-Version: 1.0
+Content-Type: TEXT/PLAIN; charset=US-ASCII
+Sender: python-list-admin@python.org
+Errors-To: python-list-admin@python.org
+X-BeenThere: python-list@python.org
+X-Mailman-Version: 2.0.1 (101270)
+Precedence: bulk
+List-Help: <mailto:python-list-request@python.org?subject=help>
+List-Post: <mailto:python-list@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=subscribe>
+List-Id: General discussion list for the Python programming language <python-list.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/python-list/>
+Date: Thu, 8 Feb 2001 12:54:00 +0100 (CET)
+
+
+While playing a bit with python 2.0, I found that I can assign some value
+to None
+
+EG: None= 2
+
+which I found to be very pernicious because then the following, for
+example, won't work any more:
+
+>>> b= filter(None, [1,2,'',3])
+
+Bug or feature ?
+
+If it is a feature (I suppose it is not a bug :), what is the interest of
+this ?
+
+Ppppp Development team
+-------------------------------------------------------------------------------
+Ppppp Technologies sa/nv Tel: +32-2-6409194
+Rue Tenbosch, 9 Fax: +32-2-6403154
+B-1000 Brussels general information: info@ppppp.net
+BELGIUM technical information: helpdesk@ppppp.net
+URL: http://www.ppppp.be/
+-------------------------------------------------------------------------------
+
+
+--
+http://mail.python.org/mailman/listinfo/python-list
+
+--11D14D1045.981637207/proxy.ggggg.com--
+
+
diff --git a/tests/bounces/postfix_04.txt b/tests/bounces/postfix_04.txt
new file mode 100644
index 00000000..86a60ea8
--- /dev/null
+++ b/tests/bounces/postfix_04.txt
@@ -0,0 +1,240 @@
+From VM Wed Mar 7 11:06:03 2001
+X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
+ [nil "Tuesday" "6" "March" "2001" "09:29:58" "-0800" "Mail Delivery System" "MAILER-DAEMON@keftamail.com" nil "185" "Undelivered Mail Returned to Sender" "^From:" nil nil "3" nil nil nil nil nil]
+ nil)
+Return-Path: <mailman-announce-admin@python.org>
+Delivered-To: bwarsaw@wooz.org
+Received: from digicool.com (host15.digitalcreations.d.subnet.rcn.com [208.59.6.15])
+ by mail.wooz.org (Postfix) with ESMTP id 6C2DCD37AC
+ for <barry@wooz.org>; Tue, 6 Mar 2001 12:30:35 -0500 (EST)
+Received: from <mailman-announce-admin@python.org>
+ by digicool.com (CommuniGate Pro RULES 3.4)
+ with RULES id 1650903; Tue, 06 Mar 2001 12:33:44 -0500
+Received: from ns2.digicool.com ([216.164.72.2] verified)
+ by digicool.com (CommuniGate Pro SMTP 3.4)
+ with ESMTP id 1650896 for barry@mail.digicool.com; Tue, 06 Mar 2001 12:33:44 -0500
+Received: from mail.python.org (mail.python.org [63.102.49.29])
+ by ns2.digicool.com (8.9.3/8.9.3) with ESMTP id MAA08939
+ for <barry@digicool.com>; Tue, 6 Mar 2001 12:31:02 -0500
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 14aLIc-0001Wp-00
+ for barry@digicool.com; Tue, 06 Mar 2001 12:31:02 -0500
+Received: from [64.75.1.85] (helo=postal-worker1.kefta.com)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 14aLIB-0001VP-00
+ for mailman-announce-admin@python.org; Tue, 06 Mar 2001 12:30:35 -0500
+Received: from mail1.kefta.com (mail1.kefta.com [10.0.2.1])
+ by postal-worker1.kefta.com (Keftamail) with ESMTP id E57BC4081
+ for <mailman-announce-admin@python.org>; Tue, 6 Mar 2001 09:24:31 -0800 (PST)
+Received: by mail1.kefta.com (Keftamail) via BOUNCE
+ id 438064082; Tue, 6 Mar 2001 09:29:58 -0800 (PST)
+MIME-Version: 1.0
+Content-Type: multipart/mixed;
+ boundary="1EDF14081.983899798/mail1.kefta.com"
+Message-Id: <20010306172958.438064082@mail1.kefta.com>
+Precedence: bulk
+List-Help: <mailto:mailman-announce-request@python.org?subject=help>
+List-Post: <mailto:mailman-announce@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/mailman-announce>,
+ <mailto:mailman-announce-request@python.org?subject=subscribe>
+List-Id: Announce-only list for Mailman releases and news <mailman-announce.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/mailman-announce>,
+ <mailto:mailman-announce-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/mailman-announce/>
+From: MAILER-DAEMON@keftamail.com (Mail Delivery System)
+Sender: mailman-announce-owner@python.org
+To: mailman-announce-admin@python.org
+Subject: Undelivered Mail Returned to Sender
+Date: Tue, 6 Mar 2001 09:29:58 -0800 (PST)
+X-Autogenerated: Mirror
+X-Mirrored-by: <mailman-announce-admin@python.org>
+X-BeenThere: mailman-announce@python.org
+X-Mailman-Version: 2.0.2 (101270)
+
+This is a MIME-encapsulated message.
+
+--1EDF14081.983899798/mail1.kefta.com
+Content-Description: Notification
+Content-Type: text/plain
+
+This is the Keftamail program at host mail1.kefta.com.
+
+I'm sorry to have to inform you that the message returned
+below could not be delivered to one or more destinations.
+
+For further assistance, please contact <postmaster@keftamail.com>
+
+If you do so, please include this problem report. You can
+delete your own text from the message returned below.
+
+ The Keftamail program
+
+<davidlowie@mail1.keftamail.com>: permission denied. Command output: Mail quota
+ exceeded.
+
+
+--1EDF14081.983899798/mail1.kefta.com
+Content-Description: Undelivered Message
+Content-Type: message/rfc822
+
+Received: from postal-worker2.kefta.com (postal-worker2.kefta.com [10.0.2.4])
+ by mail1.kefta.com (Keftamail) with ESMTP id 1EDF14081
+ for <davidlowie@mail1.keftamail.com>; Tue, 6 Mar 2001 09:29:58 -0800 (PST)
+Received: by postal-worker2.kefta.com (Keftamail)
+ id F089940C9; Tue, 6 Mar 2001 09:29:37 -0800 (PST)
+Delivered-To: davidlowie@keftamail.com
+Received: from lists.securityfocus.com (lists.securityfocus.com [66.38.151.7])
+ by postal-worker2.kefta.com (Keftamail) with ESMTP id BA59D40C0
+ for <davidlowie@KEFTAMAIL.COM>; Tue, 6 Mar 2001 09:29:37 -0800 (PST)
+Received: from lists.securityfocus.com (lists.securityfocus.com [66.38.151.7])
+ by lists.securityfocus.com (Postfix) with ESMTP
+ id 3A1C024CF8C; Tue, 6 Mar 2001 10:04:43 -0700 (MST)
+Received: from LISTS.SECURITYFOCUS.COM by LISTS.SECURITYFOCUS.COM
+ (LISTSERV-TCP/IP release 1.8d) with spool id 27825191 for
+ BUGTRAQ@LISTS.SECURITYFOCUS.COM; Tue, 6 Mar 2001 10:03:25 -0700
+Approved-By: aleph1@SECURITYFOCUS.COM
+Delivered-To: bugtraq@lists.securityfocus.com
+Received: from firewall.osb.hu (unknown [193.224.234.1]) by
+ lists.securityfocus.com (Postfix) with ESMTP id 48CD624C646 for
+ <BUGTRAQ@LISTS.SECURITYFOCUS.COM>; Tue, 6 Mar 2001 00:49:55 -0700
+ (MST)
+Received: from pimpa.intranet.osb.hu (IDENT:root@pimpa.intranet.osb.hu
+ [192.168.0.8]) by firewall.osb.hu (8.9.3/8.9.3/Debian 8.9.3-21) with
+ ESMTP id IAA11531 for <BUGTRAQ@LISTS.SECURITYFOCUS.COM>; Tue, 6 Mar
+ 2001 08:53:08 +0100
+Received: from localhost (sp@localhost) by pimpa.intranet.osb.hu (8.9.3/8.9.3)
+ with ESMTP id IAA05518 for <BUGTRAQ@LISTS.SECURITYFOCUS.COM>; Tue, 6
+ Mar 2001 08:53:08 +0100
+X-Authentication-Warning: pimpa.intranet.osb.hu: sp owned process doing -bs
+X-Received: from firewall.osb.hu (fw.intranet.osb.hu [192.168.0.1]) by
+ pimpa.intranet.osb.hu (8.9.3/8.9.3) with ESMTP id JAA18698 for
+ <sp@pimpa.intranet.osb.hu>; Sat, 3 Mar 2001 09:41:17 +0100
+X-Received: from pax.intranet.osb.hu (IDENT:root@pax.intranet.osb.hu
+ [192.168.0.2]) by firewall.osb.hu (8.9.3/8.9.3/Debian 8.9.3-21)
+ with ESMTP id JAA24373 for <sp@pimpa.intranet.osb.hu>; Sat, 3 Mar
+ 2001 09:41:17 +0100
+X-Received: from firewall.osb.hu (fw.intranet.osb.hu [192.168.0.1]) by
+ pax.intranet.osb.hu (8.9.3/8.9.3) with ESMTP id JAA09389 for
+ <sp@osb.hu>; Sat, 3 Mar 2001 09:41:16 +0100
+X-Received: from mail.python.org (mail.python.org [63.102.49.29]) by
+ firewall.osb.hu (8.9.3/8.9.3/Debian 8.9.3-21) with ESMTP id
+ JAA24367 for <sp@osb.hu>; Sat, 3 Mar 2001 09:41:07 +0100
+X-Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org) by
+ mail.python.org with esmtp (Exim 3.21 #1) id 14Z7OV-0000vs-00; Sat,
+ 03 Mar 2001 03:28:03 -0500
+X-Received: from [216.27.134.141] (helo=mail.wooz.org) by mail.python.org with
+ esmtp (Exim 3.21 #1) id 14Z7Nq-0000tq-00; Sat, 03 Mar 2001 03:27:22
+ -0500
+X-Received: by mail.wooz.org (Postfix, from userid 889) id BE7B0D37AC; Sat, 3
+ Mar 2001 03:26:35 -0500 (EST)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+Content-Transfer-Encoding: 7bit
+X-Mailer: VM 6.84 under 21.1 (patch 12) "Channel Islands" XEmacs Lucid
+X-Attribution: BAW
+X-Oblique-Strategy: Subvert your original idea
+X-Url: http://www.wooz.org/barry
+Errors-To: mailman-announce-admin@python.org
+X-BeenThere: mailman-announce@python.org
+X-Mailman-Version: 2.0.2 (101270)
+Precedence: bulk
+List-Help: <mailto:mailman-announce-request@python.org?subject=help>
+List-Post: <mailto:mailman-announce@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/mailman-announce>,
+ <mailto:mailman-announce-request@python.org?subject=subscribe>
+List-Id: Announce-only list for Mailman releases and news
+ <mailman-announce.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/mailman-announce>,
+ <mailto:mailman-announce-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/mailman-announce/>
+X-AntiVirus: scanned for viruses by AMaViS 0.2.1 (http://amavis.org/)
+ReSent-Subject: [Mailman-Announce] ANNOUNCE Mailman 2.0.2 (important privacy
+ patch)
+Message-ID: <Pine.LNX.4.30.0103060853010.5499@pimpa.intranet.osb.hu>
+Date: Tue, 6 Mar 2001 08:53:01 +0100
+Reply-To: mailman-developers@python.org
+Sender: Bugtraq List <BUGTRAQ@SECURITYFOCUS.COM>
+Comments: RFC822 error: <W> CC field duplicated. Last occurrence was
+ retained.
+Comments: Resent-From: Soos Peter <sp@osb.hu>
+Comments: Originally-From: barry@digicool.com (Barry A. Warsaw)
+From: Soos Peter <sp@OSB.HU>
+Subject: [Mailman-Announce] ANNOUNCE Mailman 2.0.2 (important privacy
+ patch)
+X-cc: mailman-developers@python.org
+To: BUGTRAQ@SECURITYFOCUS.COM
+
+I've just uploaded the Mailman 2.0.2 release to SourceForge. This is
+a bug fix release that also fixes a potential privacy hole, which
+could allow a list administrator to get access to user passwords.
+Even with those passwords, I believe there's little additional harm
+that a list admin could do, but still they probably shouldn't have
+access to those passwords.
+
+There are a few other important fixes in this release, so I recommend
+that all sites running Mailman 2.0 or 2.0.1 should upgrade.
+
+As usual I'm releasing this as both a complete tarball and as a patch
+against Mailman 2.0.1. If you grab the patchfile, you'll want to cd
+into your 2.0 source, and apply it like so:
+
+ % patch -p1 < mailman-2.0.1-2.0.2.diff
+
+Currently only http://mailman.sourceforge.net is updated, but the
+list.org and gnu.org sites should be updated soon. The release
+information on SF is at
+
+ http://sourceforge.net/project/shownotes.php?release_id=25955
+
+My thanks to Thomas Wouters for his help!
+
+Enjoy,
+-Barry
+
+P.S. I'm not sure if I'll have time to release a 2.1 alpha of the I18N
+stuff before I leave for the Python9 conference. If we get the
+expected foot of snow between Sunday and Monday, it's a
+possibility. ;)
+
+
+[From the NEWS file]
+
+2.0.2 (03-Mar-2001)
+
+ Security fix:
+
+ - A fix for a potential privacy exploit where a clever list
+ administrator could gain access to user passwords. This doesn't
+ allow them to do much more harm to the user then they normally
+ could, but they still shouldn't have access to the passwords.
+
+ Bug fixes:
+
+ - In the admindb page, don't complain when approving a
+ subscription of someone who's already on the list (SF bug
+ #222409 - Thomas Wouters).
+
+ Also, quote for HTML the Subject: text printed for held
+ messages, otherwise messages with e.g. "Subject: </table>" could
+ royally screw page formatting.
+
+ - In Netscape.py bounce processor, don't bomb out on ill-formed
+ messages (no semi-colon separating parameters), otherwise mail
+ delivery could grind to a halt. Bug reported by Kambiz
+ Aghaiepour.
+
+ - Docstring fix bin/newlist to remove mention of "immediate"
+ argument (Thomas Wouters).
+
+ - Fix for bin/update when PREFIX != VAR_PREFIX (SF bug #229794 --
+ Thomas Wouters).
+
+_______________________________________________
+Mailman-announce mailing list
+Mailman-announce@python.org
+http://mail.python.org/mailman/listinfo/mailman-announce
+
+--1EDF14081.983899798/mail1.kefta.com--
+
+
diff --git a/tests/bounces/postfix_05.txt b/tests/bounces/postfix_05.txt
new file mode 100644
index 00000000..4bd56d60
--- /dev/null
+++ b/tests/bounces/postfix_05.txt
@@ -0,0 +1,231 @@
+From VM Wed Mar 7 11:08:33 2001
+X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
+ [nil "Tuesday" "6" "March" "2001" "19:02:13" "+0000" "Mail Delivery System" "MAILER-DAEMON@bucks.net" nil "179" "Undelivered Mail Returned to Sender" "^From:" nil nil "3" nil nil nil nil nil]
+ nil)
+Return-Path: <mailman-announce-admin@python.org>
+Delivered-To: bwarsaw@wooz.org
+Received: from digicool.com (host15.digitalcreations.d.subnet.rcn.com [208.59.6.15])
+ by mail.wooz.org (Postfix) with ESMTP id 590BFD37AC
+ for <barry@wooz.org>; Tue, 6 Mar 2001 14:02:37 -0500 (EST)
+Received: from <mailman-announce-admin@python.org>
+ by digicool.com (CommuniGate Pro RULES 3.4)
+ with RULES id 1651377; Tue, 06 Mar 2001 14:05:47 -0500
+Received: from ns2.digicool.com ([216.164.72.2] verified)
+ by digicool.com (CommuniGate Pro SMTP 3.4)
+ with ESMTP id 1651376 for barry@mail.digicool.com; Tue, 06 Mar 2001 14:05:46 -0500
+Received: from mail.python.org (mail.python.org [63.102.49.29])
+ by ns2.digicool.com (8.9.3/8.9.3) with ESMTP id OAA13908
+ for <barry@digicool.com>; Tue, 6 Mar 2001 14:03:04 -0500
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 14aMje-0005oS-00
+ for barry@digicool.com; Tue, 06 Mar 2001 14:03:02 -0500
+Received: from [195.112.37.162] (helo=babylon.bucks.net ident=postfix)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 14aMix-0005nQ-00
+ for mailman-announce-admin@python.org; Tue, 06 Mar 2001 14:02:19 -0500
+Received: by babylon.bucks.net (BNS Postfix) via BOUNCE
+ id 59B9747B9E; Tue, 6 Mar 2001 19:02:13 +0000 (GMT)
+MIME-Version: 1.0
+Content-Type: multipart/mixed;
+ boundary="41A6B47B9D.983905333/babylon.bucks.net"
+Message-Id: <20010306190213.59B9747B9E@babylon.bucks.net>
+Precedence: bulk
+List-Help: <mailto:mailman-announce-request@python.org?subject=help>
+List-Post: <mailto:mailman-announce@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/mailman-announce>,
+ <mailto:mailman-announce-request@python.org?subject=subscribe>
+List-Id: Announce-only list for Mailman releases and news <mailman-announce.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/mailman-announce>,
+ <mailto:mailman-announce-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/mailman-announce/>
+From: MAILER-DAEMON@bucks.net (Mail Delivery System)
+Sender: mailman-announce-owner@python.org
+To: mailman-announce-admin@python.org
+Subject: Undelivered Mail Returned to Sender
+Date: Tue, 6 Mar 2001 19:02:13 +0000 (GMT)
+X-Autogenerated: Mirror
+X-Mirrored-by: <mailman-announce-admin@python.org>
+X-BeenThere: mailman-announce@python.org
+X-Mailman-Version: 2.0.2 (101270)
+
+This is a MIME-encapsulated message.
+
+--41A6B47B9D.983905333/babylon.bucks.net
+Content-Description: Notification
+Content-Type: text/plain
+
+This is the BNS Postfix program at host babylon.bucks.net.
+
+I'm sorry to have to inform you that the message returned
+below could not be delivered to one or more destinations.
+
+For further assistance, please contact <postmaster@bucks.net>
+
+If you do so, please include this problem report. You can
+delete your own text from the message returned below.
+
+ The BNS Postfix program
+
+<bjelf@detectit.net>: host mail.btconnect.com[193.113.154.2] said: 554 No
+ Resent-From field given
+
+
+--41A6B47B9D.983905333/babylon.bucks.net
+Content-Description: Undelivered Message
+Content-Type: message/rfc822
+
+Received: from lists.securityfocus.com (lists.securityfocus.com [66.38.151.7])
+ by babylon.bucks.net (BNS Postfix) with ESMTP id 41A6B47B9D
+ for <bjelf@SAFESTONE.COM>; Tue, 6 Mar 2001 19:02:11 +0000 (GMT)
+Received: from lists.securityfocus.com (lists.securityfocus.com [66.38.151.7])
+ by lists.securityfocus.com (Postfix) with ESMTP
+ id C8A0024C93F; Tue, 6 Mar 2001 10:05:17 -0700 (MST)
+Received: from LISTS.SECURITYFOCUS.COM by LISTS.SECURITYFOCUS.COM
+ (LISTSERV-TCP/IP release 1.8d) with spool id 27825191 for
+ BUGTRAQ@LISTS.SECURITYFOCUS.COM; Tue, 6 Mar 2001 10:03:25 -0700
+Approved-By: aleph1@SECURITYFOCUS.COM
+Delivered-To: bugtraq@lists.securityfocus.com
+Received: from firewall.osb.hu (unknown [193.224.234.1]) by
+ lists.securityfocus.com (Postfix) with ESMTP id 48CD624C646 for
+ <BUGTRAQ@LISTS.SECURITYFOCUS.COM>; Tue, 6 Mar 2001 00:49:55 -0700
+ (MST)
+Received: from pimpa.intranet.osb.hu (IDENT:root@pimpa.intranet.osb.hu
+ [192.168.0.8]) by firewall.osb.hu (8.9.3/8.9.3/Debian 8.9.3-21) with
+ ESMTP id IAA11531 for <BUGTRAQ@LISTS.SECURITYFOCUS.COM>; Tue, 6 Mar
+ 2001 08:53:08 +0100
+Received: from localhost (sp@localhost) by pimpa.intranet.osb.hu (8.9.3/8.9.3)
+ with ESMTP id IAA05518 for <BUGTRAQ@LISTS.SECURITYFOCUS.COM>; Tue, 6
+ Mar 2001 08:53:08 +0100
+X-Authentication-Warning: pimpa.intranet.osb.hu: sp owned process doing -bs
+X-Received: from firewall.osb.hu (fw.intranet.osb.hu [192.168.0.1]) by
+ pimpa.intranet.osb.hu (8.9.3/8.9.3) with ESMTP id JAA18698 for
+ <sp@pimpa.intranet.osb.hu>; Sat, 3 Mar 2001 09:41:17 +0100
+X-Received: from pax.intranet.osb.hu (IDENT:root@pax.intranet.osb.hu
+ [192.168.0.2]) by firewall.osb.hu (8.9.3/8.9.3/Debian 8.9.3-21)
+ with ESMTP id JAA24373 for <sp@pimpa.intranet.osb.hu>; Sat, 3 Mar
+ 2001 09:41:17 +0100
+X-Received: from firewall.osb.hu (fw.intranet.osb.hu [192.168.0.1]) by
+ pax.intranet.osb.hu (8.9.3/8.9.3) with ESMTP id JAA09389 for
+ <sp@osb.hu>; Sat, 3 Mar 2001 09:41:16 +0100
+X-Received: from mail.python.org (mail.python.org [63.102.49.29]) by
+ firewall.osb.hu (8.9.3/8.9.3/Debian 8.9.3-21) with ESMTP id
+ JAA24367 for <sp@osb.hu>; Sat, 3 Mar 2001 09:41:07 +0100
+X-Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org) by
+ mail.python.org with esmtp (Exim 3.21 #1) id 14Z7OV-0000vs-00; Sat,
+ 03 Mar 2001 03:28:03 -0500
+X-Received: from [216.27.134.141] (helo=mail.wooz.org) by mail.python.org with
+ esmtp (Exim 3.21 #1) id 14Z7Nq-0000tq-00; Sat, 03 Mar 2001 03:27:22
+ -0500
+X-Received: by mail.wooz.org (Postfix, from userid 889) id BE7B0D37AC; Sat, 3
+ Mar 2001 03:26:35 -0500 (EST)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+Content-Transfer-Encoding: 7bit
+X-Mailer: VM 6.84 under 21.1 (patch 12) "Channel Islands" XEmacs Lucid
+X-Attribution: BAW
+X-Oblique-Strategy: Subvert your original idea
+X-Url: http://www.wooz.org/barry
+Errors-To: mailman-announce-admin@python.org
+X-BeenThere: mailman-announce@python.org
+X-Mailman-Version: 2.0.2 (101270)
+Precedence: bulk
+List-Help: <mailto:mailman-announce-request@python.org?subject=help>
+List-Post: <mailto:mailman-announce@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/mailman-announce>,
+ <mailto:mailman-announce-request@python.org?subject=subscribe>
+List-Id: Announce-only list for Mailman releases and news
+ <mailman-announce.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/mailman-announce>,
+ <mailto:mailman-announce-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/mailman-announce/>
+X-AntiVirus: scanned for viruses by AMaViS 0.2.1 (http://amavis.org/)
+ReSent-Subject: [Mailman-Announce] ANNOUNCE Mailman 2.0.2 (important privacy
+ patch)
+Message-ID: <Pine.LNX.4.30.0103060853010.5499@pimpa.intranet.osb.hu>
+Date: Tue, 6 Mar 2001 08:53:01 +0100
+Reply-To: mailman-developers@python.org
+Sender: Bugtraq List <BUGTRAQ@SECURITYFOCUS.COM>
+Comments: RFC822 error: <W> CC field duplicated. Last occurrence was
+ retained.
+Comments: Resent-From: Soos Peter <sp@osb.hu>
+Comments: Originally-From: barry@digicool.com (Barry A. Warsaw)
+From: Soos Peter <sp@OSB.HU>
+Subject: [Mailman-Announce] ANNOUNCE Mailman 2.0.2 (important privacy
+ patch)
+X-cc: mailman-developers@python.org
+To: BUGTRAQ@SECURITYFOCUS.COM
+
+I've just uploaded the Mailman 2.0.2 release to SourceForge. This is
+a bug fix release that also fixes a potential privacy hole, which
+could allow a list administrator to get access to user passwords.
+Even with those passwords, I believe there's little additional harm
+that a list admin could do, but still they probably shouldn't have
+access to those passwords.
+
+There are a few other important fixes in this release, so I recommend
+that all sites running Mailman 2.0 or 2.0.1 should upgrade.
+
+As usual I'm releasing this as both a complete tarball and as a patch
+against Mailman 2.0.1. If you grab the patchfile, you'll want to cd
+into your 2.0 source, and apply it like so:
+
+ % patch -p1 < mailman-2.0.1-2.0.2.diff
+
+Currently only http://mailman.sourceforge.net is updated, but the
+list.org and gnu.org sites should be updated soon. The release
+information on SF is at
+
+ http://sourceforge.net/project/shownotes.php?release_id=25955
+
+My thanks to Thomas Wouters for his help!
+
+Enjoy,
+-Barry
+
+P.S. I'm not sure if I'll have time to release a 2.1 alpha of the I18N
+stuff before I leave for the Python9 conference. If we get the
+expected foot of snow between Sunday and Monday, it's a
+possibility. ;)
+
+
+[From the NEWS file]
+
+2.0.2 (03-Mar-2001)
+
+ Security fix:
+
+ - A fix for a potential privacy exploit where a clever list
+ administrator could gain access to user passwords. This doesn't
+ allow them to do much more harm to the user then they normally
+ could, but they still shouldn't have access to the passwords.
+
+ Bug fixes:
+
+ - In the admindb page, don't complain when approving a
+ subscription of someone who's already on the list (SF bug
+ #222409 - Thomas Wouters).
+
+ Also, quote for HTML the Subject: text printed for held
+ messages, otherwise messages with e.g. "Subject: </table>" could
+ royally screw page formatting.
+
+ - In Netscape.py bounce processor, don't bomb out on ill-formed
+ messages (no semi-colon separating parameters), otherwise mail
+ delivery could grind to a halt. Bug reported by Kambiz
+ Aghaiepour.
+
+ - Docstring fix bin/newlist to remove mention of "immediate"
+ argument (Thomas Wouters).
+
+ - Fix for bin/update when PREFIX != VAR_PREFIX (SF bug #229794 --
+ Thomas Wouters).
+
+_______________________________________________
+Mailman-announce mailing list
+Mailman-announce@python.org
+http://mail.python.org/mailman/listinfo/mailman-announce
+
+--41A6B47B9D.983905333/babylon.bucks.net--
+
+
diff --git a/tests/bounces/qmail_01.txt b/tests/bounces/qmail_01.txt
new file mode 100644
index 00000000..dbe6f435
--- /dev/null
+++ b/tests/bounces/qmail_01.txt
@@ -0,0 +1,103 @@
+From VM Thu Oct 4 15:25:26 2001
+X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
+ [nil "" "4" "November" "1999" "21:42:45" "-0000" "MAILER-DAEMON@gate0.n-h.net" "MAILER-DAEMON@gate0.n-h.net" nil "89" "failure notice" "^From:" nil nil "11" nil nil nil nil nil]
+ nil)
+Message-Id: <199911042119.QAA21584@python.org>
+Content-Length: 3215
+MIME-Version: 1.0
+From: MAILER-DAEMON@gate0.n-h.net
+To: psa-members-admin@python.org
+Subject: failure notice
+Date: 4 Nov 1999 21:42:45 -0000
+X-Digest: Mailman bounce lack-of-detection
+
+Hi. This is the qmail-send program at gate0.n-h.net.
+I'm afraid I wasn't able to deliver your message to the following addresses.
+This is a permanent error; I've given up. Sorry it didn't work out.
+
+<psadisc@wwwmail.n-h.de>:
+
+--- Below this line is a copy of the message.
+
+Return-Path: <psa-members-admin@python.org>
+Received: (qmail 23042 invoked from network); 4 Nov 1999 21:42:35 -0000
+Received: from one.n-h.net (HELO n-h.net) (root@195.254.4.1)
+ by wwwmail.n-h.de with SMTP; 4 Nov 1999 21:42:35 -0000
+Received: from python.org (parrot.python.org [132.151.1.90])
+ by n-h.net (8.8.5/8.8.5) with ESMTP id WAA00074
+ for <psadisc@n-h.net>; Thu, 4 Nov 1999 22:45:15 +0100
+Received: from python.org (localhost [127.0.0.1])
+ by python.org (8.9.1a/8.9.1) with ESMTP id QAA20872;
+ Thu, 4 Nov 1999 16:10:19 -0500 (EST)
+Received: from origin.ea.com (hidden-user@gnat6.owo.com [208.12.170.6])
+ by python.org (8.9.1a/8.9.1) with ESMTP id QAA20823
+ for <psa-members@python.org>; Thu, 4 Nov 1999 16:09:48 -0500 (EST)
+Received: from forest.origin.ea.com (molach.origin.ea.com [159.153.98.2])
+ by origin.ea.com (8.8.8/8.8.8PJ) with ESMTP id PAA19774;
+ Thu, 4 Nov 1999 15:26:35 -0600 (CST)
+Received: by molach.origin.ea.com with Internet Mail Service (5.5.2448.0)
+ id <VWGD5VQP>; Thu, 4 Nov 1999 15:00:30 -0600
+Message-ID: <11A17AA2B9EAD111BCEA00A0C9B4179303385B62@molach.origin.ea.com>
+From: "Asbahr, Jason" <Jasbahr@origin.EA.com>
+To: "'beazley@cs.uchicago.edu'" <beazley@cs.uchicago.edu>, chriss@dnastar.com
+Cc: psa-members@python.org
+Subject: RE: [PSA MEMBERS] ObjC.py ?
+Date: Thu, 4 Nov 1999 15:00:29 -0600
+MIME-Version: 1.0
+X-Mailer: Internet Mail Service (5.5.2448.0)
+Content-Type: text/plain;
+ charset="iso-8859-1"
+Sender: psa-members-admin@python.org
+Errors-To: psa-members-admin@python.org
+X-Mailman-Version: 1.0.2
+Precedence: bulk
+List-Id: Python Software Activity members discussion list <psa-members.python.org>
+X-BeenThere: psa-members@python.org
+
+I had the impression that SWIG supported the relatively recent
+versions of GNU ObjC, but not earlier versions, such as NeXT's
+original ObjC extensions to GCC. True?
+
+Cheers,
+
+Jason Asbahr
+Origin Systems, Inc.
+jasbahr@origin.ea.com
+
+-----Original Message-----
+From: David Beazley [mailto:beazley@cs.uchicago.edu]
+Sent: Wednesday, November 03, 1999 11:13 PM
+To: chriss@dnastar.com
+Cc: psa-members@python.org
+Subject: Re: [PSA MEMBERS] ObjC.py ?
+
+
+chriss@dnastar.com writes:
+> Does anyone know what is left of the effort to interface
+Python/ObjectiveC?
+> E.g. is there a module, bits of code ... ?
+>
+
+Well, it's not widely known, but SWIG has some support for ObjectiveC.
+I haven't used this feature of SWIG in quite awhile, but I did use it
+to build some Python interfaces to some simple ObjectiveC programs I
+wrote about 3 years ago. I can't think of any reason why it wouldn't
+work (unless there has been some sort of bit-rot that I'm not aware
+of).
+
+Cheers,
+
+Dave
+
+
+_______________________________________________
+PSA-members mailing list
+PSA-members@python.org
+http://www.python.org/mailman/listinfo/psa-members
+
+_______________________________________________
+PSA-members mailing list
+PSA-members@python.org
+http://www.python.org/mailman/listinfo/psa-members
+
+
diff --git a/tests/bounces/sendmail_01.txt b/tests/bounces/sendmail_01.txt
new file mode 100644
index 00000000..cfea95a2
--- /dev/null
+++ b/tests/bounces/sendmail_01.txt
@@ -0,0 +1,146 @@
+From VM Sat Oct 14 00:29:43 2000
+Return-Path: <mailman-users-admin@python.org>
+Delivered-To: bxxxxx@mail.wooz.org
+Received: from ns1.beopen.com (unknown [208.185.174.104])
+ by mail.wooz.org (Postfix) with ESMTP id DF2B1D38CD
+ for <yyyyy@wooz.org>; Sat, 14 Oct 2000 00:16:04 -0400 (EDT)
+Received: from dinsdale.python.org (dinsdale.cnri.reston.va.us [132.151.1.21])
+ by ns1.beopen.com (8.9.3/8.9.3) with ESMTP id VAA04124
+ for <bxxxxx@beopen.com>; Fri, 13 Oct 2000 21:17:08 -0700 (PDT)
+ (envelope-from mailman-users-admin@python.org)
+Received: from dinsdale.python.org (localhost [127.0.0.1])
+ by dinsdale.python.org (Postfix) with ESMTP id 46F711D08C
+ for <bxxxxx@beopen.com>; Sat, 14 Oct 2000 00:15:15 -0400 (EDT)
+Delivered-To: mailman-users-admin@python.org
+Received: from banzai.nfg.nl (banzai.nfg.nl [194.109.206.156])
+ by dinsdale.python.org (Postfix) with ESMTP id 201661D08C
+ for <mailman-users-admin@python.org>; Sat, 14 Oct 2000 00:14:45 -0400 (EDT)
+Received: from localhost (localhost)
+ by banzai.nfg.nl (8.9.3/8.9.3/Debian 8.9.3-21) with internal id GAB17388;
+ Sat, 14 Oct 2000 06:14:45 +0200
+Message-Id: <200010140414.GAB17388@banzai.nfg.nl>
+Auto-Submitted: auto-generated (failure)
+Errors-To: mailman-users-owner@python.org
+Precedence: bulk
+List-Help: <mailto:mailman-users-request@python.org?subject=help>
+List-Post: <mailto:mailman-users@python.org>
+List-Subscribe: <http://www.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=subscribe>
+List-Id: Mailman mailing list management users <mailman-users.python.org>
+List-Unsubscribe: <http://www.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=unsubscribe>
+List-Archive: <http://www.python.org/pipermail/mailman-users/>
+From: Mail Delivery Subsystem <MAILER-DAEMON@banzai.nfg.nl>
+Sender: mailman-users-owner@python.org
+To: mailman-users-admin@python.org
+To: postmaster@banzai.nfg.nl
+Subject: Returned mail: Too many hops 26 (25 max): from mailman-users-admin@python.org via localhost, to zzzzz@nfg.nl
+Date: Sat, 14 Oct 2000 06:14:45 +0200
+X-BeenThere: mailman-users@python.org
+X-Mailman-Version: 2.0beta6
+
+The original message was received at Sat, 14 Oct 2000 06:14:45 +0200
+from uucp@localhost
+
+ ----- The following addresses had permanent fatal errors -----
+zzzzz@shaft.coal.nl
+ (expanded from: zzzzz@nfg.nl)
+
+ ----- Transcript of session follows -----
+554 Too many hops 26 (25 max): from mailman-users-admin@python.org via localhost, to zzzzz@nfg.nl
+
+ ----- Message header follows -----
+
+Return-Path: <mailman-users-admin@python.org>
+Received: (from uucp@localhost)
+ by banzai.nfg.nl (8.9.3/8.9.3/Debian 8.9.3-21) with UUCP id GAA17388
+ for zzzzz@nfg.nl; Sat, 14 Oct 2000 06:14:45 +0200
+Received: by shaft.coal.nl (Postfix, from userid 10)
+ id A9BAE1B30B; Sat, 14 Oct 2000 06:06:08 +0200 (CEST)
+Received: (from uucp@localhost)
+ by banzai.nfg.nl (8.9.3/8.9.3/Debian 8.9.3-21) with UUCP id XAA25085
+ for zzzzz@nfg.nl; Fri, 13 Oct 2000 23:55:54 +0200
+Received: by shaft.coal.nl (Postfix, from userid 10)
+ id 62E251B307; Fri, 13 Oct 2000 23:46:43 +0200 (CEST)
+Received: (from uucp@localhost)
+ by banzai.nfg.nl (8.9.3/8.9.3/Debian 8.9.3-21) with UUCP id XAA20156
+ for zzzzz@nfg.nl; Fri, 13 Oct 2000 23:35:01 +0200
+Received: by shaft.coal.nl (Postfix, from userid 10)
+ id 247881B308; Fri, 13 Oct 2000 23:26:09 +0200 (CEST)
+Received: (from uucp@localhost)
+ by banzai.nfg.nl (8.9.3/8.9.3/Debian 8.9.3-21) with UUCP id XAA15152
+ for zzzzz@nfg.nl; Fri, 13 Oct 2000 23:15:47 +0200
+Received: by shaft.coal.nl (Postfix, from userid 10)
+ id E91F81B308; Fri, 13 Oct 2000 23:06:29 +0200 (CEST)
+Received: (from uucp@localhost)
+ by banzai.nfg.nl (8.9.3/8.9.3/Debian 8.9.3-21) with UUCP id WAA09896
+ for zzzzz@nfg.nl; Fri, 13 Oct 2000 22:54:42 +0200
+Received: by shaft.coal.nl (Postfix, from userid 10)
+ id 51CA11B308; Fri, 13 Oct 2000 22:45:24 +0200 (CEST)
+Received: (from uucp@localhost)
+ by banzai.nfg.nl (8.9.3/8.9.3/Debian 8.9.3-21) with UUCP id WAA04651
+ for zzzzz@nfg.nl; Fri, 13 Oct 2000 22:34:41 +0200
+Received: by shaft.coal.nl (Postfix, from userid 10)
+ id 6C48F1B308; Fri, 13 Oct 2000 22:25:19 +0200 (CEST)
+Received: (from uucp@localhost)
+ by banzai.nfg.nl (8.9.3/8.9.3/Debian 8.9.3-21) with UUCP id WAA31892
+ for zzzzz@nfg.nl; Fri, 13 Oct 2000 22:14:14 +0200
+Received: by shaft.coal.nl (Postfix, from userid 10)
+ id 8ABF91B308; Fri, 13 Oct 2000 22:04:33 +0200 (CEST)
+Received: (from uucp@localhost)
+ by banzai.nfg.nl (8.9.3/8.9.3/Debian 8.9.3-21) with UUCP id VAA26727
+ for zzzzz@nfg.nl; Fri, 13 Oct 2000 21:54:10 +0200
+Received: by shaft.coal.nl (Postfix, from userid 10)
+ id A44BC1B308; Fri, 13 Oct 2000 21:44:57 +0200 (CEST)
+Received: (from uucp@localhost)
+ by banzai.nfg.nl (8.9.3/8.9.3/Debian 8.9.3-21) with UUCP id VAA21600
+ for zzzzz@nfg.nl; Fri, 13 Oct 2000 21:33:40 +0200
+Received: by shaft.coal.nl (Postfix, from userid 10)
+ id 56B311B308; Fri, 13 Oct 2000 21:24:00 +0200 (CEST)
+Received: (from uucp@localhost)
+ by banzai.nfg.nl (8.9.3/8.9.3/Debian 8.9.3-21) with UUCP id VAA16279
+ for zzzzz@nfg.nl; Fri, 13 Oct 2000 21:13:21 +0200
+Received: by shaft.coal.nl (Postfix, from userid 10)
+ id 409701B308; Fri, 13 Oct 2000 21:04:32 +0200 (CEST)
+Received: (from uucp@localhost)
+ by banzai.nfg.nl (8.9.3/8.9.3/Debian 8.9.3-21) with UUCP id UAA11084
+ for zzzzz@nfg.nl; Fri, 13 Oct 2000 20:53:53 +0200
+Received: by shaft.coal.nl (Postfix, from userid 10)
+ id 05A9E1B307; Fri, 13 Oct 2000 20:44:14 +0200 (CEST)
+Received: from dinsdale.python.org (dinsdale.cnri.reston.va.us [132.151.1.21])
+ by banzai.nfg.nl (8.9.3/8.9.3/Debian 8.9.3-21) with ESMTP id UAA08474
+ for <zzzzz@nfg.nl>; Fri, 13 Oct 2000 20:41:13 +0200
+X-Authentication-Warning: banzai.nfg.nl: Host dinsdale.cnri.reston.va.us [132.151.1.21] claimed to be dinsdale.python.org
+Received: from dinsdale.python.org (localhost [127.0.0.1])
+ by dinsdale.python.org (Postfix) with ESMTP
+ id A1F631CFCC; Fri, 13 Oct 2000 14:38:00 -0400 (EDT)
+Delivered-To: mailman-users@python.org
+Received: from raptor.ebuilt.net (unknown [216.237.34.38])
+ by dinsdale.python.org (Postfix) with ESMTP id 7D3B21CDB9
+ for <mailman-users@python.org>; Fri, 13 Oct 2000 14:35:02 -0400 (EDT)
+Received: by raptor.ebuilt.net with Internet Mail Service (5.5.2650.21)
+ id <4V699WRN>; Fri, 13 Oct 2000 11:35:00 -0700
+Message-ID: <AA1E32BC8A58D411A2CB0050DACEDA43750916@raptor.ebuilt.net>
+From: "Young, Roger" <RYoung@eBuilt.com>
+To: mailman-users@python.org
+X-Mailer: Internet Mail Service (5.5.2650.21)
+Subject: [Mailman-Users] auto responder
+Sender: mailman-users-admin@python.org
+Errors-To: mailman-users-admin@python.org
+X-BeenThere: mailman-users@python.org
+X-Mailman-Version: 2.0beta6
+Precedence: bulk
+List-Help: <mailto:mailman-users-request@python.org?subject=help>
+List-Post: <mailto:mailman-users@python.org>
+List-Subscribe: <http://www.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=subscribe>
+List-Id: Mailman mailing list management users <mailman-users.python.org>
+List-Unsubscribe: <http://www.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=unsubscribe>
+List-Archive: <http://www.python.org/pipermail/mailman-users/>
+Date: Fri, 13 Oct 2000 11:34:51 -0700
+
+ ----- Message body suppressed -----
+
+
+
diff --git a/tests/bounces/simple_01.txt b/tests/bounces/simple_01.txt
new file mode 100644
index 00000000..f2d2669f
--- /dev/null
+++ b/tests/bounces/simple_01.txt
@@ -0,0 +1,153 @@
+From VM Tue Feb 20 10:32:44 2001
+Return-Path: <jpython-interest-admin@python.org>
+Delivered-To: zzzzz@wwww.org
+Received: from digicool.com (host15.digitalcreations.d.subnet.rcn.com [208.59.6.15])
+ by mail.wwww.org (Postfix) with ESMTP id 06EA8D37AC
+ for <yyyyy@wwww.org>; Sun, 18 Feb 2001 03:26:37 -0500 (EST)
+Received: from <jpython-interest-admin@python.org>
+ by digicool.com (CommuniGate Pro RULES 3.3.2)
+ with RULES id 1483250; Sun, 18 Feb 2001 03:27:53 -0500
+Received: from ns2.digicool.com ([216.164.72.2] verified)
+ by digicool.com (CommuniGate Pro SMTP 3.3.2)
+ with ESMTP id 1483249 for yyyyy@mail.digicool.com; Sun, 18 Feb 2001 03:27:53 -0500
+Received: from mail.python.org (mail.python.org [63.102.49.29])
+ by ns2.digicool.com (8.9.3/8.9.3) with ESMTP id DAA13272
+ for <yyyyy@digicool.com>; Sun, 18 Feb 2001 03:25:56 -0500
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 14UPAP-0001ei-00
+ for yyyyy@digicool.com; Sun, 18 Feb 2001 03:26:01 -0500
+Received: from [63.118.43.131] (helo=receive.turbosport.com)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 14UP9j-0001c7-00
+ for jpython-interest-admin@python.org; Sun, 18 Feb 2001 03:25:19 -0500
+Received: from receive.turbosport.com [63.118.43.131] by receive.turbosport.com [63.118.43.131]
+ with RAW (MDaemon.v3.5.2.R)
+ for <jpython-interest-admin@python.org>; Sun, 18 Feb 2001 02:26:12 -0600
+Message-ID: <MDAEMON2560256200102180226.AA2612019@receive.turbosport.com>
+Mime-Version: 1.0
+Content-Type: multipart/mixed; boundary="0218-0226-12-PART-BREAK"
+Precedence: bulk
+List-Help: <mailto:jpython-interest-request@python.org?subject=help>
+List-Post: <mailto:jpython-interest@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/jpython-interest>,
+ <mailto:jpython-interest-request@python.org?subject=subscribe>
+List-Id: Python for the Java<SUP><FONT SIZE=-2>TM</FONT></SUP> Platform <jpython-interest.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/jpython-interest>,
+ <mailto:jpython-interest-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/jpython-interest/>
+From: MDaemon@receive.turbosport.com
+Sender: jpython-interest-owner@python.org
+To: jpython-interest-admin@python.org
+Subject: Permanent Delivery Failure
+Date: Sun, 18 Feb 2001 02:26:12 -0600
+X-Autogenerated: Mirror
+X-Mirrored-by: <jpython-interest-admin@python.org>
+X-MDSend-Notifications-To: [trash]
+X-MDaemon-Deliver-To: jpython-interest-admin@python.org
+X-Actual-From: MDaemon@receive.turbosport.com
+X-BeenThere: jpython-interest@python.org
+X-Mailman-Version: 2.0.1 (101270)
+Reply-To: BadMsgQ@receive.turbosport.com
+
+ The following data may contain sections which represent BASE64 encoded
+ file attachments. These sections will be unreadable without MIME aware
+ tools. Seek your system administrator if you need help extracting any
+ files which may be embedded within this message.
+
+--0218-0226-12-PART-BREAK
+Content-Type: text/plain; charset=US-ASCII
+Content-Transfer-Encoding: 7bit
+
+The attached message had PERMANENT fatal delivery errors!
+
+After one or more unsuccessful delivery attempts the attached message has
+been removed from the mail queue on this server. The number and frequency
+of delivery attempts are determined by local configuration parameters.
+
+YOUR MESSAGE WAS NOT DELIVERED!
+
+The following addresses did NOT receive a copy of your message:
+
+> bbbsss@turbosport.com
+
+--- Session Transcript ---
+ Attempting SMTP connection to [63.118.43.130 : 25]
+ Waiting for socket connection...
+ Socket connection established
+ Waiting for protocol initiation...
+ 220 turbosport.com ESMTP MDaemon 3.5.2 ready
+ EHLO receive.turbosport.com
+ 250-turbosport.com Hello receive.turbosport.com, ESMTP hello!
+ 250-VRFY
+ 250-EXPN
+ 250-ETRN
+ 250-AUTH LOGIN CRAM-MD5
+ 250-8BITMIME
+ 250 SIZE 40000000
+ MAIL From:<jpython-interest-admin@python.org> SIZE=1861
+ 250 <jpython-interest-admin@python.org>, Sender ok
+ RCPT To:<bbbsss@turbosport.com>
+ 552 Message for <bbbsss@turbosport.com> would exceed mailbox quota
+ QUIT
+--- End Transcript ---
+
+: Message contains [1] file attachments
+
+--0218-0226-12-PART-BREAK
+Content-Type: message/rfc822; charset=US-ASCII; name="md50002271709.md"
+Content-Transfer-Encoding: 7bit
+Content-ID: <MDAEMON2560256200102180226.AA2612019@receive.turbosport.com>
+Content-Description:
+
+Return-path: <jpython-interest-admin@python.org>
+Received: from mta540.mail.yahoo.com [216.136.131.22] by receive.turbosport.com [63.118.43.131]
+ with SMTP (MDaemon.v3.5.2.R)
+ for <bbbsss@turbosport.com>; Sun, 18 Feb 2001 02:25:20 -0600
+Message-ID: <20010218082300.42071.qmail@mta540.mail.yahoo.com>
+Received: from mta540.mail.yahoo.com for bbbsss@turbosport.com; Feb 18 00:23:00 2001 -0800
+Received: from smtp015.mail.yahoo.com (216.136.173.59)
+X-Yahoo-Forwarded: from aaaaa_20@yahoo.com to bbbsss@turbosport.com
+ by mta540.mail.yahoo.com with SMTP; 18 Feb 2001 00:23:00 -0800 (PST)
+Date: 18 Feb 2001 08:22:57 -0000
+From: MAILER-DAEMON@yahoo.com
+To: aaaaa@yahoo.com
+Subject: failure delivery
+X-MDRcpt-To: bbbsss@turbosport.com
+X-MDRemoteIP: 216.136.131.22
+X-Return-Path: jpython-interest-admin@python.org
+X-MDaemon-Deliver-To: bbbsss@turbosport.com
+
+Message from yahoo.com.
+Unable to deliver message to the following address(es).
+
+<subscribe.motorcycles@listsociety.com>:
+Sorry, I wasn't able to establish an SMTP connection. (#4.4.1)
+I'm not going to try again; this message has been in the queue too long.
+
+--- Original message follows.
+
+Return-Path: <aaaaa@yahoo.com>
+Received: from c58148.upc-c.chello.nl (HELO localhost) (212.187.58.148)
+ by smtp.mail.vip.sc5.yahoo.com with SMTP; 11 Feb 2001 01:15:27 -0000
+X-Apparently-From: <aaaaa?20@yahoo.com>
+X-Sender: aaaaa@yahoo.com
+From: Albert Ttttt <aaaaa@yahoo.com>
+To: subscribe.motorcycles@listsociety.com
+Date: Sun, 11 Feb 2001 02:14:40 +0100
+Subject: Subscribe
+Reply-To: aaaaa@yahoo.com
+MIME-Version: 1.0
+Content-Type: text/plain; charset=iso-8859-1
+Content-Transfer-Encoding: 7bit
+
+
+
+_________________________________________________________
+Do You Yahoo!?
+Get your free @yahoo.com address at http://mail.yahoo.com
+
+--0218-0226-12-PART-BREAK--
+
+
+
diff --git a/tests/bounces/simple_02.txt b/tests/bounces/simple_02.txt
new file mode 100644
index 00000000..f017fa25
--- /dev/null
+++ b/tests/bounces/simple_02.txt
@@ -0,0 +1,118 @@
+From VM Thu Feb 22 16:05:17 2001
+Return-Path: <python-list-admin@python.org>
+Delivered-To: zzzzz@wwww.org
+Received: from digicool.com (host15.digitalcreations.d.subnet.rcn.com [208.59.6.15])
+ by mail.wwww.org (Postfix) with ESMTP id AD081D37AC
+ for <zzzzz@wwww.org>; Thu, 22 Feb 2001 04:54:37 -0500 (EST)
+Received: from <python-list-admin@python.org>
+ by digicool.com (CommuniGate Pro RULES 3.3.2)
+ with RULES id 1498944; Thu, 22 Feb 2001 04:56:22 -0500
+Received: from ns2.digicool.com ([216.164.72.2] verified)
+ by digicool.com (CommuniGate Pro SMTP 3.3.2)
+ with ESMTP id 1498943 for zzzzz@mail.digicool.com; Thu, 22 Feb 2001 04:56:22 -0500
+Received: from mail.python.org (mail.python.org [63.102.49.29])
+ by ns2.digicool.com (8.9.3/8.9.3) with ESMTP id EAA15538
+ for <zzzzz@digicool.com>; Thu, 22 Feb 2001 04:54:14 -0500
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 14VsRz-0002Md-00
+ for zzzzz@digicool.com; Thu, 22 Feb 2001 04:54:15 -0500
+Received: from [204.68.24.95] (helo=nm195.netaddress.usa.net)
+ by mail.python.org with smtp (Exim 3.21 #1)
+ id 14VsRh-0002K2-00
+ for python-list-admin@python.org; Thu, 22 Feb 2001 04:53:57 -0500
+Received: (qmail 1169 invoked by uid 0); 22 Feb 2001 09:51:46 -0000
+Message-ID: <20010222095146.1166.qmail@nm195.netaddress.usa.net>
+Precedence: bulk
+List-Help: <mailto:python-list-request@python.org?subject=help>
+List-Post: <mailto:python-list@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=subscribe>
+List-Id: General discussion list for the Python programming language <python-list.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/python-list/>
+From: MAILER-DAEMON@usa.net
+Sender: python-list-owner@python.org
+To: python-list-admin@python.org
+Subject: Processing Error
+Date: 22 Feb 2001 09:51:46 -0000
+X-Autogenerated: Mirror
+X-Mirrored-by: <python-list-admin@python.org>
+X-BeenThere: python-list@python.org
+X-Mailman-Version: 2.0.1 (101270)
+
+Intended recipient: chris.ggggmmmm@usa.net
+
+The following mail has been returned because it encountered an error
+while being processed. Please try to resend this message.
+
+A notice of this error has been reported to the POSTMASTER at USA.NET
+which will attempt to contact the intended recipient.
+
+--------RETURNED MAIL FOLLOWS--------
+Received: from mail.python.org [63.102.49.29] by nm195 via mtad (34FM.0700.12.01)
+ with ESMTP id 167FBVJzI0889M19; Thu, 22 Feb 2001 09:51:43 GMT
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 14Vs49-0000n4-00; Thu, 22 Feb 2001 04:29:37 -0500
+Path: news.baymountain.net!uunet!ash.uu.net!npeer.kpnqwest.net!news.tele.dk!130.133.1.3!fu-berlin.de!uni-berlin.de!adsl-138-89-39-3.nnj.adsl.bellatlantic.NET!not-for-mail
+From: ccccc@meezon.com (Ccccc Mmmmm)
+Newsgroups: comp.lang.python
+Subject: Re: import statement is case sensitive
+Lines: 28
+Message-ID: <3a947ac4.802440@News.CIS.DFN.DE>
+References: <3a943bea.525315589@News.CIS.DFN.DE> <t98i9hsgjkov26@corp.supernews.com>
+NNTP-Posting-Host: adsl-138-89-39-3.nnj.adsl.bellatlantic.net (138.89.39.3)
+X-Trace: fu-berlin.de 982810722 24108160 138.89.39.3 (16 [57226])
+X-Newsreader: Forte Free Agent 1.1/32.230
+Xref: news.baymountain.net comp.lang.python:89820
+To: python-list@python.org
+Sender: python-list-admin@python.org
+Errors-To: python-list-admin@python.org
+X-BeenThere: python-list@python.org
+X-Mailman-Version: 2.0.1 (101270)
+Precedence: bulk
+List-Help: <mailto:python-list-request@python.org?subject=help>
+List-Post: <mailto:python-list@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=subscribe>
+List-Id: General discussion list for the Python programming language <python-list.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/python-list/>
+Date: Thu, 22 Feb 2001 02:58:29 GMT
+
+"Lyle" <lllll@rrrrgggg.com> wrote:
+
+>> Also what is the purpose of even having it case sensitive. I've yet to
+>> see a file system that has case sensitive filenames....
+>
+>There is an operating system called "Unix" that has case-sensitive file
+>names. There is a slight chance that others on this newsgroup have also
+>heard of this obscure operating system.
+>
+
+Well given the fact that Linux and Windows is beating it to death I
+can see why Unix is becoming obscure :)
+
+Actually I would consider this a shortcoming of Unix. Shipping a
+product that depends on the directory names and files being in the
+right case must cause all sorts of headaches.
+
+I am trying to run an an application under Windows and now I have to
+worry if my directory name is in the correct case. I use PythonWin (a
+fantastic product) to run and test it. There is no option for telling
+it to ignore the case of the import filenames that I could see.
+
+And renaming directories and files is not an easy option.. But anyway,
+this is should automatically be handled in Python depending on the OS.
+
+
+Why would asnyone make the same filenames with different cases? Is
+there a good use?
+--
+http://mail.python.org/mailman/listinfo/python-list
+---------END OF RETURNED MAIL--------
+
+
diff --git a/tests/bounces/simple_03.txt b/tests/bounces/simple_03.txt
new file mode 100644
index 00000000..16fc04d6
--- /dev/null
+++ b/tests/bounces/simple_03.txt
@@ -0,0 +1,68 @@
+From VM Mon Apr 2 02:29:26 2001
+X-VM-v5-Data: ([nil nil nil nil nil nil t nil nil]
+ [nil "Monday" "2" "April" "2001" "08:27:16" "+0200" "Mail Delivery System" "Mailer-Daemon@pop3.pta.lia.net" nil "18" "Warning: message 14jRTi-0007jE-00 delayed 24 hours" "^From:" "python-list-admin@python.org" "python-list-admin@python.org" "4" nil nil nil nil nil]
+ nil)
+Return-Path: <python-list-admin@python.org>
+Delivered-To: bwarsaw@wooz.org
+Received: from digicool.com (host15.digitalcreations.d.subnet.rcn.com [208.59.6.15])
+ by mail.wooz.org (Postfix) with ESMTP id 458FAD3757
+ for <barry@wooz.org>; Mon, 2 Apr 2001 02:25:41 -0400 (EDT)
+Received: from <python-list-admin@python.org>
+ by digicool.com (CommuniGate Pro RULES 3.4)
+ with RULES id 1746501; Mon, 02 Apr 2001 02:27:54 -0400
+Received: from ns2.digicool.com ([216.164.72.2] verified)
+ by digicool.com (CommuniGate Pro SMTP 3.4)
+ with ESMTP id 1746500 for barry@mail.digicool.com; Mon, 02 Apr 2001 02:27:54 -0400
+Received: from mail.python.org (mail.python.org [63.102.49.29])
+ by ns2.digicool.com (8.9.3/8.9.3) with ESMTP id CAA09080
+ for <barry@digicool.com>; Mon, 2 Apr 2001 02:28:02 -0400
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 14jxoo-0003mt-00
+ for barry@digicool.com; Mon, 02 Apr 2001 02:28:02 -0400
+Received: from [196.22.216.11] (helo=pop3.pta.lia.net ident=root)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 14jxo8-0003hg-00
+ for python-list-admin@python.org; Mon, 02 Apr 2001 02:27:23 -0400
+Received: from root by pop3.pta.lia.net with local (Exim 1.92 #1)
+ for python-list-admin@python.org
+ id 14jxo4-00007H-00; Mon, 2 Apr 2001 08:27:16 +0200
+Message-Id: <E14jxo4-00007H-00@pop3.pta.lia.net>
+Precedence: bulk
+List-Help: <mailto:python-list-request@python.org?subject=help>
+List-Post: <mailto:python-list@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=subscribe>
+List-Id: General discussion list for the Python programming language <python-list.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/python-list/>
+From: Mail Delivery System <Mailer-Daemon@pop3.pta.lia.net>
+Sender: python-list-owner@python.org
+To: python-list-admin@python.org
+Subject: Warning: message 14jRTi-0007jE-00 delayed 24 hours
+Date: Mon, 2 Apr 2001 08:27:16 +0200
+X-Autogenerated: Mirror
+X-Mirrored-by: <python-list-admin@python.org>
+X-BeenThere: python-list@python.org
+X-Mailman-Version: 2.0.3 (101270)
+
+This message was created automatically by mail delivery software.
+
+A message that you sent has not yet been delivered to all its recipients
+after more than 24 hours on the queue on pop3.pta.lia.net.
+
+The message identifier is: 14jRTi-0007jE-00
+The subject of the message is: I want to learn PYTHON!
+The date of the message is: Sat, 31 Mar 2001 14:33:06 -0500
+
+The address to which the message has not yet been delivered is:
+
+ jacobus@geo.co.za
+
+No action is required on your part. Delivery attempts will continue for
+some time, and this warning may be repeated at intervals if the message
+remains undelivered. Eventually the mail delivery software will give up,
+and when that happens, the message will be returned to you.
+
+
diff --git a/tests/bounces/simple_04.txt b/tests/bounces/simple_04.txt
new file mode 100644
index 00000000..022a3198
--- /dev/null
+++ b/tests/bounces/simple_04.txt
@@ -0,0 +1,105 @@
+From VM Sat Aug 4 01:17:43 2001
+X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
+ [nil "Friday" "3" "August" "2001" "23:59:56" "-0500" "MAILER-DAEMON@airmail.net" "MAILER-DAEMON@airmail.net" nil "51" "mail failed, returning to sender" "^From:" nil nil "8" nil nil nil nil nil]
+ nil)
+Return-Path: <mailman-users-admin@python.org>
+Delivered-To: barry@wooz.org
+Received: from digicool.com (unknown [63.100.190.15])
+ by mail.wooz.org (Postfix) with ESMTP id D0258D3738
+ for <barry@wooz.org>; Sat, 4 Aug 2001 01:00:57 -0400 (EDT)
+Received: from <mailman-users-admin@python.org>
+ by digicool.com (CommuniGate Pro RULES 3.4)
+ with RULES id 2491440; Sat, 04 Aug 2001 01:01:04 -0400
+Received: from smtp.zope.com ([63.100.190.10] verified)
+ by digicool.com (CommuniGate Pro SMTP 3.4)
+ with ESMTP id 2491439 for barry@mail.zope.com; Sat, 04 Aug 2001 01:01:04 -0400
+Received: from mail.python.org (mail.python.org [63.102.49.29])
+ by smtp.zope.com (8.11.2/8.11.2) with ESMTP id f74511X29279
+ for <barry@zope.com>; Sat, 4 Aug 2001 01:01:01 -0400
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 15StYa-0005er-00; Sat, 04 Aug 2001 01:01:00 -0400
+Received: from [209.196.77.104] (helo=mx7.airmail.net)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 15StYG-0005ec-00
+ for mailman-users-admin@python.org; Sat, 04 Aug 2001 01:00:40 -0400
+Received: from mail3.iadfw.net ([209.196.123.3])
+ by mx7.airmail.net with smtp (Exim 3.16 #10)
+ id 15StY6-000E5t-00
+ for mailman-users-admin@python.org; Sat, 04 Aug 2001 00:00:30 -0500
+Received: from mail3.iadfw.net by mail3.iadfw.net
+ (/\##/\ Smail3.1.30.16 #30.25) with bsmtp for <mailman-users-admin@python.org> sender: <MAILER-DAEMON>
+ id <my/15StXY-00385Ey@mail3.iadfw.net>; Fri, 3 Aug 2001 23:59:56 -0500 (CDT)
+Message-Id: <my/15StXY-00385Ey@mail3.iadfw.net>
+Reference: <mm/15StXR-003859m@mail3.iadfw.net>
+Precedence: bulk
+List-Help: <mailto:mailman-users-request@python.org?subject=help>
+List-Post: <mailto:mailman-users@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=subscribe>
+List-Id: Mailman mailing list management users <mailman-users.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/mailman-users/>
+From: <MAILER-DAEMON@airmail.net>
+Sender: mailman-users-owner@python.org
+To: mailman-users-admin@python.org
+Subject: mail failed, returning to sender
+Date: Fri, 3 Aug 2001 23:59:56 -0500 (CDT)
+X-Autogenerated: Mirror
+X-Mirrored-by: <mailman-users-admin@python.org>
+X-BeenThere: mailman-users@python.org
+X-Mailman-Version: 2.0.6 (101270)
+
+|------------------------- Message log follows: -------------------------|
+ no valid recipients were found for this message
+|------------------------- Failed addresses follow: ---------------------|
+ claird@starbase.neosoft.com ... unknown host
+|------------------------- Message text follows: ------------------------|
+Received: from mx1.airmail.net from [209.196.77.98] by mail3.iadfw.net
+ (/\##/\ Smail3.1.30.16 #30.25) with esmtp sender: <mailman-users-admin@python.org>
+ id <mm/15StXR-003859m@mail3.iadfw.net>; Fri, 3 Aug 2001 23:59:49 -0500 (CDT)
+Received: from mail.python.org ([63.102.49.29])
+ by mx1.airmail.net with esmtp (Exim 3.16 #10)
+ id 15StVY-000P3g-00
+ for claird@neosoft.com; Fri, 03 Aug 2001 23:57:52 -0500
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 15StSp-0005bx-00; Sat, 04 Aug 2001 00:55:03 -0400
+Received: from [206.81.192.3] (helo=sttlpop3.sttl.uswest.net)
+ by mail.python.org with smtp (Exim 3.21 #1)
+ id 15StRq-0005bS-00
+ for mailman-users@python.org; Sat, 04 Aug 2001 00:54:02 -0400
+Received: (qmail 14391 invoked by alias); 4 Aug 2001 04:53:49 -0000
+Delivered-To: fixup-mailman-users@python.org@fixme
+Received: (qmail 14361 invoked by uid 0); 4 Aug 2001 04:53:48 -0000
+Received: from sttldslgw14poola186.sttl.uswest.net (HELO first-last.ocentrix.com) (63.229.16.186)
+ by sttlpop3.sttl.uswest.net with SMTP; 4 Aug 2001 04:53:48 -0000
+Message-Id: <5.0.2.1.0.20010803211707.04770ce0@mail.ocentrix.com>
+X-Sender: benwa@mail.ocentrix.com
+X-Mailer: QUALCOMM Windows Eudora Version 5.0.2
+To: runaway@rahul.net (Colin Andrews)
+From: Ben Burnett <benwa@ocentrix.com>
+Subject: Re: [Mailman-Users] Excessive headers and Eudora
+Cc: mailman-users@python.org
+In-Reply-To: <20010803190718.3389699D03@waltz.rahul.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset="us-ascii"; format=flowed
+Sender: mailman-users-admin@python.org
+Errors-To: mailman-users-admin@python.org
+X-BeenThere: mailman-users@python.org
+X-Mailman-Version: 2.0.6 (101270)
+Precedence: bulk
+List-Help: <mailto:mailman-users-request@python.org?subject=help>
+List-Post: <mailto:mailman-users@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=subscribe>
+List-Id: Mailman mailing list management users <mailman-users.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/mailman-users/>
+Date: Fri, 03 Aug 2001 21:54:02 -0700
+
+[low-priority message, body not included]
+
+
diff --git a/tests/bounces/sina_01.txt b/tests/bounces/sina_01.txt
new file mode 100644
index 00000000..366500a9
--- /dev/null
+++ b/tests/bounces/sina_01.txt
@@ -0,0 +1,128 @@
+Return-Path: <boost-admin@lists.boost.org>
+Received: from mx04.mrf.mail.rcn.net ([207.172.4.53] [207.172.4.53])
+ by mta05.mrf.mail.rcn.net with ESMTP
+ id <20020403160608.EQZZ19155.mta05.mrf.mail.rcn.net@mx04.mrf.mail.rcn.net>;
+ Wed, 3 Apr 2002 11:06:08 -0500
+Received: from milliways.osl.iu.edu ([129.79.245.239])
+ by mx04.mrf.mail.rcn.net with esmtp (Exim 3.35 #5)
+ id 16snGx-0005F0-00
+ for david.abrahams@rcn.com; Wed, 03 Apr 2002 11:06:07 -0500
+Received: from milliways.osl.iu.edu (localhost [127.0.0.1])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with ESMTP id g33G61A24861;
+ Wed, 3 Apr 2002 11:06:01 -0500
+Received: from sina.com ([202.106.187.178])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with SMTP id g33G5CA24792
+ for <boost-admin@lists.boost.org>; Wed, 3 Apr 2002 11:05:13 -0500
+Message-Id: <200204031605.g33G5CA24792@milliways.osl.iu.edu>
+Received: (qmail 53818 invoked for bounce); 3 Apr 2002 15:55:44 -0000
+Date: 3 Apr 2002 15:55:44 -0000
+From: MAILER-DAEMON@sina.com
+To: boost-admin@lists.boost.org
+Subject: Óʼþ´«Êäʧ°Ü£¡
+MIME-Version: 1.0
+X-Priority: 3
+X-Mailer: SinaMail 3.0
+Content-Type: multipart/mixed;
+ boundary="----------101784934443375SINAEMAIL---"
+Sender: boost-owner@lists.boost.org
+Errors-To: boost-owner@lists.boost.org
+X-BeenThere: boost@lists.boost.org
+X-Mailman-Version: 2.0.8
+Precedence: bulk
+List-Help: <mailto:boost-request@lists.boost.org?subject=help>
+List-Post: <mailto:boost@lists.boost.org>
+List-Subscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=subscribe>
+List-Id: Boost mailing list <boost.lists.boost.org>
+List-Unsubscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=unsubscribe>
+List-Archive: <http://lists.boost.org/MailArchives/boost/>
+
+This is a multi-part message in MIME format.
+
+------------101784934443375SINAEMAIL---
+Content-Type: text/plain;
+ charset="gb2312"
+Content-Transfer-Encoding: binary
+
+sina.com.
+ÓʼþÎÞ·¨·¢Ë͵½ÄúÖ¸¶¨µÄµØÖ·ÖС£
+ÔÚÓʼþ´«Êä¹ý³ÌÖÐÓÉÓÚÍⲿµÄÎÞ·¨±ÜÃâµÄ´íÎóµ¼ÖÂÓʼþÎÞ·¨ËÍ´ï¡£
+
+<boboman76@sina.com>:
+
+<alan_t18@sina.com>:
+
+--- ¸½¼þÖеÄÄÚÈÝÊÇÔ­ÐżþµÄÒ»·Ý¿½±´
+
+------------101784934443375SINAEMAIL---
+Content-Type: message/rfc822;
+ name="original message.eml"
+Content-Transfer-Encoding: binary
+Content-Disposition: attachment;
+ filename="original message.eml"
+
+Return-Path: <boost-admin@lists.boost.org>
+Received: (qmail 31910 invoked from network); 3 Apr 2002 15:42:31 -0000
+Received: from unknown (HELO milliways.osl.iu.edu) (129.79.245.239)
+ by 202.106.187.178 with SMTP; 3 Apr 2002 15:42:31 -0000
+Received: from milliways.osl.iu.edu (localhost [127.0.0.1])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with ESMTP id g33FaGA24120;
+ Wed, 3 Apr 2002 10:36:16 -0500
+Received: from hotmail.com (f128.law10.hotmail.com [64.4.15.128])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with ESMTP id g33FYUA24076
+ for <boost@lists.boost.org>; Wed, 3 Apr 2002 10:34:31 -0500
+Received: from mail pickup service by hotmail.com with Microsoft SMTPSVC;
+ Wed, 3 Apr 2002 07:34:23 -0800
+Received: from 194.100.118.234 by lw10fd.law10.hotmail.msn.com with HTTP;
+ Wed, 03 Apr 2002 15:34:23 GMT
+X-Originating-IP: [194.100.118.234]
+From: "Vesa Karvonen" <vesa_karvonen@hotmail.com>
+To: boost@lists.boost.org
+Subject: Re: [boost] [Type Traits] Patch for type_with_alignment
+Mime-Version: 1.0
+Content-Type: text/plain; format=flowed
+Message-ID: <F128rzvsTDWWcuZcGwM00012d40@hotmail.com>
+X-OriginalArrivalTime: 03 Apr 2002 15:34:23.0543 (UTC) FILETIME=[07DF4470:01C1DB25]
+Sender: boost-admin@lists.boost.org
+Errors-To: boost-admin@lists.boost.org
+X-BeenThere: boost@lists.boost.org
+X-Mailman-Version: 2.0.8
+Precedence: bulk
+Reply-To: boost@lists.boost.org
+List-Help: <mailto:boost-request@lists.boost.org?subject=help>
+List-Post: <mailto:boost@lists.boost.org>
+List-Subscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=subscribe>
+List-Id: Boost mailing list <boost.lists.boost.org>
+List-Unsubscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=unsubscribe>
+List-Archive: <http://lists.boost.org/MailArchives/boost/>
+Date: Wed, 03 Apr 2002 18:34:23 +0300
+
+Douglas Gregor:
+>type_with_alignment<> is available in CVS.
+
+hmm... You are right, but it is in the compiler_supported_error_messages
+branch. Is this intentional?
+
+>I'm guessing we should also add aligned_storage somewhere, because I'm
+>sure quite a few of us will use it:
+
+Good idea.
+
+>Maybe this belongs in utility/aligned_storage.hpp?
+
+I have a feeling that something like this should probably go somewhere
+closer to <memory> rather than <utility>.
+
+
+_________________________________________________________________
+Send and receive Hotmail on your mobile device: http://mobile.msn.com
+
+_______________________________________________
+Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
+
+
+
+------------101784934443375SINAEMAIL----- \ No newline at end of file
diff --git a/tests/bounces/smtp32_01.txt b/tests/bounces/smtp32_01.txt
new file mode 100644
index 00000000..decf0ddc
--- /dev/null
+++ b/tests/bounces/smtp32_01.txt
@@ -0,0 +1,97 @@
+From VM Mon Apr 2 10:02:42 2001
+X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
+ [nil "Monday" "2" "April" "101" "04:20:10" "CST" "Postmaster" "postmaster@208.24.118.205" nil "48" "Undeliverable Mail" "^From:" nil nil "4" nil nil nil nil nil]
+ nil)
+Return-Path: <mailman-users-admin@python.org>
+Delivered-To: bwarsaw@wooz.org
+Received: from digicool.com (host15.digitalcreations.d.subnet.rcn.com [208.59.6.15])
+ by mail.wooz.org (Postfix) with ESMTP id B42DFD3757
+ for <barry@wooz.org>; Mon, 2 Apr 2001 06:21:39 -0400 (EDT)
+Received: from <mailman-users-admin@python.org>
+ by digicool.com (CommuniGate Pro RULES 3.4)
+ with RULES id 1746977; Mon, 02 Apr 2001 06:23:54 -0400
+Received: from ns2.digicool.com ([216.164.72.2] verified)
+ by digicool.com (CommuniGate Pro SMTP 3.4)
+ with ESMTP id 1746976 for barry@mail.digicool.com; Mon, 02 Apr 2001 06:23:54 -0400
+Received: from mail.python.org (mail.python.org [63.102.49.29])
+ by ns2.digicool.com (8.9.3/8.9.3) with ESMTP id GAA19223
+ for <barry@digicool.com>; Mon, 2 Apr 2001 06:24:01 -0400
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 14k1VB-0006KC-00
+ for barry@digicool.com; Mon, 02 Apr 2001 06:24:01 -0400
+Received: from [207.51.255.218] (helo=208.24.118.205)
+ by mail.python.org with smtp (Exim 3.21 #1)
+ id 14k1UG-0006Ia-00
+ for mailman-users-admin@python.org; Mon, 02 Apr 2001 06:23:04 -0400
+Message-Id: <10104020420.AA00477@208.24.118.205>
+Precedence: bulk
+List-Help: <mailto:mailman-users-request@python.org?subject=help>
+List-Post: <mailto:mailman-users@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=subscribe>
+List-Id: Mailman mailing list management users <mailman-users.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/mailman-users/>
+From: "Postmaster" <postmaster@208.24.118.205>
+Sender: mailman-users-owner@python.org
+To: <mailman-users-admin@python.org>
+Subject: Undeliverable Mail
+Date: Mon, 2 Apr 101 04:20:10 CST
+X-Autogenerated: Mirror
+X-Mirrored-by: <mailman-users-admin@python.org>
+X-Mailer: <SMTP32 v980629>
+X-BeenThere: mailman-users@python.org
+X-Mailman-Version: 2.0.3 (101270)
+Reply-To: <postmaster@208.24.118.205>
+
+Delivery failed 20 attempts: oliver@pcworld.com.ph
+
+
+Original message follows.
+
+Received: from SMTP32-FWD by the-pentagon.com
+ (SMTP32) id A00000199; Sun, 1 Apr 101 09:53:32 CST
+Received: from mail.python.org [63.102.49.29] by 208.24.118.205 with ESMTP
+ (SMTPD32-6.00) id AEF8223011C; Sun, 01 Apr 2001 10:53:31 -0500
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 14jk6B-0005u4-00; Sun, 01 Apr 2001 11:49:03 -0400
+Received: from [195.3.3.14] (helo=ibis.worldnet.net)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 14jk5s-0005t5-00
+ for mailman-users@python.org; Sun, 01 Apr 2001 11:48:45 -0400
+Received: from m3.worldnet.net (m2.worldnet.net [195.3.3.6])
+ by ibis.worldnet.net (8.11.3/8.11.1) with ESMTP id f31Fmgv23795
+ for <mailman-users@python.org>; Sun, 1 Apr 2001 17:48:42 +0200 (CEST)
+ (envelope-from bootc@worldnet.fr)
+Received: from [195.3.46.106] (i46-106.province.worldnet.fr [195.3.46.106])
+ by m3.worldnet.net (8.11.2/8.11.1) with ESMTP id f31FnIY00581
+ for <mailman-users@python.org>; Sun, 1 Apr 2001 17:49:18 +0200 (CEST)
+ (envelope-from bootc@worldnet.fr)
+User-Agent: Microsoft-Outlook-Express-Macintosh-Edition/5.02.2022
+Subject: Re: [Mailman-Users] List Info page showing wrong e-mail address
+From: Chris Boot <bootc@worldnet.fr>
+To: Mailman Users <mailman-users@python.org>
+Message-ID: <B6ED1A51.CD1E%bootc@worldnet.fr>
+In-Reply-To: <B6EC3825.CCB5%bootc@worldnet.fr>
+Mime-version: 1.0
+Content-type: text/plain; charset="US-ASCII"
+Content-transfer-encoding: 7bit
+Sender: mailman-users-admin@python.org
+Errors-To: mailman-users-admin@python.org
+X-BeenThere: mailman-users@python.org
+X-Mailman-Version: 2.0.3 (101270)
+Precedence: bulk
+List-Help: <mailto:mailman-users-request@python.org?subject=help>
+List-Post: <mailto:mailman-users@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=subscribe>
+List-Id: Mailman mailing list management users <mailman-users.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=unsubscribe>
+
+[message truncated]
+
+
diff --git a/tests/bounces/smtp32_02.txt b/tests/bounces/smtp32_02.txt
new file mode 100644
index 00000000..3336a28d
--- /dev/null
+++ b/tests/bounces/smtp32_02.txt
@@ -0,0 +1,96 @@
+From VM Wed May 30 01:59:29 2001
+X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
+ [nil "Tuesday" "29" "May" "2001" "20:19:37" "-0700" "Postmaster" "postmaster@launchpoint.net" nil "48" "Undeliverable Mail" "^From:" nil nil "5" nil nil nil nil nil]
+ nil)
+Return-Path: <python-list-admin@python.org>
+Delivered-To: barry@wooz.org
+Received: from digicool.com (unknown [63.100.190.15])
+ by mail.wooz.org (Postfix) with ESMTP id 5BA95D35D7
+ for <barry@wooz.org>; Tue, 29 May 2001 23:48:06 -0400 (EDT)
+Received: from <python-list-admin@python.org>
+ by digicool.com (CommuniGate Pro RULES 3.4)
+ with RULES id 1993021; Tue, 29 May 2001 23:48:38 -0400
+Received: from ns2.digicool.com ([63.100.190.2] verified)
+ by digicool.com (CommuniGate Pro SMTP 3.4)
+ with ESMTP id 1993014 for barry@mail.digicool.com; Tue, 29 May 2001 23:47:17 -0400
+Received: from mail.python.org (mail.python.org [63.102.49.29])
+ by ns2.digicool.com (8.9.3/8.9.3) with ESMTP id XAA05200
+ for <barry@digicool.com>; Tue, 29 May 2001 23:46:46 -0400
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 154wwZ-0007Jf-00
+ for barry@digicool.com; Tue, 29 May 2001 23:46:47 -0400
+Received: from [65.200.12.28] (helo=launchpoint.net)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 154wv7-0007H3-00
+ for python-list-admin@python.org; Tue, 29 May 2001 23:45:17 -0400
+Message-Id: <10105292019.AA00136@launchpoint.net>
+Precedence: bulk
+List-Help: <mailto:python-list-request@python.org?subject=help>
+List-Post: <mailto:python-list@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=subscribe>
+List-Id: General discussion list for the Python programming language <python-list.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/python-list/>
+From: "Postmaster" <postmaster@launchpoint.net>
+Sender: python-list-owner@python.org
+To: <python-list-admin@python.org>
+Subject: Undeliverable Mail
+Date: Tue, 29 May 2001 20:19:37 -0700
+X-Autogenerated: Mirror
+X-Mirrored-by: <python-list-admin@python.org>
+X-Mailer: <SMTP32 v20010131>
+X-BeenThere: python-list@python.org
+X-Mailman-Version: 2.0.5 (101270)
+
+Delivery failed 20 attempts: lists@mail.spicynoodles.com
+
+
+Original message follows.
+
+Received: from mail.python.org [63.102.49.29] by launchpoint.net with ESMTP
+ (SMTPD32-6.06) id ACB127960212; Tue, 29 May 2001 09:22:09 -0700
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 154mEf-0002VG-00; Tue, 29 May 2001 12:20:45 -0400
+Received: from [194.109.0.100] (helo=centurion.xs4all.nl)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 154mDK-0002Te-00
+ for python-list@python.org; Tue, 29 May 2001 12:19:22 -0400
+Received: by centurion.xs4all.nl (Postfix, from userid 1000)
+ id 14716147; Tue, 29 May 2001 18:18:49 +0200 (CEST)
+From: Thomas Wouters <thomas@xs4all.net>
+To: Jim Abrams <jim@publishingresources.com>
+Cc: python-list@python.org
+Subject: Re: Active State and the PSF
+Message-ID: <20010529181849.U690@xs4all.nl>
+References: <mailman.991021781.12258.python-list@python.org> <Xns90B07596E1F35jimpublishingresourc@64.152.100.91>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+Content-Disposition: inline
+User-Agent: Mutt/1.3.17i
+In-Reply-To: <Xns90B07596E1F35jimpublishingresourc@64.152.100.91>; from jim@publishingresources.com on Tue, May 29, 2001 at 03:43:08PM +0000
+Sender: python-list-admin@python.org
+Errors-To: python-list-admin@python.org
+X-BeenThere: python-list@python.org
+X-Mailman-Version: 2.0.5 (101270)
+Precedence: bulk
+List-Help: <mailto:python-list-request@python.org?subject=help>
+List-Post: <mailto:python-list@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=subscribe>
+List-Id: General discussion list for the Python programming language <python-list.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/python-list>,
+ <mailto:python-list-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/python-list/>
+Date: Tue, 29 May 2001 18:18:49 +0200
+
+On Tue, May 29, 2001 at 03:43:08PM +0000, Jim Abrams wrote:
+
+> Forgive my lazyiness in not deciphering the GPL, but does the GPL put some
+
+[message truncated]
+
+
diff --git a/tests/bounces/smtp32_03.txt b/tests/bounces/smtp32_03.txt
new file mode 100644
index 00000000..0c284afc
--- /dev/null
+++ b/tests/bounces/smtp32_03.txt
@@ -0,0 +1,92 @@
+From VM Wed Aug 1 17:39:21 2001
+X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
+ [nil "Wednesday" "1" "August" "2001" "12:02:47" "-0700" "Postmaster" "postmaster@mgw.xraymedia.com" nil "43" "Undeliverable Mail" "^From:" "mailman-users-admin@python.org" "mailman-users-admin@python.org" "8" nil nil nil nil nil]
+ nil)
+Return-Path: <mailman-users-admin@python.org>
+Delivered-To: barry@wooz.org
+Received: from digicool.com (unknown [63.100.190.15])
+ by mail.wooz.org (Postfix) with ESMTP id 012AFD35F4
+ for <barry@wooz.org>; Wed, 1 Aug 2001 15:24:04 -0400 (EDT)
+Received: from <mailman-users-admin@python.org>
+ by digicool.com (CommuniGate Pro RULES 3.4)
+ with RULES id 2461696; Wed, 01 Aug 2001 15:24:06 -0400
+Received: from smtp.zope.com ([63.100.190.10] verified)
+ by digicool.com (CommuniGate Pro SMTP 3.4)
+ with ESMTP id 2461695 for barry@mail.zope.com; Wed, 01 Aug 2001 15:24:06 -0400
+Received: from mail.python.org (mail.python.org [63.102.49.29])
+ by smtp.zope.com (8.11.2/8.11.2) with ESMTP id f71JO6X18645
+ for <barry@zope.com>; Wed, 1 Aug 2001 15:24:06 -0400
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 15S1bB-0001XU-00; Wed, 01 Aug 2001 15:24:05 -0400
+Received: from [209.17.153.132] (helo=mgw.xraymedia.com)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 15S1aM-0001Wb-00
+ for mailman-users-admin@python.org; Wed, 01 Aug 2001 15:23:14 -0400
+Message-Id: <10108011202.AA00462@mgw.xraymedia.com>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+Precedence: bulk
+List-Help: <mailto:mailman-users-request@python.org?subject=help>
+List-Post: <mailto:mailman-users@python.org>
+List-Subscribe: <http://mail.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=subscribe>
+List-Id: Mailman mailing list management users <mailman-users.python.org>
+List-Unsubscribe: <http://mail.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=unsubscribe>
+List-Archive: <http://mail.python.org/pipermail/mailman-users/>
+From: "Postmaster" <postmaster@mgw.xraymedia.com>
+Sender: mailman-users-owner@python.org
+To: mailman-users-admin@python.org
+Subject: Undeliverable Mail
+Date: Wed, 1 Aug 2001 12:02:47 -0700
+X-Autogenerated: Mirror
+X-Mirrored-by: <mailman-users-admin@python.org>
+X-Mailer: <SMTP32 v20010525EVAL>
+X-BeenThere: mailman-users@python.org
+X-Mailman-Version: 2.0.6 (101270)
+
+undeliverable to borisk@gw.xraymedia.com
+
+
+Original message follows.
+
+Received: from mgw.xraymedia.com [209.17.153.132] by mgw.xraymedia.com with ESMTP
+ (SMTPD32-7.00 EVAL) id A2541501BA; Wed, 01 Aug 2001 12:02:47 -0700
+Received: from mgw.xraymedia.com [209.17.153.132] by mgw.xraymedia.com with ESMTP
+ (SMTPD32-7.00 EVAL) id A2534501B6; Wed, 01 Aug 2001 12:02:46 -0700
+Received: from mgw.xraymedia.com [209.17.153.132] by mgw.xraymedia.com with ESMTP
+ (SMTPD32-7.00 EVAL) id A24D3A01B6; Wed, 01 Aug 2001 12:02:46 -0700
+Received: from mgw.xraymedia.com [209.17.153.132] by mgw.xraymedia.com with ESMTP
+ (SMTPD32-7.00 EVAL) id A2533401B6; Wed, 01 Aug 2001 12:02:46 -0700
+Received: from hercules.xraymedia.com [64.69.69.18] by mgw.xraymedia.com with ESMTP
+ (SMTPD32-7.00 EVAL) id A2553201B6; Wed, 01 Aug 2001 12:02:45 -0700
+Received: from mail.python.org (mail.python.org [63.102.49.29])
+ by hercules.xraymedia.com (8.11.0/8.11.0) with ESMTP id f71IEQb00859
+ for <borisk@xraymedia.com>; Wed, 1 Aug 2001 11:14:26 -0700
+Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 15S13G-0008Mi-00; Wed, 01 Aug 2001 14:49:02 -0400
+Received: from [24.201.245.36] (helo=VL-MS-MR002.sc1.videotron.ca)
+ by mail.python.org with esmtp (Exim 3.21 #1)
+ id 15S12G-0008IE-00
+ for mailman-users@python.org; Wed, 01 Aug 2001 14:48:00 -0400
+Received: from cthulhu.gerg.ca ([24.203.122.44]) by
+ VL-MS-MR002.sc1.videotron.ca (Netscape Messaging Server 4.15)
+ with ESMTP id GHEK7K02.QG7 for <mailman-users@python.org>; Wed,
+ 1 Aug 2001 14:47:44 -0400
+Received: from gward by cthulhu.gerg.ca with local (Exim 3.22 #1 (Debian))
+ id 15S11y-0000ip-00
+ for <mailman-users@python.org>; Wed, 01 Aug 2001 14:47:42 -0400
+To: mailman-users@python.org
+Subject: Re: [Mailman-Users] pls HELP!!!
+Message-ID: <20010801144742.B2759@mems-exchange.org>
+Mail-Followup-To: mailman-users@python.org
+References: <DPEEILMMKFNDFMKLPIMFEEFLCMAA.rimas@beritrans.com>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+Content-Disposition: inline
+
+[message truncated]
+
+
diff --git a/tests/bounces/yahoo_01.txt b/tests/bounces/yahoo_01.txt
new file mode 100644
index 00000000..0758957f
--- /dev/null
+++ b/tests/bounces/yahoo_01.txt
@@ -0,0 +1,47 @@
+Return-path: <jpython-interest-admin@python.org>
+Received: from mta540.mail.yahoo.com [216.136.131.22] by receive.turbosport.com [63.118.43.131]
+ with SMTP (MDaemon.v3.5.2.R)
+ for <bbbsss@turbosport.com>; Sun, 18 Feb 2001 02:25:20 -0600
+Message-ID: <20010218082300.42071.qmail@mta540.mail.yahoo.com>
+Received: from mta540.mail.yahoo.com for bbbsss@turbosport.com; Feb 18 00:23:00 2001 -0800
+Received: from smtp015.mail.yahoo.com (216.136.173.59)
+X-Yahoo-Forwarded: from aaaaa_20@yahoo.com to bbbsss@turbosport.com
+ by mta540.mail.yahoo.com with SMTP; 18 Feb 2001 00:23:00 -0800 (PST)
+Date: 18 Feb 2001 08:22:57 -0000
+From: MAILER-DAEMON@yahoo.com
+To: aaaaa@yahoo.com
+Subject: failure delivery
+X-MDRcpt-To: bbbsss@turbosport.com
+X-MDRemoteIP: 216.136.131.22
+X-Return-Path: jpython-interest-admin@python.org
+X-MDaemon-Deliver-To: bbbsss@turbosport.com
+
+Message from yahoo.com.
+Unable to deliver message to the following address(es).
+
+<subscribe.motorcycles@listsociety.com>:
+Sorry, I wasn't able to establish an SMTP connection. (#4.4.1)
+I'm not going to try again; this message has been in the queue too long.
+
+--- Original message follows.
+
+Return-Path: <aaaaa@yahoo.com>
+Received: from c58148.upc-c.chello.nl (HELO localhost) (212.187.58.148)
+ by smtp.mail.vip.sc5.yahoo.com with SMTP; 11 Feb 2001 01:15:27 -0000
+X-Apparently-From: <aaaaa?20@yahoo.com>
+X-Sender: aaaaa@yahoo.com
+From: Albert Ttttt <aaaaa@yahoo.com>
+To: subscribe.motorcycles@listsociety.com
+Date: Sun, 11 Feb 2001 02:14:40 +0100
+Subject: Subscribe
+Reply-To: aaaaa@yahoo.com
+MIME-Version: 1.0
+Content-Type: text/plain; charset=iso-8859-1
+Content-Transfer-Encoding: 7bit
+
+
+
+_________________________________________________________
+Do You Yahoo!?
+Get your free @yahoo.com address at http://mail.yahoo.com
+
diff --git a/tests/bounces/yahoo_02.txt b/tests/bounces/yahoo_02.txt
new file mode 100644
index 00000000..90d835dc
--- /dev/null
+++ b/tests/bounces/yahoo_02.txt
Binary files differ
diff --git a/tests/bounces/yahoo_03.txt b/tests/bounces/yahoo_03.txt
new file mode 100644
index 00000000..9de32a43
--- /dev/null
+++ b/tests/bounces/yahoo_03.txt
@@ -0,0 +1,98 @@
+Return-Path: <boost-admin@lists.boost.org>
+Received: from mx04.mrf.mail.rcn.net ([207.172.4.53] [207.172.4.53])
+ by mta02.mrf.mail.rcn.net with ESMTP
+ id <20020403141004.PXBK1795.mta02.mrf.mail.rcn.net@mx04.mrf.mail.rcn.net>;
+ Wed, 3 Apr 2002 09:10:04 -0500
+Received: from milliways.osl.iu.edu ([129.79.245.239])
+ by mx04.mrf.mail.rcn.net with esmtp (Exim 3.35 #5)
+ id 16slSd-0006Tx-00
+ for david.abrahams@rcn.com; Wed, 03 Apr 2002 09:10:04 -0500
+Received: from milliways.osl.iu.edu (localhost [127.0.0.1])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with ESMTP id g33EA0A22345;
+ Wed, 3 Apr 2002 09:10:00 -0500
+Received: from mta545.mail.yahoo.com (mta545.mail.yahoo.com [216.136.131.27])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with SMTP id g33E9DA22332
+ for <boost-admin@lists.boost.org>; Wed, 3 Apr 2002 09:09:13 -0500
+Date: Wed, 3 Apr 2002 09:09:13 -0500
+Message-Id: <200204031409.g33E9DA22332@milliways.osl.iu.edu>
+From: MAILER-DAEMON@yahoo.com
+To: boost-admin@lists.boost.org
+X-Loop: MAILER-DAEMON@yahoo.com
+Subject: Delivery failure
+Sender: boost-owner@lists.boost.org
+Errors-To: boost-owner@lists.boost.org
+X-BeenThere: boost@lists.boost.org
+X-Mailman-Version: 2.0.8
+Precedence: bulk
+List-Help: <mailto:boost-request@lists.boost.org?subject=help>
+List-Post: <mailto:boost@lists.boost.org>
+List-Subscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=subscribe>
+List-Id: Boost mailing list <boost.lists.boost.org>
+List-Unsubscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=unsubscribe>
+List-Archive: <http://lists.boost.org/MailArchives/boost/>
+
+Message from yahoo.com.
+Unable to deliver message to the following address(es).
+
+<cresus22@yahoo.com>:
+Sorry your message to cresus22@yahoo.com cannot be delivered. This account has been disabled or discontinued.
+
+--- Original message follows.
+
+X-Rocket-Spam: 129.79.245.239
+X-YahooFilteredBulk: 129.79.245.239
+X-Track: 111: 20
+Return-Path: <boost-admin@lists.boost.org>
+Received: from milliways.osl.iu.edu (129.79.245.239)
+ by mta545.mail.yahoo.com with SMTP; 03 Apr 2002 06:09:04 -0800 (PST)
+Received: from milliways.osl.iu.edu (localhost [127.0.0.1])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with ESMTP id g33D6PA21151;
+ Wed, 3 Apr 2002 08:06:25 -0500
+Received: from exchsrv.uttc-utc.com ([63.80.119.4])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with ESMTP id g33D42A21076
+ for <boost@lists.boost.org>; Wed, 3 Apr 2002 08:04:03 -0500
+Received: by EXCHSRV with Internet Mail Service (5.5.2653.19)
+ id <G9MVAA8Z>; Wed, 3 Apr 2002 08:03:59 -0500
+Message-ID: <2FE8C75C7A06D4118BB50008C7F7E83103D5DF@EXCHSRV>
+From: "Moore, Dave" <dmoore@ashtontechgroup.com>
+To: "'boost@lists.boost.org'" <boost@lists.boost.org>
+MIME-Version: 1.0
+X-Mailer: Internet Mail Service (5.5.2653.19)
+Content-Type: text/plain;
+ charset="iso-8859-1"
+Subject: [boost] OT(?) Top Posting, Discussion Threads, and Outlook/Exchange
+Sender: boost-admin@lists.boost.org
+Errors-To: boost-admin@lists.boost.org
+X-BeenThere: boost@lists.boost.org
+X-Mailman-Version: 2.0.8
+Precedence: bulk
+Reply-To: boost@lists.boost.org
+List-Help: <mailto:boost-request@lists.boost.org?subject=help>
+List-Post: <mailto:boost@lists.boost.org>
+List-Subscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=subscribe>
+List-Id: Boost mailing list <boost.lists.boost.org>
+List-Unsubscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=unsubscribe>
+List-Archive: <http://lists.boost.org/MailArchives/boost/>
+Date: Wed, 3 Apr 2002 08:03:58 -0500
+
+Since the recent discussion-discussion, I just tried to reply the "right"
+way in "RE: [boost] Thread locals", only to see my efforts cheerfully
+ignored by the Mailing List archive.
+(http://lists.boost.org/MailArchives/boost/)
+
+I am stuck with Outlook 2000 + Exchange 5.5 here at work, but have some
+considerable pull with the Exchange Admin.
+
+I notice that my replies have the "References:" field stripped off. Any
+Boosters successfully using this email combination, preserving the
+references field?
+
+Thanks, and sorry for the noise.
+Dave
+_______________________________________________
+Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
+.
diff --git a/tests/bounces/yahoo_04.txt b/tests/bounces/yahoo_04.txt
new file mode 100644
index 00000000..cf603636
--- /dev/null
+++ b/tests/bounces/yahoo_04.txt
@@ -0,0 +1,150 @@
+Return-Path: <boost-admin@lists.boost.org>
+Received: from mx04.mrf.mail.rcn.net ([207.172.4.53] [207.172.4.53])
+ by mta05.mrf.mail.rcn.net with ESMTP
+ id <20020403144504.BXMM19155.mta05.mrf.mail.rcn.net@mx04.mrf.mail.rcn.net>;
+ Wed, 3 Apr 2002 09:45:04 -0500
+Received: from milliways.osl.iu.edu ([129.79.245.239])
+ by mx04.mrf.mail.rcn.net with esmtp (Exim 3.35 #5)
+ id 16sm0V-0007O8-00
+ for david.abrahams@rcn.com; Wed, 03 Apr 2002 09:45:04 -0500
+Received: from milliways.osl.iu.edu (localhost [127.0.0.1])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with ESMTP id g33Ej1A23023;
+ Wed, 3 Apr 2002 09:45:01 -0500
+Received: from mta468.mail.yahoo.com (mta468.mail.yahoo.com [216.136.130.133])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with SMTP id g33EibA23012
+ for <boost-admin@lists.boost.org>; Wed, 3 Apr 2002 09:44:37 -0500
+Date: Wed, 3 Apr 2002 09:44:37 -0500
+Message-Id: <200204031444.g33EibA23012@milliways.osl.iu.edu>
+From: MAILER-DAEMON@yahoo.com
+To: boost-admin@lists.boost.org
+X-Loop: MAILER-DAEMON@yahoo.com
+Subject: Delivery failure
+Sender: boost-owner@lists.boost.org
+Errors-To: boost-owner@lists.boost.org
+X-BeenThere: boost@lists.boost.org
+X-Mailman-Version: 2.0.8
+Precedence: bulk
+List-Help: <mailto:boost-request@lists.boost.org?subject=help>
+List-Post: <mailto:boost@lists.boost.org>
+List-Subscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=subscribe>
+List-Id: Boost mailing list <boost.lists.boost.org>
+List-Unsubscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=unsubscribe>
+List-Archive: <http://lists.boost.org/MailArchives/boost/>
+
+Message from yahoo.com.
+Unable to deliver message to the following address(es).
+
+<agarciamartiartu@yahoo.es>:
+Sorry, your message to agarciamartiartu@yahoo.es cannot be delivered. This account is over quota.
+
+<open00now@yahoo.co.uk>:
+Sorry, your message to open00now@yahoo.co.uk cannot be delivered. This account is over quota.
+
+--- Original message follows.
+
+X-Track: 0: 100
+Return-Path: <boost-admin@lists.boost.org>
+Received: from milliways.osl.iu.edu (129.79.245.239)
+ by mta468.mail.yahoo.com with SMTP; 03 Apr 2002 06:44:13 -0800 (PST)
+Received: from milliways.osl.iu.edu (localhost [127.0.0.1])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with ESMTP id g33EgcA22988;
+ Wed, 3 Apr 2002 09:42:38 -0500
+Received: from mail2.commerzbank.com (mail2.commerzbank.com [212.149.48.101])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with ESMTP id g33EciA22890
+ for <boost@lists.boost.org>; Wed, 3 Apr 2002 09:38:44 -0500
+Received: from sv016317.exchange.commerzbank.com (sendmail.commerzbank.com [172.16.71.150])
+ by mail2.commerzbank.com (Commerzbank Mail-System) with ESMTP id 38105116C
+ for <boost@lists.boost.org>; Wed, 3 Apr 2002 16:35:15 +0200 (CEST)
+Received: by sv016317.exchange.commerzbank.com with Internet Mail Service (5.5.2653.19)
+ id <2GBLGLD2>; Wed, 3 Apr 2002 16:37:33 +0200
+Message-ID: <CD3F0650BD65D31191BF0008C75D8DBD0300F66F@SV018443>
+From: "Hoeffner, Detlef" <Detlef.Hoeffner@partner.commerzbank.com>
+To: "'boost@lists.boost.org'" <boost@lists.boost.org>
+Subject: RE: [boost] Thread locals
+MIME-Version: 1.0
+X-Mailer: Internet Mail Service (5.5.2653.19)
+Content-Type: text/plain;
+ charset="iso-8859-1"
+Sender: boost-admin@lists.boost.org
+Errors-To: boost-admin@lists.boost.org
+X-BeenThere: boost@lists.boost.org
+X-Mailman-Version: 2.0.8
+Precedence: bulk
+Reply-To: boost@lists.boost.org
+List-Help: <mailto:boost-request@lists.boost.org?subject=help>
+List-Post: <mailto:boost@lists.boost.org>
+List-Subscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=subscribe>
+List-Id: Boost mailing list <boost.lists.boost.org>
+List-Unsubscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=unsubscribe>
+List-Archive: <http://lists.boost.org/MailArchives/boost/>
+Date: Wed, 3 Apr 2002 16:37:41 +0200
+
+
+> As a substitute, try using the comparison operator for the boost::thread
+> class. This can fill the gap in many (but not all) cases where you are
+> managing the set of threads yourself.
+
+I need this mainly for tracing purposes in spots where I have no knowledge
+of the current instance of thread. This does not seem to help me in that
+case.
+
+> On some platforms (i.e. pthreads), the "thread_id" is actually an opaque
+> type (pthread_t) rather than a numeric value, and I think that is why no
+> such operation is exposed in the current version of the library.
+
+It is however possible to provide a class threadid, that has dependent on
+the
+platform different members but provides operations as ==, !=,
+operator<<(ostream&, ), ... That would be fine to solve the problem.
+
+Regards
+
+Detlef
+
+-----Original Message-----
+From: Moore, Dave [mailto:dmoore@ashtontechgroup.com]
+Sent: Mittwoch, 3. April 2002 14:33
+To: 'boost@lists.boost.org'
+Subject: RE: [boost] Thread locals
+
+
+> -----Original Message-----
+> From: Hoeffner, Detlef
+> [mailto:Detlef.Hoeffner@partner.commerzbank.com]
+> Sent: Wednesday, April 03, 2002 6:59 AM
+> To: 'boost@lists.boost.org'
+> Subject: [boost] Thread locals
+>
+>
+> Hello all,
+>
+> I am replacing my thread abstraction with the thread package
+> from boost. It
+> is very nice but I am missing two things.
+>
+> The first is the possibility to get an identifier for the
+> current thread, a
+> thread id.
+
+As a substitute, try using the comparison operator for the boost::thread
+class. This can fill the gap in many (but not all) cases where you are
+managing the set of threads yourself.
+
+On some platforms (i.e. pthreads), the "thread_id" is actually an opaque
+type (pthread_t) rather than a numeric value, and I think that is why no
+such operation is exposed in the current version of the library.
+
+Regards,
+Dave
+
+
+_______________________________________________
+Unsubscribe & other changes:
+http://lists.boost.org/mailman/listinfo.cgi/boost
+_______________________________________________
+Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
+.
diff --git a/tests/bounces/yahoo_05.txt b/tests/bounces/yahoo_05.txt
new file mode 100644
index 00000000..56d1a301
--- /dev/null
+++ b/tests/bounces/yahoo_05.txt
@@ -0,0 +1,150 @@
+Return-Path: <boost-admin@lists.boost.org>
+Received: from mx04.mrf.mail.rcn.net ([207.172.4.53] [207.172.4.53])
+ by mta05.mrf.mail.rcn.net with ESMTP
+ id <20020403160106.EMCB19155.mta05.mrf.mail.rcn.net@mx04.mrf.mail.rcn.net>;
+ Wed, 3 Apr 2002 11:01:06 -0500
+Received: from milliways.osl.iu.edu ([129.79.245.239])
+ by mx04.mrf.mail.rcn.net with esmtp (Exim 3.35 #5)
+ id 16snC5-0003g7-00
+ for david.abrahams@rcn.com; Wed, 03 Apr 2002 11:01:06 -0500
+Received: from milliways.osl.iu.edu (localhost [127.0.0.1])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with ESMTP id g33G10A24726;
+ Wed, 3 Apr 2002 11:01:00 -0500
+Received: from mta414.mail.yahoo.com (mta414.mail.yahoo.com [216.136.128.66])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with SMTP id g33G02A24708
+ for <boost-admin@lists.boost.org>; Wed, 3 Apr 2002 11:00:03 -0500
+Date: Wed, 3 Apr 2002 11:00:03 -0500
+Message-Id: <200204031600.g33G02A24708@milliways.osl.iu.edu>
+From: MAILER-DAEMON@yahoo.com
+To: boost-admin@lists.boost.org
+X-Loop: MAILER-DAEMON@yahoo.com
+Subject: Delivery failure
+Sender: boost-owner@lists.boost.org
+Errors-To: boost-owner@lists.boost.org
+X-BeenThere: boost@lists.boost.org
+X-Mailman-Version: 2.0.8
+Precedence: bulk
+List-Help: <mailto:boost-request@lists.boost.org?subject=help>
+List-Post: <mailto:boost@lists.boost.org>
+List-Subscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=subscribe>
+List-Id: Boost mailing list <boost.lists.boost.org>
+List-Unsubscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=unsubscribe>
+List-Archive: <http://lists.boost.org/MailArchives/boost/>
+
+Message from yahoo.com.
+Unable to deliver message to the following address(es).
+
+<cresus22@yahoo.com>:
+Sorry your message to cresus22@yahoo.com cannot be delivered. This account has been disabled or discontinued.
+
+<jjb700@yahoo.com>:
+Sorry your message to jjb700@yahoo.com cannot be delivered. This account has been disabled or discontinued.
+
+--- Original message follows.
+
+X-Track: 1: 40
+Return-Path: <boost-admin@lists.boost.org>
+Received: from milliways.osl.iu.edu (129.79.245.239)
+ by mta414.mail.yahoo.com with SMTP; 03 Apr 2002 07:59:49 -0800 (PST)
+Received: from milliways.osl.iu.edu (localhost [127.0.0.1])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with ESMTP id g33EduA22960;
+ Wed, 3 Apr 2002 09:39:56 -0500
+Received: from mail2.commerzbank.com (mail2.commerzbank.com [212.149.48.101])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with ESMTP id g33EciA22890
+ for <boost@lists.boost.org>; Wed, 3 Apr 2002 09:38:44 -0500
+Received: from sv016317.exchange.commerzbank.com (sendmail.commerzbank.com [172.16.71.150])
+ by mail2.commerzbank.com (Commerzbank Mail-System) with ESMTP id 38105116C
+ for <boost@lists.boost.org>; Wed, 3 Apr 2002 16:35:15 +0200 (CEST)
+Received: by sv016317.exchange.commerzbank.com with Internet Mail Service (5.5.2653.19)
+ id <2GBLGLD2>; Wed, 3 Apr 2002 16:37:33 +0200
+Message-ID: <CD3F0650BD65D31191BF0008C75D8DBD0300F66F@SV018443>
+From: "Hoeffner, Detlef" <Detlef.Hoeffner@partner.commerzbank.com>
+To: "'boost@lists.boost.org'" <boost@lists.boost.org>
+Subject: RE: [boost] Thread locals
+MIME-Version: 1.0
+X-Mailer: Internet Mail Service (5.5.2653.19)
+Content-Type: text/plain;
+ charset="iso-8859-1"
+Sender: boost-admin@lists.boost.org
+Errors-To: boost-admin@lists.boost.org
+X-BeenThere: boost@lists.boost.org
+X-Mailman-Version: 2.0.8
+Precedence: bulk
+Reply-To: boost@lists.boost.org
+List-Help: <mailto:boost-request@lists.boost.org?subject=help>
+List-Post: <mailto:boost@lists.boost.org>
+List-Subscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=subscribe>
+List-Id: Boost mailing list <boost.lists.boost.org>
+List-Unsubscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=unsubscribe>
+List-Archive: <http://lists.boost.org/MailArchives/boost/>
+Date: Wed, 3 Apr 2002 16:37:41 +0200
+
+
+> As a substitute, try using the comparison operator for the boost::thread
+> class. This can fill the gap in many (but not all) cases where you are
+> managing the set of threads yourself.
+
+I need this mainly for tracing purposes in spots where I have no knowledge
+of the current instance of thread. This does not seem to help me in that
+case.
+
+> On some platforms (i.e. pthreads), the "thread_id" is actually an opaque
+> type (pthread_t) rather than a numeric value, and I think that is why no
+> such operation is exposed in the current version of the library.
+
+It is however possible to provide a class threadid, that has dependent on
+the
+platform different members but provides operations as ==, !=,
+operator<<(ostream&, ), ... That would be fine to solve the problem.
+
+Regards
+
+Detlef
+
+-----Original Message-----
+From: Moore, Dave [mailto:dmoore@ashtontechgroup.com]
+Sent: Mittwoch, 3. April 2002 14:33
+To: 'boost@lists.boost.org'
+Subject: RE: [boost] Thread locals
+
+
+> -----Original Message-----
+> From: Hoeffner, Detlef
+> [mailto:Detlef.Hoeffner@partner.commerzbank.com]
+> Sent: Wednesday, April 03, 2002 6:59 AM
+> To: 'boost@lists.boost.org'
+> Subject: [boost] Thread locals
+>
+>
+> Hello all,
+>
+> I am replacing my thread abstraction with the thread package
+> from boost. It
+> is very nice but I am missing two things.
+>
+> The first is the possibility to get an identifier for the
+> current thread, a
+> thread id.
+
+As a substitute, try using the comparison operator for the boost::thread
+class. This can fill the gap in many (but not all) cases where you are
+managing the set of threads yourself.
+
+On some platforms (i.e. pthreads), the "thread_id" is actually an opaque
+type (pthread_t) rather than a numeric value, and I think that is why no
+such operation is exposed in the current version of the library.
+
+Regards,
+Dave
+
+
+_______________________________________________
+Unsubscribe & other changes:
+http://lists.boost.org/mailman/listinfo.cgi/boost
+_______________________________________________
+Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
+.
diff --git a/tests/bounces/yahoo_06.txt b/tests/bounces/yahoo_06.txt
new file mode 100644
index 00000000..16c04fd6
--- /dev/null
+++ b/tests/bounces/yahoo_06.txt
@@ -0,0 +1,105 @@
+Return-Path: <boost-admin@lists.boost.org>
+Received: from mx04.mrf.mail.rcn.net ([207.172.4.53] [207.172.4.53])
+ by mta03.mrf.mail.rcn.net with ESMTP
+ id <20020403160604.WVKA16695.mta03.mrf.mail.rcn.net@mx04.mrf.mail.rcn.net>;
+ Wed, 3 Apr 2002 11:06:04 -0500
+Received: from milliways.osl.iu.edu ([129.79.245.239])
+ by mx04.mrf.mail.rcn.net with esmtp (Exim 3.35 #5)
+ id 16snGt-0005FB-00
+ for david.abrahams@rcn.com; Wed, 03 Apr 2002 11:06:04 -0500
+Received: from milliways.osl.iu.edu (localhost [127.0.0.1])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with ESMTP id g33G61A24869;
+ Wed, 3 Apr 2002 11:06:01 -0500
+Received: from mta593.mail.yahoo.com (mta593.mail.yahoo.com [216.136.224.181])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with SMTP id g33G5lA24845
+ for <boost-admin@lists.boost.org>; Wed, 3 Apr 2002 11:05:47 -0500
+Date: Wed, 3 Apr 2002 11:05:47 -0500
+Message-Id: <200204031605.g33G5lA24845@milliways.osl.iu.edu>
+From: MAILER-DAEMON@yahoo.com
+To: boost-admin@lists.boost.org
+X-Loop: MAILER-DAEMON@yahoo.com
+Subject: Delivery failure
+Sender: boost-owner@lists.boost.org
+Errors-To: boost-owner@lists.boost.org
+X-BeenThere: boost@lists.boost.org
+X-Mailman-Version: 2.0.8
+Precedence: bulk
+List-Help: <mailto:boost-request@lists.boost.org?subject=help>
+List-Post: <mailto:boost@lists.boost.org>
+List-Subscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=subscribe>
+List-Id: Boost mailing list <boost.lists.boost.org>
+List-Unsubscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=unsubscribe>
+List-Archive: <http://lists.boost.org/MailArchives/boost/>
+
+Message from yahoo.com.
+Unable to deliver message to the following address(es).
+
+<andrew_polevoy@yahoo.com>:
+Sorry your message to andrew_polevoy@yahoo.com cannot be delivered. This account has been disabled or discontinued.
+
+<baruch_sterin@yahoo.com>:
+Sorry your message to baruch_sterin@yahoo.com cannot be delivered. This account has been disabled or discontinued.
+
+<rjhoeks@yahoo.com>:
+Sorry your message to rjhoeks@yahoo.com cannot be delivered. This account has been disabled or discontinued.
+
+<tritonrugger91@yahoo.com>:
+Sorry your message to tritonrugger91@yahoo.com cannot be delivered. This account has been disabled or discontinued.
+
+--- Original message follows.
+
+X-Track: 1: 40
+Return-Path: <boost-admin@lists.boost.org>
+Received: from milliways.osl.iu.edu (129.79.245.239)
+ by mta593.mail.yahoo.com with SMTP; 03 Apr 2002 08:03:49 -0800 (PST)
+Received: from milliways.osl.iu.edu (localhost [127.0.0.1])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with ESMTP id g33D6PA21151;
+ Wed, 3 Apr 2002 08:06:25 -0500
+Received: from exchsrv.uttc-utc.com ([63.80.119.4])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with ESMTP id g33D42A21076
+ for <boost@lists.boost.org>; Wed, 3 Apr 2002 08:04:03 -0500
+Received: by EXCHSRV with Internet Mail Service (5.5.2653.19)
+ id <G9MVAA8Z>; Wed, 3 Apr 2002 08:03:59 -0500
+Message-ID: <2FE8C75C7A06D4118BB50008C7F7E83103D5DF@EXCHSRV>
+From: "Moore, Dave" <dmoore@ashtontechgroup.com>
+To: "'boost@lists.boost.org'" <boost@lists.boost.org>
+MIME-Version: 1.0
+X-Mailer: Internet Mail Service (5.5.2653.19)
+Content-Type: text/plain;
+ charset="iso-8859-1"
+Subject: [boost] OT(?) Top Posting, Discussion Threads, and Outlook/Exchange
+Sender: boost-admin@lists.boost.org
+Errors-To: boost-admin@lists.boost.org
+X-BeenThere: boost@lists.boost.org
+X-Mailman-Version: 2.0.8
+Precedence: bulk
+Reply-To: boost@lists.boost.org
+List-Help: <mailto:boost-request@lists.boost.org?subject=help>
+List-Post: <mailto:boost@lists.boost.org>
+List-Subscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=subscribe>
+List-Id: Boost mailing list <boost.lists.boost.org>
+List-Unsubscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=unsubscribe>
+List-Archive: <http://lists.boost.org/MailArchives/boost/>
+Date: Wed, 3 Apr 2002 08:03:58 -0500
+
+Since the recent discussion-discussion, I just tried to reply the "right"
+way in "RE: [boost] Thread locals", only to see my efforts cheerfully
+ignored by the Mailing List archive.
+(http://lists.boost.org/MailArchives/boost/)
+
+I am stuck with Outlook 2000 + Exchange 5.5 here at work, but have some
+considerable pull with the Exchange Admin.
+
+I notice that my replies have the "References:" field stripped off. Any
+Boosters successfully using this email combination, preserving the
+references field?
+
+Thanks, and sorry for the noise.
+Dave
+_______________________________________________
+Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
+.
diff --git a/tests/bounces/yahoo_07.txt b/tests/bounces/yahoo_07.txt
new file mode 100644
index 00000000..1f35e70f
--- /dev/null
+++ b/tests/bounces/yahoo_07.txt
@@ -0,0 +1,112 @@
+Return-Path: <boost-admin@lists.boost.org>
+Received: from mx04.mrf.mail.rcn.net ([207.172.4.53] [207.172.4.53])
+ by mta05.mrf.mail.rcn.net with ESMTP
+ id <20020403160902.ETVB19155.mta05.mrf.mail.rcn.net@mx04.mrf.mail.rcn.net>;
+ Wed, 3 Apr 2002 11:09:02 -0500
+Received: from milliways.osl.iu.edu ([129.79.245.239])
+ by mx04.mrf.mail.rcn.net with esmtp (Exim 3.35 #5)
+ id 16snJm-00067W-00
+ for david.abrahams@rcn.com; Wed, 03 Apr 2002 11:09:02 -0500
+Received: from milliways.osl.iu.edu (localhost [127.0.0.1])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with ESMTP id g33G90A24959;
+ Wed, 3 Apr 2002 11:09:00 -0500
+Received: from mta532.mail.yahoo.com (mta532.mail.yahoo.com [216.136.129.204])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with SMTP id g33G84A24927
+ for <boost-admin@lists.boost.org>; Wed, 3 Apr 2002 11:08:05 -0500
+Date: Wed, 3 Apr 2002 11:08:05 -0500
+Message-Id: <200204031608.g33G84A24927@milliways.osl.iu.edu>
+From: MAILER-DAEMON@yahoo.com
+To: boost-admin@lists.boost.org
+X-Loop: MAILER-DAEMON@yahoo.com
+Subject: Delivery failure
+Sender: boost-owner@lists.boost.org
+Errors-To: boost-owner@lists.boost.org
+X-BeenThere: boost@lists.boost.org
+X-Mailman-Version: 2.0.8
+Precedence: bulk
+List-Help: <mailto:boost-request@lists.boost.org?subject=help>
+List-Post: <mailto:boost@lists.boost.org>
+List-Subscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=subscribe>
+List-Id: Boost mailing list <boost.lists.boost.org>
+List-Unsubscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=unsubscribe>
+List-Archive: <http://lists.boost.org/MailArchives/boost/>
+
+Message from yahoo.com.
+Unable to deliver message to the following address(es).
+
+<mark1960_1998@yahoo.com>:
+Sorry your message to mark1960_1998@yahoo.com cannot be delivered. This account has been disabled or discontinued.
+
+<ovchenkov@yahoo.com>:
+Sorry your message to ovchenkov@yahoo.com cannot be delivered. This account has been disabled or discontinued.
+
+<tsa412@yahoo.com>:
+Sorry your message to tsa412@yahoo.com cannot be delivered. This account has been disabled or discontinued.
+
+<vaxheadroom@yahoo.com>:
+Sorry your message to vaxheadroom@yahoo.com cannot be delivered. This account has been disabled or discontinued.
+
+--- Original message follows.
+
+X-Track: 1: 40
+Return-Path: <boost-admin@lists.boost.org>
+Received: from 129.79.245.239 (EHLO milliways.osl.iu.edu) (129.79.245.239)
+ by mta532.mail.yahoo.com with SMTP; 03 Apr 2002 08:06:35 -0800 (PST)
+Received: from milliways.osl.iu.edu (localhost [127.0.0.1])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with ESMTP id g33DItA21480;
+ Wed, 3 Apr 2002 08:18:55 -0500
+Received: from hotmail.com (f110.law10.hotmail.com [64.4.15.110])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with ESMTP id g33DH7A21450
+ for <boost@lists.boost.org>; Wed, 3 Apr 2002 08:17:07 -0500
+Received: from mail pickup service by hotmail.com with Microsoft SMTPSVC;
+ Wed, 3 Apr 2002 05:16:59 -0800
+Received: from 194.100.118.234 by lw10fd.law10.hotmail.msn.com with HTTP;
+ Wed, 03 Apr 2002 13:16:59 GMT
+X-Originating-IP: [194.100.118.234]
+From: "Vesa Karvonen" <vesa_karvonen@hotmail.com>
+To: boost@lists.boost.org
+Subject: Re: [boost] [Type Traits] Patch for type_with_alignment
+Mime-Version: 1.0
+Content-Type: text/plain; format=flowed
+Message-ID: <F110iKiIcN3VknIDBoH00014513@hotmail.com>
+X-OriginalArrivalTime: 03 Apr 2002 13:16:59.0830 (UTC) FILETIME=[D63C7D60:01C1DB11]
+Sender: boost-admin@lists.boost.org
+Errors-To: boost-admin@lists.boost.org
+X-BeenThere: boost@lists.boost.org
+X-Mailman-Version: 2.0.8
+Precedence: bulk
+Reply-To: boost@lists.boost.org
+List-Help: <mailto:boost-request@lists.boost.org?subject=help>
+List-Post: <mailto:boost@lists.boost.org>
+List-Subscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=subscribe>
+List-Id: Boost mailing list <boost.lists.boost.org>
+List-Unsubscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=unsubscribe>
+List-Archive: <http://lists.boost.org/MailArchives/boost/>
+Date: Wed, 03 Apr 2002 16:16:59 +0300
+
+>On Fri, 29 Mar 2002, David Abrahams wrote:
+>>Are you planning to apply this patch?
+>>
+>>-Dave
+>
+>Yes, but I can't right now. I'll apply it tomorrow if it hasn't already
+>been done.
+>
+> Doug
+
+How is the patch coming up (or did I miss some post on this subject)?
+
+I'm also working on something that could use type_with_alignment<>.
+
+
+_________________________________________________________________
+Join the world’s largest e-mail service with MSN Hotmail.
+http://www.hotmail.com
+
+_______________________________________________
+Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
+.
diff --git a/tests/bounces/yahoo_08.txt b/tests/bounces/yahoo_08.txt
new file mode 100644
index 00000000..c531cef9
--- /dev/null
+++ b/tests/bounces/yahoo_08.txt
@@ -0,0 +1,129 @@
+Return-Path: <boost-admin@lists.boost.org>
+Received: from mx04.mrf.mail.rcn.net ([207.172.4.53] [207.172.4.53])
+ by mta05.mrf.mail.rcn.net with ESMTP
+ id <20020403162905.FMNL19155.mta05.mrf.mail.rcn.net@mx04.mrf.mail.rcn.net>;
+ Wed, 3 Apr 2002 11:29:05 -0500
+Received: from milliways.osl.iu.edu ([129.79.245.239])
+ by mx04.mrf.mail.rcn.net with esmtp (Exim 3.35 #5)
+ id 16snd9-0004Fd-00
+ for david.abrahams@rcn.com; Wed, 03 Apr 2002 11:29:04 -0500
+Received: from milliways.osl.iu.edu (localhost [127.0.0.1])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with ESMTP id g33GT1A25554;
+ Wed, 3 Apr 2002 11:29:01 -0500
+Received: from mta551.mail.yahoo.com (mta551.mail.yahoo.com [216.136.172.80])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with SMTP id g33GSmA25536
+ for <boost-admin@lists.boost.org>; Wed, 3 Apr 2002 11:28:49 -0500
+Date: Wed, 3 Apr 2002 11:28:49 -0500
+Message-Id: <200204031628.g33GSmA25536@milliways.osl.iu.edu>
+From: MAILER-DAEMON@yahoo.com
+To: boost-admin@lists.boost.org
+X-Loop: MAILER-DAEMON@yahoo.com
+Subject: Delivery failure
+Sender: boost-owner@lists.boost.org
+Errors-To: boost-owner@lists.boost.org
+X-BeenThere: boost@lists.boost.org
+X-Mailman-Version: 2.0.8
+Precedence: bulk
+List-Help: <mailto:boost-request@lists.boost.org?subject=help>
+List-Post: <mailto:boost@lists.boost.org>
+List-Subscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=subscribe>
+List-Id: Boost mailing list <boost.lists.boost.org>
+List-Unsubscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=unsubscribe>
+List-Archive: <http://lists.boost.org/MailArchives/boost/>
+
+Message from yahoo.com.
+Unable to deliver message to the following address(es).
+
+<chatrathis@yahoo.com>:
+Sorry your message to chatrathis@yahoo.com cannot be delivered. This account has been disabled or discontinued.
+
+<crownjules01@yahoo.com>:
+Sorry your message to crownjules01@yahoo.com cannot be delivered. This account has been disabled or discontinued.
+
+<cwl_999@yahoo.com>:
+Sorry your message to cwl_999@yahoo.com cannot be delivered. This account has been disabled or discontinued.
+
+<eichaiwiu@yahoo.com>:
+Sorry your message to eichaiwiu@yahoo.com cannot be delivered. This account has been disabled or discontinued.
+
+<rjhoeks@yahoo.com>:
+Sorry your message to rjhoeks@yahoo.com cannot be delivered. This account has been disabled or discontinued.
+
+<yuli_kolesnikov@yahoo.com>:
+Sorry your message to yuli_kolesnikov@yahoo.com cannot be delivered. This account has been disabled or discontinued.
+
+--- Original message follows.
+
+X-Track: 1: 40
+Return-Path: <boost-admin@lists.boost.org>
+Received: from milliways.osl.iu.edu (129.79.245.239)
+ by mta551.mail.yahoo.com with SMTP; 03 Apr 2002 08:22:08 -0800 (PST)
+Received: from milliways.osl.iu.edu (localhost [127.0.0.1])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with ESMTP id g33GJwA25252;
+ Wed, 3 Apr 2002 11:19:58 -0500
+Received: from mailout6-0.nyroc.rr.com (mailout6-0.nyroc.rr.com [24.92.226.125])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with ESMTP id g33GInA25230
+ for <boost@lists.boost.org>; Wed, 3 Apr 2002 11:18:49 -0500
+Received: from there (alb-66-24-181-181.nycap.rr.com [66.24.181.181])
+ by mailout6-0.nyroc.rr.com (8.11.6/Road Runner 1.12) with SMTP id g33GIko18895
+ for <boost@lists.boost.org>; Wed, 3 Apr 2002 11:18:46 -0500 (EST)
+Message-Id: <200204031618.g33GIko18895@mailout6-0.nyroc.rr.com>
+Content-Type: text/plain;
+ charset="iso-8859-1"
+From: Douglas Gregor <gregod@cs.rpi.edu>
+Organization: Rensselaer Polytechnic Institute
+To: boost@lists.boost.org
+Subject: Re: [boost] [Type Traits] Patch for type_with_alignment
+X-Mailer: KMail [version 1.3.2]
+References: <F128rzvsTDWWcuZcGwM00012d40@hotmail.com>
+In-Reply-To: <F128rzvsTDWWcuZcGwM00012d40@hotmail.com>
+MIME-Version: 1.0
+Content-Transfer-Encoding: 8bit
+Sender: boost-admin@lists.boost.org
+Errors-To: boost-admin@lists.boost.org
+X-BeenThere: boost@lists.boost.org
+X-Mailman-Version: 2.0.8
+Precedence: bulk
+Reply-To: boost@lists.boost.org
+X-Reply-To: gregod@cs.rpi.edu
+List-Help: <mailto:boost-request@lists.boost.org?subject=help>
+List-Post: <mailto:boost@lists.boost.org>
+List-Subscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=subscribe>
+List-Id: Boost mailing list <boost.lists.boost.org>
+List-Unsubscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=unsubscribe>
+List-Archive: <http://lists.boost.org/MailArchives/boost/>
+Date: Wed, 3 Apr 2002 11:21:18 -0500
+
+On Wednesday 03 April 2002 10:34 am, you wrote:
+> Douglas Gregor:
+> >type_with_alignment<> is available in CVS.
+>
+> hmm... You are right, but it is in the compiler_supported_error_messages
+> branch. Is this intentional?
+
+It was a rogue sticky tag... type_with_alignment<> is now on the CVS main
+trunk, where it was supposed to be in the first place.
+
+> >I'm guessing we should also add aligned_storage somewhere, because I'm
+> >sure quite a few of us will use it:
+>
+> Good idea.
+>
+> >Maybe this belongs in utility/aligned_storage.hpp?
+>
+> I have a feeling that something like this should probably go somewhere
+> closer to <memory> rather than <utility>.
+
+<boost/memory.hpp>? I'd really like to have more than 6 lines in it, but we
+can do that. That'd probably be a good place for the small-string
+optimization allocator as well.
+
+ Doug
+_______________________________________________
+Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
+.
+
diff --git a/tests/bounces/yahoo_09.txt b/tests/bounces/yahoo_09.txt
new file mode 100644
index 00000000..f8067a5b
--- /dev/null
+++ b/tests/bounces/yahoo_09.txt
@@ -0,0 +1,165 @@
+Return-Path: <boost-admin@lists.boost.org>
+Received: from mx04.mrf.mail.rcn.net ([207.172.4.53] [207.172.4.53])
+ by mta01.mrf.mail.rcn.net with ESMTP
+ id <20020403190104.CHE29566.mta01.mrf.mail.rcn.net@mx04.mrf.mail.rcn.net>;
+ Wed, 3 Apr 2002 14:01:04 -0500
+Received: from milliways.osl.iu.edu ([129.79.245.239])
+ by mx04.mrf.mail.rcn.net with esmtp (Exim 3.35 #5)
+ id 16sq0F-0005l5-00
+ for david.abrahams@rcn.com; Wed, 03 Apr 2002 14:01:03 -0500
+Received: from milliways.osl.iu.edu (localhost [127.0.0.1])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with ESMTP id g33J11A07189;
+ Wed, 3 Apr 2002 14:01:01 -0500
+Received: from mta446.mail.yahoo.com (mta446.mail.yahoo.com [216.136.129.101])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with SMTP id g33J04A07150
+ for <boost-admin@lists.boost.org>; Wed, 3 Apr 2002 14:00:05 -0500
+Date: Wed, 3 Apr 2002 14:00:05 -0500
+Message-Id: <200204031900.g33J04A07150@milliways.osl.iu.edu>
+From: MAILER-DAEMON@yahoo.com
+To: boost-admin@lists.boost.org
+X-Loop: MAILER-DAEMON@yahoo.com
+Subject: Delivery failure
+Sender: boost-owner@lists.boost.org
+Errors-To: boost-owner@lists.boost.org
+X-BeenThere: boost@lists.boost.org
+X-Mailman-Version: 2.0.8
+Precedence: bulk
+List-Help: <mailto:boost-request@lists.boost.org?subject=help>
+List-Post: <mailto:boost@lists.boost.org>
+List-Subscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=subscribe>
+List-Id: Boost mailing list <boost.lists.boost.org>
+List-Unsubscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=unsubscribe>
+List-Archive: <http://lists.boost.org/MailArchives/boost/>
+
+Message from yahoo.com.
+Unable to deliver message to the following address(es).
+
+<hankel_o_fung@yahoo.com>:
+Sorry your message to hankel_o_fung@yahoo.com cannot be delivered. This account has been disabled or discontinued.
+
+<ultravirus2001@yahoo.com>:
+Sorry your message to ultravirus2001@yahoo.com cannot be delivered. This account has been disabled or discontinued.
+
+--- Original message follows.
+
+The original message is over 5K. Message truncated.
+
+X-Track: 1: 100
+Return-Path: <boost-admin@lists.boost.org>
+Received: from milliways.osl.iu.edu (129.79.245.239)
+ by mta446.mail.yahoo.com with SMTP; 03 Apr 2002 10:59:57 -0800 (PST)
+Received: from milliways.osl.iu.edu (localhost [127.0.0.1])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with ESMTP id g33HexA27227;
+ Wed, 3 Apr 2002 12:40:59 -0500
+Received: from smtp016.mail.yahoo.com (smtp016.mail.yahoo.com [216.136.174.113])
+ by milliways.osl.iu.edu (8.11.6/8.11.6/IUCS_2.44) with SMTP id g33HcwA27186
+ for <boost@lists.boost.org>; Wed, 3 Apr 2002 12:38:58 -0500
+Received: from ppp-1-53.chel-5800-8.access.uk.tiscali.com (HELO albert) (RaoulGough@212.159.169.53 with login)
+ by smtp.mail.vip.sc5.yahoo.com with SMTP; 3 Apr 2002 17:38:54 -0000
+Message-ID: <001601c1db36$6da28950$0100a8c0@albert>
+From: "Raoul Gough" <RaoulGough@yahoo.co.uk>
+To: <boost@lists.boost.org>
+References: <200204011702.g31H2eA04494@milliways.osl.iu.edu>
+MIME-Version: 1.0
+Content-Type: text/plain;
+ charset="iso-8859-1"
+Content-Transfer-Encoding: 7bit
+X-Priority: 3
+X-MSMail-Priority: Normal
+X-Mailer: Microsoft Outlook Express 6.00.2600.0000
+X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000
+Subject: [boost] Re: boost::weak_ptr suggestions
+Sender: boost-admin@lists.boost.org
+Errors-To: boost-admin@lists.boost.org
+X-BeenThere: boost@lists.boost.org
+X-Mailman-Version: 2.0.8
+Precedence: bulk
+Reply-To: boost@lists.boost.org
+List-Help: <mailto:boost-request@lists.boost.org?subject=help>
+List-Post: <mailto:boost@lists.boost.org>
+List-Subscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=subscribe>
+List-Id: Boost mailing list <boost.lists.boost.org>
+List-Unsubscribe: <http://lists.boost.org/mailman/listinfo.cgi/boost>,
+ <mailto:boost-request@lists.boost.org?subject=unsubscribe>
+List-Archive: <http://lists.boost.org/MailArchives/boost/>
+Date: Wed, 3 Apr 2002 18:37:55 +0100
+
+> From: "Peter Dimov" <pdimov@mmltd.net>
+> To: <boost@lists.boost.org>
+> Subject: Re: [boost] boost::weak_ptr suggestions
+> Date: Mon, 1 Apr 2002 17:31:05 +0300
+> Organization: Multi Media Ltd.
+> Reply-To: boost@lists.boost.org
+>
+> From: "Raoul Gough" <RaoulGough@yahoo.co.uk>
+[snip]
+> > Secondly, I believe it would be better for the get() method to throw or
+> > assert when called on an invalidated pointer, instead of transparently
+> > returning 0. In my opinion, there is a fundamental difference between
+the
+> > two states (null and invalid) which is not observable with the current
+> > interface. The addition of a member function like "bool is_valid()
+const;"
+> > would also allow the user code to decide how to deal with an invalid
+> > pointer, instead of merging the two distinct states into the one (null)
+> > state.
+>
+> Right again. However, the primary methods of accessing a weak_ptr are (1)
+> constructing a shared_ptr (which does throw) and (2) make_shared. get()
+has
+> been retained for efficiency but is not recommended (in multithreaded
+> programs.)
+
+So why the difference in error semantics between the single and
+multi-threaded idioms? For example, if I converted single-threaded code that
+uses get() to thread-safe code using make_shared, I also get changed
+semantics for the invalid pointer case.
+
+Incidentally, it looks like the use_count member function can determine
+indirectly whether the target still exists or not. It seems a bit obscure
+though, seeing as the reference count is really an implementation detail and
+distinct from the concept of null/valid/invalid.
+
+>
+> > The big advantage of considering invalid.get() an error is that code
+which
+> > then works without error using weak_ptr would have *exactly* unchanged
+> > semantics using a plain pointer replacement. This allows (for example) a
+> > debug build/release build choice between weak_ptr<T> and T* for
+> performance
+> > reasons. If weak_ptr<T> silently returns null on invalid pointers, then
+> this
+> > guarantee cannot be made - what would be undefined use on a plain
+pointer
+> is
+> > not detected by the weak_ptr.
+>
+> Interesting point. You can write your own get() that does what you want:
+>
+> T * get(weak_ptr<T> const & p)
+> {
+> return shared_ptr<T>(p).get();
+> }
+>
+> but it's not as efficient as a throwing get(). Most people seem to prefer
+> the current get() semantics, though, where 0 is returned.
+
+Well, I can understand that point of view as well - either the weak pointer
+has a valid target object or not (in which case null or deleted doesn't
+really matter). However, my use of a smart weak pointer is really as a
+debugging aid, so I would like the error to be detected as soon as possible
+(and distinguished from a null-pointer assertion or SEGV). Short of adding a
+policy class template parameter, it would be easy to add a new member
+function which does get() with severe checking - along the lines of
+vector.at versus vector.operator[]. Just an idea.
+
+BTW, am I right in thinking that sharede_ptr always maintains an extra weak
+reference counter? I mean, even if my code doesn't use weak_ptr, shared_ptr
+still has to maintain the extra counter, right? That, combined with the
+*** MESSAGE TRUNCATED ***
+
+
+.
diff --git a/tests/bounces/yale_01.txt b/tests/bounces/yale_01.txt
new file mode 100644
index 00000000..7be4754e
--- /dev/null
+++ b/tests/bounces/yale_01.txt
@@ -0,0 +1,422 @@
+From VM Tue Dec 26 22:41:08 2000
+Return-Path: <mailman-users-admin@python.org>
+Received: from ns2.digicool.com ([216.164.72.2] verified)
+ by digicool.com (CommuniGate Pro SMTP 3.3.1)
+ with ESMTP id 400038 for xxxxx@mail.digicool.com; Tue, 26 Dec 2000 18:41:55 -0500
+Received: from mail.python.org (starship.python.net [63.102.49.30])
+ by ns2.digicool.com (8.9.3/8.9.3) with ESMTP id SAA03359
+ for <xxxxx@digicool.com>; Tue, 26 Dec 2000 18:41:47 -0500
+Received: from ns1.zope.org (localhost.localdomain [127.0.0.1])
+ by mail.python.org (Postfix) with ESMTP id DC80BE904
+ for <xxxxx@digicool.com>; Tue, 26 Dec 2000 13:27:01 -0500 (EST)
+Delivered-To: mm+mailman-users-admin@python.org
+Received: from mr2.its.yale.edu (mr2.its.yale.edu [130.132.21.43])
+ by mail.python.org (Postfix) with ESMTP id E27E8E904
+ for <mailman-users-admin@python.org>; Tue, 26 Dec 2000 13:26:19 -0500 (EST)
+Received: (from mailnull@localhost)
+ by mr2.its.yale.edu (8.8.8/8.8.8) id NAA14658;
+ Tue, 26 Dec 2000 13:26:18 -0500 (EST)
+Message-Id: <200012261826.NAA14658@mr2.its.yale.edu>
+Errors-To: mailman-users-owner@python.org
+Precedence: bulk
+List-Help: <mailto:mailman-users-request@python.org?subject=help>
+List-Post: <mailto:mailman-users@python.org>
+List-Subscribe: <http://www.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=subscribe>
+List-Id: Mailman mailing list management users <mailman-users.python.org>
+List-Unsubscribe: <http://www.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=unsubscribe>
+List-Archive: <http://www.python.org/pipermail/mailman-users/>
+From: MAILER-DAEMON@mr2.its.yale.edu
+Sender: mailman-users-owner@python.org
+To: mailman-users-admin@python.org
+Subject: Returned mail - nameserver error report
+Date: Tue, 26 Dec 2000 13:26:18 -0500 (EST)
+X-BeenThere: mailman-users@python.org
+X-Mailman-Version: 2.0
+
+ --------Message not delivered to the following:
+
+ thomas.dtankengine No matches to nameserver query
+
+ --------Error Detail (phquery V4.1):
+
+ The message, "No matches to nameserver query," is generated whenever
+ Yale's on-line directory fails to locate either a ph alias, name or
+ nickname field that matches the supplied name. The usual causes are
+ typographical errors. Recommended action is to query the Yale on-line
+ directory prior to mailing using the ``ph -s directory.yale.edu NAME'',
+ ``finger NAME@directory.yale.edu'', or equivalent commands, or by
+ querying the Yale Directory within YaleInfo, where NAME is your party's
+ name, email alias, or nickname. If no lookup tools are available to
+ you, try sending to the most explicit form of the name, e.g., if
+ mike.fox@yale.edu fails, try michael.j.fox@yale.edu.
+
+ To reach a party that was formerly reachable by emailing NAME@yale.edu,
+ try emailing to NAME@cs.yale.edu instead.
+
+
+ --------Unsent Message below:
+
+Received: from mail.python.org ([63.102.49.30])
+ by mr2.its.yale.edu (8.8.8/8.8.8) with ESMTP id NAA14654
+ for <thomas.dtankengine@yale.edu>; Tue, 26 Dec 2000 13:26:17 -0500 (EST)
+Received: from ns1.zope.org (localhost.localdomain [127.0.0.1])
+ by mail.python.org (Postfix) with ESMTP
+ id 3DFEDE904; Tue, 26 Dec 2000 12:01:13 -0500 (EST)
+From: mailman-users-request@python.org
+Subject: Mailman-Users digest, Vol 1 #948 - 11 msgs
+Reply-To: mailman-users@python.org
+X-Mailer: Mailman v2.0
+MIME-version: 1.0
+Content-type: text/plain
+To: mailman-users@python.org
+Sender: mailman-users-admin@python.org
+Errors-To: mailman-users-admin@python.org
+X-BeenThere: mailman-users@python.org
+X-Mailman-Version: 2.0
+Precedence: bulk
+List-Help: <mailto:mailman-users-request@python.org?subject=help>
+List-Post: <mailto:mailman-users@python.org>
+List-Subscribe: <http://www.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=subscribe>
+List-Id: Mailman mailing list management users <mailman-users.python.org>
+List-Unsubscribe: <http://www.python.org/mailman/listinfo/mailman-users>,
+ <mailto:mailman-users-request@python.org?subject=unsubscribe>
+List-Archive: <http://www.python.org/pipermail/mailman-users/>
+Message-Id: <20001226170113.3DFEDE904@mail.python.org>
+Date: Tue, 26 Dec 2000 12:01:13 -0500 (EST)
+
+Send Mailman-Users mailing list submissions to
+ mailman-users@python.org
+
+To subscribe or unsubscribe via the World Wide Web, visit
+ http://www.python.org/mailman/listinfo/mailman-users
+or, via email, send a message with subject or body 'help' to
+ mailman-users-request@python.org
+
+You can reach the person managing the list at
+ mailman-users-admin@python.org
+
+When replying, please edit your Subject line so it is more specific
+than "Re: Contents of Mailman-Users digest..."
+
+
+Today's Topics:
+
+ 1. Re: GID error (Bradley Leonard)
+ 2. Password bug in Mailman 2.0 (Juan Eliseo Carrasco Diaz)
+ 3. Re: Password bug in Mailman 2.0 (Bek Oberin)
+ 4. Re: Password bug in Mailman 2.0 (Juan Eliseo Carrasco Diaz)
+ 5. Re: Password bug in Mailman 2.0 (Bek Oberin)
+ 6. Re: Is this a bug, or just because I called it from an
+ unpriveledged account? (Dan Mick)
+ 7. Re: Re: Password bug in Mailman 2.0 (Dan Mick)
+ 8. Mailman 2.0 with Python 2.0 (Leonard Jacobs)
+ 9. Recovering/resetting a list admin password (Jim Trigg)
+ 10. (no subject) (Michael Albert)
+
+--__--__--
+
+Message: 1
+Date: Mon, 25 Dec 2000 14:05:42 -0500 (EST)
+Subject: Re: [Mailman-Users] GID error
+From: "Bradley Leonard" <bradley@stygianresearch.com>
+To: jaym@opensourcedirectory.com
+Cc: mailman-users@python.org
+Reply-To: bradley@stygianresearch.com
+
+If the rpm was compiled for RH 7 then its probably set to apache. If not,
+you need to find the src rpm and rebuild it using the --rebuilddb option.
+You'll need to pass in new options or change the spec file.
+
+Brad
+
+
+0> How would I set the GID for the cgi to execute. If I installed mailman
+> via rpm(on a slackware system)?
+>
+>
+> ------------------------------------------------------
+> Mailman-Users maillist - Mailman-Users@python.org
+> http://www.python.org/mailman/listinfo/mailman-users
+
+
+--
+Bradley Leonard (bradley@stygianresearch.com)
+Stygian Research (http://stygianresearch.com)
+
+Life is simple. We make it complicated.
+
+
+
+
+--__--__--
+
+Message: 2
+Date: Mon, 25 Dec 2000 22:48:07 -0500
+From: Juan Eliseo Carrasco Diaz <eliseocd@teleline.es>
+To: mailman-users@python.org
+Subject: [Mailman-Users] Password bug in Mailman 2.0
+
+ The Administrator name can be used as password to go into and change
+administrative and users options in theirs respective html pages.
+
+ It's this a bug?
+
+
+
+--__--__--
+
+Message: 3
+Date: Tue, 26 Dec 2000 11:49:21 +1100
+From: Bek Oberin <gossamer@tertius.net.au>
+To: Juan Eliseo Carrasco Diaz <eliseocd@teleline.es>
+Cc: mailman-users@python.org
+Subject: [Mailman-Users] Re: Password bug in Mailman 2.0
+
+Juan Eliseo Carrasco Diaz wrote:
+> The Administrator name can be used as password to go into and change
+> administrative and users options in theirs respective html pages.
+
+It's a feature.
+
+
+bekj
+
+--
+: --Hacker-Neophile-Eclectic-Geek-Grrl-Queer-Disabled-Boychick--
+: gossamer@tertius.net.au http://www.tertius.net.au/~gossamer/
+: Artificial Intelligence: the art of making computers that behave
+: like the ones in movies. -- Bill Bulko
+
+
+--__--__--
+
+Message: 4
+Date: Tue, 26 Dec 2000 01:21:42 -0500
+From: Juan Eliseo Carrasco Diaz <eliseocd@teleline.es>
+To: Bek Oberin <gossamer@tertius.net.au>
+Cc: mailman-users@python.org
+Subject: [Mailman-Users] Re: Password bug in Mailman 2.0
+
+Bek Oberin wrote:
+
+> Juan Eliseo Carrasco Diaz wrote:
+> > The Administrator name can be used as password to go into and change
+> > administrative and users options in theirs respective html pages.
+>
+> It's a feature.
+>
+> bekj
+>
+> --
+> : --Hacker-Neophile-Eclectic-Geek-Grrl-Queer-Disabled-Boychick--
+> : gossamer@tertius.net.au http://www.tertius.net.au/~gossamer/
+> : Artificial Intelligence: the art of making computers that behave
+> : like the ones in movies. -- Bill Bulko
+
+Ok, but It can be used by anyone, so a list member can modify the
+administrative options.
+
+ If it's a feature, I don't understand it.
+
+
+
+--__--__--
+
+Message: 5
+Date: Tue, 26 Dec 2000 12:23:42 +1100
+From: Bek Oberin <gossamer@tertius.net.au>
+To: Juan Eliseo Carrasco Diaz <eliseocd@teleline.es>
+Cc: mailman-users@python.org
+Subject: [Mailman-Users] Re: Password bug in Mailman 2.0
+
+Juan Eliseo Carrasco Diaz wrote:
+> Bek Oberin wrote:
+> > Juan Eliseo Carrasco Diaz wrote:
+> > > The Administrator name can be used as password to go into and change
+> > > administrative and users options in theirs respective html pages.
+> > It's a feature.
+> Ok, but It can be used by anyone, so a list member can modify the
+> administrative options.
+
+Hang on, I mis-read that as "The Administrator password ...".
+Their -name-? You mean their email address? There isn't
+anywhere in mailman that their name is used ....
+
+bekj
+
+--
+: --Hacker-Neophile-Eclectic-Geek-Grrl-Queer-Disabled-Boychick--
+: gossamer@tertius.net.au http://www.tertius.net.au/~gossamer/
+: Uptime DSW's are the highest form of geek competition.
+: -- Mike Whitaker
+
+
+--__--__--
+
+Message: 6
+Date: Mon, 25 Dec 2000 21:00:25 -0800
+From: Dan Mick <Dan.Mick@west.sun.com>
+To: scott-brown@home.com
+Cc: mailman-users@python.org
+Subject: Re: [Mailman-Users] Is this a bug, or just because I called it from an
+ unpriveledged account?
+
+
+
+> If it's trying to delete a lock file, it's no doubt due to the fact that it
+> (thought that it) created a lock file. Since no lock file is present... why
+> did it get as far as it did without producing an error?
+
+I believe the underlying code is trying to clean up any possibly pre-existing lock file
+as part of the "taking care" section when creating a list. There's no known live lock
+file for the list because the list is being created now, and this code is just a
+prophylactic measure to try to make newlist more bulletproof. The fact
+that you didn't have permission would be a fatal error for either creating or
+removing a lock, so dying if it happens is not unreasonable.
+
+It is a bit confusing, but it's part of trying to make the filesystem persistence
+less of a problem.
+
+
+--__--__--
+
+Message: 7
+Date: Mon, 25 Dec 2000 21:06:48 -0800
+From: Dan Mick <Dan.Mick@west.sun.com>
+To: Juan Eliseo Carrasco Diaz <eliseocd@teleline.es>,
+ mailman-users@python.org
+Subject: Re: [Mailman-Users] Re: Password bug in Mailman 2.0
+
+
+
+Juan Eliseo Carrasco Diaz wrote:
+>
+> Bek Oberin wrote:
+>
+> > Juan Eliseo Carrasco Diaz wrote:
+> > > The Administrator name can be used as password to go into and change
+> > > administrative and users options in theirs respective html pages.
+> >
+> > It's a feature.
+> >
+> > bekj
+> >
+> > --
+> > : --Hacker-Neophile-Eclectic-Geek-Grrl-Queer-Disabled-Boychick--
+> > : gossamer@tertius.net.au http://www.tertius.net.au/~gossamer/
+> > : Artificial Intelligence: the art of making computers that behave
+> > : like the ones in movies. -- Bill Bulko
+>
+> Ok, but It can be used by anyone, so a list member can modify the
+> administrative options.
+
+?? You said, correctly, the administrator password can be used as password to go
+change users' options. That's not at all true in the reverse; user passwords don't
+get you admin privileges.
+
+Think of the admin password like the "root" user password; you can do more with it.
+And the site password works for even more things (for admin privs on any list,
+for example).
+
+
+--__--__--
+
+Message: 8
+From: "Leonard Jacobs" <lj@mandala-designs.com>
+To: mailman-users@python.org
+Date: Tue, 26 Dec 2000 01:31:17 -0500
+Reply-To: lj@mandala-designs.com
+Subject: [Mailman-Users] Mailman 2.0 with Python 2.0
+
+Mailman seems to be continually retrying sending mail to hosts
+which can't be resolved via the DNS. Is this correct?
+
+Also why is it that Mailman seems to invoke sendmail in such a
+way that it causes sendmail to return a failure on hostnames that
+can't be resolved (presumably a temporary condition) rather than
+just passing the message to sendmail and letting sendmail do all
+the retries itself (which is how most mailers invoke sendmail). I
+imagine this must relate to the program's needing more detailed
+info about the state of each message to be sent, but when you tie
+this in with the default frequency of its retries, it's very strange.
+
+------------------
+
+ Leonard Jacobs
+ www.mandala-designs.com
+ (508) 359-5473
+
+
+
+--__--__--
+
+Message: 9
+Date: Tue, 26 Dec 2000 09:08:39 -0500
+To: mailman-users@python.org
+From: Jim Trigg <blaise@scadian.net>
+Subject: [Mailman-Users] Recovering/resetting a list admin password
+
+I lost the email giving me my list admin password for one list. The site
+admin claims that there is no way to either recover or reset that password,
+and that I have to recreate the list. Is that true, or can he use the site
+admin password to get access to the list administrative page and reset the
+password that way? It looks to me from the documentation that he should be
+able to.
+
+Thanks,
+Jim Trigg
+
+
+
+--__--__--
+
+Message: 10
+From: "Michael Albert" <sysop@zmag.org>
+To: <mailman-users@python.org>
+Date: Tue, 26 Dec 2000 10:03:03 -0800
+Subject: [Mailman-Users] (no subject)
+
+There is a list about ethiopia maintained or adminstered or otherwise
+related to your operations.
+
+People are being added to this list without having any knowledge of it. They
+are given passwords they don't know. They cannot, therefore, remove
+themsleves. I am such a person.
+
+Perhaps this is ignorance, more likely a stupid but venal undertaking, At
+any rate, you should immediately shut down this list and inform those
+attempting to create it of proper procedures.
+
+Thank you.
+
+The list is
+
+Pol.ethiopia mailing list
+Pol.ethiopia@lists.sn.apc.org
+http://lists.sn.apc.org/mailman/listinfo/pol.ethiopia
+
+
+
+Michael Albert
+Z Magazine / ZNet
+sysop@zmag.org
+www.zmag.org
+
+
+
+
+--__--__--
+
+------------------------------------------------------
+Mailman-Users maillist - Mailman-Users@python.org
+http://www.python.org/mailman/listinfo/mailman-users
+
+
+End of Mailman-Users Digest
+
+ --------End of Unsent Message
+
+
diff --git a/tests/fblast.py b/tests/fblast.py
new file mode 100644
index 00000000..2add9458
--- /dev/null
+++ b/tests/fblast.py
@@ -0,0 +1,60 @@
+"""Throw email at Mailman as fast as you can.
+
+This is not a unit test, it's a functional test, so you can't run it within
+the unit test framework (hence its filename doesn't start with `test_').
+Here's how I use this one:
+
+- set up a dummy list
+
+- add an alias to your MTA, say `devnull' that pipes its messages to, you
+ guessed it, /dev/null
+
+- make this address a member of your list
+
+- add another address to `accept_these_non_members', let's call it ok@dom.ain
+
+- change the FROMADDR variable to ok@dom.ain
+
+- change the LISTADDR variable to point to your list
+
+- run this program like so: python fblast.py N
+ where N is the number of seconds to sleep before sending the next msg
+
+- let this run until you're tired of it, then hit ^C
+"""
+
+FROMADDR = 'ok@dom.ain'
+LISTADDR = 'list@dom.ain'
+
+import sys
+import time
+import smtplib
+
+conn = smtplib.SMTP()
+conn.connect()
+
+snooze = int(sys.argv[1])
+
+try:
+ i = 1
+ while 1:
+ sys.stdout.write('.')
+ sys.stdout.flush()
+ i += 1
+ if i % 50 == 0:
+ print
+ for j in range(10):
+ conn.sendmail(FROMADDR, [LISTADDR], """\
+From: %(FROMADDR)s
+To: $(LISTADDR)s
+Subject: test %(num)d
+X-No-Archive: yes
+
+testing %(num)d
+""" % {'num' : i,
+ 'FROMADDR': FROMADDR,
+ 'LISTADDR': LISTADDR,
+ }
+ time.sleep(snooze)
+finally:
+ conn.quit()
diff --git a/tests/msgs/.cvsignore b/tests/msgs/.cvsignore
new file mode 100644
index 00000000..f3c7a7c5
--- /dev/null
+++ b/tests/msgs/.cvsignore
@@ -0,0 +1 @@
+Makefile
diff --git a/tests/msgs/Makefile.in b/tests/msgs/Makefile.in
new file mode 100644
index 00000000..3844820b
--- /dev/null
+++ b/tests/msgs/Makefile.in
@@ -0,0 +1,68 @@
+# Copyright (C) 2001 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
+# 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 Licenseo
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+# NOTE: Makefile.in is converted into Makefile by the configure script
+# in the parent directory. Once configure has run, you can recreate
+# the Makefile by running just config.status.
+
+# Variables set by configure
+
+VPATH= @srcdir@
+srcdir= @srcdir@
+bindir= @bindir@
+prefix= @prefix@
+exec_prefix= @exec_prefix@
+
+CC= @CC@
+CHMOD= @CHMOD@
+INSTALL= @INSTALL@
+
+DEFS= @DEFS@
+
+# Customizable but not set by configure
+
+OPT= @OPT@
+CFLAGS= $(OPT) $(DEFS)
+MSGSDIR= $(prefix)/tests/msgs
+SHELL= /bin/sh
+
+MSG_FILES= $(srcdir)/*.txt
+
+
+# Modes for directories and executables created by the install
+# process. Default to group-writable directories but
+# user-only-writable for executables.
+DIRMODE= 775
+EXEMODE= 755
+FILEMODE= 644
+INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE)
+
+# Rules
+all:
+
+install:
+ for f in $(MSG_FILES); \
+ do \
+ $(INSTALL) -m $(FILEMODE) $$f $(MSGSDIR); \
+ done
+
+finish:
+
+clean:
+
+distclean:
+ -rm *.pyc
+ -rm Makefile
diff --git a/tests/msgs/bad_01.txt b/tests/msgs/bad_01.txt
new file mode 100644
index 00000000..04a17267
--- /dev/null
+++ b/tests/msgs/bad_01.txt
@@ -0,0 +1,62 @@
+From xxxxx@webmail6.catholic.org Mon Oct 2 22:11:14 2000
+Return-Path: <xxxxx@webmail6.catholic.org>
+Delivered-To: mailman-developers@python.org
+Received: from webmail6.catholic.org (unknown [63.196.163.10])
+ by dinsdale.python.org (Postfix) with ESMTP id 680521CF4C
+ for <mailman-developers@python.org>; Mon, 2 Oct 2000 22:11:14 -0400 (EDT)
+Received: (from root@localhost)
+ by webmail6.catholic.org (8.10.1/8.10.1) id e932BDE08525;
+ Mon, 2 Oct 2000 19:11:13 -0700 (PDT)
+To: "catholic.org@catholicnet.org.uk" <@@forward@@.python.org>
+Received: from dinsdale.python.org (dinsdale.cnri.reston.va.us [132.151.1.21])
+ by webmail6.catholic.org (8.10.1/8.10.1) with SMTP id e932BBa08476
+ for <xxxxx@catholic.org>; Mon, 2 Oct 2000 19:11:11 -0700 (PDT)
+Received: from dinsdale.python.org (localhost [127.0.0.1])
+ by dinsdale.python.org (Postfix) with ESMTP
+ id 1DF9A1CF35; Mon, 2 Oct 2000 22:11:07 -0400 (EDT)
+Delivered-To: mailman-users@python.org
+Received: from alb-net.com (www.alb-net.com [205.216.244.65])
+ by dinsdale.python.org (Postfix) with ESMTP
+ id 55FEC1CF28; Mon, 2 Oct 2000 22:10:11 -0400 (EDT)
+Received: from localhost (localhost [127.0.0.1])
+ by alb-net.com (8.11.0/8.11.0) with ESMTP id e932AAU22315;
+ Mon, 2 Oct 2000 22:10:10 -0400 (EDT)
+From: Zzzzz TTTT <zzzzz@alb-net.com>
+Cc: mailman-developers@python.org
+Message-ID: <Pine.GSO.4.21.0010022206280.5021-100000@alb-net.com>
+Organization: "http://www.alb-net.com/"
+X-Loop: ZZZZZ
+MIME-Version: 1.0
+Content-Type: TEXT/PLAIN; charset=US-ASCII
+Subject: [Mailman-Users] "download the full raw archive"
+Sender: mailman-users-admin@python.org
+Errors-To: mailman-users-admin@python.org
+X-BeenThere: mailman-users@python.org
+X-Mailman-Version: 2.0beta6
+Precedence: bulk
+List-Help: <mailto:mailman-users-request@python.org?subject=help>
+List-Post: <mailto:mailman-users@python.org>
+List-Subscribe: <http://www.python.org/mailman/listinfo/mailman-users>, <mailto:mailman-users-request@python.org?subject=subscribe>
+List-Id: Mailman mailing list management users <mailman-users.python.org>
+List-Unsubscribe: <http://www.python.org/mailman/listinfo/mailman-users>, <mailto:mailman-users-request@python.org?subject=unsubscribe>
+List-Archive: <http://www.python.org/pipermail/mailman-users/>
+Date: Mon, 2 Oct 2000 22:10:10 -0400 (EDT)
+X-Date-Received: Tue, 3 Oct 2000 02:11:12 -0800
+X-EdgeMail-Forward: catholic.org@catholicnet.org.uk <@@forward@@>
+
+
+Doesn't this link run contrary to the "obscure_addresses" Option?
+
+Even if I have the obscure_addresses Option set to YES, the e-mail
+addresses of public archives can be still harvested by various robots out
+there.
+
+later,
+Zzzzz
+
+
+------------------------------------------------------
+Mailman-Users maillist - Mailman-Users@python.org
+http://www.python.org/mailman/listinfo/mailman-users
+
+
diff --git a/tests/msgs/nimda.txt b/tests/msgs/nimda.txt
new file mode 100644
index 00000000..fba0ae09
--- /dev/null
+++ b/tests/msgs/nimda.txt
@@ -0,0 +1,43 @@
+Received: from tom.interq.or.jp (tom.interq.or.jp [210.172.128.229])
+ by imap.interq.or.jp with ESMTP id f8J1sCHb006936
+ for <ben@gmo.jp>;
+ Wed, 19 Sep 2001 10:54:13 +0900 (JST)
+Received: from master.debian.org (mail@master.debian.org [216.234.231.130])
+ by tom.interq.or.jp with ESMTP id f8J1sAS04533
+ for <ben@gmo.jp>; ) Wed, 19 Sep 2001 10:54:11 +0900 (JST)
+Date: Wed, 19 Sep 2001 10:54:11 +0900 (JST)
+From: <crt@kiski.net>
+Subject: C:\WINNT\mmc.exebqinsghtmstaskicwconnhtml helpdialerhypertrmgotodlgmsicwie6bakieexbqqviewie6bakeudcediticwdldwintlreadmehypertrmmsicwnpbqv32hypertrmicwhelpieexmscreatehmmapiwrite32npbqs32fixiehtml helpicwconn1write32ie6setupicwtutorieexsupportsetuphtml helplover.com.install
+MIME-Version: 1.0
+Content-Type: multipart/related;
+ type="multipart/alternative";
+ boundary="====_ABC1234567890DEF_===="
+X-Priority: 3
+X-MSMail-Priority: Normal
+X-Unsent: 1
+
+--====_ABC1234567890DEF_====
+Content-Type: multipart/alternative;
+ boundary="====_ABC0987654321DEF_===="
+
+--====_ABC0987654321DEF_====
+Content-Type: text/html;
+ charset="iso-8859-1"
+Content-Transfer-Encoding: quoted-printable
+
+
+<HTML><HEAD></HEAD><BODY bgColor=3D#ffffff>
+<iframe src=3Dcid:EA4DMGBP9p height=3D0 width=3D0>
+</iframe></BODY></HTML>
+--====_ABC0987654321DEF_====--
+
+--====_ABC1234567890DEF_====
+Content-Type: audio/x-wav;
+ name="readme.exe"
+Content-Transfer-Encoding: base64
+Content-ID: <EA4DMGBP9p>
+
+XXXX
+--====_ABC1234567890DEF_====
+
+
diff --git a/tests/onebounce.py b/tests/onebounce.py
new file mode 100755
index 00000000..24467342
--- /dev/null
+++ b/tests/onebounce.py
@@ -0,0 +1,94 @@
+#! /usr/bin/env python
+
+# Copyright (C) 2002 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
+# 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, USA.
+
+"""Test the bounce detection for files containing bounces.
+
+Usage: %(PROGRAM)s [options] file1 ...
+
+Options:
+ -h / --help
+ Print this text and exit.
+
+ -v / --verbose
+ Verbose output.
+
+ -a / --all
+ Run the message through all the bounce modules. Normally this script
+ stops at the first one that finds a match.
+"""
+
+import sys
+import email
+import getopt
+
+import paths
+from Mailman.Bouncers import BouncerAPI
+
+PROGRAM = sys.argv[0]
+COMMASPACE = ', '
+
+
+
+def usage(code, msg=''):
+ print __doc__ % globals()
+ if msg:
+ print msg
+ sys.exit(code)
+
+
+
+def main():
+ try:
+ opts, args = getopt.getopt(sys.argv[1:], 'hva',
+ ['help', 'verbose', 'all'])
+ except getopt.error, msg:
+ usage(1, msg)
+
+ all = verbose = 0
+ for opt, arg in opts:
+ if opt in ('-h', '--help'):
+ usage(0)
+ elif opt in ('-v', '--verbose'):
+ verbose = 1
+ elif opt in ('-a', '--all'):
+ all = 1
+
+ for file in args:
+ fp = open(file)
+ msg = email.message_from_file(fp)
+ fp.close()
+ for module in BouncerAPI.BOUNCE_PIPELINE:
+ modname = 'Mailman.Bouncers.' + module
+ __import__(modname)
+ addrs = sys.modules[modname].process(msg)
+ if addrs is BouncerAPI.Stop:
+ print module, 'got a Stop'
+ if not all:
+ break
+ if not addrs:
+ if verbose:
+ print module, 'found no matches'
+ else:
+ print module, 'found', COMMASPACE.join(addrs)
+ if not all:
+ break
+
+
+
+if __name__ == '__main__':
+ main()
diff --git a/tests/test_bounces.py b/tests/test_bounces.py
new file mode 100644
index 00000000..2cb417e3
--- /dev/null
+++ b/tests/test_bounces.py
@@ -0,0 +1,175 @@
+# Copyright (C) 2001,2002 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
+# 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, USA.
+
+"""Test the bounce detection modules."""
+
+import sys
+import os
+import unittest
+import email
+
+
+
+class BounceTest(unittest.TestCase):
+ DATA = (
+ # Postfix bounces
+ ('Postfix', 'postfix_01.txt', ['xxxxx@local.ie']),
+ ('Postfix', 'postfix_02.txt', ['yyyyy@digicool.com']),
+ ('Postfix', 'postfix_03.txt', ['ttttt@ggggg.com']),
+ ('Postfix', 'postfix_04.txt', ['davidlowie@mail1.keftamail.com']),
+ ('Postfix', 'postfix_05.txt', ['bjelf@detectit.net']),
+ # Exim bounces
+ ('Exim', 'exim_01.txt', ['delangen@its.tudelft.nl']),
+ # SimpleMatch bounces
+ ('SimpleMatch', 'sendmail_01.txt', ['zzzzz@nfg.nl']),
+ ('SimpleMatch', 'simple_01.txt', ['bbbsss@turbosport.com']),
+ ('SimpleMatch', 'simple_02.txt', ['chris.ggggmmmm@usa.net']),
+ ('SimpleMatch', 'simple_04.txt', ['claird@starbase.neosoft.com']),
+ ('SimpleMatch', 'newmailru_01.txt', ['zzzzz@newmail.ru']),
+ ('SimpleMatch', 'hotpop_01.txt', ['allensmithee@hotpop.com']),
+ # SimpleWarning
+ ('SimpleWarning', 'simple_03.txt', ['jacobus@geo.co.za']),
+ # GroupWise
+ ('GroupWise', 'groupwise_01.txt', ['thoff@MAINEX1.ASU.EDU']),
+ # This one really sucks 'cause it's text/html. Just make sure it
+ # doesn't throw an exception, but we won't get any meaningful
+ # addresses back from it.
+ ('GroupWise', 'groupwise_02.txt', []),
+ # Yale's own
+ ('Yale', 'yale_01.txt', ['thomas.dtankengine@cs.yale.edu',
+ 'thomas.dtankengine@yale.edu']),
+ # DSN, i.e. RFC 1894
+ ('DSN', 'dsn_01.txt', ['JimmyMcEgypt@go.com']),
+ ('DSN', 'dsn_02.txt', ['zzzzz@zeus.hud.ac.uk']),
+ ('DSN', 'dsn_03.txt', ['ddd.kkk@advalvas.be']),
+ ('DSN', 'dsn_04.txt', ['max.haas@unibas.ch']),
+ ('DSN', 'dsn_05.txt', ['pkocmid@atlas.cz']),
+ ('DSN', 'dsn_06.txt', ['hao-nghi.au@fr.thalesgroup.com']),
+ ('DSN', 'dsn_07.txt', ['david.farrar@parliament.govt.nz']),
+ ('DSN', 'dsn_08.txt', ['news-list.zope@localhost.bln.innominate.de']),
+ ('DSN', 'dsn_09.txt', ['pr@allen-heath.com']),
+ ('DSN', 'dsn_10.txt', ['anne.person@dom.ain']),
+ ('DSN', 'dsn_11.txt', ['joem@example.com']),
+ # Microsoft Exchange
+ ('Exchange', 'microsoft_01.txt', ['DJBENNETT@IKON.COM']),
+ ('Exchange', 'microsoft_02.txt', ['MDMOORE@BALL.COM']),
+ # SMTP32
+ ('SMTP32', 'smtp32_01.txt', ['oliver@pcworld.com.ph']),
+ ('SMTP32', 'smtp32_02.txt', ['lists@mail.spicynoodles.com']),
+ ('SMTP32', 'smtp32_03.txt', ['borisk@gw.xraymedia.com']),
+ # Qmail
+ ('Qmail', 'qmail_01.txt', ['psadisc@wwwmail.n-h.de']),
+ # LLNL's custom Sendmail
+ ('LLNL', 'llnl_01.txt', ['trotts1@llnl.gov']),
+ # Netscape's server...
+ ('Netscape', 'netscape_01.txt', ['aaaaa@corel.com',
+ 'bbbbb@corel.com']),
+ # Yahoo's proprietary format
+ ('Yahoo', 'yahoo_01.txt', ['subscribe.motorcycles@listsociety.com']),
+ ('Yahoo', 'yahoo_02.txt', ['agarciamartiartu@yahoo.es']),
+ ('Yahoo', 'yahoo_03.txt', ['cresus22@yahoo.com']),
+ ('Yahoo', 'yahoo_04.txt', ['agarciamartiartu@yahoo.es',
+ 'open00now@yahoo.co.uk']),
+ ('Yahoo', 'yahoo_05.txt', ['cresus22@yahoo.com',
+ 'jjb700@yahoo.com']),
+ ('Yahoo', 'yahoo_06.txt', ['andrew_polevoy@yahoo.com',
+ 'baruch_sterin@yahoo.com',
+ 'rjhoeks@yahoo.com',
+ 'tritonrugger91@yahoo.com']),
+ ('Yahoo', 'yahoo_07.txt', ['mark1960_1998@yahoo.com',
+ 'ovchenkov@yahoo.com',
+ 'tsa412@yahoo.com',
+ 'vaxheadroom@yahoo.com']),
+ ('Yahoo', 'yahoo_08.txt', ['chatrathis@yahoo.com',
+ 'crownjules01@yahoo.com',
+ 'cwl_999@yahoo.com',
+ 'eichaiwiu@yahoo.com',
+ 'rjhoeks@yahoo.com',
+ 'yuli_kolesnikov@yahoo.com']),
+ ('Yahoo', 'yahoo_09.txt', ['hankel_o_fung@yahoo.com',
+ 'ultravirus2001@yahoo.com']),
+ # sina.com appears to use their own weird SINAEMAIL MTA
+ ('Sina', 'sina_01.txt', ['boboman76@sina.com', 'alan_t18@sina.com']),
+ # No address can be detected in these...
+ # dumbass_01.txt - We love Microsoft. :(
+ # Done
+ )
+
+ def test_bounce(self):
+ for modname, file, addrs in self.DATA:
+ module = 'Mailman.Bouncers.' + modname
+ __import__(module)
+ fp = open(os.path.join('tests', 'bounces', file))
+ try:
+ msg = email.message_from_file(fp)
+ finally:
+ fp.close()
+ foundaddrs = sys.modules[module].process(msg)
+ # Some modules return None instead of [] for failure
+ if foundaddrs is None:
+ foundaddrs = []
+ addrs.sort()
+ foundaddrs.sort()
+ self.assertEqual(addrs, foundaddrs)
+
+ def test_SMTP32_failure(self):
+ from Mailman.Bouncers import SMTP32
+ # This file has no X-Mailer: header
+ fp = open(os.path.join('tests', 'bounces', 'postfix_01.txt'))
+ try:
+ msg = email.message_from_file(fp)
+ finally:
+ fp.close()
+ self.failIf(msg['x-mailer'] is not None)
+ self.failIf(SMTP32.process(msg))
+
+ def test_caiwireless(self):
+ from Mailman.Bouncers import Caiwireless
+ # BAW: this is a mostly bogus test; I lost the samples. :(
+ msg = email.message_from_string("""\
+Content-Type: multipart/report; boundary=BOUNDARY
+
+--BOUNDARY
+
+--BOUNDARY--
+
+""")
+ self.assertEqual(None, Caiwireless.process(msg))
+
+ def test_microsoft(self):
+ from Mailman.Bouncers import Microsoft
+ # BAW: similarly as above, I lost the samples. :(
+ msg = email.message_from_string("""\
+Content-Type: multipart/report; boundary=BOUNDARY
+
+--BOUNDARY
+
+--BOUNDARY--
+
+""")
+ self.assertEqual(None, Microsoft.process(msg))
+
+
+
+def suite():
+ suite = unittest.TestSuite()
+ suite.addTest(unittest.makeSuite(BounceTest))
+ return suite
+
+
+
+if __name__ == '__main__':
+ unittest.main(defaultTest='suite')
diff --git a/tests/test_handlers.py b/tests/test_handlers.py
new file mode 100644
index 00000000..d169c51e
--- /dev/null
+++ b/tests/test_handlers.py
@@ -0,0 +1,1741 @@
+# Copyright (C) 2001,2002 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
+# 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, USA.
+
+"""Unit tests for the various Mailman/Handlers/*.py modules.
+"""
+
+import os
+import time
+import sha
+import unittest
+import cPickle
+import errno
+import email
+from email.Generator import Generator
+from types import ListType
+
+from Mailman import mm_cfg
+from Mailman.MailList import MailList
+from Mailman import Message
+from Mailman import Errors
+from Mailman import Pending
+from Mailman.Queue.Switchboard import Switchboard
+
+from Mailman.Handlers import Acknowledge
+from Mailman.Handlers import AfterDelivery
+from Mailman.Handlers import Approve
+from Mailman.Handlers import CalcRecips
+from Mailman.Handlers import Cleanse
+from Mailman.Handlers import CookHeaders
+from Mailman.Handlers import Decorate
+from Mailman.Handlers import FileRecips
+from Mailman.Handlers import Hold
+from Mailman.Handlers import MimeDel
+from Mailman.Handlers import Moderate
+from Mailman.Handlers import Personalize
+from Mailman.Handlers import Replybot
+from Mailman.Handlers import SMTPDirect
+from Mailman.Handlers import Sendmail
+from Mailman.Handlers import SpamDetect
+from Mailman.Handlers import Tagger
+from Mailman.Handlers import ToArchive
+from Mailman.Handlers import ToDigest
+from Mailman.Handlers import ToOutgoing
+from Mailman.Handlers import ToUsenet
+
+from TestBase import TestBase
+
+
+
+def password(plaintext):
+ return sha.new(plaintext).hexdigest()
+
+
+
+class TestAcknowledge(TestBase):
+ def setUp(self):
+ TestBase.setUp(self)
+ # We're going to want to inspect this queue directory
+ self._sb = Switchboard(mm_cfg.VIRGINQUEUE_DIR)
+ # Add a member
+ self._mlist.addNewMember('aperson@dom.ain')
+
+ def tearDown(self):
+ for f in os.listdir(mm_cfg.VIRGINQUEUE_DIR):
+ os.unlink(os.path.join(mm_cfg.VIRGINQUEUE_DIR, f))
+ TestBase.tearDown(self)
+
+ def test_no_ack_msgdata(self):
+ eq = self.assertEqual
+ # Make sure there are no files in the virgin queue already
+ eq(len(self._sb.files()), 0)
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+
+""", Message.Message)
+ Acknowledge.process(self._mlist, msg,
+ {'original_sender': 'aperson@dom.ain'})
+ eq(len(self._sb.files()), 0)
+
+ def test_no_ack_not_a_member(self):
+ eq = self.assertEqual
+ # Make sure there are no files in the virgin queue already
+ eq(len(self._sb.files()), 0)
+ msg = email.message_from_string("""\
+From: bperson@dom.ain
+
+""", Message.Message)
+ Acknowledge.process(self._mlist, msg,
+ {'original_sender': 'bperson@dom.ain'})
+ eq(len(self._sb.files()), 0)
+
+ def test_no_ack_sender(self):
+ eq = self.assertEqual
+ eq(len(self._sb.files()), 0)
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+
+""", Message.Message)
+ Acknowledge.process(self._mlist, msg, {})
+ eq(len(self._sb.files()), 0)
+
+ def test_ack_no_subject(self):
+ eq = self.assertEqual
+ self._mlist.setMemberOption(
+ 'aperson@dom.ain', mm_cfg.AcknowledgePosts, 1)
+ eq(len(self._sb.files()), 0)
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+
+""", Message.Message)
+ Acknowledge.process(self._mlist, msg, {})
+ files = self._sb.files()
+ eq(len(files), 1)
+ qmsg, qdata = self._sb.dequeue(files[0])
+ # Check the .db file
+ eq(qdata.get('listname'), '_xtest')
+ eq(qdata.get('recips'), ['aperson@dom.ain'])
+ eq(qdata.get('version'), 3)
+ # Check the .pck
+ eq(str(str(qmsg['subject'])), '_xtest post acknowledgement')
+ eq(qmsg['to'], 'aperson@dom.ain')
+ eq(qmsg['from'], '_xtest-bounces@dom.ain')
+ eq(qmsg.get_type(), 'text/plain')
+ eq(qmsg.get_param('charset'), 'us-ascii')
+ msgid = qmsg['message-id']
+ self.failUnless(msgid.startswith('<mailman.'))
+ self.failUnless(msgid.endswith('._xtest@dom.ain>'))
+ eq(qmsg.get_payload(), """\
+Your message entitled
+
+ (no subject)
+
+was successfully received by the _xtest mailing list.
+
+List info page: http://www.dom.ain/mailman/listinfo/_xtest
+""")
+ # Make sure we dequeued the only message
+ eq(len(self._sb.files()), 0)
+
+ def test_ack_with_subject(self):
+ eq = self.assertEqual
+ self._mlist.setMemberOption(
+ 'aperson@dom.ain', mm_cfg.AcknowledgePosts, 1)
+ eq(len(self._sb.files()), 0)
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+Subject: Wish you were here
+
+""", Message.Message)
+ Acknowledge.process(self._mlist, msg, {})
+ files = self._sb.files()
+ eq(len(files), 1)
+ qmsg, qdata = self._sb.dequeue(files[0])
+ # Check the .db file
+ eq(qdata.get('listname'), '_xtest')
+ eq(qdata.get('recips'), ['aperson@dom.ain'])
+ eq(qdata.get('version'), 3)
+ # Check the .pck
+ eq(str(qmsg['subject']), '_xtest post acknowledgement')
+ eq(qmsg['to'], 'aperson@dom.ain')
+ eq(qmsg['from'], '_xtest-bounces@dom.ain')
+ eq(qmsg.get_type(), 'text/plain')
+ eq(qmsg.get_param('charset'), 'us-ascii')
+ msgid = qmsg['message-id']
+ self.failUnless(msgid.startswith('<mailman.'))
+ self.failUnless(msgid.endswith('._xtest@dom.ain>'))
+ eq(qmsg.get_payload(), """\
+Your message entitled
+
+ Wish you were here
+
+was successfully received by the _xtest mailing list.
+
+List info page: http://www.dom.ain/mailman/listinfo/_xtest
+""")
+ # Make sure we dequeued the only message
+ eq(len(self._sb.files()), 0)
+
+ def test_ack_with_prefixed_subject(self):
+ eq = self.assertEqual
+ self._mlist.subject_prefix = '[XTEST] '
+ self._mlist.setMemberOption(
+ 'aperson@dom.ain', mm_cfg.AcknowledgePosts, 1)
+ eq(len(self._sb.files()), 0)
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+Subject: [XTEST] Wish you were here
+
+""", Message.Message)
+ Acknowledge.process(self._mlist, msg, {})
+ files = self._sb.files()
+ eq(len(files), 1)
+ qmsg, qdata = self._sb.dequeue(files[0])
+ # Check the .db file
+ eq(qdata.get('listname'), '_xtest')
+ eq(qdata.get('recips'), ['aperson@dom.ain'])
+ eq(qdata.get('version'), 3)
+ # Check the .pck
+ eq(str(qmsg['subject']), '_xtest post acknowledgement')
+ eq(qmsg['to'], 'aperson@dom.ain')
+ eq(qmsg['from'], '_xtest-bounces@dom.ain')
+ eq(qmsg.get_type(), 'text/plain')
+ eq(qmsg.get_param('charset'), 'us-ascii')
+ msgid = qmsg['message-id']
+ self.failUnless(msgid.startswith('<mailman.'))
+ self.failUnless(msgid.endswith('._xtest@dom.ain>'))
+ eq(qmsg.get_payload(), """\
+Your message entitled
+
+ Wish you were here
+
+was successfully received by the _xtest mailing list.
+
+List info page: http://www.dom.ain/mailman/listinfo/_xtest
+""")
+ # Make sure we dequeued the only message
+ eq(len(self._sb.files()), 0)
+
+
+
+class TestAfterDelivery(TestBase):
+ # Both msg and msgdata are ignored
+ def test_process(self):
+ mlist = self._mlist
+ last_post_time = mlist.last_post_time
+ post_id = mlist.post_id
+ AfterDelivery.process(mlist, None, None)
+ self.failUnless(mlist.last_post_time > last_post_time)
+ self.assertEqual(mlist.post_id, post_id + 1)
+
+
+
+class TestApprove(TestBase):
+ def test_short_circuit(self):
+ msgdata = {'approved': 1}
+ rtn = Approve.process(self._mlist, None, msgdata)
+ # Not really a great test, but there's little else to assert
+ self.assertEqual(rtn, None)
+
+ def test_approved_moderator(self):
+ mlist = self._mlist
+ mlist.mod_password = password('wazoo')
+ msg = email.message_from_string("""\
+Approved: wazoo
+
+""")
+ msgdata = {}
+ Approve.process(mlist, msg, msgdata)
+ self.failUnless(msgdata.has_key('approved'))
+ self.assertEqual(msgdata['approved'], 1)
+
+ def test_approve_moderator(self):
+ mlist = self._mlist
+ mlist.mod_password = password('wazoo')
+ msg = email.message_from_string("""\
+Approve: wazoo
+
+""")
+ msgdata = {}
+ Approve.process(mlist, msg, msgdata)
+ self.failUnless(msgdata.has_key('approved'))
+ self.assertEqual(msgdata['approved'], 1)
+
+ def test_approved_admin(self):
+ mlist = self._mlist
+ mlist.password = password('wazoo')
+ msg = email.message_from_string("""\
+Approved: wazoo
+
+""")
+ msgdata = {}
+ Approve.process(mlist, msg, msgdata)
+ self.failUnless(msgdata.has_key('approved'))
+ self.assertEqual(msgdata['approved'], 1)
+
+ def test_approve_admin(self):
+ mlist = self._mlist
+ mlist.password = password('wazoo')
+ msg = email.message_from_string("""\
+Approve: wazoo
+
+""")
+ msgdata = {}
+ Approve.process(mlist, msg, msgdata)
+ self.failUnless(msgdata.has_key('approved'))
+ self.assertEqual(msgdata['approved'], 1)
+
+ def test_unapproved(self):
+ mlist = self._mlist
+ mlist.password = password('zoowa')
+ msg = email.message_from_string("""\
+Approve: wazoo
+
+""")
+ msgdata = {}
+ Approve.process(mlist, msg, msgdata)
+ self.assertEqual(msgdata.get('approved'), None)
+
+ def test_trip_beentheres(self):
+ mlist = self._mlist
+ msg = email.message_from_string("""\
+X-BeenThere: %s
+
+""" % mlist.GetListEmail())
+ self.assertRaises(Errors.LoopError, Approve.process, mlist, msg, {})
+
+
+
+class TestCalcRecips(TestBase):
+ def setUp(self):
+ TestBase.setUp(self)
+ # Add a bunch of regular members
+ mlist = self._mlist
+ mlist.addNewMember('aperson@dom.ain')
+ mlist.addNewMember('bperson@dom.ain')
+ mlist.addNewMember('cperson@dom.ain')
+ # And a bunch of digest members
+ mlist.addNewMember('dperson@dom.ain', digest=1)
+ mlist.addNewMember('eperson@dom.ain', digest=1)
+ mlist.addNewMember('fperson@dom.ain', digest=1)
+
+ def test_short_circuit(self):
+ msgdata = {'recips': 1}
+ rtn = CalcRecips.process(self._mlist, None, msgdata)
+ # Not really a great test, but there's little else to assert
+ self.assertEqual(rtn, None)
+
+ def test_simple_path(self):
+ msgdata = {}
+ msg = email.message_from_string("""\
+From: dperson@dom.ain
+
+""", Message.Message)
+ CalcRecips.process(self._mlist, msg, msgdata)
+ self.failUnless(msgdata.has_key('recips'))
+ recips = msgdata['recips']
+ recips.sort()
+ self.assertEqual(recips, ['aperson@dom.ain', 'bperson@dom.ain',
+ 'cperson@dom.ain'])
+
+ def test_exclude_sender(self):
+ msgdata = {}
+ msg = email.message_from_string("""\
+From: cperson@dom.ain
+
+""", Message.Message)
+ self._mlist.setMemberOption('cperson@dom.ain',
+ mm_cfg.DontReceiveOwnPosts, 1)
+ CalcRecips.process(self._mlist, msg, msgdata)
+ self.failUnless(msgdata.has_key('recips'))
+ recips = msgdata['recips']
+ recips.sort()
+ self.assertEqual(recips, ['aperson@dom.ain', 'bperson@dom.ain'])
+
+ def test_urgent_moderator(self):
+ self._mlist.mod_password = password('xxXXxx')
+ msgdata = {}
+ msg = email.message_from_string("""\
+From: dperson@dom.ain
+Urgent: xxXXxx
+
+""", Message.Message)
+ CalcRecips.process(self._mlist, msg, msgdata)
+ self.failUnless(msgdata.has_key('recips'))
+ recips = msgdata['recips']
+ recips.sort()
+ self.assertEqual(recips, ['aperson@dom.ain', 'bperson@dom.ain',
+ 'cperson@dom.ain', 'dperson@dom.ain',
+ 'eperson@dom.ain', 'fperson@dom.ain'])
+
+ def test_urgent_admin(self):
+ self._mlist.mod_password = password('yyYYyy')
+ self._mlist.password = password('xxXXxx')
+ msgdata = {}
+ msg = email.message_from_string("""\
+From: dperson@dom.ain
+Urgent: xxXXxx
+
+""", Message.Message)
+ CalcRecips.process(self._mlist, msg, msgdata)
+ self.failUnless(msgdata.has_key('recips'))
+ recips = msgdata['recips']
+ recips.sort()
+ self.assertEqual(recips, ['aperson@dom.ain', 'bperson@dom.ain',
+ 'cperson@dom.ain', 'dperson@dom.ain',
+ 'eperson@dom.ain', 'fperson@dom.ain'])
+
+ def test_urgent_reject(self):
+ self._mlist.mod_password = password('yyYYyy')
+ self._mlist.password = password('xxXXxx')
+ msgdata = {}
+ msg = email.message_from_string("""\
+From: dperson@dom.ain
+Urgent: zzZZzz
+
+""", Message.Message)
+ self.assertRaises(Errors.RejectMessage,
+ CalcRecips.process,
+ self._mlist, msg, msgdata)
+
+ # BAW: must test the do_topic_filters() path...
+
+
+
+class TestCleanse(TestBase):
+ def setUp(self):
+ TestBase.setUp(self)
+
+ def test_simple_cleanse(self):
+ eq = self.assertEqual
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+Approved: yes
+Urgent: indeed
+Reply-To: bperson@dom.ain
+Sender: asystem@dom.ain
+Return-Receipt-To: another@dom.ain
+Disposition-Notification-To: athird@dom.ain
+X-Confirm-Reading-To: afourth@dom.ain
+X-PMRQC: afifth@dom.ain
+Subject: a message to you
+
+""", Message.Message)
+ Cleanse.process(self._mlist, msg, {})
+ eq(msg['approved'], None)
+ eq(msg['urgent'], None)
+ eq(msg['return-receipt-to'], None)
+ eq(msg['disposition-notification-to'], None)
+ eq(msg['x-confirm-reading-to'], None)
+ eq(msg['x-pmrqc'], None)
+ eq(msg['from'], 'aperson@dom.ain')
+ eq(msg['reply-to'], 'bperson@dom.ain')
+ eq(msg['sender'], 'asystem@dom.ain')
+ eq(msg['subject'], 'a message to you')
+
+ def test_anon_cleanse(self):
+ eq = self.assertEqual
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+Approved: yes
+Urgent: indeed
+Reply-To: bperson@dom.ain
+Sender: asystem@dom.ain
+Return-Receipt-To: another@dom.ain
+Disposition-Notification-To: athird@dom.ain
+X-Confirm-Reading-To: afourth@dom.ain
+X-PMRQC: afifth@dom.ain
+Subject: a message to you
+
+""", Message.Message)
+ self._mlist.anonymous_list = 1
+ Cleanse.process(self._mlist, msg, {})
+ eq(msg['approved'], None)
+ eq(msg['urgent'], None)
+ eq(msg['return-receipt-to'], None)
+ eq(msg['disposition-notification-to'], None)
+ eq(msg['x-confirm-reading-to'], None)
+ eq(msg['x-pmrqc'], None)
+ eq(len(msg.get_all('from')), 1)
+ eq(len(msg.get_all('reply-to')), 1)
+ eq(msg['from'], '_xtest@dom.ain')
+ eq(msg['reply-to'], '_xtest@dom.ain')
+ eq(msg['sender'], None)
+ eq(msg['subject'], 'a message to you')
+
+
+
+class TestCookHeaders(TestBase):
+ def test_transform_noack_to_xack(self):
+ eq = self.assertEqual
+ msg = email.message_from_string("""\
+X-Ack: yes
+
+""", Message.Message)
+ CookHeaders.process(self._mlist, msg, {'noack': 1})
+ eq(len(msg.get_all('x-ack')), 1)
+ eq(msg['x-ack'], 'no')
+
+ def test_original_sender(self):
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+
+""", Message.Message)
+ msgdata = {}
+ CookHeaders.process(self._mlist, msg, msgdata)
+ self.assertEqual(msgdata.get('original_sender'), 'aperson@dom.ain')
+
+ def test_no_original_sender(self):
+ msg = email.message_from_string("""\
+Subject: about this message
+
+""", Message.Message)
+ msgdata = {}
+ CookHeaders.process(self._mlist, msg, msgdata)
+ self.assertEqual(msgdata.get('original_sender'), '')
+
+ def test_xbeenthere(self):
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+
+""", Message.Message)
+ CookHeaders.process(self._mlist, msg, {})
+ self.assertEqual(msg['x-beenthere'], '_xtest@dom.ain')
+
+ def test_multiple_xbeentheres(self):
+ eq = self.assertEqual
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+X-BeenThere: alist@another.dom.ain
+
+""", Message.Message)
+ CookHeaders.process(self._mlist, msg, {})
+ eq(len(msg.get_all('x-beenthere')), 2)
+ beentheres = msg.get_all('x-beenthere')
+ beentheres.sort()
+ eq(beentheres, ['_xtest@dom.ain', 'alist@another.dom.ain'])
+
+ def test_nonexisting_mmversion(self):
+ eq = self.assertEqual
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+
+""", Message.Message)
+ CookHeaders.process(self._mlist, msg, {})
+ eq(msg['x-mailman-version'], mm_cfg.VERSION)
+
+ def test_existing_mmversion(self):
+ eq = self.assertEqual
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+X-Mailman-Version: 3000
+
+""", Message.Message)
+ CookHeaders.process(self._mlist, msg, {})
+ eq(len(msg.get_all('x-mailman-version')), 1)
+ eq(msg['x-mailman-version'], '3000')
+
+ def test_nonexisting_precedence(self):
+ eq = self.assertEqual
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+
+""", Message.Message)
+ CookHeaders.process(self._mlist, msg, {})
+ eq(msg['precedence'], 'bulk')
+
+ def test_existing_precedence(self):
+ eq = self.assertEqual
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+Precedence: junk
+
+""", Message.Message)
+ CookHeaders.process(self._mlist, msg, {})
+ eq(len(msg.get_all('precedence')), 1)
+ eq(msg['precedence'], 'junk')
+
+ def test_subject_munging_no_subject(self):
+ self._mlist.subject_prefix = '[XTEST] '
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+
+""", Message.Message)
+ CookHeaders.process(self._mlist, msg, {})
+ self.assertEqual(str(msg['subject']), '[XTEST] (no subject)')
+
+ def test_subject_munging(self):
+ self._mlist.subject_prefix = '[XTEST] '
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+Subject: About Mailman...
+
+""", Message.Message)
+ CookHeaders.process(self._mlist, msg, {})
+ self.assertEqual(msg['subject'], '[XTEST] About Mailman...')
+
+ def test_no_subject_munging_for_digests(self):
+ self._mlist.subject_prefix = '[XTEST] '
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+Subject: About Mailman...
+
+""", Message.Message)
+ CookHeaders.process(self._mlist, msg, {'isdigest': 1})
+ self.assertEqual(msg['subject'], 'About Mailman...')
+
+ def test_no_subject_munging_for_fasttrack(self):
+ self._mlist.subject_prefix = '[XTEST] '
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+Subject: About Mailman...
+
+""", Message.Message)
+ CookHeaders.process(self._mlist, msg, {'_fasttrack': 1})
+ self.assertEqual(msg['subject'], 'About Mailman...')
+
+ def test_no_subject_munging_has_prefix(self):
+ self._mlist.subject_prefix = '[XTEST] '
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+Subject: Re: [XTEST] About Mailman...
+
+""", Message.Message)
+ CookHeaders.process(self._mlist, msg, {})
+ self.assertEqual(msg['subject'], 'Re: [XTEST] About Mailman...')
+
+ def test_reply_to_list(self):
+ eq = self.assertEqual
+ mlist = self._mlist
+ mlist.reply_goes_to_list = 1
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+
+""", Message.Message)
+ CookHeaders.process(mlist, msg, {})
+ eq(msg['reply-to'], '_xtest@dom.ain')
+ eq(msg.get_all('reply-to'), ['_xtest@dom.ain'])
+
+ def test_reply_to_list_with_strip(self):
+ eq = self.assertEqual
+ mlist = self._mlist
+ mlist.reply_goes_to_list = 1
+ mlist.first_strip_reply_to = 1
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+Reply-To: bperson@dom.ain
+
+""", Message.Message)
+ CookHeaders.process(mlist, msg, {})
+ eq(msg['reply-to'], '_xtest@dom.ain')
+ eq(msg.get_all('reply-to'), ['_xtest@dom.ain'])
+
+ def test_reply_to_explicit(self):
+ eq = self.assertEqual
+ mlist = self._mlist
+ mlist.reply_goes_to_list = 2
+ mlist.reply_to_address = 'mlist@dom.ain'
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+
+""", Message.Message)
+ CookHeaders.process(mlist, msg, {})
+ eq(msg['reply-to'], 'mlist@dom.ain')
+ eq(msg.get_all('reply-to'), ['mlist@dom.ain'])
+
+ def test_reply_to_explicit_with_strip(self):
+ eq = self.assertEqual
+ mlist = self._mlist
+ mlist.reply_goes_to_list = 2
+ mlist.first_strip_reply_to = 1
+ mlist.reply_to_address = 'mlist@dom.ain'
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+Reply-To: bperson@dom.ain
+
+""", Message.Message)
+ CookHeaders.process(self._mlist, msg, {})
+ eq(msg['reply-to'], 'mlist@dom.ain')
+ eq(msg.get_all('reply-to'), ['mlist@dom.ain'])
+
+ def test_reply_to_extends_to_list(self):
+ eq = self.assertEqual
+ mlist = self._mlist
+ mlist.reply_goes_to_list = 1
+ mlist.first_strip_reply_to = 0
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+Reply-To: bperson@dom.ain
+
+""", Message.Message)
+ CookHeaders.process(mlist, msg, {})
+ eq(msg['reply-to'], 'bperson@dom.ain, _xtest@dom.ain')
+
+ def test_reply_to_extends_to_explicit(self):
+ eq = self.assertEqual
+ mlist = self._mlist
+ mlist.reply_goes_to_list = 2
+ mlist.first_strip_reply_to = 0
+ mlist.reply_to_address = 'mlist@dom.ain'
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+Reply-To: bperson@dom.ain
+
+""", Message.Message)
+ CookHeaders.process(mlist, msg, {})
+ eq(msg['reply-to'], 'mlist@dom.ain, bperson@dom.ain')
+
+ def test_list_headers_nolist(self):
+ eq = self.assertEqual
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+
+""", Message.Message)
+ CookHeaders.process(self._mlist, msg, {'_nolist': 1})
+ eq(msg['list-id'], None)
+ eq(msg['list-help'], None)
+ eq(msg['list-unsubscribe'], None)
+ eq(msg['list-subscribe'], None)
+ eq(msg['list-post'], None)
+ eq(msg['list-archive'], None)
+
+ def test_list_headers(self):
+ eq = self.assertEqual
+ self._mlist.archive = 1
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+
+""", Message.Message)
+ oldval = mm_cfg.DEFAULT_URL_HOST
+ mm_cfg.DEFAULT_URL_HOST = 'www.dom.ain'
+ try:
+ CookHeaders.process(self._mlist, msg, {})
+ finally:
+ mm_cfg.DEFAULT_URL_HOST = oldval
+ eq(msg['list-id'], '<_xtest.dom.ain>')
+ eq(msg['list-help'], '<mailto:_xtest-request@dom.ain?subject=help>')
+ eq(msg['list-unsubscribe'],
+ '<http://www.dom.ain/mailman/listinfo/_xtest>,'
+ '\n\t<mailto:_xtest-request@dom.ain?subject=unsubscribe>')
+ eq(msg['list-subscribe'],
+ '<http://www.dom.ain/mailman/listinfo/_xtest>,'
+ '\n\t<mailto:_xtest-request@dom.ain?subject=subscribe>')
+ eq(msg['list-post'], '<mailto:_xtest@dom.ain>')
+ eq(msg['list-archive'], '<http://www.dom.ain/pipermail/_xtest>')
+
+ def test_list_headers_with_description(self):
+ eq = self.assertEqual
+ self._mlist.archive = 1
+ self._mlist.description = 'A Test List'
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+
+""", Message.Message)
+ CookHeaders.process(self._mlist, msg, {})
+ eq(msg['list-id'], 'A Test List <_xtest.dom.ain>')
+ eq(msg['list-help'], '<mailto:_xtest-request@dom.ain?subject=help>')
+ eq(msg['list-unsubscribe'],
+ '<http://www.dom.ain/mailman/listinfo/_xtest>,'
+ '\n\t<mailto:_xtest-request@dom.ain?subject=unsubscribe>')
+ eq(msg['list-subscribe'],
+ '<http://www.dom.ain/mailman/listinfo/_xtest>,'
+ '\n\t<mailto:_xtest-request@dom.ain?subject=subscribe>')
+ eq(msg['list-post'], '<mailto:_xtest@dom.ain>')
+
+
+
+class TestDecorate(TestBase):
+ def test_short_circuit(self):
+ msgdata = {'isdigest': 1}
+ rtn = Decorate.process(self._mlist, None, msgdata)
+ # Not really a great test, but there's little else to assert
+ self.assertEqual(rtn, None)
+
+ def test_no_multipart(self):
+ mlist = self._mlist
+ mlist.msg_header = 'header\n'
+ mlist.msg_footer = 'footer'
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+
+Here is a message.
+""")
+ Decorate.process(self._mlist, msg, {})
+ self.assertEqual(msg.get_payload(), """\
+header
+Here is a message.
+footer""")
+
+ def test_no_multipart_template(self):
+ mlist = self._mlist
+ mlist.msg_header = '%(real_name)s header\n'
+ mlist.msg_footer = '%(real_name)s footer'
+ mlist.real_name = 'XTest'
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+
+Here is a message.
+""")
+ Decorate.process(self._mlist, msg, {})
+ self.assertEqual(msg.get_payload(), """\
+XTest header
+Here is a message.
+XTest footer""")
+
+ def test_no_multipart_type_error(self):
+ mlist = self._mlist
+ mlist.msg_header = '%(real_name) header\n'
+ mlist.msg_footer = '%(real_name) footer'
+ mlist.real_name = 'XTest'
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+
+Here is a message.
+""")
+ Decorate.process(self._mlist, msg, {})
+ self.assertEqual(msg.get_payload(), """\
+%(real_name) header
+Here is a message.
+%(real_name) footer""")
+
+ def test_no_multipart_value_error(self):
+ mlist = self._mlist
+ # These will generate warnings in logs/error
+ mlist.msg_header = '%(real_name)p header\n'
+ mlist.msg_footer = '%(real_name)p footer'
+ mlist.real_name = 'XTest'
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+
+Here is a message.
+""")
+ Decorate.process(self._mlist, msg, {})
+ self.assertEqual(msg.get_payload(), """\
+%(real_name)p header
+Here is a message.
+%(real_name)p footer""")
+
+ def test_no_multipart_missing_key(self):
+ mlist = self._mlist
+ mlist.msg_header = '%(spooge)s header\n'
+ mlist.msg_footer = '%(spooge)s footer'
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+
+Here is a message.
+""")
+ Decorate.process(self._mlist, msg, {})
+ self.assertEqual(msg.get_payload(), """\
+%(spooge)s header
+Here is a message.
+%(spooge)s footer""")
+
+ def test_multipart(self):
+ mlist = self._mlist
+ mlist.msg_header = 'header\n'
+ mlist.msg_footer = 'footer'
+ msg1 = email.message_from_string("""\
+From: aperson@dom.ain
+
+Here is the first message.
+""")
+ msg2 = email.message_from_string("""\
+From: bperson@dom.ain
+
+Here is the second message.
+""")
+ msg = Message.Message()
+ msg.set_type('multipart/mixed')
+ msg.set_boundary('BOUNDARY')
+ msg.attach(msg1)
+ msg.attach(msg2)
+ Decorate.process(self._mlist, msg, {})
+ self.assertEqual(msg.as_string(unixfrom=0), """\
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="BOUNDARY"
+
+--BOUNDARY
+Content-Type: text/plain; charset="us-ascii"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+
+header
+
+--BOUNDARY
+From: aperson@dom.ain
+
+Here is the first message.
+
+--BOUNDARY
+From: bperson@dom.ain
+
+Here is the second message.
+
+--BOUNDARY
+Content-Type: text/plain; charset="us-ascii"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+
+footer
+
+--BOUNDARY--""")
+
+ def test_image(self):
+ mlist = self._mlist
+ mlist.msg_header = 'header\n'
+ mlist.msg_footer = 'footer'
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+Content-type: image/x-spooge
+
+IMAGEDATAIMAGEDATAIMAGEDATA
+""")
+ Decorate.process(self._mlist, msg, {})
+ self.assertEqual(msg.get_payload(), """\
+IMAGEDATAIMAGEDATAIMAGEDATA
+""")
+
+ def test_personalize_assert(self):
+ raises = self.assertRaises
+ raises(AssertionError, Decorate.process,
+ self._mlist, None, {'personalize': 1})
+ raises(AssertionError, Decorate.process,
+ self._mlist, None, {'personalize': 1,
+ 'recips': [1, 2, 3]})
+
+
+
+class TestFileRecips(TestBase):
+ def test_short_circuit(self):
+ msgdata = {'recips': 1}
+ rtn = FileRecips.process(self._mlist, None, msgdata)
+ # Not really a great test, but there's little else to assert
+ self.assertEqual(rtn, None)
+
+ def test_file_nonexistant(self):
+ msgdata = {}
+ FileRecips.process(self._mlist, None, msgdata)
+ self.assertEqual(msgdata.get('recips'), [])
+
+ def test_file_exists_no_sender(self):
+ msg = email.message_from_string("""\
+To: yall@dom.ain
+
+""", Message.Message)
+ msgdata = {}
+ file = os.path.join(self._mlist.fullpath(), 'members.txt')
+ addrs = ['aperson@dom.ain', 'bperson@dom.ain',
+ 'cperson@dom.ain', 'dperson@dom.ain']
+ fp = open(file, 'w')
+ try:
+ for addr in addrs:
+ print >> fp, addr
+ fp.close()
+ FileRecips.process(self._mlist, msg, msgdata)
+ self.assertEqual(msgdata.get('recips'), addrs)
+ finally:
+ try:
+ os.unlink(file)
+ except OSError, e:
+ if e.errno <> e.ENOENT: raise
+
+ def test_file_exists_no_member(self):
+ msg = email.message_from_string("""\
+From: eperson@dom.ain
+To: yall@dom.ain
+
+""", Message.Message)
+ msgdata = {}
+ file = os.path.join(self._mlist.fullpath(), 'members.txt')
+ addrs = ['aperson@dom.ain', 'bperson@dom.ain',
+ 'cperson@dom.ain', 'dperson@dom.ain']
+ fp = open(file, 'w')
+ try:
+ for addr in addrs:
+ print >> fp, addr
+ fp.close()
+ FileRecips.process(self._mlist, msg, msgdata)
+ self.assertEqual(msgdata.get('recips'), addrs)
+ finally:
+ try:
+ os.unlink(file)
+ except OSError, e:
+ if e.errno <> e.ENOENT: raise
+
+ def test_file_exists_is_member(self):
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+To: yall@dom.ain
+
+""", Message.Message)
+ msgdata = {}
+ file = os.path.join(self._mlist.fullpath(), 'members.txt')
+ addrs = ['aperson@dom.ain', 'bperson@dom.ain',
+ 'cperson@dom.ain', 'dperson@dom.ain']
+ fp = open(file, 'w')
+ try:
+ for addr in addrs:
+ print >> fp, addr
+ self._mlist.addNewMember(addr)
+ fp.close()
+ FileRecips.process(self._mlist, msg, msgdata)
+ self.assertEqual(msgdata.get('recips'), addrs[1:])
+ finally:
+ try:
+ os.unlink(file)
+ except OSError, e:
+ if e.errno <> e.ENOENT: raise
+
+
+
+class TestHold(TestBase):
+ def setUp(self):
+ TestBase.setUp(self)
+ self._mlist.administrivia = 1
+ self._mlist.respond_to_post_requests = 0
+ self._mlist.admin_immed_notify = 0
+ # We're going to want to inspect this queue directory
+ self._sb = Switchboard(mm_cfg.VIRGINQUEUE_DIR)
+
+ def tearDown(self):
+ for f in os.listdir(mm_cfg.VIRGINQUEUE_DIR):
+ os.unlink(os.path.join(mm_cfg.VIRGINQUEUE_DIR, f))
+ TestBase.tearDown(self)
+ try:
+ os.unlink(os.path.join(mm_cfg.DATA_DIR, 'pending.db'))
+ except OSError, e:
+ if e.errno <> errno.ENOENT: raise
+ for f in [holdfile for holdfile in os.listdir(mm_cfg.DATA_DIR)
+ if holdfile.startswith('heldmsg-')]:
+ os.unlink(os.path.join(mm_cfg.DATA_DIR, f))
+
+ def test_short_circuit(self):
+ msgdata = {'approved': 1}
+ rtn = Hold.process(self._mlist, None, msgdata)
+ # Not really a great test, but there's little else to assert
+ self.assertEqual(rtn, None)
+
+ def test_administrivia(self):
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+Subject: unsubscribe
+
+""", Message.Message)
+ self.assertRaises(Hold.Administrivia, Hold.process,
+ self._mlist, msg, {})
+
+ def test_max_recips(self):
+ self._mlist.max_num_recipients = 5
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+To: _xtest@dom.ain, bperson@dom.ain
+Cc: cperson@dom.ain
+Cc: dperson@dom.ain (Jimmy D. Person)
+To: Billy E. Person <eperson@dom.ain>
+
+Hey folks!
+""", Message.Message)
+ self.assertRaises(Hold.TooManyRecipients, Hold.process,
+ self._mlist, msg, {})
+
+ def test_implicit_destination(self):
+ self._mlist.require_explicit_destination = 1
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+Subject: An implicit message
+
+""", Message.Message)
+ self.assertRaises(Hold.ImplicitDestination, Hold.process,
+ self._mlist, msg, {})
+
+ def test_implicit_destination_fromusenet(self):
+ self._mlist.require_explicit_destination = 1
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+Subject: An implicit message
+
+""", Message.Message)
+ rtn = Hold.process(self._mlist, msg, {'fromusenet': 1})
+ self.assertEqual(rtn, None)
+
+ def test_suspicious_header(self):
+ self._mlist.bounce_matching_headers = 'From: .*person@(blah.)?dom.ain'
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+To: _xtest@dom.ain
+Subject: An implicit message
+
+""", Message.Message)
+ self.assertRaises(Hold.SuspiciousHeaders, Hold.process,
+ self._mlist, msg, {})
+
+ def test_suspicious_header_ok(self):
+ self._mlist.bounce_matching_headers = 'From: .*person@blah.dom.ain'
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+To: _xtest@dom.ain
+Subject: An implicit message
+
+""", Message.Message)
+ rtn = Hold.process(self._mlist, msg, {})
+ self.assertEqual(rtn, None)
+
+ def test_max_message_size(self):
+ self._mlist.max_message_size = 1
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+To: _xtest@dom.ain
+
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+""", Message.Message)
+ self.assertRaises(Hold.MessageTooBig, Hold.process,
+ self._mlist, msg, {})
+
+ def test_hold_notifications(self):
+ eq = self.assertEqual
+ self._mlist.respond_to_post_requests = 1
+ self._mlist.admin_immed_notify = 1
+ # Now cause an implicit destination hold
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+
+""", Message.Message)
+ self.assertRaises(Hold.ImplicitDestination, Hold.process,
+ self._mlist, msg, {})
+ # Now we have to make sure there are two messages in the virgin queue,
+ # one to the sender and one to the list owners.
+ qfiles = {}
+ files = self._sb.files()
+ eq(len(files), 2)
+ for filebase in files:
+ qmsg, qdata = self._sb.dequeue(filebase)
+ to = qmsg['to']
+ qfiles[to] = qmsg, qdata
+ # BAW: We could be testing many other attributes of either the
+ # messages or the metadata files...
+ keys = qfiles.keys()
+ keys.sort()
+ eq(keys, ['_xtest-owner@dom.ain', 'aperson@dom.ain'])
+ # Get the pending cookie from the message to the sender
+ pmsg, pdata = qfiles['aperson@dom.ain']
+ confirmlines = pmsg.get_payload().split('\n')
+ cookie = confirmlines[-3].split('/')[-1]
+ # We also need to make sure there's an entry in the Pending database
+ # for the heold message.
+ data = Pending.confirm(cookie)
+ eq(data, ('H', 1))
+ heldmsg = os.path.join(mm_cfg.DATA_DIR, 'heldmsg-_xtest-1.pck')
+ self.failUnless(os.path.exists(heldmsg))
+ os.unlink(heldmsg)
+ holdfiles = [f for f in os.listdir(mm_cfg.DATA_DIR)
+ if f.startswith('heldmsg-')]
+ eq(len(holdfiles), 0)
+
+
+
+class TestMimeDel(TestBase):
+ def setUp(self):
+ TestBase.setUp(self)
+ self._mlist.filter_content = 1
+ self._mlist.filter_mime_types = ['image/jpeg']
+ self._mlist.convert_html_to_plaintext = 1
+
+ def test_outer_matches(self):
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+Content-Type: image/jpeg
+MIME-Version: 1.0
+
+xxxxx
+""")
+ self.assertRaises(Errors.DiscardMessage, MimeDel.process,
+ self._mlist, msg, {})
+
+ def test_strain_multipart(self):
+ eq = self.assertEqual
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+Content-Type: multipart/mixed; boundary=BOUNDARY
+MIME-Version: 1.0
+
+--BOUNDARY
+Content-Type: image/jpeg
+MIME-Version: 1.0
+
+xxx
+
+--BOUNDARY
+Content-Type: image/gif
+MIME-Version: 1.0
+
+yyy
+--BOUNDARY--
+""")
+ MimeDel.process(self._mlist, msg, {})
+ eq(len(msg.get_payload()), 1)
+ subpart = msg.get_payload(0)
+ eq(subpart.get_type(), 'image/gif')
+ eq(subpart.get_payload(), 'yyy')
+
+ def test_collapse_multipart_alternative(self):
+ eq = self.assertEqual
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+Content-Type: multipart/mixed; boundary=BOUNDARY
+MIME-Version: 1.0
+
+--BOUNDARY
+Content-Type: multipart/alternative; boundary=BOUND2
+MIME-Version: 1.0
+
+--BOUND2
+Content-Type: image/jpeg
+MIME-Version: 1.0
+
+xxx
+
+--BOUND2
+Content-Type: image/gif
+MIME-Version: 1.0
+
+yyy
+--BOUND2--
+
+--BOUNDARY--
+""")
+ MimeDel.process(self._mlist, msg, {})
+ eq(len(msg.get_payload()), 1)
+ eq(msg.get_type(), 'multipart/mixed')
+ subpart = msg.get_payload(0)
+ eq(subpart.get_type(), 'image/gif')
+ eq(subpart.get_payload(), 'yyy')
+
+ def test_convert_to_plaintext(self):
+ # BAW: This test is dependent on your particular lynx version
+ eq = self.assertEqual
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+Content-Type: text/html
+MIME-Version: 1.0
+
+<html><head></head>
+<body></body></html>
+""")
+ MimeDel.process(self._mlist, msg, {})
+ eq(msg.get_type(), 'text/plain')
+ eq(msg.get_payload(), '\n \n\n')
+
+ def test_deep_structure(self):
+ eq = self.assertEqual
+ self._mlist.filter_mime_types.append('text/html')
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+Content-Type: multipart/mixed; boundary=AAA
+
+--AAA
+Content-Type: multipart/mixed; boundary=BBB
+
+--BBB
+Content-Type: image/jpeg
+
+xxx
+--BBB
+Content-Type: image/jpeg
+
+yyy
+--BBB---
+--AAA
+Content-Type: multipart/alternative; boundary=CCC
+
+--CCC
+Content-Type: text/html
+
+<h2>This is a header</h2>
+
+--CCC
+Content-Type: text/plain
+
+A different message
+--CCC--
+--AAA
+Content-Type: image/gif
+
+zzz
+--AAA
+Content-Type: image/gif
+
+aaa
+--AAA--
+""")
+ MimeDel.process(self._mlist, msg, {})
+ payload = msg.get_payload()
+ eq(len(payload), 3)
+ part1 = msg.get_payload(0)
+ eq(part1.get_type(), 'text/plain')
+ eq(part1.get_payload(), 'A different message')
+ part2 = msg.get_payload(1)
+ eq(part2.get_type(), 'image/gif')
+ eq(part2.get_payload(), 'zzz')
+ part3 = msg.get_payload(2)
+ eq(part3.get_type(), 'image/gif')
+ eq(part3.get_payload(), 'aaa')
+
+ def test_top_multipart_alternative(self):
+ eq = self.assertEqual
+ self._mlist.filter_mime_types.append('text/html')
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+Content-Type: multipart/alternative; boundary=AAA
+
+--AAA
+Content-Type: text/html
+
+<b>This is some html</b>
+--AAA
+Content-Type: text/plain
+
+This is plain text
+--AAA--
+""")
+ MimeDel.process(self._mlist, msg, {})
+ eq(msg.get_type(), 'text/plain')
+ eq(msg.get_payload(), 'This is plain text')
+
+
+
+class TestModerate(TestBase):
+ pass
+
+
+
+class TestReplybot(TestBase):
+ pass
+
+
+
+class TestSMTPDirect(TestBase):
+ pass
+
+
+
+class TestSendmail(TestBase):
+ pass
+
+
+
+class TestSpamDetect(TestBase):
+ def test_short_circuit(self):
+ msgdata = {'approved': 1}
+ rtn = SpamDetect.process(self._mlist, None, msgdata)
+ # Not really a great test, but there's little else to assert
+ self.assertEqual(rtn, None)
+
+ def test_spam_detect(self):
+ msg1 = email.message_from_string("""\
+From: aperson@dom.ain
+
+A message.
+""")
+ msg2 = email.message_from_string("""\
+To: xlist@dom.ain
+
+A message.
+""")
+ spammers = mm_cfg.KNOWN_SPAMMERS[:]
+ try:
+ mm_cfg.KNOWN_SPAMMERS.append(('from', '.?person'))
+ self.assertRaises(SpamDetect.SpamDetected,
+ SpamDetect.process, self._mlist, msg1, {})
+ rtn = SpamDetect.process(self._mlist, msg2, {})
+ self.assertEqual(rtn, None)
+ finally:
+ mm_cfg.KNOWN_SPAMMERS = spammers
+
+
+
+class TestTagger(TestBase):
+ def setUp(self):
+ TestBase.setUp(self)
+ self._mlist.topics = [('bar fight', '.*bar.*', 'catch any bars', 1)]
+ self._mlist.topics_enabled = 1
+
+ def test_short_circuit(self):
+ self._mlist.topics_enabled = 0
+ rtn = Tagger.process(self._mlist, None, {})
+ # Not really a great test, but there's little else to assert
+ self.assertEqual(rtn, None)
+
+ def test_simple(self):
+ eq = self.assertEqual
+ mlist = self._mlist
+ mlist.topics_bodylines_limit = 0
+ msg = email.message_from_string("""\
+Subject: foobar
+Keywords: barbaz
+
+""")
+ msgdata = {}
+ Tagger.process(mlist, msg, msgdata)
+ eq(msg['x-topics'], 'bar fight')
+ eq(msgdata.get('topichits'), ['bar fight'])
+
+ def test_all_body_lines_plain_text(self):
+ eq = self.assertEqual
+ mlist = self._mlist
+ mlist.topics_bodylines_limit = -1
+ msg = email.message_from_string("""\
+Subject: Was
+Keywords: Raw
+
+Subject: farbaw
+Keywords: barbaz
+""")
+ msgdata = {}
+ Tagger.process(mlist, msg, msgdata)
+ eq(msg['x-topics'], 'bar fight')
+ eq(msgdata.get('topichits'), ['bar fight'])
+
+ def test_no_body_lines(self):
+ eq = self.assertEqual
+ mlist = self._mlist
+ mlist.topics_bodylines_limit = 0
+ msg = email.message_from_string("""\
+Subject: Was
+Keywords: Raw
+
+Subject: farbaw
+Keywords: barbaz
+""")
+ msgdata = {}
+ Tagger.process(mlist, msg, msgdata)
+ eq(msg['x-topics'], None)
+ eq(msgdata.get('topichits'), None)
+
+ def test_body_lines_in_multipart(self):
+ eq = self.assertEqual
+ mlist = self._mlist
+ mlist.topics_bodylines_limit = -1
+ msg = email.message_from_string("""\
+Subject: Was
+Keywords: Raw
+Content-Type: multipart/alternative; boundary="BOUNDARY"
+
+--BOUNDARY
+From: sabo
+To: obas
+
+Subject: farbaw
+Keywords: barbaz
+
+--BOUNDARY--
+""")
+ msgdata = {}
+ Tagger.process(mlist, msg, msgdata)
+ eq(msg['x-topics'], 'bar fight')
+ eq(msgdata.get('topichits'), ['bar fight'])
+
+ def test_body_lines_no_part(self):
+ eq = self.assertEqual
+ mlist = self._mlist
+ mlist.topics_bodylines_limit = -1
+ msg = email.message_from_string("""\
+Subject: Was
+Keywords: Raw
+Content-Type: multipart/alternative; boundary=BOUNDARY
+
+--BOUNDARY
+From: sabo
+To: obas
+Content-Type: message/rfc822
+
+Subject: farbaw
+Keywords: barbaz
+
+--BOUNDARY
+From: sabo
+To: obas
+Content-Type: message/rfc822
+
+Subject: farbaw
+Keywords: barbaz
+
+--BOUNDARY--
+""")
+ msgdata = {}
+ Tagger.process(mlist, msg, msgdata)
+ eq(msg['x-topics'], None)
+ eq(msgdata.get('topichits'), None)
+
+
+
+class TestToArchive(TestBase):
+ def setUp(self):
+ TestBase.setUp(self)
+ # We're going to want to inspect this queue directory
+ self._sb = Switchboard(mm_cfg.ARCHQUEUE_DIR)
+
+ def tearDown(self):
+ for f in os.listdir(mm_cfg.ARCHQUEUE_DIR):
+ os.unlink(os.path.join(mm_cfg.ARCHQUEUE_DIR, f))
+ TestBase.tearDown(self)
+
+ def test_short_circuit(self):
+ eq = self.assertEqual
+ msgdata = {'isdigest': 1}
+ ToArchive.process(self._mlist, None, msgdata)
+ eq(len(self._sb.files()), 0)
+ # Try the other half of the or...
+ self._mlist.archive = 0
+ ToArchive.process(self._mlist, None, msgdata)
+ eq(len(self._sb.files()), 0)
+ # Now try the various message header shortcuts
+ msg = email.message_from_string("""\
+X-No-Archive: YES
+
+""")
+ self._mlist.archive = 1
+ ToArchive.process(self._mlist, msg, {})
+ eq(len(self._sb.files()), 0)
+ # And for backwards compatibility
+ msg = email.message_from_string("""\
+X-Archive: NO
+
+""")
+ ToArchive.process(self._mlist, msg, {})
+ eq(len(self._sb.files()), 0)
+
+ def test_normal_archiving(self):
+ eq = self.assertEqual
+ msg = email.message_from_string("""\
+Subject: About Mailman
+
+It rocks!
+""")
+ ToArchive.process(self._mlist, msg, {})
+ files = self._sb.files()
+ eq(len(files), 1)
+ msg2, data = self._sb.dequeue(files[0])
+ eq(len(data), 2)
+ eq(data['version'], 3)
+ # Clock skew makes this unreliable
+ #self.failUnless(data['received_time'] <= time.time())
+ eq(msg.as_string(unixfrom=0), msg2.as_string(unixfrom=0))
+
+
+
+class TestToDigest(TestBase):
+ def _makemsg(self, i=0):
+ msg = email.message_from_string("""From: aperson@dom.ain
+To: _xtest@dom.ain
+Subject: message number %(i)d
+
+Here is message %(i)d
+""" % {'i' : i})
+ return msg
+
+ def setUp(self):
+ TestBase.setUp(self)
+ self._path = os.path.join(self._mlist.fullpath(), 'digest.mbox')
+ fp = open(self._path, 'w')
+ g = Generator(fp)
+ for i in range(5):
+ g(self._makemsg(i), unixfrom=1)
+ fp.close()
+ self._sb = Switchboard(mm_cfg.VIRGINQUEUE_DIR)
+
+ def tearDown(self):
+ try:
+ os.unlink(self._path)
+ except OSError, e:
+ if e.errno <> errno.ENOENT: raise
+ for f in os.listdir(mm_cfg.VIRGINQUEUE_DIR):
+ os.unlink(os.path.join(mm_cfg.VIRGINQUEUE_DIR, f))
+ TestBase.tearDown(self)
+
+ def test_short_circuit(self):
+ eq = self.assertEqual
+ mlist = self._mlist
+ mlist.digestable = 0
+ eq(ToDigest.process(mlist, None, {}), None)
+ mlist.digestable = 1
+ eq(ToDigest.process(mlist, None, {'isdigest': 1}), None)
+ eq(self._sb.files(), [])
+
+ def test_undersized(self):
+ msg = self._makemsg(99)
+ size = os.path.getsize(self._path) + len(str(msg))
+ self._mlist.digest_size_threshhold = (size + 1) * 1024
+ ToDigest.process(self._mlist, msg, {})
+ self.assertEqual(self._sb.files(), [])
+
+ def test_send_a_digest(self):
+ eq = self.assertEqual
+ mlist = self._mlist
+ msg = self._makemsg(99)
+ size = os.path.getsize(self._path) + len(str(msg))
+ mlist.digest_size_threshhold = 0
+ ToDigest.process(mlist, msg, {})
+ files = self._sb.files()
+ # There should be two files in the queue, one for the MIME digest and
+ # one for the RFC 1153 digest.
+ eq(len(files), 2)
+ # Now figure out which of the two files is the MIME digest and which
+ # is the RFC 1153 digest.
+ for filebase in files:
+ qmsg, qdata = self._sb.dequeue(filebase)
+ if qmsg['mime-version']:
+ mimemsg = qmsg
+ mimedata = qdata
+ else:
+ rfc1153msg = qmsg
+ rfc1153data = qdata
+ eq(mimemsg.get_type(), 'multipart/mixed')
+ eq(mimemsg['from'], mlist.GetRequestEmail())
+ eq(mimemsg['subject'],
+ '%(realname)s Digest, Vol %(volume)d, Issue %(issue)d' % {
+ 'realname': mlist.real_name,
+ 'volume' : mlist.volume,
+ 'issue' : mlist.next_digest_number - 1,
+ })
+ eq(mimemsg['to'], mlist.GetListEmail())
+ # BAW: this test is incomplete...
+
+
+
+class TestToOutgoing(TestBase):
+ def setUp(self):
+ TestBase.setUp(self)
+ # We're going to want to inspect this queue directory
+ self._sb = Switchboard(mm_cfg.OUTQUEUE_DIR)
+
+ def tearDown(self):
+ for f in os.listdir(mm_cfg.OUTQUEUE_DIR):
+ os.unlink(os.path.join(mm_cfg.OUTQUEUE_DIR, f))
+ TestBase.tearDown(self)
+
+ def test_outgoing(self):
+ eq = self.assertEqual
+ msg = email.message_from_string("""\
+Subject: About Mailman
+
+It rocks!
+""")
+ msgdata = {'foo': 1, 'bar': 2}
+ ToOutgoing.process(self._mlist, msg, msgdata)
+ files = self._sb.files()
+ eq(len(files), 1)
+ msg2, data = self._sb.dequeue(files[0])
+ eq(msg.as_string(unixfrom=0), msg2.as_string(unixfrom=0))
+ eq(len(data), 6)
+ eq(data['foo'], 1)
+ eq(data['bar'], 2)
+ eq(data['version'], 3)
+ eq(data['listname'], '_xtest')
+ eq(data['verp'], 0)
+ # Clock skew makes this unreliable
+ #self.failUnless(data['received_time'] <= time.time())
+
+
+
+class TestToUsenet(TestBase):
+ def setUp(self):
+ TestBase.setUp(self)
+ # We're going to want to inspect this queue directory
+ self._sb = Switchboard(mm_cfg.NEWSQUEUE_DIR)
+
+ def tearDown(self):
+ for f in os.listdir(mm_cfg.NEWSQUEUE_DIR):
+ os.unlink(os.path.join(mm_cfg.NEWSQUEUE_DIR, f))
+ TestBase.tearDown(self)
+
+ def test_short_circuit(self):
+ eq = self.assertEqual
+ mlist = self._mlist
+ mlist.gateway_to_news = 0
+ ToUsenet.process(mlist, None, {})
+ eq(len(self._sb.files()), 0)
+ mlist.gateway_to_news = 1
+ ToUsenet.process(mlist, None, {'isdigest': 1})
+ eq(len(self._sb.files()), 0)
+ ToUsenet.process(mlist, None, {'fromusenet': 1})
+ eq(len(self._sb.files()), 0)
+
+ def test_to_usenet(self):
+ # BAW: Should we, can we, test the error conditions that only log to a
+ # file instead of raising an exception?
+ eq = self.assertEqual
+ mlist = self._mlist
+ mlist.gateway_to_news = 1
+ mlist.linked_newsgroup = 'foo'
+ mlist.nntp_host = 'bar'
+ msg = email.message_from_string("""\
+Subject: About Mailman
+
+Mailman rocks!
+""")
+ ToUsenet.process(mlist, msg, {})
+ files = self._sb.files()
+ eq(len(files), 1)
+ msg2, data = self._sb.dequeue(files[0])
+ eq(msg.as_string(unixfrom=0), msg2.as_string(unixfrom=0))
+ eq(data['version'], 3)
+ eq(data['listname'], '_xtest')
+ # Clock skew makes this unreliable
+ #self.failUnless(data['received_time'] <= time.time())
+
+
+
+def suite():
+ suite = unittest.TestSuite()
+ suite.addTest(unittest.makeSuite(TestAcknowledge))
+ suite.addTest(unittest.makeSuite(TestAfterDelivery))
+ suite.addTest(unittest.makeSuite(TestApprove))
+ suite.addTest(unittest.makeSuite(TestCalcRecips))
+ suite.addTest(unittest.makeSuite(TestCleanse))
+ suite.addTest(unittest.makeSuite(TestCookHeaders))
+ suite.addTest(unittest.makeSuite(TestDecorate))
+ suite.addTest(unittest.makeSuite(TestFileRecips))
+ suite.addTest(unittest.makeSuite(TestHold))
+ suite.addTest(unittest.makeSuite(TestMimeDel))
+ suite.addTest(unittest.makeSuite(TestModerate))
+ suite.addTest(unittest.makeSuite(TestReplybot))
+ suite.addTest(unittest.makeSuite(TestSMTPDirect))
+ suite.addTest(unittest.makeSuite(TestSendmail))
+ suite.addTest(unittest.makeSuite(TestSpamDetect))
+ suite.addTest(unittest.makeSuite(TestTagger))
+ suite.addTest(unittest.makeSuite(TestToArchive))
+ suite.addTest(unittest.makeSuite(TestToDigest))
+ suite.addTest(unittest.makeSuite(TestToOutgoing))
+ suite.addTest(unittest.makeSuite(TestToUsenet))
+ return suite
+
+
+
+if __name__ == '__main__':
+ unittest.main(defaultTest='suite')
diff --git a/tests/test_lockfile.py b/tests/test_lockfile.py
new file mode 100644
index 00000000..7f300c6b
--- /dev/null
+++ b/tests/test_lockfile.py
@@ -0,0 +1,45 @@
+# Copyright (C) 2002 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
+# 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, USA.
+
+"""Unit tests for the LockFile class.
+"""
+
+import unittest
+
+from Mailman.LockFile import LockFile
+
+LOCKFILE_NAME = '/tmp/.mm-test-lock'
+
+
+
+class TestLockFile(unittest.TestCase):
+ def test_two_lockfiles_same_proc(self):
+ lf1 = LockFile(LOCKFILE_NAME)
+ lf2 = LockFile(LOCKFILE_NAME)
+ lf1.lock()
+ self.failIf(lf2.locked())
+
+
+
+def suite():
+ suite = unittest.TestSuite()
+ suite.addTest(unittest.makeSuite(TestLockFile))
+ return suite
+
+
+
+if __name__ == '__main__':
+ unittest.main(defaultTest='suite')
diff --git a/tests/test_membership.py b/tests/test_membership.py
new file mode 100644
index 00000000..c3850186
--- /dev/null
+++ b/tests/test_membership.py
@@ -0,0 +1,380 @@
+# Copyright (C) 2001,2002 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
+# 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, USA.
+
+"""Unit tests for OldStyleMemberships.
+"""
+
+import os
+import time
+import unittest
+
+from Mailman import mm_cfg
+from Mailman import Utils
+from Mailman import MailList
+from Mailman import MemberAdaptor
+from Mailman.Errors import NotAMemberError
+from Mailman.UserDesc import UserDesc
+
+from TestBase import TestBase
+
+
+
+class TestNoMembers(TestBase):
+ def test_no_member(self):
+ eq = self.assertEqual
+ raises = self.assertRaises
+ mlist = self._mlist
+ eq(mlist.getMembers(), [])
+ eq(mlist.getRegularMemberKeys(), [])
+ eq(mlist.getDigestMemberKeys(), [])
+ self.failIf(mlist.isMember('nobody@dom.ain'))
+ raises(NotAMemberError, mlist.getMemberKey, 'nobody@dom.ain')
+ raises(NotAMemberError, mlist.getMemberCPAddress, 'nobody@dom.ain')
+ eq(mlist.getMemberCPAddresses(('nobody@dom.ain', 'noperson@dom.ain')),
+ [None, None])
+ raises(NotAMemberError, mlist.getMemberPassword, 'nobody@dom.ain')
+ raises(NotAMemberError, mlist.authenticateMember,
+ 'nobody@dom.ain', 'blarg')
+ eq(mlist.getMemberLanguage('nobody@dom.ain'), mlist.preferred_language)
+ raises(NotAMemberError, mlist.getMemberOption,
+ 'nobody@dom.ain', mm_cfg.AcknowledgePosts)
+ raises(NotAMemberError, mlist.getMemberName, 'nobody@dom.ain')
+ raises(NotAMemberError, mlist.getMemberTopics, 'nobody@dom.ain')
+ raises(NotAMemberError, mlist.removeMember, 'nobody@dom.ain')
+
+ def test_add_member_mixed_case(self):
+ eq = self.assertEqual
+ mlist = self._mlist
+ mlist.addNewMember('APerson@dom.AIN')
+ eq(mlist.getMembers(), ['aperson@dom.ain'])
+ eq(mlist.getRegularMemberKeys(), ['aperson@dom.ain'])
+ self.failUnless(mlist.isMember('APerson@dom.AIN'))
+ self.failUnless(mlist.isMember('aperson@dom.ain'))
+ self.failUnless(mlist.isMember('APERSON@DOM.AIN'))
+ eq(mlist.getMemberCPAddress('aperson@dom.ain'), 'APerson@dom.AIN')
+ eq(mlist.getMemberCPAddress('APerson@dom.ain'), 'APerson@dom.AIN')
+ eq(mlist.getMemberCPAddress('APERSON@DOM.AIN'), 'APerson@dom.AIN')
+ eq(mlist.getMemberCPAddresses(('aperson@dom.ain',)),
+ ['APerson@dom.AIN'])
+ eq(mlist.getMemberCPAddresses(('APerson@dom.ain',)),
+ ['APerson@dom.AIN'])
+ eq(mlist.getMemberCPAddresses(('APERSON@DOM.AIN',)),
+ ['APerson@dom.AIN'])
+
+
+
+class TestMembers(TestBase):
+ def setUp(self):
+ TestBase.setUp(self)
+ self._mlist.addNewMember('person@dom.ain',
+ digest=0,
+ password='xxXXxx',
+ language='xx',
+ realname='A. Nice Person')
+
+ def test_add_member(self):
+ eq = self.assertEqual
+ mlist = self._mlist
+ eq(mlist.getMembers(), ['person@dom.ain'])
+ eq(mlist.getRegularMemberKeys(), ['person@dom.ain'])
+ eq(mlist.getDigestMemberKeys(), [])
+ self.failUnless(mlist.isMember('person@dom.ain'))
+ eq(mlist.getMemberKey('person@dom.ain'), 'person@dom.ain')
+ eq(mlist.getMemberCPAddress('person@dom.ain'), 'person@dom.ain')
+ eq(mlist.getMemberCPAddresses(('person@dom.ain', 'noperson@dom.ain')),
+ ['person@dom.ain', None])
+ eq(mlist.getMemberPassword('person@dom.ain'), 'xxXXxx')
+ eq(mlist.getMemberLanguage('person@dom.ain'), 'xx')
+ eq(mlist.getMemberOption('person@dom.ain', mm_cfg.Digests), 0)
+ eq(mlist.getMemberOption('person@dom.ain', mm_cfg.AcknowledgePosts), 0)
+ eq(mlist.getMemberName('person@dom.ain'), 'A. Nice Person')
+ eq(mlist.getMemberTopics('person@dom.ain'), [])
+
+ def test_authentication(self):
+ mlist = self._mlist
+ self.failIf(mlist.authenticateMember('person@dom.ain', 'xxx'))
+ self.assertEqual(mlist.authenticateMember('person@dom.ain', 'xxXXxx'),
+ 'xxXXxx')
+
+ def test_remove_member(self):
+ eq = self.assertEqual
+ raises = self.assertRaises
+ mlist = self._mlist
+ mlist.removeMember('person@dom.ain')
+ eq(mlist.getMembers(), [])
+ eq(mlist.getRegularMemberKeys(), [])
+ eq(mlist.getDigestMemberKeys(), [])
+ self.failIf(mlist.isMember('person@dom.ain'))
+ raises(NotAMemberError, mlist.getMemberKey, 'person@dom.ain')
+ raises(NotAMemberError, mlist.getMemberCPAddress, 'person@dom.ain')
+ eq(mlist.getMemberCPAddresses(('person@dom.ain', 'noperson@dom.ain')),
+ [None, None])
+ raises(NotAMemberError, mlist.getMemberPassword, 'person@dom.ain')
+ raises(NotAMemberError, mlist.authenticateMember,
+ 'person@dom.ain', 'blarg')
+ eq(mlist.getMemberLanguage('person@dom.ain'), mlist.preferred_language)
+ raises(NotAMemberError, mlist.getMemberOption,
+ 'person@dom.ain', mm_cfg.AcknowledgePosts)
+ raises(NotAMemberError, mlist.getMemberName, 'person@dom.ain')
+ raises(NotAMemberError, mlist.getMemberTopics, 'person@dom.ain')
+
+ def test_remove_member_clears(self):
+ eq = self.assertEqual
+ raises = self.assertRaises
+ # We don't really care what the bounce info is
+ class Info: pass
+ info = Info()
+ mlist = self._mlist
+ mlist.setBounceInfo('person@dom.ain', info)
+ mlist.setDeliveryStatus('person@dom.ain', MemberAdaptor.BYADMIN)
+ mlist.removeMember('person@dom.ain')
+ raises(NotAMemberError, mlist.getDeliveryStatus, 'person@dom.ain')
+ raises(NotAMemberError, mlist.getDeliveryStatusChangeTime,
+ 'person@dom.ain')
+ raises(NotAMemberError, mlist.getBounceInfo, 'person@dom.ain')
+ eq(mlist.getDeliveryStatusMembers(), [])
+ eq(mlist.getBouncingMembers(), [])
+
+ def test_change_address(self):
+ eq = self.assertEqual
+ raises = self.assertRaises
+ mlist = self._mlist
+ mlist.changeMemberAddress('person@dom.ain', 'nice@dom.ain')
+ # Check the new address
+ eq(mlist.getMembers(), ['nice@dom.ain'])
+ eq(mlist.getRegularMemberKeys(), ['nice@dom.ain'])
+ eq(mlist.getDigestMemberKeys(), [])
+ self.failUnless(mlist.isMember('nice@dom.ain'))
+ eq(mlist.getMemberKey('nice@dom.ain'), 'nice@dom.ain')
+ eq(mlist.getMemberCPAddress('nice@dom.ain'), 'nice@dom.ain')
+ eq(mlist.getMemberCPAddresses(('nice@dom.ain', 'nonice@dom.ain')),
+ ['nice@dom.ain', None])
+ eq(mlist.getMemberPassword('nice@dom.ain'), 'xxXXxx')
+ eq(mlist.getMemberLanguage('nice@dom.ain'), 'xx')
+ eq(mlist.getMemberOption('nice@dom.ain', mm_cfg.Digests), 0)
+ eq(mlist.getMemberOption('nice@dom.ain', mm_cfg.AcknowledgePosts), 0)
+ eq(mlist.getMemberName('nice@dom.ain'), 'A. Nice Person')
+ eq(mlist.getMemberTopics('nice@dom.ain'), [])
+ # Check the old address
+ eq(mlist.getMembers(), ['nice@dom.ain'])
+ eq(mlist.getRegularMemberKeys(), ['nice@dom.ain'])
+ eq(mlist.getDigestMemberKeys(), [])
+ self.failIf(mlist.isMember('person@dom.ain'))
+ raises(NotAMemberError, mlist.getMemberKey, 'person@dom.ain')
+ raises(NotAMemberError, mlist.getMemberCPAddress, 'person@dom.ain')
+ eq(mlist.getMemberCPAddresses(('person@dom.ain', 'noperson@dom.ain')),
+ [None, None])
+ raises(NotAMemberError, mlist.getMemberPassword, 'person@dom.ain')
+ raises(NotAMemberError, mlist.authenticateMember,
+ 'person@dom.ain', 'blarg')
+ eq(mlist.getMemberLanguage('person@dom.ain'), mlist.preferred_language)
+ raises(NotAMemberError, mlist.getMemberOption,
+ 'person@dom.ain', mm_cfg.AcknowledgePosts)
+ raises(NotAMemberError, mlist.getMemberName, 'person@dom.ain')
+ raises(NotAMemberError, mlist.getMemberTopics, 'person@dom.ain')
+
+ def test_set_password(self):
+ eq = self.assertEqual
+ mlist = self._mlist
+ mlist.setMemberPassword('person@dom.ain', 'yyYYyy')
+ eq(mlist.getMemberPassword('person@dom.ain'), 'yyYYyy')
+ eq(mlist.authenticateMember('person@dom.ain', 'yyYYyy'), 'yyYYyy')
+ self.failIf(mlist.authenticateMember('person@dom.ain', 'xxXXxx'))
+
+ def test_set_language(self):
+ self._mlist.setMemberLanguage('person@dom.ain', 'yy')
+ self.assertEqual(self._mlist.getMemberLanguage('person@dom.ain'), 'yy')
+
+ def test_basic_option(self):
+ eq = self.assertEqual
+ gmo = self._mlist.getMemberOption
+ # First test the current option values
+ eq(gmo('person@dom.ain', mm_cfg.Digests), 0)
+ eq(gmo('person@dom.ain', mm_cfg.DontReceiveOwnPosts), 0)
+ eq(gmo('person@dom.ain', mm_cfg.AcknowledgePosts), 0)
+ eq(gmo('person@dom.ain', mm_cfg.DisableMime), 0)
+ eq(gmo('person@dom.ain', mm_cfg.ConcealSubscription), 0)
+ eq(gmo('person@dom.ain', mm_cfg.SuppressPasswordReminder), 0)
+ eq(gmo('person@dom.ain', mm_cfg.ReceiveNonmatchingTopics), 0)
+
+ def test_set_digests(self):
+ eq = self.assertEqual
+ gmo = self._mlist.getMemberOption
+ self._mlist.setMemberOption('person@dom.ain', mm_cfg.Digests, 1)
+ eq(gmo('person@dom.ain', mm_cfg.Digests), 1)
+ eq(gmo('person@dom.ain', mm_cfg.DontReceiveOwnPosts), 0)
+ eq(gmo('person@dom.ain', mm_cfg.AcknowledgePosts), 0)
+ eq(gmo('person@dom.ain', mm_cfg.DisableMime), 0)
+ eq(gmo('person@dom.ain', mm_cfg.ConcealSubscription), 0)
+ eq(gmo('person@dom.ain', mm_cfg.SuppressPasswordReminder), 0)
+ eq(gmo('person@dom.ain', mm_cfg.ReceiveNonmatchingTopics), 0)
+
+ def test_set_disable_delivery(self):
+ eq = self.assertEqual
+ gds = self._mlist.getDeliveryStatus
+ eq(gds('person@dom.ain'), MemberAdaptor.ENABLED)
+ self._mlist.setDeliveryStatus('person@dom.ain', MemberAdaptor.UNKNOWN)
+ eq(gds('person@dom.ain'), MemberAdaptor.UNKNOWN)
+ self._mlist.setDeliveryStatus('person@dom.ain', MemberAdaptor.BYUSER)
+ eq(gds('person@dom.ain'), MemberAdaptor.BYUSER)
+ self._mlist.setDeliveryStatus('person@dom.ain', MemberAdaptor.BYBOUNCE)
+ eq(gds('person@dom.ain'), MemberAdaptor.BYBOUNCE)
+ self._mlist.setDeliveryStatus('person@dom.ain', MemberAdaptor.BYADMIN)
+ eq(gds('person@dom.ain'), MemberAdaptor.BYADMIN)
+
+ def test_delivery_status_time(self):
+ now = time.time()
+ time.sleep(1)
+ self._mlist.setDeliveryStatus('person@dom.ain', MemberAdaptor.BYUSER)
+ self.failUnless(
+ self._mlist.getDeliveryStatusChangeTime('person@dom.ain')
+ > now)
+ self._mlist.setDeliveryStatus('person@dom.ain', MemberAdaptor.ENABLED)
+ self.assertEqual(
+ self._mlist.getDeliveryStatusChangeTime('person@dom.ain'),
+ 0)
+
+ def test_set_dont_receive_own_posts(self):
+ eq = self.assertEqual
+ gmo = self._mlist.getMemberOption
+ self._mlist.setMemberOption('person@dom.ain',
+ mm_cfg.DontReceiveOwnPosts, 1)
+ eq(gmo('person@dom.ain', mm_cfg.Digests), 0)
+ eq(gmo('person@dom.ain', mm_cfg.DontReceiveOwnPosts), 1)
+ eq(gmo('person@dom.ain', mm_cfg.AcknowledgePosts), 0)
+ eq(gmo('person@dom.ain', mm_cfg.DisableMime), 0)
+ eq(gmo('person@dom.ain', mm_cfg.ConcealSubscription), 0)
+ eq(gmo('person@dom.ain', mm_cfg.SuppressPasswordReminder), 0)
+ eq(gmo('person@dom.ain', mm_cfg.ReceiveNonmatchingTopics), 0)
+
+ def test_set_acknowledge_posts(self):
+ eq = self.assertEqual
+ gmo = self._mlist.getMemberOption
+ self._mlist.setMemberOption('person@dom.ain',
+ mm_cfg.AcknowledgePosts, 1)
+ eq(gmo('person@dom.ain', mm_cfg.Digests), 0)
+ eq(gmo('person@dom.ain', mm_cfg.DontReceiveOwnPosts), 0)
+ eq(gmo('person@dom.ain', mm_cfg.AcknowledgePosts), 1)
+ eq(gmo('person@dom.ain', mm_cfg.DisableMime), 0)
+ eq(gmo('person@dom.ain', mm_cfg.ConcealSubscription), 0)
+ eq(gmo('person@dom.ain', mm_cfg.SuppressPasswordReminder), 0)
+ eq(gmo('person@dom.ain', mm_cfg.ReceiveNonmatchingTopics), 0)
+
+ def test_disable_mime(self):
+ eq = self.assertEqual
+ gmo = self._mlist.getMemberOption
+ self._mlist.setMemberOption('person@dom.ain',
+ mm_cfg.DisableMime, 1)
+ eq(gmo('person@dom.ain', mm_cfg.Digests), 0)
+ eq(gmo('person@dom.ain', mm_cfg.DontReceiveOwnPosts), 0)
+ eq(gmo('person@dom.ain', mm_cfg.AcknowledgePosts), 0)
+ eq(gmo('person@dom.ain', mm_cfg.DisableMime), 1)
+ eq(gmo('person@dom.ain', mm_cfg.ConcealSubscription), 0)
+ eq(gmo('person@dom.ain', mm_cfg.SuppressPasswordReminder), 0)
+ eq(gmo('person@dom.ain', mm_cfg.ReceiveNonmatchingTopics), 0)
+
+ def test_conceal_subscription(self):
+ eq = self.assertEqual
+ gmo = self._mlist.getMemberOption
+ self._mlist.setMemberOption('person@dom.ain',
+ mm_cfg.ConcealSubscription, 1)
+ eq(gmo('person@dom.ain', mm_cfg.Digests), 0)
+ eq(gmo('person@dom.ain', mm_cfg.DontReceiveOwnPosts), 0)
+ eq(gmo('person@dom.ain', mm_cfg.AcknowledgePosts), 0)
+ eq(gmo('person@dom.ain', mm_cfg.DisableMime), 0)
+ eq(gmo('person@dom.ain', mm_cfg.ConcealSubscription), 1)
+ eq(gmo('person@dom.ain', mm_cfg.SuppressPasswordReminder), 0)
+ eq(gmo('person@dom.ain', mm_cfg.ReceiveNonmatchingTopics), 0)
+
+ def test_suppress_password_reminder(self):
+ eq = self.assertEqual
+ gmo = self._mlist.getMemberOption
+ self._mlist.setMemberOption('person@dom.ain',
+ mm_cfg.SuppressPasswordReminder, 1)
+ eq(gmo('person@dom.ain', mm_cfg.Digests), 0)
+ eq(gmo('person@dom.ain', mm_cfg.DontReceiveOwnPosts), 0)
+ eq(gmo('person@dom.ain', mm_cfg.AcknowledgePosts), 0)
+ eq(gmo('person@dom.ain', mm_cfg.DisableMime), 0)
+ eq(gmo('person@dom.ain', mm_cfg.ConcealSubscription), 0)
+ eq(gmo('person@dom.ain', mm_cfg.SuppressPasswordReminder), 1)
+ eq(gmo('person@dom.ain', mm_cfg.ReceiveNonmatchingTopics), 0)
+
+ def test_receive_nonmatching_topics(self):
+ eq = self.assertEqual
+ gmo = self._mlist.getMemberOption
+ self._mlist.setMemberOption('person@dom.ain',
+ mm_cfg.ReceiveNonmatchingTopics, 1)
+ eq(gmo('person@dom.ain', mm_cfg.Digests), 0)
+ eq(gmo('person@dom.ain', mm_cfg.DontReceiveOwnPosts), 0)
+ eq(gmo('person@dom.ain', mm_cfg.AcknowledgePosts), 0)
+ eq(gmo('person@dom.ain', mm_cfg.DisableMime), 0)
+ eq(gmo('person@dom.ain', mm_cfg.ConcealSubscription), 0)
+ eq(gmo('person@dom.ain', mm_cfg.SuppressPasswordReminder), 0)
+ eq(gmo('person@dom.ain', mm_cfg.ReceiveNonmatchingTopics), 1)
+
+ def test_member_name(self):
+ self._mlist.setMemberName('person@dom.ain', 'A. Good Person')
+ self.assertEqual(self._mlist.getMemberName('person@dom.ain'),
+ 'A. Good Person')
+
+ def test_member_topics(self):
+ eq = self.assertEqual
+ mlist = self._mlist
+ mlist.setMemberTopics('person@dom.ain', ['topic1', 'topic2', 'topic3'])
+ eq(mlist.getMemberTopics('person@dom.ain'),
+ ['topic1', 'topic2', 'topic3'])
+ mlist.setMemberTopics('person@dom.ain', None)
+ eq(mlist.getMemberTopics('person@dom.ain'), [])
+
+ def test_bounce_info(self):
+ eq = self.assertEqual
+ mlist = self._mlist
+ # We don't really care what info is stored
+ class Info: pass
+ info = Info()
+ # Test setting and getting
+ mlist.setBounceInfo('person@dom.ain', info)
+ eq(mlist.getBounceInfo('person@dom.ain'), info)
+ # Test case sensitivity
+ eq(mlist.getBounceInfo('PERSON@dom.ain'), info)
+ info2 = Info()
+ mlist.setBounceInfo('PeRsOn@dom.ain', info2)
+ eq(mlist.getBounceInfo('person@dom.ain'), info2)
+ eq(mlist.getBounceInfo('PeRsOn@dom.ain'), info2)
+ eq(mlist.getBounceInfo('PERSON@DOM.AIN'), info2)
+ # Test getBouncingMembers...
+ eq(mlist.getBouncingMembers(), ['person@dom.ain'])
+ # Test clearing bounce information...
+ mlist.setBounceInfo('person@dom.ain', None)
+ eq(mlist.getBouncingMembers(), [])
+ eq(mlist.getBounceInfo('person@dom.ain'), None)
+ # Make sure that you can clear the attributes case insensitively
+ mlist.setBounceInfo('person@dom.ain', info)
+ mlist.setBounceInfo('PERSON@dom.ain', None)
+ eq(mlist.getBouncingMembers(), [])
+
+
+
+def suite():
+ suite = unittest.TestSuite()
+ suite.addTest(unittest.makeSuite(TestNoMembers))
+ suite.addTest(unittest.makeSuite(TestMembers))
+ return suite
+
+
+
+if __name__ == '__main__':
+ unittest.main(defaultTest='suite')
diff --git a/tests/test_message.py b/tests/test_message.py
new file mode 100644
index 00000000..7a104f05
--- /dev/null
+++ b/tests/test_message.py
@@ -0,0 +1,102 @@
+# Copyright (C) 2001 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
+# 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, USA.
+
+"""Unit tests for the various Message class methods.
+"""
+
+import unittest
+import email
+
+from Mailman import Message
+from Mailman import Version
+from Mailman import Errors
+
+from EmailBase import EmailBase
+
+
+
+class TestSentMessage(EmailBase):
+ def test_user_notification(self):
+ eq = self.assertEqual
+ unless = self.failUnless
+ msg = Message.UserNotification(
+ 'aperson@dom.ain',
+ '_xtest@dom.ain',
+ 'Your Test List',
+ 'About your test list')
+ msg.send(self._mlist)
+ qmsg = email.message_from_string(self._readmsg())
+ eq(qmsg['subject'], 'Your Test List')
+ eq(qmsg['from'], '_xtest@dom.ain')
+ eq(qmsg['to'], 'aperson@dom.ain')
+ # The Message-ID: header has some time-variant information
+ msgid = qmsg['message-id']
+ unless(msgid.startswith('<mailman.'))
+ unless(msgid.endswith('._xtest@dom.ain>'))
+ eq(qmsg['sender'], '_xtest-admin@dom.ain')
+ eq(qmsg['errors-to'], '_xtest-admin@dom.ain')
+ eq(qmsg['x-beenthere'], '_xtest@dom.ain')
+ eq(qmsg['x-mailman-version'], Version.VERSION)
+ eq(qmsg['precedence'], 'bulk')
+ eq(qmsg['list-help'], '<mailto:_xtest-request@dom.ain?subject=help>')
+ eq(qmsg['list-post'], '<mailto:_xtest@dom.ain>')
+ eq(qmsg['list-subscribe'], """\
+<http://www.dom.ain/mailman/listinfo/_xtest>,
+ <mailto:_xtest-request@dom.ain?subject=subscribe>""")
+ eq(qmsg['list-id'], '<_xtest.dom.ain>')
+ eq(qmsg['list-unsubscribe'], """\
+<http://www.dom.ain/mailman/listinfo/_xtest>,
+ <mailto:_xtest-request@dom.ain?subject=unsubscribe>""")
+ eq(qmsg['list-archive'], '<http://www.dom.ain/pipermail/_xtest>')
+ eq(qmsg.get_payload(), 'About your test list')
+
+ def test_bounce_message(self):
+ eq = self.assertEqual
+ unless = self.failUnless
+ msg = email.message_from_string("""\
+To: _xtest@dom.ain
+From: nobody@dom.ain
+Subject: and another thing
+
+yadda yadda yadda
+""", Message.Message)
+ self._mlist.BounceMessage(msg, {})
+ qmsg = email.message_from_string(self._readmsg())
+ unless(qmsg.is_multipart())
+ eq(len(qmsg.get_payload()), 2)
+ # The first payload is the details of the bounce action, and the
+ # second message is the message/rfc822 attachment of the original
+ # message.
+ msg1 = qmsg.get_payload(0)
+ eq(msg1.get_type(), 'text/plain')
+ eq(msg1.get_payload(), '[No bounce details are available]\n')
+ msg2 = qmsg.get_payload(1)
+ eq(msg2.get_type(), 'message/rfc822')
+ unless(not msg2.is_multipart())
+ msg3 = msg2.get_payload()
+ eq(msg3.get_payload(), 'yadda yadda yadda\n')
+
+
+
+def suite():
+ suite = unittest.TestSuite()
+ suite.addTest(unittest.makeSuite(TestSentMessage))
+ return suite
+
+
+
+if __name__ == '__main__':
+ unittest.main(defaultTest='suite')
diff --git a/tests/test_runners.py b/tests/test_runners.py
new file mode 100644
index 00000000..6363ac66
--- /dev/null
+++ b/tests/test_runners.py
@@ -0,0 +1,120 @@
+# Copyright (C) 2001 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
+# 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, USA.
+
+"""Unit tests for the various Mailman/Queue/*Runner.py modules
+"""
+
+import unittest
+import email
+
+from Mailman.Queue.NewsRunner import prepare_message
+
+from TestBase import TestBase
+
+
+
+class TestPrepMessage(TestBase):
+ def test_remove_unacceptables(self):
+ eq = self.assertEqual
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+To: _xtest@dom.ain
+NNTP-Posting-Host: news.dom.ain
+NNTP-Posting-Date: today
+X-Trace: blah blah
+X-Complaints-To: abuse@dom.ain
+Xref: blah blah
+Xref: blah blah
+Date-Received: yesterday
+Posted: tomorrow
+Posting-Version: 99.99
+Relay-Version: 88.88
+Received: blah blah
+
+A message
+""")
+ msgdata = {}
+ prepare_message(self._mlist, msg, msgdata)
+ eq(msgdata.get('prepped'), 1)
+ eq(msg['from'], 'aperson@dom.ain')
+ eq(msg['to'], '_xtest@dom.ain')
+ eq(msg['nntp-posting-host'], None)
+ eq(msg['nntp-posting-date'], None)
+ eq(msg['x-trace'], None)
+ eq(msg['x-complaints-to'], None)
+ eq(msg['xref'], None)
+ eq(msg['date-received'], None)
+ eq(msg['posted'], None)
+ eq(msg['posting-version'], None)
+ eq(msg['relay-version'], None)
+ eq(msg['received'], None)
+
+ def test_munge_duplicates_no_duplicates(self):
+ eq = self.assertEqual
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+To: _xtest@dom.ain
+Cc: someother@dom.ain
+Content-Transfer-Encoding: yes
+
+A message
+""")
+ msgdata = {}
+ prepare_message(self._mlist, msg, msgdata)
+ eq(msgdata.get('prepped'), 1)
+ eq(msg['from'], 'aperson@dom.ain')
+ eq(msg['to'], '_xtest@dom.ain')
+ eq(msg['cc'], 'someother@dom.ain')
+ eq(msg['content-transfer-encoding'], 'yes')
+
+ def test_munge_duplicates(self):
+ eq = self.assertEqual
+ msg = email.message_from_string("""\
+From: aperson@dom.ain
+To: _xtest@dom.ain
+To: two@dom.ain
+Cc: three@dom.ain
+Cc: four@dom.ain
+Cc: five@dom.ain
+Content-Transfer-Encoding: yes
+Content-Transfer-Encoding: no
+Content-Transfer-Encoding: maybe
+
+A message
+""")
+ msgdata = {}
+ prepare_message(self._mlist, msg, msgdata)
+ eq(msgdata.get('prepped'), 1)
+ eq(msg.get_all('from'), ['aperson@dom.ain'])
+ eq(msg.get_all('to'), ['_xtest@dom.ain'])
+ eq(msg.get_all('cc'), ['three@dom.ain'])
+ eq(msg.get_all('content-transfer-encoding'), ['yes'])
+ eq(msg.get_all('x-original-to'), ['two@dom.ain'])
+ eq(msg.get_all('x-original-cc'), ['four@dom.ain', 'five@dom.ain'])
+ eq(msg.get_all('x-original-content-transfer-encoding'),
+ ['no', 'maybe'])
+
+
+
+def suite():
+ suite = unittest.TestSuite()
+ suite.addTest(unittest.makeSuite(TestPrepMessage))
+ return suite
+
+
+
+if __name__ == '__main__':
+ unittest.main(defaultTest='suite')
diff --git a/tests/test_safedict.py b/tests/test_safedict.py
new file mode 100644
index 00000000..ac340918
--- /dev/null
+++ b/tests/test_safedict.py
@@ -0,0 +1,103 @@
+# Copyright (C) 2001 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
+# 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, USA.
+
+"""Unit tests for the SafeDict.py module
+"""
+
+import email
+import unittest
+
+from Mailman import SafeDict
+
+
+
+class TestSafeDict(unittest.TestCase):
+ def test_okay(self):
+ sd = SafeDict.SafeDict({'foo': 'bar'})
+ si = '%(foo)s' % sd
+ self.assertEqual(si, 'bar')
+
+ def test_key_error(self):
+ sd = SafeDict.SafeDict({'foo': 'bar'})
+ si = '%(baz)s' % sd
+ self.assertEqual(si, '%(baz)s')
+
+ def test_key_error_not_string(self):
+ key = ()
+ sd = SafeDict.SafeDict({})
+ self.assertEqual(sd[key], '<Missing key: ()>')
+
+
+
+class TestMsgSafeDict(unittest.TestCase):
+ def setUp(self):
+ self._msg = email.message_from_string("""To: foo
+From: bar
+Subject: baz
+Cc: aperson@dom.ain
+Cc: bperson@dom.ain
+
+""")
+
+ def test_normal_key(self):
+ sd = SafeDict.MsgSafeDict(self._msg, {'key': 'value'})
+ si = '%(key)s' % sd
+ self.assertEqual(si, 'value')
+
+ def test_msg_key(self):
+ sd = SafeDict.MsgSafeDict(self._msg, {'to': 'value'})
+ si = '%(msg_to)s' % sd
+ self.assertEqual(si, 'foo')
+
+ def test_allmsg_key(self):
+ sd = SafeDict.MsgSafeDict(self._msg, {'cc': 'value'})
+ si = '%(allmsg_cc)s' % sd
+ self.assertEqual(si, 'aperson@dom.ain, bperson@dom.ain')
+
+ def test_msg_no_key(self):
+ sd = SafeDict.MsgSafeDict(self._msg)
+ si = '%(msg_date)s' % sd
+ self.assertEqual(si, 'n/a')
+
+ def test_allmsg_no_key(self):
+ sd = SafeDict.MsgSafeDict(self._msg)
+ si = '%(allmsg_date)s' % sd
+ self.assertEqual(si, 'n/a')
+
+ def test_copy(self):
+ sd = SafeDict.MsgSafeDict(self._msg, {'foo': 'bar'})
+ copy = sd.copy()
+ items = copy.items()
+ items.sort()
+ self.assertEqual(items, [
+ ('allmsg_cc', 'aperson@dom.ain, bperson@dom.ain'),
+ ('foo', 'bar'),
+ ('msg_from', 'bar'),
+ ('msg_subject', 'baz'),
+ ('msg_to', 'foo'),
+ ])
+
+
+def suite():
+ suite = unittest.TestSuite()
+ suite.addTest(unittest.makeSuite(TestSafeDict))
+ suite.addTest(unittest.makeSuite(TestMsgSafeDict))
+ return suite
+
+
+
+if __name__ == '__main__':
+ unittest.main(defaultTest='suite')
diff --git a/tests/test_security_mgr.py b/tests/test_security_mgr.py
new file mode 100644
index 00000000..451e6bbd
--- /dev/null
+++ b/tests/test_security_mgr.py
@@ -0,0 +1,261 @@
+# Copyright (C) 2001 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
+# 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, USA.
+
+"""Unit tests for Mailman/SecurityManager.py
+"""
+
+import os
+import unittest
+import errno
+import md5
+import sha
+import Cookie
+try:
+ import crypt
+except ImportError:
+ crypt = None
+from cStringIO import StringIO
+
+from Mailman import mm_cfg
+from Mailman import Utils
+from Mailman import Errors
+
+from TestBase import TestBase
+
+
+
+def password(plaintext):
+ return sha.new(plaintext).hexdigest()
+
+
+
+class TestSecurityManager(TestBase):
+ def test_init_vars(self):
+ eq = self.assertEqual
+ eq(self._mlist.mod_password, None)
+ eq(self._mlist.passwords, {})
+
+ def test_auth_context_info_authuser(self):
+ mlist = self._mlist
+ self.assertRaises(TypeError, mlist.AuthContextInfo, mm_cfg.AuthUser)
+ # Add a member
+ mlist.addNewMember('aperson@dom.ain', password='xxXXxx')
+ self.assertEqual(
+ mlist.AuthContextInfo(mm_cfg.AuthUser, 'aperson@dom.ain'),
+ ('_xtest+user+aperson--at--dom.ain', 'xxXXxx'))
+
+ def test_auth_context_moderator(self):
+ mlist = self._mlist
+ mlist.mod_password = 'yyYYyy'
+ self.assertEqual(
+ mlist.AuthContextInfo(mm_cfg.AuthListModerator),
+ ('_xtest+moderator', 'yyYYyy'))
+
+ def test_auth_context_admin(self):
+ mlist = self._mlist
+ mlist.password = 'zzZZzz'
+ self.assertEqual(
+ mlist.AuthContextInfo(mm_cfg.AuthListAdmin),
+ ('_xtest+admin', 'zzZZzz'))
+
+ def test_auth_context_site(self):
+ mlist = self._mlist
+ mlist.password = 'aaAAaa'
+ self.assertEqual(
+ mlist.AuthContextInfo(mm_cfg.AuthSiteAdmin),
+ ('_xtest+admin', 'aaAAaa'))
+
+ def test_auth_context_huh(self):
+ self.assertEqual(
+ self._mlist.AuthContextInfo('foo'),
+ (None, None))
+
+
+
+class TestAuthenticate(TestBase):
+ def setUp(self):
+ TestBase.setUp(self)
+ Utils.set_global_password('bbBBbb', siteadmin=1)
+ Utils.set_global_password('ccCCcc', siteadmin=0)
+
+ def tearDown(self):
+ try:
+ os.unlink(mm_cfg.SITE_PW_FILE)
+ except OSError, e:
+ if e.errno <> errno.ENOENT: raise
+ try:
+ os.unlink(mm_cfg.LISTCREATOR_PW_FILE)
+ except OSError, e:
+ if e.errno <> errno.ENOENT: raise
+ TestBase.tearDown(self)
+
+ def test_auth_creator(self):
+ self.assertEqual(self._mlist.Authenticate(
+ [mm_cfg.AuthCreator], 'ccCCcc'), mm_cfg.AuthCreator)
+
+ def test_auth_creator_unauth(self):
+ self.assertEqual(self._mlist.Authenticate(
+ [mm_cfg.AuthCreator], 'xxxxxx'), mm_cfg.UnAuthorized)
+
+ def test_auth_site_admin(self):
+ self.assertEqual(self._mlist.Authenticate(
+ [mm_cfg.AuthSiteAdmin], 'bbBBbb'), mm_cfg.AuthSiteAdmin)
+
+ def test_auth_site_admin_unauth(self):
+ self.assertEqual(self._mlist.Authenticate(
+ [mm_cfg.AuthSiteAdmin], 'xxxxxx'), mm_cfg.UnAuthorized)
+
+ def test_list_admin(self):
+ self._mlist.password = password('ttTTtt')
+ self.assertEqual(self._mlist.Authenticate(
+ [mm_cfg.AuthListAdmin], 'ttTTtt'), mm_cfg.AuthListAdmin)
+
+ def test_list_admin_unauth(self):
+ self._mlist.password = password('ttTTtt')
+ self.assertEqual(self._mlist.Authenticate(
+ [mm_cfg.AuthListAdmin], 'xxxxxx'), mm_cfg.UnAuthorized)
+
+ def test_list_admin_upgrade(self):
+ eq = self.assertEqual
+ mlist = self._mlist
+ mlist.password = md5.new('ssSSss').digest()
+ eq(mlist.Authenticate(
+ [mm_cfg.AuthListAdmin], 'ssSSss'), mm_cfg.AuthListAdmin)
+ eq(mlist.password, password('ssSSss'))
+ # Test crypt upgrades if crypt is supported
+ if crypt:
+ mlist.password = crypt.crypt('rrRRrr', 'zc')
+ eq(self._mlist.Authenticate(
+ [mm_cfg.AuthListAdmin], 'rrRRrr'), mm_cfg.AuthListAdmin)
+ eq(mlist.password, password('rrRRrr'))
+
+ def test_list_admin_oldstyle_unauth(self):
+ eq = self.assertEqual
+ mlist = self._mlist
+ mlist.password = md5.new('ssSSss').digest()
+ eq(mlist.Authenticate(
+ [mm_cfg.AuthListAdmin], 'xxxxxx'), mm_cfg.UnAuthorized)
+ eq(mlist.password, md5.new('ssSSss').digest())
+ # Test crypt upgrades if crypt is supported
+ if crypt:
+ mlist.password = crypted = crypt.crypt('rrRRrr', 'zc')
+ eq(self._mlist.Authenticate(
+ [mm_cfg.AuthListAdmin], 'xxxxxx'), mm_cfg.UnAuthorized)
+ eq(mlist.password, crypted)
+
+ def test_list_moderator(self):
+ self._mlist.mod_password = password('mmMMmm')
+ self.assertEqual(self._mlist.Authenticate(
+ [mm_cfg.AuthListModerator], 'mmMMmm'), mm_cfg.AuthListModerator)
+
+ def test_user(self):
+ mlist = self._mlist
+ mlist.addNewMember('aperson@dom.ain', password='nosrepa')
+ self.assertEqual(mlist.Authenticate(
+ [mm_cfg.AuthUser], 'nosrepa', 'aperson@dom.ain'), mm_cfg.AuthUser)
+
+ def test_wrong_user(self):
+ mlist = self._mlist
+ mlist.addNewMember('aperson@dom.ain', password='nosrepa')
+ self.assertRaises(Errors.NotAMemberError, mlist.Authenticate,
+ [mm_cfg.AuthUser], 'nosrepa', 'bperson@dom.ain')
+
+ def test_no_user(self):
+ mlist = self._mlist
+ mlist.addNewMember('aperson@dom.ain', password='nosrepa')
+ self.assertRaises(TypeError, mlist.Authenticate,
+ [mm_cfg.AuthUser], 'nosrepa')
+
+ def test_user_unauth(self):
+ mlist = self._mlist
+ mlist.addNewMember('aperson@dom.ain', password='nosrepa')
+ self.assertEqual(mlist.Authenticate(
+ [mm_cfg.AuthUser], 'xxxxxx', 'aperson@dom.ain'),
+ mm_cfg.UnAuthorized)
+
+ def test_value_error(self):
+ self.assertRaises(ValueError, self._mlist.Authenticate,
+ ['spooge'], 'xxxxxx', 'zperson@dom.ain')
+
+
+
+class TestWebAuthenticate(TestBase):
+ def setUp(self):
+ TestBase.setUp(self)
+ Utils.set_global_password('bbBBbb', siteadmin=1)
+ Utils.set_global_password('ccCCcc', siteadmin=0)
+ mlist = self._mlist
+ mlist.mod_password = password('abcdefg')
+ mlist.addNewMember('aperson@dom.ain', password='qqQQqq')
+ # Set up the cookie data
+ sfp = StringIO()
+ print >> sfp, mlist.MakeCookie(mm_cfg.AuthSiteAdmin)
+ # AuthCreator isn't handled in AuthContextInfo()
+ print >> sfp, mlist.MakeCookie(mm_cfg.AuthListAdmin)
+ print >> sfp, mlist.MakeCookie(mm_cfg.AuthListModerator)
+ print >> sfp, mlist.MakeCookie(mm_cfg.AuthUser, 'aperson@dom.ain')
+ os.environ['HTTP_COOKIE'] = sfp.getvalue()
+
+ def tearDown(self):
+ try:
+ os.unlink(mm_cfg.SITE_PW_FILE)
+ except OSError, e:
+ if e.errno <> errno.ENOENT: raise
+ try:
+ os.unlink(mm_cfg.LISTCREATOR_PW_FILE)
+ except OSError, e:
+ if e.errno <> errno.ENOENT: raise
+ TestBase.tearDown(self)
+
+ def test_auth_site_admin(self):
+ self.assertEqual(self._mlist.WebAuthenticate(
+ [mm_cfg.AuthSiteAdmin], 'xxxxxx'), 1)
+
+ def test_list_admin(self):
+ self.assertEqual(self._mlist.WebAuthenticate(
+ [mm_cfg.AuthListAdmin], 'xxxxxx'), 1)
+
+ def test_list_moderator(self):
+ self.assertEqual(self._mlist.WebAuthenticate(
+ [mm_cfg.AuthListModerator], 'xxxxxx'), 1)
+
+ def test_user(self):
+ self.assertEqual(self._mlist.WebAuthenticate(
+ [mm_cfg.AuthUser], 'xxxxxx'), 1)
+
+ def test_not_a_user(self):
+ self._mlist.removeMember('aperson@dom.ain')
+ self.assertEqual(self._mlist.WebAuthenticate(
+ [mm_cfg.AuthUser], 'xxxxxx', 'aperson@dom.ain'), 0)
+
+
+
+# TBD: Tests for MakeCookie(), ZapCookie(), CheckCookie() -- although the
+# latter is implicitly tested by testing WebAuthenticate() above.
+
+
+
+def suite():
+ suite = unittest.TestSuite()
+ suite.addTest(unittest.makeSuite(TestSecurityManager))
+ suite.addTest(unittest.makeSuite(TestAuthenticate))
+ suite.addTest(unittest.makeSuite(TestWebAuthenticate))
+ return suite
+
+
+
+if __name__ == '__main__':
+ unittest.main(defaultTest='suite')
diff --git a/tests/testall.py b/tests/testall.py
new file mode 100644
index 00000000..0f6a9be2
--- /dev/null
+++ b/tests/testall.py
@@ -0,0 +1,40 @@
+# Copyright (C) 2001,2002 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
+# 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, USA.
+
+"""PyUnit-based test harness for Mailman."""
+
+import unittest
+
+MODULES = ('bounces', 'handlers', 'membership', 'safedict',
+ 'security_mgr', 'runners', 'lockfile',
+ )
+
+# test_message.py can only be run when mailmanctl is running, but mailmanctl
+# can't be run when the other tests are run, 'cause it'll clobber qfiles.
+# This means you have to run test_message.py manually. :(
+
+
+def suite():
+ alltests = unittest.TestSuite()
+ for modname in MODULES:
+ mod = __import__('test_'+modname)
+ alltests.addTest(mod.suite())
+ return alltests
+
+
+
+if __name__ == '__main__':
+ unittest.main(defaultTest='suite')