diff options
| author | Barry Warsaw | 2009-01-25 13:01:41 -0500 |
|---|---|---|
| committer | Barry Warsaw | 2009-01-25 13:01:41 -0500 |
| commit | eefd06f1b88b8ecbb23a9013cd223b72ca85c20d (patch) | |
| tree | 72c947fe16fce0e07e996ee74020b26585d7e846 /mailman/queue/outgoing.py | |
| parent | 07871212f74498abd56bef3919bf3e029eb8b930 (diff) | |
| download | mailman-eefd06f1b88b8ecbb23a9013cd223b72ca85c20d.tar.gz mailman-eefd06f1b88b8ecbb23a9013cd223b72ca85c20d.tar.zst mailman-eefd06f1b88b8ecbb23a9013cd223b72ca85c20d.zip | |
Diffstat (limited to 'mailman/queue/outgoing.py')
| -rw-r--r-- | mailman/queue/outgoing.py | 130 |
1 files changed, 0 insertions, 130 deletions
diff --git a/mailman/queue/outgoing.py b/mailman/queue/outgoing.py deleted file mode 100644 index fdb1289fd..000000000 --- a/mailman/queue/outgoing.py +++ /dev/null @@ -1,130 +0,0 @@ -# Copyright (C) 2000-2009 by the Free Software Foundation, Inc. -# -# This file is part of GNU Mailman. -# -# GNU Mailman 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 3 of the License, or (at your option) -# any later version. -# -# GNU Mailman 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 -# GNU Mailman. If not, see <http://www.gnu.org/licenses/>. - -"""Outgoing queue runner.""" - -import os -import sys -import socket -import logging - -from datetime import datetime -from lazr.config import as_timedelta - -from mailman.config import config -from mailman.core import errors -from mailman.queue import Runner -from mailman.queue.bounce import BounceMixin - -# This controls how often _do_periodic() will try to deal with deferred -# permanent failures. It is a count of calls to _do_periodic() -DEAL_WITH_PERMFAILURES_EVERY = 10 - -log = logging.getLogger('mailman.error') - - - -class OutgoingRunner(Runner, BounceMixin): - """The outgoing queue runner.""" - - def __init__(self, slice=None, numslices=1): - Runner.__init__(self, slice, numslices) - BounceMixin.__init__(self) - # We look this function up only at startup time. - module_name, callable_name = config.mta.outgoing.rsplit('.', 1) - __import__(module_name) - self._func = getattr(sys.modules[module_name], callable_name) - # This prevents smtp server connection problems from filling up the - # error log. It gets reset if the message was successfully sent, and - # set if there was a socket.error. - self._logged = False - self._retryq = config.switchboards['retry'] - - def _dispose(self, mlist, msg, msgdata): - # See if we should retry delivery of this message again. - deliver_after = msgdata.get('deliver_after', datetime.fromtimestamp(0)) - if datetime.now() < deliver_after: - return True - # Make sure we have the most up-to-date state - try: - pid = os.getpid() - self._func(mlist, msg, msgdata) - # Failsafe -- a child may have leaked through. - if pid <> os.getpid(): - log.error('child process leaked thru: %s', pid) - os._exit(1) - self._logged = False - except socket.error: - # There was a problem connecting to the SMTP server. Log this - # once, but crank up our sleep time so we don't fill the error - # log. - port = int(config.mta.port) - if port == 0: - port = 'smtp' - # Log this just once. - if not self._logged: - log.error('Cannot connect to SMTP server %s on port %s', - config.mta.host, port) - self._logged = True - return True - except errors.SomeRecipientsFailed, e: - # Handle local rejects of probe messages differently. - if msgdata.get('probe_token') and e.permfailures: - self._probe_bounce(mlist, msgdata['probe_token']) - else: - # Delivery failed at SMTP time for some or all of the - # recipients. Permanent failures are registered as bounces, - # but temporary failures are retried for later. - # - # BAW: msg is going to be the original message that failed - # delivery, not a bounce message. This may be confusing if - # this is what's sent to the user in the probe message. Maybe - # we should craft a bounce-like message containing information - # about the permanent SMTP failure? - if e.permfailures: - self._queue_bounces(mlist.fqdn_listname, e.permfailures, - msg) - # Move temporary failures to the qfiles/retry queue which will - # occasionally move them back here for another shot at - # delivery. - if e.tempfailures: - now = datetime.now() - recips = e.tempfailures - last_recip_count = msgdata.get('last_recip_count', 0) - deliver_until = msgdata.get('deliver_until', now) - if len(recips) == last_recip_count: - # We didn't make any progress, so don't attempt - # delivery any longer. BAW: is this the best - # disposition? - if now > deliver_until: - return False - else: - # Keep trying to delivery this message for a while - deliver_until = now + as_timedelta( - config.mta.delivery_retry_period) - msgdata['last_recip_count'] = len(recips) - msgdata['deliver_until'] = deliver_until - msgdata['recips'] = recips - self._retryq.enqueue(msg, msgdata) - # We've successfully completed handling of this message - return False - - _do_periodic = BounceMixin._do_periodic - - def _clean_up(self): - BounceMixin._clean_up(self) - Runner._clean_up(self) |
