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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
#! /usr/bin/env python
#
# Copyright (C) 1998,1999,2000 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 Utils
from Mailman import MailList
from Mailman import Message
from Mailman import Errors
from Mailman import LockFile
from Mailman.Logging.Utils import LogStdErr
from Mailman.Handlers import HandlerAPI
from Mailman.pythonlib.StringIO import StringIO
LogStdErr("error", "post")
def get_message(mlist):
msg = None
# Perhaps flow the message text through a filter program
prog = mlist.filter_prog
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)
return msg
def main():
# TBD: If you've configured your list or aliases so poorly as to get
# either of these first two errors, there's little that can be done to
# save your messages. They will be lost. Minimal testing of new lists
# should avoid either of these problems.
try:
listname = sys.argv[1]
except IndexError:
sys.stderr.write('Mailman error: post got no listname.\n')
sys.exit(1)
try:
mlist = MailList.MailList(listname, lock=0)
except Errors.MMListError, e:
sys.stderr.write('Mailman error: post got bad listname: %s\n%s' %
(listname, e))
sys.exit(1)
# We have a valid, unlocked list. This is enough to extract the message
# object in a usable form. From here on out, we should never lose
# messages.
msg = get_message(mlist)
# Try to obtain the mailing list lock. If that fails, enqueue the message
# for delivery by the qrunner cron job.
try:
mlist.Lock(timeout=mm_cfg.LIST_LOCK_TIMEOUT)
except LockFile.TimeOutError:
msg.Enqueue(mlist)
return
try:
msgdata = {}
# ignore return value
HandlerAPI.DeliverToList(mlist, msg, msgdata)
finally:
mlist.Save()
mlist.Unlock()
if __name__ == '__main__':
main()
|