Apply 79_archiver_slash.patch
[mspang/vmailman.git] / contrib / qmail-to-mailman.py
1 #! @PYTHON@
2
3 # Configuration variables - Change these for your site if necessary.
4 MailmanHome = "@prefix@"; # Mailman home directory.
5 MailmanVar = "@VAR_PREFIX@"; # Mailman directory for mutable data.
6 MailmanOwner = "postmaster@localhost"; # Postmaster and abuse mail recepient.
7 # End of configuration variables.
8
9 # qmail-to-mailman.py
10 #
11 # Interface mailman to a qmail virtual domain. Does not require the creation
12 # of _any_ aliases to connect lists to your mail system.
13 #
14 # Bruce Perens, bruce@perens.com, March 1999.
15 # This is free software under the GNU General Public License.
16 #
17 # This script is meant to be called from ~mailman/.qmail-default . It catches
18 # all mail to a virtual domain, in my case "lists.hams.com". It looks at the
19 # recepient for each mail message and decides if the mail is addressed to a
20 # valid list or not, and bounces the message with a helpful suggestion if it's
21 # not addressed to a list. It decides if it is a posting, a list command, or
22 # mail to the list administrator, by checking for the -admin, -owner, and
23 # -request addresses. It will recognize a list as soon as the list is created,
24 # there is no need to add _any_ aliases for any list. It recognizes mail to
25 # postmaster, mailman-owner, abuse, mailer-daemon, root, and owner, and
26 # routes those mails to MailmanOwner as defined in the configuration
27 # variables, above.
28 #
29 # INSTALLATION:
30 #
31 # Install this file as ~mailman/bin/qmail-to-mailman.py
32 #
33 # To configure a virtual domain to connect to mailman, create these files:
34 #
35 # ~mailman/.qmail-default
36 # |preline /usr/bin/python /usr/lib/mailman/bin/mail-in.py
37 #
38 # /var/qmail/control/virtualdomains:
39 # DOMAIN.COM:mailman
40 #
41 # Note: "preline" is a QMail program which ensures a Unix "From " header is
42 # on the message.  Archiving will break without this.
43 #
44 # Replace DOMAIN.COM above with the name of the domain to be connected to
45 # Mailman. Note that _all_ mail to that domain will go to Mailman, so you
46 # don't want to put the name of your main domain here. In my case, I created 
47 # lists.hams.com for Mailman, and I use hams.com as my regular domain.
48 #
49 # After you edit /var/qmail/control/virtualdomains, kill and restart qmail.
50 #
51
52 import sys, os, re, string
53
54 def main():
55     os.nice(5)  # Handle mailing lists at non-interactive priority.
56
57     os.chdir(MailmanVar + "/lists")
58
59     try:
60         local = os.environ["LOCAL"]
61     except:
62         # This might happen if we're not using qmail.
63         sys.stderr.write("LOCAL not set in environment?\n")
64         sys.exit(100)
65
66     local = string.lower(local)
67     local = re.sub("^" + MailmanUser + "-","",local)
68
69     names = ("root", "postmaster", "mailer-daemon", "mailman-owner", "owner",
70              "abuse")
71     for i in names:
72         if i == local:
73             os.execv("/var/qmail/bin/qmail-inject",
74                      ("/var/qmail/bin/qmail-inject", MailmanOwner))
75             sys.exit(0)
76
77     type = "post"
78     types = (("-admin$", "bounces"),
79              ("-bounces$", "bounces"),
80              ("-join$", "join"),
81              ("-leave$", "leave"),
82              ("-owner$", "owner"),
83              ("-request$", "request"))
84
85     for i in types:
86         if re.search(i[0],local):
87             type = i[1]
88             local = re.sub(i[0],"",local)
89
90     if os.path.exists(local):
91         os.execv(MailmanHome + "/mail/mailman",
92                  (MailmanHome + "/mail/mailman", type, local))
93     else:
94         bounce()
95     sys.exit(111)
96
97 def bounce():
98     bounce_message = """\
99 TO ACCESS THE MAILING LIST SYSTEM: Start your web browser on
100 http://%s/
101 That web page will help you subscribe or unsubscribe, and will
102 give you directions on how to post to each mailing list.\n"""
103     sys.stderr.write(bounce_message % (os.environ["HOST"]))
104     sys.exit(100)
105
106 try:
107     sys.exit(main())
108 except SystemExit, argument:
109     sys.exit(argument)
110
111 except Exception, argument:
112     info = sys.exc_info()
113     trace = info[2]
114     sys.stderr.write("%s %s\n" % (sys.exc_type, argument))
115     sys.stderr.write("Line %d\n" % (trace.tb_lineno))
116     sys.exit(111)       # Soft failure, try again later.