------------------------------------------------------------ revno: 6526 committer: Barry Warsaw <[EMAIL PROTECTED]> branch nick: 3.0 timestamp: Sun 2007-07-08 07:47:03 -0400 message: Convert ToOutgoing handler to a doctest. Minor cleanup of the handler code to a more modern Python style. added: Mailman/docs/outgoing.txt modified: Mailman/Handlers/ToOutgoing.py Mailman/testing/test_handlers.py
=== added file 'Mailman/docs/outgoing.txt' --- a/Mailman/docs/outgoing.txt 1970-01-01 00:00:00 +0000 +++ b/Mailman/docs/outgoing.txt 2007-07-08 11:47:03 +0000 @@ -0,0 +1,150 @@ +The outgoing handler +==================== + +Mailman's outgoing queue is used as the wrapper around SMTP delivery to the +upstream mail server. The ToOutgoing handler does little more than drop the +message into the outgoing queue, after calculating whether the message should +be VERP'd or not. VERP means Variable Envelope Return Path; we're using that +term somewhat incorrectly, but within the spirit of the standard, which +basically describes how to encode the recipient's address in the originator +headers for unambigous bounce processing. + + >>> from Mailman.Handlers.ToOutgoing import process + >>> from Mailman.Message import Message + >>> from Mailman.Queue.Switchboard import Switchboard + >>> from Mailman.configuration import config + >>> from Mailman.database import flush + >>> from email import message_from_string + >>> mlist = config.list_manager.create('[EMAIL PROTECTED]') + >>> flush() + >>> switchboard = Switchboard(config.OUTQUEUE_DIR) + + >>> def queue_size(): + ... size = len(switchboard.files) + ... for filebase in switchboard.files: + ... msg, msgdata = switchboard.dequeue(filebase) + ... switchboard.finish(filebase) + ... return size + +Craft a message destined for the outgoing queue. Include some random metadata +as if this message had passed through some other handlers. + + >>> msg = message_from_string("""\ + ... Subject: Here is a message + ... + ... Something of great import. + ... """, Message) + +When certain conditions are met, the message will be VERP'd. For example, if +the message metadata already has a VERP key, this message will be VERP'd. + + >>> msgdata = dict(foo=1, bar=2, verp=True) + >>> process(mlist, msg, msgdata) + >>> print msg.as_string() + Subject: Here is a message + <BLANKLINE> + Something of great import. + >>> msgdata['verp'] + True + +While the queued message will not be changed, the queued metadata will have an +additional key set: the mailing list name. + + >>> filebase = switchboard.files[0] + >>> qmsg, qmsgdata = switchboard.dequeue(filebase) + >>> switchboard.finish(filebase) + >>> print qmsg.as_string() + Subject: Here is a message + <BLANKLINE> + Something of great import. + >>> sorted(qmsgdata.items()) + [('_parsemsg', False), + ('bar', 2), ('foo', 1), + ('listname', '[EMAIL PROTECTED]'), + ('received_time', ...), + ('verp', True), ('version', 3)] + >>> queue_size() + 0 + +If the list is set to personalize deliveries, and the global configuration +option to VERP personalized deliveries is set, then the message will be +VERP'd. + + >>> mlist.personalize = True + >>> flush() + >>> config.VERP_PERSONALIZED_DELIVERIES = True + >>> msgdata = dict(foo=1, bar=2) + >>> process(mlist, msg, msgdata) + >>> msgdata['verp'] + True + >>> queue_size() + 1 + +However, if the global configuration variable prohibits VERP'ing, even +personalized lists will not VERP. + + >>> config.VERP_PERSONALIZED_DELIVERIES = False + >>> msgdata = dict(foo=1, bar=2) + >>> process(mlist, msg, msgdata) + >>> print msgdata.get('verp') + None + >>> queue_size() + 1 + +If the list is not personalized, then the message may still be VERP'd based on +the global configuration variable VERP_DELIVERY_INTERVAL. This variable tells +Mailman how often to VERP even non-personalized mailing lists. It can be set +to zero, which means non-personalized messages will never be VERP'd. + + >>> mlist.personalize = False + >>> flush() + >>> config.VERP_DELIVERY_INTERVAL = 0 + >>> msgdata = dict(foo=1, bar=2) + >>> process(mlist, msg, msgdata) + >>> print msgdata.get('verp') + None + >>> queue_size() + 1 + +If the interval is set to 1, then every message will be VERP'd. + + >>> config.VERP_DELIVERY_INTERVAL = 1 + >>> for i in range(10): + ... msgdata = dict(foo=1, bar=2) + ... process(mlist, msg, msgdata) + ... print i, msgdata['verp'] + 0 True + 1 True + 2 True + 3 True + 4 True + 5 True + 6 True + 7 True + 8 True + 9 True + >>> queue_size() + 10 + +If the interval is set to some other number, then one out of that many posts +will be VERP'd. + + >>> config.VERP_DELIVERY_INTERVAL = 3 + >>> for i in range(10): + ... mlist.post_id = i + ... flush() + ... msgdata = dict(foo=1, bar=2) + ... process(mlist, msg, msgdata) + ... print i, msgdata.get('verp', False) + 0 True + 1 False + 2 False + 3 True + 4 False + 5 False + 6 True + 7 False + 8 False + 9 True + >>> queue_size() + 10 === modified file 'Mailman/Handlers/ToOutgoing.py' --- a/Mailman/Handlers/ToOutgoing.py 2007-01-19 04:38:06 +0000 +++ b/Mailman/Handlers/ToOutgoing.py 2007-07-08 11:47:03 +0000 @@ -37,7 +37,7 @@ # # Note that the verp flag may already be set, e.g. by mailpasswds using # VERP_PASSWORD_REMINDERS. Preserve any existing verp flag. - if msgdata.has_key('verp'): + if 'verp' in msgdata: pass elif mlist.personalize: if config.VERP_PERSONALIZED_DELIVERIES: === modified file 'Mailman/testing/test_handlers.py' --- a/Mailman/testing/test_handlers.py 2007-07-06 04:08:56 +0000 +++ b/Mailman/testing/test_handlers.py 2007-07-08 11:47:03 +0000 @@ -44,7 +44,6 @@ # Don't test handlers such as SMTPDirect and Sendmail here from Mailman.Handlers import ToArchive from Mailman.Handlers import ToDigest -from Mailman.Handlers import ToOutgoing @@ -390,51 +389,10 @@ -class TestToOutgoing(TestBase): - def setUp(self): - TestBase.setUp(self) - # We're going to want to inspect this queue directory - self._sb = Switchboard(config.OUTQUEUE_DIR) - # Save and set this value - self._interval = config.VERP_DELIVERY_INTERVAL - config.VERP_DELIVERY_INTERVAL = 1 - - def tearDown(self): - # Restore this value - config.VERP_DELIVERY_INTERVAL = self._interval - for f in os.listdir(config.OUTQUEUE_DIR): - os.unlink(os.path.join(config.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), 7) - eq(data['foo'], 1) - eq(data['bar'], 2) - eq(data['version'], 3) - eq(data['listname'], '[EMAIL PROTECTED]') - eq(data['verp'], 1) - # Clock skew makes this unreliable - #self.failUnless(data['received_time'] <= time.time()) - - - def test_suite(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(TestApprove)) suite.addTest(unittest.makeSuite(TestScrubber)) suite.addTest(unittest.makeSuite(TestToArchive)) suite.addTest(unittest.makeSuite(TestToDigest)) - suite.addTest(unittest.makeSuite(TestToOutgoing)) return suite -- (no title) https://code.launchpad.net/~mailman-coders/mailman/3.0 You are receiving this branch notification because you are subscribed to it. To unsubscribe from this branch go to https://code.launchpad.net/~mailman-coders/mailman/3.0/+subscription/mailman-checkins. _______________________________________________ Mailman-checkins mailing list Mailman-checkins@python.org Unsubscribe: http://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org