1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
#! /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()
|