#! /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. """Accept posts to a list and handle them properly. This script is invoked via the mail wrapper. stdin is the mail message, and argv[1] is the name of the target mailing list. """ import sys import paths from Mailman import mm_cfg from Mailman import MailList from Mailman import Message from Mailman import Errors from Mailman import Utils from Mailman.Logging.Utils import LogStdErr from Mailman.Handlers import HandlerAPI from Mailman.pythonlib.StringIO import StringIO LogStdErr("error", "post") def main(): mlist = MailList.MailList(sys.argv[1]) try: # get the message text, which might flow through a filter module prog = mlist.filter_prog msg = None if prog: import os, __main__ file = os.path.join(mm_cfg.PREFIX, 'filters', prog) try: execfile(file) msg = Message.Message(StringIO(__main__.mailman_text)) except: pass if msg is None: s = StringIO(sys.stdin.read()) msg = Message.Message(s) # go ahead and post the message adminaddr = mlist.GetAdminEmail() try: mlist.Post(msg) # TBD: change this to use LoopError and/or move this to the message # pipeline where it probably ought to be. except Errors.MMLoopingPost: # let the list admin know this happened, but don't otherwise hold # the message for approval. sys.stderr.write('Message already came through this list\n') map(sys.stderr.write, msg.headers) sys.stderr.write('[body of message suppressed]\n') noticemsg = Message.UserNotification( adminaddr, adminaddr, 'Message loop detected [message discarded]', '\n---------- Original Message ----------\n' + str(msg)) HandlerAPI.DeliverToUser(mlist, noticemsg) # Let another process run. finally: mlist.Save() mlist.Unlock() if __name__ == '__main__': main()