diff options
| -rw-r--r-- | Mailman/OutgoingQueue.py | 51 | ||||
| -rw-r--r-- | Mailman/Utils.py | 18 | ||||
| -rw-r--r-- | cron/Makefile.in | 2 | ||||
| -rwxr-xr-x | cron/crontab.in.in | 3 | ||||
| -rw-r--r-- | cron/run_queue | 31 |
5 files changed, 101 insertions, 4 deletions
diff --git a/Mailman/OutgoingQueue.py b/Mailman/OutgoingQueue.py new file mode 100644 index 000000000..9022b82ea --- /dev/null +++ b/Mailman/OutgoingQueue.py @@ -0,0 +1,51 @@ +# Copyright (C) 1998 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. + +"""Queue up posts if the SMTP connection fails.""" + +import tempfile, marshal, mm_cfg + +TEMPLATE = "mm_q." + +def dequeueMessage(msg): + import os + os.unlink(msg) + +def processQueue(): + import os, smtplib + files = os.listdir(mm_cfg.DATA_DIR) + for file in files: + if TEMPLATE <> file[:len(TEMPLATE)]: + continue + full_fname = os.path.join(mm_cfg.DATA_DIR, file) + f = open(full_fname,"r") + recip,sender,text = marshal.load(f) + f.close() + import Utils + Utils.TrySMTPDelivery(recip,sender,text,full_fname) + + +def enqueueMessage(the_sender, recip, text): + tempfile.tempdir = mm_cfg.DATA_DIR + tempfile.template = TEMPLATE + fname = tempfile.mktemp() + f = open(fname, "a+") + marshal.dump((recip,the_sender,text),f) + f.close() + return fname + + + diff --git a/Mailman/Utils.py b/Mailman/Utils.py index 6a6315b60..ff927a5c8 100644 --- a/Mailman/Utils.py +++ b/Mailman/Utils.py @@ -163,7 +163,6 @@ def DeliverToUser(msg, recipient, add_headers=[]): # hang pending release of the lock - deadlock. if os.fork(): return - import smtplib sender = msg.GetSender() try: @@ -179,13 +178,26 @@ def DeliverToUser(msg, recipient, add_headers=[]): msg.headers.append(i) text = string.join(msg.headers, '')+ '\n'+ QuotePeriods(msg.body) + import OutgoingQueue + OutgoingQueue.enqueueMessage(sender, recipient, text) + TrySMTPDelivery(recipient,sender,text,queue_id) + # Just in case there's still something waiting to be sent... + OutgoingQueue.processQueue() + finally: + os._exit(0) + +def TrySMTPDelivery(recipient, sender, text, queue_entry): + import smtplib + try: con = smtplib.SmtpConnection(mm_cfg.SMTPHOST) con.helo(mm_cfg.DEFAULT_HOST_NAME) con.send(to=recipient,frm=sender,text=text) con.quit() + import OutgoingQueue + OutgoingQueue.dequeueMessage(queue_entry) finally: - os._exit(0) - +# except: # Todo: This might want to handle special cases. + pass # Just try again later. def QuotePeriods(text): return string.join(string.split(text, '\n.\n'), '\n .\n') diff --git a/cron/Makefile.in b/cron/Makefile.in index 3d0c9863e..04dff3b42 100644 --- a/cron/Makefile.in +++ b/cron/Makefile.in @@ -43,7 +43,7 @@ CRONDIR= $(prefix)/cron SHELL= /bin/sh SCRIPTS= archive checkdbs crontab.in mailpasswds senddigests \ -upvolumes_monthly upvolumes_yearly gate_news +upvolumes_monthly upvolumes_yearly gate_news run_queue # Modes for directories and executables created by the install # process. Default to group-writable directories but diff --git a/cron/crontab.in.in b/cron/crontab.in.in index c8246d5f0..c2c776127 100755 --- a/cron/crontab.in.in +++ b/cron/crontab.in.in @@ -11,3 +11,6 @@ # if you don't want to allow gating, or don't have any going on right now, # or want to exclusively use a callback strategy instead of polling. 0,5,10,15,20,25,30,35,40,45,50,55 * * * * @PYTHON@ @prefix@/cron/gate_news + +# Every 1/2 hour flush the outgoing mail queue. +12,42 * * * * @PYTHON@ @prefix@/cron/run_queue
\ No newline at end of file diff --git a/cron/run_queue b/cron/run_queue new file mode 100644 index 000000000..4fafc1140 --- /dev/null +++ b/cron/run_queue @@ -0,0 +1,31 @@ +#! /usr/bin/env python +# +# Copyright (C) 1998 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: This is being deprecated since mailman has been shifted over to an +# external archiver (ie, andrew kuchling's latest version of pipermail.) +# +# This script gets called by cron. +# It updates the archive for all mailing lists with update-frequency equal +# to or greater than the specified archive level. + + +import sys +import paths +from Mailman import OutgoingQueue + +OutgoingQueue.processQueue() |
