diff options
Diffstat (limited to 'doc/mailman-install.tex')
-rw-r--r-- | doc/mailman-install.tex | 1808 |
1 files changed, 0 insertions, 1808 deletions
diff --git a/doc/mailman-install.tex b/doc/mailman-install.tex deleted file mode 100644 index efc9a5e3..00000000 --- a/doc/mailman-install.tex +++ /dev/null @@ -1,1808 +0,0 @@ -\documentclass{howto} - -\title{GNU Mailman - Installation Manual} -\author{Barry Warsaw} -\authoraddress{\email{barry (at) list dot org}} - -\date{\today} -\release{2.1} % software release, not documentation -\setreleaseinfo{} % empty for final release -\setshortversion{2.1} % major.minor only for software - -\begin{document} - -\maketitle - -% This makes the Abstract go on a separate page in the HTML version; -% if a copyright notice is used, it should go immediately after this. -% -\ifhtml -\chapter*{Front Matter\label{front}} -\fi - -\begin{abstract} -\noindent -This document describes how to install GNU Mailman on a POSIX-based system -such as \UNIX{}, MacOSX, or GNU/Linux. It will cover basic installation -instructions, as well as guidelines for integrating Mailman with your web and -mail servers. - -\noindent -The GNU Mailman website is at \url{http://www.list.org} -\end{abstract} - -% The ugly "%begin{latexonly}" pseudo-environment supresses the table -% of contents for HTML generation. -% -%begin{latexonly} -\tableofcontents -%end{latexonly} - - -\section{Installation Requirements} - -\emph{Please note that the information on this page may be out of date.} -Check for the -\ulink{latest installation information}{http://wiki.list.org/x/bAM} on the -\ulink{Mailman wiki}{http://wiki.list.org}. - -GNU Mailman works on most POSIX-based systems such as \UNIX{}, MacOSX, or -GNU/Linux. It does not currently work on Windows. You must have a mail -server that you can send messages to, and a web server that supports the -CGI/1.1 API. \ulink{Apache}{http://httpd.apache.org} makes a fine choice for -web server, and mail servers such as -\ulink{Postfix}{http://www.postfix.org}, -\ulink{Exim}{http://www.exim.org}, -\ulink{Sendmail}{http://www.sendmail.org}, and -\ulink{qmail}{http://cr.yp.to/qmail.html} should -work just fine. - -To install Mailman from source, you will need an ANSI C compiler to build -Mailman's security wrappers. The -\ulink{GNU C compiler gcc}{http://gcc.gnu.org} works well. - -You must have the \ulink{Python}{http://www.python.org} interpreter installed -somewhere on your system. As of this writing, Python 2.4.4 is recommended, -but see the wiki page above for the latest information. - -\section{Set up your system} - -Before installing Mailman, you need to prepare your system by adding certain -users and groups. You will need to have root privileges to perform the steps -in this section. - -\subsection{Add the group and user} - -Mailman requires a unique user and group name which will own its files, and -under which its processes will run. Mailman's basic security is based on -group ownership permissions, so it's important to get this step -right\footnote{You will be able to check and repair your permissions after -installation is complete.}. Typically, you will add a new user and a new -group, both called \code{mailman}. The \code{mailman} user must be a member -of the \code{mailman} group. Mailman will be installed under the -\code{mailman} user and group, with the set-group-id (setgid) bit enabled. - -If these names are already in use, you can choose different user and group -names, as long as you remember these when you run \program{configure}. If you -choose a different unique user name, you will have to specify this with -\program{configure}'s \longprogramopt{with-username} option, and if you choose -a different group name, you will have to specify this with -\program{configure}'s \longprogramopt{with-groupname} option. - -On Linux systems, you can use the following commands to create these -accounts. Check your system's manual pages for details: - -\begin{verbatim} - % groupadd mailman - % useradd -c''GNU Mailman'' -s /no/shell -d /no/home -g mailman mailman -\end{verbatim} - -\subsection{Create the installation directory\label{create-install-dir}} -Typically, Mailman is installed into a single directory, which includes both -the Mailman source code and the run-time list and archive data. It is -possible to split the static program files from the variable data files and -install them in separate directories. This section will describe the -available options. - -The default is to install all of Mailman to -\file{/usr/local/mailman}\footnote{This is the default for Mailman 2.1. -Earlier versions of Mailman installed everything under \file{/home/mailman} by -default.}. You can change this base installation directory (referred to here -as \var{\$prefix}) by specifying the directory with the -\longprogramopt{prefix} \program{configure} option. If you're upgrading from -a previous version of Mailman, you may want to use the \longprogramopt{prefix} -option unless you move your mailing lists. - -\begin{notice}[warning] -You cannot install Mailman on a filesystem that is mounted with the -\code{nosuid} option. This will break Mailman, which relies on setgid -programs for its security. If this describes your environment, simply install -Mailman in a location that allows setgid programs. -\end{notice} - -Make sure the installation directory is set to group \code{mailman} (or -whatever you're going to specify with \longprogramopt{with-groupname}) and has -the setgid bit set\footnote{BSD users should see the \ref{bsd-issues} section -for additional information.}. You probably also want to guarantee that this -directory is readable and executable by everyone. For example, these shell -commands will accomplish this: - -\begin{verbatim} - % cd $prefix - % chgrp mailman . - % chmod a+rx,g+ws . -\end{verbatim} - -You are now ready to configure and install the Mailman software. - -\section{Build and install Mailman\label{building}} - -\subsection{Run \program{configure}} - -Before you can install Mailman, you must run \program{configure} to set -various installation options your system might need. - -\begin{notice}[note] -Take special note of the \longprogramopt{with-mail-gid} and -\longprogramopt{with-cgi-gid} options below. You will probably need to use -these. -\end{notice} - -You should \strong{not} be root while performing the steps in this section. -Do them under your own login, or whatever account you typically use to install -software. You do not need to do these steps as user \code{mailman}, but you -could. However, make sure that the login used is a member of the -\code{mailman} group as that that group has write permissions to the -\var{\$prefix} directory made in the previous step. You must also have -permission to create a setgid file in the file system where it resides (NFS -and other mounts can be configured to inhibit setgid settings). - -If you've installed other GNU software, you should be familiar with the -\program{configure} script. Usually you can just \program{cd} to the -directory you unpacked the Mailman source tarball into, and run -\program{configure} with no arguments: - -\begin{verbatim} - % cd mailman-<version> - % ./configure - % make install -\end{verbatim} - -The following options allow you to customize your Mailman -installation. - -\begin{description} -\item[\longprogramopt{prefix}=\var{dir}] - Standard GNU configure option which changes the base directory that - Mailman is installed into. By default \var{\$prefix} is - \file{/usr/local/mailman}. This directory must already exist, and be set - up as described in \ref{create-install-dir}. - -\item[\longprogramopt{exec-prefix}=\var{dir}] - Standard GNU configure option which lets you specify a different - installation directory for architecture dependent binaries. - -\item[\longprogramopt{with-var-prefix}=\var{dir}] - Store mutable data under \var{dir} instead of under the \var{\$prefix} or - \var{\$exec_prefix}. Examples of such data include the list archives and - list settings database. - -\item[\longprogramopt{with-python}=\file{/path/to/python}] - Specify an alternative Python interpreter to use for the wrapper programs. - The default is to use the interpreter found first on your shell's - \var{\$PATH}. - -\item[\longprogramopt{with-username}=\var{username-or-uid}] - Specify a different username than \code{mailman}. The value of this - option can be an integer user id or a user name. Be sure your - \var{\$prefix} directory is owned by this user. - -\item[\longprogramopt{with-groupname}=\var{groupname-or-gid}] - Specify a different groupname than \code{mailman}. The value of this - option can be an integer group id or a group name. Be sure your - \var{\$prefix} directory is group-owned by this group. - -\item[\longprogramopt{with-mail-gid}=\var{group-or-groups}] - Specify an alternative group for running scripts via the mail wrapper. - \var{group-or-groups} can be a list of one or more integer group ids or - symbolic group names. The first value in the list that resolves to an - existing group is used. By default, the value is the list \code{mailman}, - \code{other}, \code{mail}, and \code{daemon}. - - \begin{notice}[note] - This is highly system dependent and you must get this right, because the - group id is compiled into the mail wrapper program for added security. On - systems using \program{sendmail}, the \file{sendmail.cf} configuration - file designates the group id of \program{sendmail} processes using the - \var{DefaultUser} option. (If commented out, it still may be indicating - the default...) - \end{notice} - - Check your mail server's documentation and configuration files to find the - right value for this switch. - -\item[\longprogramopt{with-cgi-gid}=\var{group-or-groups}] - Specify an alternative group for running scripts via the CGI wrapper. - \var{group-or-groups} can be a list of one or more integer group ids or - symbolic group names. The first value in the list that resolves to an - existing group is used. By default, the value is the the list - \code{www}, \code{www-data}, and \code{nobody}. - - \begin{notice}[note] - The proper value for this is dependent on your web server configuration. - You must get this right, because the group id is compiled into the CGI - wrapper program for added security, and no Mailman CGI scripts will run if - this is incorrect. - \end{notice} - - If you're using Apache, check the values for the \var{Group} option in - your \file{httpd.conf} file. - -\item[\longprogramopt{with-cgi-ext}=\var{extension}] - Specify an extension for cgi-bin programs. The CGI wrappers placed in - \file{\var{\$prefix}/cgi-bin} will have this extension (some web servers - require an extension). \var{extension} must include the leading dot. - -\item[\longprogramopt{with-mailhost}=\var{hostname}] - Specify the fully qualified host name part for outgoing email. After the - installation is complete, this value can be overriden in - \file{\var{\$prefix}/Mailman/mm_cfg.py}. - -\item[\longprogramopt{with-urlhost}=\var{hostname}] - Specify the fully qualified host name part of urls. After the - installation is complete, this value can be overriden in - \file{\var{\$prefix}/Mailman/mm_cfg.py}. - -\item[\longprogramopt{with-gcc}=no] - Don't use gcc, even if it is found. In this case, \program{cc} must be - found on your \var{\$PATH}. - -\end{description} - -\subsection{Make and install} - -Once you've run \program{configure}, you can simply run \program{make}, then -\program{make install} to build and install Mailman. - -\section{Check your installation} - -After you've run \program{make install}, you should check that your -installation has all the correct permissions and group ownerships by running -the \program{check_perms} script. First change to the installation -(i.e. \var{\$prefix}) directory, then run the \program{bin/check_perms} -program. Don't try to run bin/check_perms from the source directory; it will -only run from the installation directory. - -If this reports no problems, then it's very likely <wink> that your -installation is set up correctly. If it reports problems, then you can either -fix them manually, re-run the installation, or use \program{bin/check_perms} -to fix the problems (probably the easiest solution): - -\begin{itemize} -\item You need to become the user that did the installation, and that owns all - the files in \var{\$prefix}, or root. - -\item Run \program{bin/check_perms -f} - -\item Repeat previous step until no more errors are reported! -\end{itemize} - -\begin{notice}[warning] -If you're running Mailman on a shared multiuser system, and you have mailing -lists with private archives, you may want to hide the private archive -directory from other users on your system. In that case, you should drop the -other execute permission (o-x) from the \file{archives/private} directory. -However, the web server process must be able to follow the symbolic link in -public directory, otherwise your public Pipermail archives will not work. To -set this up, become root and run the following commands: - -\begin{verbatim} -# cd <prefix>/archives -# chown <web-server-user> private -# chmod o-x private -\end{verbatim} - -You need to know what user your web server runs as. It may be \code{www}, -\code{apache}, \code{httpd} or \code{nobody}, depending on your server's -configuration. -\end{notice} - -\section{Set up your web server} - -Congratulations! You've installed the Mailman software. To get everything -running you need to hook Mailman up to both your web server and your mail -system. - -If you plan on running your mail and web servers on different machines, -sharing Mailman installations via NFS, be sure that the clocks on those two -machines are synchronized closely. You might take a look at the file -\file{Mailman/LockFile.py}; the constant \var{CLOCK_SLOP} helps the locking -mechanism compensate for clock skew in this type of environment. - -This section describes some of the things you need to do to connect Mailman's -web interface to your web server. The instructions here are somewhat geared -toward the Apache web server, so you should consult your web server -documentation for details. - -You must configure your web server to enable CGI script permission in the -\file{\var{\$prefix}/cgi-bin} to run CGI scripts. The line you should add -might look something like the following, with the real absolute directory -substituted for \var{\$prefix}, of course: - -\begin{verbatim} - Exec /mailman/* $prefix/cgi-bin/* -\end{verbatim} -% $ - emacs turd - - or: - -\begin{verbatim} - ScriptAlias /mailman/ $prefix/cgi-bin/ -\end{verbatim} -% $ - emacs turd - -\begin{notice}[warning] -You want to be very sure that the user id under which your CGI scripts run is -\strong{not} in the \code{mailman} group you created above, otherwise private -archives will be accessible to anyone. -\end{notice} - -Copy the Mailman, Python, and GNU logos to a location accessible to your web -server. E.g. with Apache, you've usually got an \file{icons} directory that -you can drop the images into. For example: - -\begin{verbatim} - % cp $prefix/icons/*.{jpg,png} /path/to/apache/icons -\end{verbatim} - -You then want to add a line to your \file{\var{\$prefix}/Mailman/mm_cfg.py} -file which sets the base URL for the logos. For example: - -\begin{verbatim} - IMAGE_LOGOS = '/images/' -\end{verbatim} - -The default value for \var{IMAGE_LOGOS} is \file{/icons/}. Read the comment -in \file{Defaults.py.in} for details. - -Configure your web server to point to the Pipermail public mailing list -archives. For example, in Apache: - -\begin{verbatim} - Alias /pipermail/ $varprefix/archives/public/ -\end{verbatim} -% $ - emacs turd - -where \var{\$varprefix} is usually \var{\$prefix} unless you've used the -\longprogramopt{with-var-prefix} option to \program{configure}. Also be -sure to configure your web server to follow symbolic links in this directory, -otherwise public Pipermail archives won't be accessible. For Apache users, -consult the \var{FollowSymLinks} option. - -If you're going to be supporting internationalized public archives, you will -probably want to turn off any default charset directive for the Pipermail -directory, otherwise your multilingual archive pages won't show up correctly. -Here's an example for Apache, based on the standard installation directories: - -\begin{verbatim} - <Directory "/usr/local/mailman/archives/public/"> - AddDefaultCharset Off - </Directory> -\end{verbatim} - -Now restart your web server. - -\section{Set up your mail server\label{mail-server}} - -This section describes some of the things you need to do to connect Mailman's -email interface to your mail server. The instructions here are different for -each mail server; if your mail server is not described in the following -subsections, try to generalize from the existing documentation, and consider -contributing documentation updates to the Mailman developers. - -\subsection{Using the Postfix mail server} - -Mailman should work pretty much out of the box with a standard Postfix -installation. It has been tested with various Postfix versions up to and -including Postfix 2.1.5. - -In order to support Mailman's optional VERP delivery, you will want to disable -\code{luser_relay} (the default) and you will want to set -\code{recipient_delimiter} for extended address semantics. You should comment -out any \code{luser_relay} value in your \file{main.cf} and just go with the -defaults. Also, add this to your \file{main.cf} file: - -\begin{verbatim} - recipient_delimiter = + -\end{verbatim} - -Using \samp{+} as the delimiter works well with the default values for -\var{VERP_FORMAT} and \var{VERP_REGEXP} in \file{Defaults.py}. - -When attempting to deliver a message to a non-existent local address, Postfix -may return a 450 error code. Since this is a transient error code, Mailman -will continue to attempt to deliver the message for -\var{DELIVERY_RETRY_PERIOD} -- 5 days by default. You might want to set -Postfix up so that it returns permanent error codes for non-existent local -users by adding the following to your \file{main.cf} file: - -\begin{verbatim} - unknown_local_recipient_reject_code = 550 -\end{verbatim} - -Finally, if you are using Postfix-style virtual domains, read the section on -virtual domain support below. - -\subsubsection{Integrating Postfix and Mailman} - -You can integrate Postfix and Mailman such that when new lists are created, or -lists are removed, Postfix's alias database will be automatically updated. -The following are the steps you need to take to make this work. - -In the description below, we assume that you've installed Mailman in the -default location, i.e. \file{/usr/local/mailman}. If that's not the case, -adjust the instructions according to your use of \program{configure}'s -\longprogramopt{prefix} and \longprogramopt{with-var-prefix} options. - -\begin{notice}[note] -If you are using virtual domains and you want Mailman to honor your virtual -domains, read the \ref{postfix-virtual} section below first! -\end{notice} - -\begin{itemize} -\item Add this to the bottom of the \file{\var{\$prefix}/Mailman/mm_cfg.py} - file: - - \begin{verbatim} - MTA = 'Postfix' - \end{verbatim} - - The MTA variable names a module in the \file{Mailman/MTA} directory - which contains the mail server-specific functions to be executed when a - list is created or removed. - -\item Look at the \file{Defaults.py} file for the variables - \var{POSTFIX_ALIAS_CMD} and \var{POSTFIX_MAP_CMD} command. Make sure - these point to your \program{postalias} and \program{postmap} programs - respectively. Remember that if you need to make changes, do it in - \file{mm_cfg.py}. - -\item Run the \program{bin/genaliases} script to initialize your - \file{aliases} file. - - \begin{verbatim} - % cd /usr/local/mailman - % bin/genaliases - \end{verbatim} - - Make sure that the owner of the \file{data/aliases} and - \file{data/aliases.db} file is \code{mailman}, that the group owner - for those files is \code{mailman}, or whatever user and group you used - in the configure command, and that both files are group writable: - - \begin{verbatim} - % su - % chown mailman:mailman data/aliases* - % chmod g+w data/aliases* - \end{verbatim} - -\item Hack your Postfix's \file{main.cf} file to include the following path in - your \var{alias_maps} variable: - - \begin{verbatim} - /usr/local/mailman/data/aliases - \end{verbatim} - - Note that there should be no trailing \code{.db}. Do not include this - in your \var{alias_database} variable. This is because you do not want - Postfix's \program{newaliases} command to modify Mailman's - \file{aliases.db} file, but you do want Postfix to consult - \file{aliases.db} when looking for local addresses. - - You probably want to use a \code{hash:} style database for this entry. - Here's an example: - - \begin{verbatim} - alias_maps = hash:/etc/postfix/aliases, - hash:/usr/local/mailman/data/aliases - \end{verbatim} - -\item When you configure Mailman, use the - \longprogramopt{with-mail-gid=mailman} switch; this will be the default - if you configured Mailman after adding the \code{mailman} owner. - Because the owner of the \file{aliases.db} file is \code{mailman}, - Postfix will execute Mailman's wrapper program as uid and gid - \code{mailman}. - -\end{itemize} - -That's it! One caveat: when you add or remove a list, the \file{aliases.db} -file will updated, but it will not automatically run \program{postfix reload}. -This is because you need to be root to run this and suid-root scripts are not -secure. The only effect of this is that it will take about a minute for -Postfix to notice the change to the \file{aliases.db} file and update its -tables. - -\subsubsection{Virtual domains\label{postfix-virtual}} - -Postfix 2.0 supports ``virtual alias domains'', essentially what used to be -called ``Postfix-style virtual domains'' in earlier Postfix versions. To make -virtual alias domains work with Mailman, you need to do some setup in both -Postfix and Mailman. Mailman will write all virtual alias mappings to a file -called, by default, \file{/usr/local/mailman/data/virtual-mailman}. It will -also use \program{postmap} to create the \program{virtual-mailman.db} file -that Postfix will actually use. - -First, you need to set up the Postfix virtual alias domains as described in -the Postfix documentation (see Postfix's \code{virtual(5)} manpage). Note -that it's your responsibility to include the \code{virtual-alias.domain -anything} line as described manpage; Mailman will not include this line in -\file{virtual-mailman}. You are highly encouraged to make sure your virtual -alias domains are working properly before integrating with Mailman. - -Next, add a path to Postfix's \var{virtual_alias_maps} variable, pointing to -the virtual-mailman file, e.g.: - -\begin{verbatim} - virtual_alias_maps = <your normal virtual alias files>, - hash:/usr/local/mailman/data/virtual-mailman -\end{verbatim} - -assuming you've installed Mailman in the default location. If you're using an -older version of Postfix which doesn't have the \var{virtual_alias_maps} -variable, use the \var{virtual_maps} variable instead. - -Next, in your \file{mm_cfg.py} file, you will want to set the variable -\var{POSTFIX_STYLE_VIRTUAL_DOMAINS} to the list of virtual domains that Mailman -should update. This may not be all of the virtual alias domains that your -Postfix installation supports! The values in this list will be matched -against the \var{host_name} attribute of mailing lists objects, and must be an -exact match. - -Here's an example. Say that Postfix is configured to handle the virtual -domains \code{dom1.ain}, \code{dom2.ain}, and \code{dom3.ain}, and further -that in your \file{main.cf} file you've got the following settings: - -\begin{verbatim} - myhostname = mail.dom1.ain - mydomain = dom1.ain - mydestination = $myhostname, localhost.$mydomain - virtual_alias_maps = - hash:/some/path/to/virtual-dom1, - hash:/some/path/to/virtual-dom2, - hash:/some/path/to/virtual-dom2 -\end{verbatim} - -If in your \file{virtual-dom1} file, you've got the following lines: - -\begin{verbatim} - dom1.ain IGNORE - @dom1.ain @mail.dom1.ain -\end{verbatim} - -this tells Postfix to deliver anything addressed to \code{dom1.ain} to the -same mailbox at \code{mail.dom1.com}, its default destination. - -In this case you would not include \code{dom1.ain} in -\var{POSTFIX_STYLE_VIRTUAL_DOMAINS} because otherwise Mailman will write -entries for mailing lists in the dom1.ain domain as - -\begin{verbatim} - mylist@dom1.ain mylist - mylist-request@dom1.ain mylist-request - # and so on... -\end{verbatim} - -The more specific entries trump your more general entries, thus breaking the -delivery of any \code{dom1.ain} mailing list. - -However, you would include \code{dom2.ain} and \code{dom3.ain} in -\file{mm_cfg.py}: - -\begin{verbatim} - POSTFIX_STYLE_VIRTUAL_DOMAINS = ['dom2.ain', 'dom3.ain'] -\end{verbatim} - -Now, any list that Mailman creates in either of those two domains, will have -the correct entries written to \file{/usr/local/mailman/data/virtual-mailman}. - -As above with the \file{data/aliases*} files, you want to make sure that both -\file{data/virtual-mailman} and \file{data/virtual-mailman.db} are user and -group owned by \code{mailman}. - -\subsubsection{An alternative approach} - -Fil \email{fil@rezo.net} has an alternative approach based on virtual maps and -regular expressions, as described at: - -\begin{itemize} -\item (French) \url{http://listes.rezo.net/comment.php} -\item (English) \url{http://listes.rezo.net/how.php} -\end{itemize} - -This is a good (and simpler) alternative if you don't mind exposing an -additional hostname in the domain part of the addresses people will use to -contact your list. I.e. if people should use \code{mylist@lists.dom.ain} -instead of \code{mylist@dom.ain}. - -\subsection{Using the Exim mail server} - -\begin{notice}[note] -This section is derived from Nigel Metheringham's ``HOWTO - Using Exim and -Mailman together'', which covers Mailman 2.0.x and Exim 3. It has been -updated to cover Mailman 2.1 and Exim 4. The original document is here: -\url{http://www.exim.org/howto/mailman.html}. -\end{notice} - -There is no Mailman configuration needed other than the standard options -detailed in the Mailman install documentation. The Exim configuration is -transparent to Mailman. The user and group settings for Mailman must match -those in the config fragments given below. - -\subsubsection{Exim configuration} - -The Exim configuration is built so that a list created within Mailman -automatically appears to Exim without the need for defining any additional -aliases. - -The drawback of this configuration is that it will work poorly on systems -supporting lists in several different mail domains. While Mailman handles -virtual domains, it does not yet support having two distinct lists with the -same name in different virtual domains, using the same Mailman installation. -This will eventually change. (But see below for a variation on this scheme -that should accommodate virtual domains better.) - -The configuration file excerpts below are for use in an already functional -Exim configuration, which accepts mail for the domain in which the list -resides. If this domain is separate from the others handled by your Exim -configuration, then you'll need to: - -\begin{itemize} -\item add the list domain, ``my.list.domain'' to \var{local_domains} - -\item add a ``domains=my.list.domain'' option to the director (router) for the - list - -\item (optional) exclude that domain from your other directors (routers) -\end{itemize} - -\begin{notice}[note] -The instructions in this document should work with either Exim 3 or Exim 4. -In Exim 3, you must have a \var{local_domains} configuration setting; in Exim -4, you most likely have a \var{local_domains} domainlist. If you don't, you -probably know what you're doing and can adjust accordingly. Similarly, in -Exim 4 the concept of ``directors'' has disappeared -- there are only routers -now. So if you're using Exim 4, whenever this document says ``director'', -read ``router''. -\end{notice} - -Whether you are using Exim 3 or Exim 4, you will need to add some macros to -the main section of your Exim config file. You will also need to define one -new transport. With Exim 3, you'll need to add a new director; with Exim 4, a -new router plays the same role. - -Finally, the configuration supplied here should allow co-habiting Mailman 2.0 -and 2.1 installations, with the proviso that you'll probably want to use -\code{mm21} in place of \code{mailman} -- e.g., \var{MM21_HOME}, -\var{mm21_transport}, etc. - -\subsubsection{Main configuration settings} - -First, you need to add some macros to the top of your Exim config file. These -just make the director (router) and transport below a bit cleaner. Obviously, -you'll need to edit these based on how you configured and installed Mailman. - -\begin{verbatim} - # Home dir for your Mailman installation -- aka Mailman's prefix - # directory. - MAILMAN_HOME=/usr/local/mailman - MAILMAN_WRAP=MAILMAN_HOME/mail/mailman - - # User and group for Mailman, should match your --with-mail-gid - # switch to Mailman's configure script. - MAILMAN_USER=mailman - MAILMAN_GROUP=mailman -\end{verbatim} - -\subsubsection{Transport for Exim 3\label{exim3-transport}} - -Add this to the transports section of your Exim config file, -i.e. somewhere between the first and second ``end'' line: - -\begin{verbatim} - mailman_transport: - driver = pipe - command = MAILMAN_WRAP \ - '${if def:local_part_suffix \ - {${sg{$local_part_suffix}{-(\\w+)(\\+.*)?}{\$1}}} \ - {post}}' \ - $local_part - current_directory = MAILMAN_HOME - home_directory = MAILMAN_HOME - user = MAILMAN_USER - group = MAILMAN_GROUP -\end{verbatim} - -\subsubsection{Director for Exim 3} - -If you're using Exim 3, you'll need to add the following director to your -config file (directors go between the second and third ``end'' lines). Also, -don't forget that order matters -- e.g. you can make Mailman lists take -precedence over system aliases by putting this director in front of your -aliasfile director, or vice-versa. - -\begin{verbatim} - # Handle all addresses related to a list 'foo': the posting address. - # Automatically detects list existence by looking - # for lists/$local_part/config.pck under MAILMAN_HOME. - mailman_director: - driver = smartuser - require_files = MAILMAN_HOME/lists/$local_part/config.pck - suffix_optional - suffix = -bounces : -bounces+* : \ - -confirm+* : -join : -leave : \ - -owner : -request : -admin - transport = mailman_transport -\end{verbatim} - -\subsubsection{Router for Exim 4} - -In Exim 4, there's no such thing as directors -- you need to add a new router -instead. Also, the canonical order of the configuration file was changed so -routers come before transports, so the router for Exim 4 comes first here. -Put this router somewhere after the ``begin routers'' line of your config -file, and remember that order matters. - -\begin{verbatim} - mailman_router: - driver = accept - require_files = MAILMAN_HOME/lists/$local_part/config.pck - local_part_suffix_optional - local_part_suffix = -bounces : -bounces+* : \ - -confirm+* : -join : -leave : \ - -owner : -request : -admin - transport = mailman_transport -\end{verbatim} -% $ - emacs turds - -\subsubsection{Transports for Exim 4} - -The transport for Exim 4 is the same as for Exim 3 (see \ref{exim3-transport}; -just copy the transport given above to somewhere under the ``begin -transports'' line of your Exim config file. - -\subsubsection{Additional notes} - -Exim should be configured to allow reasonable volume -- e.g. don't set -\var{max_recipients} down to a silly value -- and with normal degrees of -security -- specifically, be sure to allow relaying from 127.0.0.1, but pretty -much nothing else. Parallel deliveries and other tweaks can also be used if -you like; experiment with your setup to see what works. Delay warning -messages should be switched off or configured to only happen for non-list -mail, unless you like receiving tons of mail when some random host is down. - -\subsubsection{Problems} - -\begin{itemize} - -\item Mailman will send as many \code{MAIL FROM}/\code{RCPT TO} as it needs. - It may result in more than 10 or 100 messages sent in one connection, - which will exceed the default value of Exim's - \var{smtp_accept_queue_per_connection} value. This is bad because it - will cause Exim to switch into queue mode and severely delay delivery of - your list messages. The way to fix this is to set Mailman's - \var{SMTP_MAX_SESSIONS_PER_CONNECTION} (in - \file{\var{\$prefix}/Mailman/mm_cfg.py}) to a smaller value than Exim's - \var{smtp_accept_queue_per_connection}. - -\item Mailman should ignore Exim delay warning messages, even though Exim - should never send this to list messages. Mailman 2.1's general bounce - detection and VERP support should greatly improve the bounce detector's - hit rates. - -\item List existence is determined by the existence of a \file{config.pck} - file for a list. If you delete lists by foul means, be aware of this. - -\item If you are getting Exim or Mailman complaining about user ids when you - send mail to a list, check that the \var{MAILMAN_USER} and - \var{MAILMAN_GROUP} match those of Mailman itself (i.e. what were used - in the \program{configure} script). Also make sure you do not have - aliases in the main alias file for the list. -\end{itemize} - -\subsubsection{Receiver Verification} - -Exim's receiver verification feature is very useful -- it lets Exim reject -unrouteable addresses at SMTP time. However, this is most useful for -externally-originating mail that is addressed to mail in one of your local -domains. For Mailman list traffic, mail originates on your server, and is -addressed to random external domains that are not under your control. -Furthermore, each message is addressed to many recipients --- up to 500 if you use Mailman's default configuration and don't tweak -\var{SMTP_MAX_RCPTS}. - -Doing receiver verification on Mailman list traffic is a recipe for trouble. -In particular, Exim will attempt to route every recipient addresses in -outgoing Mailman list posts. Even though this requires nothing more than a -few DNS lookups for each address, it can still introduce significant delays. -Therefore, you should disable recipient verification for Mailman traffic. - -Under Exim 3, put this in your main configuration section: - -\begin{verbatim} - receiver_verify_hosts = !127.0.0.1 -\end{verbatim} - -Under Exim 4, this is probably already taken care of for you by the default -recipient verification ACL statement (in the \code{RCPT TO} ACL): - -\begin{verbatim} - accept domains = +local_domains - endpass - message = unknown user - verify = recipient -\end{verbatim} - -which only does recipient verification on addresses in your domain. (That's -not exactly the same as doing recipient verification only on messages coming -from non-127.0.0.1 hosts, but it should do the trick for Mailman.) - -\subsubsection{SMTP Callback} - -Exim's SMTP callback feature is an even more powerful way to detect bogus -sender addresses than normal sender verification. Unfortunately, lots of -servers send bounce messages with a bogus address in the header, and there are -plenty that send bounces with bogus envelope senders (even though they're -supposed to just use an empty envelope sender for bounces). - -In order to ensure that Mailman can disable/remove bouncing addresses, you -generally want to receive bounces for Mailman lists, even if those bounces are -themselves not bounceable. Thus, you might want to disable SMTP callback on -bounce messages. - -With Exim 4, you can accomplish this using something like the following in -your \code{RCPT TO} ACL: - -\begin{verbatim} - # Accept bounces to lists even if callbacks or other checks would fail - warn message = X-WhitelistedRCPT-nohdrfromcallback: Yes - condition = \ - ${if and {{match{$local_part}{(.*)-bounces\+.*}} \ - {exists {MAILMAN_HOME/lists/$1/config.pck}}} \ - {yes}{no}} - {yes}{no}} - - accept condition = \ - ${if and {{match{$local_part}{(.*)-bounces\+.*}} \ - {exists {MAILMAN_HOME/lists/$1/config.pck}}} \ - {yes}{no}} - {yes}{no}} - - # Now, check sender address with SMTP callback. - deny !verify = sender/callout=90s -\end{verbatim} - -If you also do SMTP callbacks on header addresses, you'll want something like -this in your \code{DATA} ACL: - -\begin{verbatim} - deny !condition = $header_X-WhitelistedRCPT-nohdrfromcallback: - !verify = header_sender/callout=90s -\end{verbatim} -% $ - emacs turd - -\subsubsection{Doing VERP with Exim and Mailman} - -VERP will send one email, with a separate envelope sender (return path), for -each of your subscribers -- read the information in -\file{\var{\$prefix}/Mailman/Defaults.py} for the options that start with VERP. -In a nutshell, all you need to do to enable VERP with Exim is to add these lines to \file{\var{\$prefix}/Mailman/mm_cfg.py}: - -\begin{verbatim} - VERP_PASSWORD_REMINDERS = Yes - VERP_PERSONALIZED_DELIVERIES = Yes - VERP_DELIVERY_INTERVAL = Yes - VERP_CONFIRMATIONS = Yes -\end{verbatim} - -(The director (router) above is smart enough to deal with VERP bounces.) - -\subsubsection{Virtual Domains} - -One approach to handling virtual domains is to use a separate Mailman -installation for each virtual domain. Currently, this is the only way to have -lists with the same name in different virtual domains handled by the same -machine. - -In this case, the \var{MAILMAN_HOME} and \var{MAILMAN_WRAP} macros are useless --- you can remove them. Change your director (router) to something like this: - -\begin{verbatim} - require_files = /virtual/${domain}/mailman/lists/${lc:$local_part}/config.pck -\end{verbatim} -% $ - emacs turd - -and change your transport like this: - -\begin{verbatim} - command = /virtual/${domain}/mailman/mail/mailman \ - ${if def:local_part_suffix \ - {${sg{$local_part_suffix}{-(\\w+)(\\+.*)?}{\$1}}} - {post}} \ - $local_part - current_directory = /virtual/${domain}/mailman - home_directory = /virtual/${domain}/mailman -\end{verbatim} -% $ - emacs turd - -\subsubsection{List Verification} - -This is how a set of address tests for the Exim lists look on a working -system. The list in question is \email{quixote-users@mems-exchange.org}, and -these commands were run on the \code{mems-exchange.org} mail server ("\% " -indicates the Unix shell prompt): - -\begin{verbatim} - % exim -bt quixote-users - quixote-users@mems-exchange.org - router = mailman_main_router, transport = mailman_transport - - % exim -bt quixote-users-request - quixote-users-request@mems-exchange.org - router = mailman_router, transport = mailman_transport - - % exim -bt quixote-users-bounces - quixote-users-bounces@mems-exchange.org - router = mailman_router, transport = mailman_transport - - % exim -bt quixote-users-bounces+luser=example.com - quixote-users-bounces+luser=example.com@mems-exchange.org - router = mailman_router, transport = mailman_transport -\end{verbatim} - -If your \program{exim -bt} output looks something like this, that's a start: -at least it means Exim will pass the right messages to the right Mailman -commands. It by no means guarantees that your Exim/Mailman installation is -functioning perfectly, though! - -\subsubsection{Document History} - -Originally written by Nigel Metheringham \email{postmaster@exim.org}. Updated -by Marc Merlin \email{marc_soft@merlins.org} for Mailman 2.1, Exim 4. -Overhauled/reformatted/clarified/simplified by Greg Ward -\email{gward@python.net}. - -\subsection{Using the Sendmail mail server} - -\begin{notice}[warning] -You may be tempted to set the \var{DELIVERY_MODULE} configuration variable in -\file{mm_cfg.py} to \code{'Sendmail'} when using the Sendmail mail server. -\strong{Don't}. The \file{Sendmail.py} module is misnamed -- it's really a -command line based message handoff scheme as opposed to the SMTP scheme used -in \file{SMTPDirect.py} (the default). \file{Sendmail.py} has known security -holes and is provided as a proof-of-concept only\footnote{In fact, in later -versions of Mailman, this module is explicitly sabotaged. You have to know -what you're doing in order to re-enable it.}. If you are having problems -using \file{SMTPDirect.py} fix those instead of using \file{Sendmail.py}, or -you may open your system up to security exploits. -\end{notice} - -\subsubsection{Sendmail ``smrsh'' compatibility} - -Many newer versions of Sendmail come with a restricted execution utility -called ``smrsh'', which limits the executables that Sendmail will allow to be -used as mail programs. You need to explicitly allow Mailman's wrapper program -to be used with smrsh or Mailman will not work. If mail is not getting -delivered to Mailman's wrapper program and you're getting an ``operating -system error'' in your mail syslog, this could be your problem. - -One good way of enabling this is: - -\begin{itemize} - \item Find out where your Sendmail executes its smrsh wrapper - - \begin{verbatim} - % grep smrsh /etc/mail/sendmail.cf - \end{verbatim} - - \item Figure out where smrsh expects symlinks for allowable mail - programs. At the very beginning of the following output you will - see a full path to some directory, e.g. \file{/var/adm/sm.bin} or - similar: - - \begin{verbatim} - % strings $path_to_smrsh | less - \end{verbatim} - - \item cd into \file{/var/adm/sm.bin}, or where ever it happens to reside - on your system -- alternatives include \file{/etc/smrsh}, - \file{/var/smrsh} and \file{/usr/local/smrsh}. - - \begin{verbatim} - % cd /var/adm/sm.bin - \end{verbatim} - - \item Create a symbolic link to Mailman's wrapper program: - - \begin{verbatim} - % ln -s /usr/local/mailman/mail/mailman mailman - \end{verbatim} -\end{itemize} - -\subsubsection{Integrating Sendmail and Mailman} - -David Champion has contributed a recipe for more closely integrating Sendmail -and Mailman, such that Sendmail will automatically recognize and deliver to -new mailing lists as they are created, without having to manually edit alias -tables. - -In the \file{contrib} directory of Mailman's source distribution, you will -find four files: - -\begin{itemize} -\item \file{mm-handler.readme} - an explanation of how to set everything up -\item \file{mm-handler} - the mail delivery agent (MDA) -\item \file{mailman.mc} - a toy configuration file sample -\item \file{virtusertable} - a sample for RFC 2142 address exceptions -\end{itemize} - -\subsubsection{Performance notes} - -One of the surest performance killers for Sendmail users is when Sendmail is -configured to synchronously verify the recipient's host via DNS. If it does -this for messages posted to it from Mailman, you will get horrible -performance. Since Mailman usually connects via \code{localhost} -(i.e. 127.0.0.1) to the SMTP port of Sendmail, you should be sure to configure -Sendmail to \strong{not} do DNS verification synchronously for localhost -connections. - -\subsection{Using the Qmail mail server\label{qmail-issues}} - -There are some issues that users of the qmail mail transport agent have -encountered. None of the core maintainers use qmail, so all of this -information has been contributed by the Mailman user community, especially -Martin Preishuber and Christian Tismer, with notes by Balazs Nagy (BN) and -Norbert Bollow (NB). - -\begin{itemize} -\item You might need to set the mail-gid user to either \code{qmail}, - \code{mailman}, or \code{nofiles} by using the - \longprogramopt{with-mail-gid} \program{configure} option. - - \emph{BN:} it highly depends on your mail storing policy. For example - if you use the simple \file{\~{}alias/.qmail-*} files, you can use - \program{`id -g alias`}. But if you use \file{/var/qmail/users}, the - specified mail gid can be used. - - If you are going to be directing virtual domains directly to the - \code{mailman} user (using ``virtualdomains'' on a list-only domain, for - example), you will have to use \longprogramopt{with-mail-gid}=\var{gid - of mailman user's group}. This is incompatible with having list aliases - in \file{\~{}alias}, unless that alias simply forwards to - \code{mailman-listname*}. - -\item If there is a user \code{mailman} on your system, the alias - \code{mailman-owner} will work only in \file{\~{}mailman}. You have to do - a \program{touch .qmail-owner} in \file{\~{}mailman} directory to create - this alias. - - \emph{NB:} An alternative, IMHO better solution is to \program{chown - root \~{}mailman}, that will stop qmail from considering \code{mailman} to - be a user to whom mail can be delivered. (See ``man 8 qmail-getpw''.) - -\item In a related issue, if you have any users with the same name as one of - your mailing lists, you will have problems if list names contain - \samp{-} in them. Putting \file{.qmail} redirections into the user's - home directory doesn't work because the Mailman wrappers will not get - spawned with the proper GID. The solution is to put the following lines - in the \file{/var/qmail/users/assign} file: - -\begin{verbatim} - +zope-:alias:112:11:/var/qmail/alias:-:zope-: - . -\end{verbatim} - - where in this case the listname is e.g. \code{zope-users}. - - \emph{NB:} Alternatively, you could host the lists on a virtual domain, - and use the \file{/var/qmail/control/virtualdomains} file to put the - \code{mailman} user in charge of this virtual domain. - -\item \emph{BN:}If inbound messages are delivered by another user than - \code{mailman}, it's necessary to allow it to access \file{\~{}mailman}. - Be sure that \file{\~{}mailman} has group writing access and setgid bit is - set. Then put the delivering user to \code{mailman} group, and you can - deny access to \file{\~{}mailman} to others. Be sure that you can do the - same with the WWW service. - - By the way the best thing is to make a virtual mail server to handle all - of the mail. \emph{NB:} E.g. make an additional "A" DNS record for the - virtual mailserver pointing to your IP address, add the line - \code{lists.kva.hu:mailman} to \file{/var/qmail/control/virtualdomains} - and a \code{lists.kva.hu} line to \file{/var/qmail/control/rcpthosts} - file. Don't forget to HUP the qmail-send after modifying - ``virtualdomains''. Then every mail to lists.kva.hu will arrive to - mail.kva.hu's mailman user. - - Then make your aliases: - -\begin{verbatim} - .qmail => mailman@...'s letters - .qmail-owner => mailman-owner's letters -\end{verbatim} - - For list aliases, you can either create them manually: - -\begin{verbatim} - .qmail-list => posts to the 'list' list - .qmail-list-admin => posts to the 'list's owner - .qmail-list-request => requests to 'list' - etc -\end{verbatim} - - or for automatic list alias handling (when using the lists.kva.hu - virtual as above), see \file{contrib/qmail-to-mailman.py} in the Mailman - source distribution. Modify the \file{\~{}mailman/.qmail-default} to - include: - -\begin{verbatim} - |preline /path/to/python /path/to/qmail-to-mailman.py -\end{verbatim} - - and new lists will automatically be picked up. - -\item You have to make sure that the localhost can relay. If you start qmail - via inetd and tcpenv, you need some line the following in your - \file{/etc/hosts.allow} file: - -\begin{verbatim} - tcp-env: 127. 10.205.200. : setenv RELAYCLIENT -\end{verbatim} - - where 10.205.200. is your IP address block. If you use tcpserver, then - you need something like the following in your \file{/etc/tcp.smtp} file: - -\begin{verbatim} - 10.205.200.:allow,RELAYCLIENT="" - 127.:allow,RELAYCLIENT="" -\end{verbatim} - -\item \emph{BN:} Bigger \file{/var/qmail/control/concurrencyremote} values - work better sending outbound messages, within reason. Unless you know - your system can handle it (many if not most cannot) this should not be - set to a value greater than 120. - -\item More information about setting up qmail and relaying can be found in the - qmail documentation. -\end{itemize} - -\emph{BN:} Last but not least, here's a little script to generate aliases to -your lists (if for some reason you can/will not have them automatically picked -up using \file{contrib/qmail-to-mailman.py}): - -This script is for the Mailman 2.0 series: - -\begin{verbatim} -#!/bin/sh -if [ $# = 1 ]; then - i=$1 - echo Making links to $i in the current directory... - echo "|preline /home/mailman/mail/mailman post $i" > .qmail-$i - echo "|preline /home/mailman/mail/mailman mailowner $i" > .qmail-$i-admin - echo "|preline /home/mailman/mail/mailman mailowner $i" > .qmail-$i-owner - echo "|preline /home/mailman/mail/mailman mailowner $i" > .qmail-owner-$i - echo "|preline /home/mailman/mail/mailman mailcmd $i" > .qmail-$i-request -fi -\end{verbatim} -% $ - emacs turd - -\begin{notice}[note] -This is for a new Mailman 2.1 installation. Users upgrading from -Mailman 2.0 would most likely change \file{/usr/local/mailman} to -\file{/home/mailman}. If in doubt, refer to the \longprogramopt{prefix} -option passed to \program{configure} during compile time. -\end{notice} - -\begin{verbatim} -#!/bin/sh -if [ $# = 1 ]; then - i=$1 - echo Making links to $i in the current directory... - echo "|preline /usr/local/mailman/mail/mailman post $i" > .qmail-$i - echo "|preline /usr/local/mailman/mail/mailman admin $i" > .qmail-$i-admin - echo "|preline /usr/local/mailman/mail/mailman bounces $i" > .qmail-$i-bounces - # The following line is for VERP - # echo "|preline /usr/local/mailman/mail/mailman bounces $i" > .qmail-$i-bounces-default - echo "|preline /usr/local/mailman/mail/mailman confirm $i" > .qmail-$i-confirm - echo "|preline /usr/local/mailman/mail/mailman join $i" > .qmail-$i-join - echo "|preline /usr/local/mailman/mail/mailman leave $i" > .qmail-$i-leave - echo "|preline /usr/local/mailman/mail/mailman owner $i" > .qmail-$i-owner - echo "|preline /usr/local/mailman/mail/mailman request $i" > .qmail-$i-request - echo "|preline /usr/local/mailman/mail/mailman subscribe $i" > .qmail-$i-subscribe - echo "|preline /usr/local/mailman/mail/mailman unsubscribe $i" > .qmail-$i-unsubscribe -fi -\end{verbatim} -% $ - emacs turd - -\subsubsection{Information on VERP} - -You will note in the alias generating script for 2.1 above, there is a line -for VERP that has been commented out. If you are interested in VERP there are -two options. The first option is to allow Mailman to do the VERP formatting. -To activate this, uncomment that line and add the following lines to your -\file{mm_cfg.py} file: - -\begin{verbatim} - VERP_FORMAT = '%(bounces)s-+%(mailbox)s=%(host)s' - VERP_REGEXP = r'^(?P<bounces>.*?)-\+(?P<mailbox>[^=]+)=(?P<host>[^@]+)@.*$' -\end{verbatim} -% $ - emacs turd - -The second option is a patch on SourceForge located at: - -\url{http://sourceforge.net/tracker/?func=detail\&atid=300103\&aid=645513\&group_id=103} - -This patch currently needs more testing and might best be suitable for -developers or people well familiar with qmail. Having said that, this patch -is the more qmail-friendly approach resulting in large performance gains. - -\subsubsection{Virtual mail server} - -As mentioned in the \ref{qmail-issues} section for a virtual mail server, a -patch under testing is located at: - -\url{http://sf.net/tracker/index.php?func=detail\&aid=621257\&group_id=103\&atid=300103} - -Again, this patch is for people familiar with their qmail installation. - -\subsubsection{More information} - -You might be interested in some information on modifying footers that Norbert -Bollow has written about Mailman and qmail, available here: - - \url{http://mailman.cis.to/qmail-verh/} - -\section{Review your site defaults\label{customizing}} - -Mailman has a large number of site-wide configuration options which you should -now review and change according to your needs. Some of the options control -how Mailman interacts with your environment, and other options select defaults -for newly created lists\footnote{In general, changing the list defaults -described in this section will not affect any already created lists. To make -changes after a list has been created, use the web interface or the command -line scripts, such as \program{bin/withlist} and \program{bin/config_list}.}. -There are system tuning parameters and integration options. - -The full set of site-wide defaults lives in the -\file{\var{\$prefix}/Mailman/Defaults.py} file, however you should -\strong{never} modify this file! Instead, change the \file{mm_cfg.py} file in -that same directory. You only need to add values to \file{mm_cfg.py} that are -different than the defaults in \file{Defaults.py}, and future Mailman upgrades -are guaranteed never to touch your \file{mm_cfg.py} file. - -The \file{Defaults.py} file is documented extensively, so the options are not -described here. The \file{Defaults.py} and \file{mm_cfg.py} are both -\ulink{Python}{http://www.python.org} files so valid Python syntax must be -maintained or your Mailman installation will break. - -\begin{notice}[note] -Do \strong{not} change the \var{HOME_DIR} or \var{MAILMAN_DIR} variables. -These are set automatically by the \program{configure} script, and you will -break your Mailman installation by if you change these. -\end{notice} - -You should make any changes to \file{mm_cfg.py} using the account you -installed Mailman under in the \ref{building} section. - -\section{Create a site-wide mailing list} - -After you have completed the integration of Mailman and your mail server, you -need to create a ``site-wide'' mailing list. This is the one that password -reminders will appear to come from, and it is required for proper Mailman -operation. Usually this should be a list called \code{mailman}, but if you -need to change this, be sure to change the \var{MAILMAN_SITE_LIST} variable in -\file{mm_cfg.py}. You can create the site list with this command, following -the prompts: - -\begin{verbatim} - % bin/newlist mailman -\end{verbatim} - -Now configure your site list. There is a convenient template for a generic -site list in the installation directory, under \file{data/sitelist.cfg} which -can help you with this. You should review the configuration options in the -template, but note that any options not named in the \file{sitelist.cfg} file -won't be changed. - -The template can be applied to your site list by -running: - -\begin{verbatim} - % bin/config_list -i data/sitelist.cfg mailman -\end{verbatim} - -After applying the \file{sitelist.cfg} options, be sure you review the -site list's configuration via the admin pages. - -You should also subscribe yourself to the site list. - -\section{Set up cron} - -Several Mailman features occur on a regular schedule, so you must set up -\program{cron} to run the right programs at the right time\footnote{Note that -if you're upgrading from a previous version of Mailman, you'll want to install -the new crontab, but be careful if you're running multiple Mailman -installations on your site! Changing the crontab could mess with other -parallel Mailman installations.}. - -If your version of crontab supports the \programopt{-u} option, you must be -root to do this next step. Add \file{\var{\$prefix}/cron/crontab.in} as a -crontab entry by executing these commands: - -\begin{verbatim} - % cd $prefix/cron - % crontab -u mailman crontab.in -\end{verbatim} - -If you used the \longprogramopt{with-username} option, use that user name -instead of \code{mailman} for the \programopt{-u} argument value. If your -crontab does not support the \programopt{-u} option, try these commands: - -\begin{verbatim} - % cd $prefix/cron - % su - mailman - % crontab crontab.in -\end{verbatim} - -\section{Start the Mailman qrunner} - -Mailman depends on a process called the ``qrunner'' to delivery all -email messages it sees. You must start the qrunner by executing the following -command from the \var{\$prefix} directory: - -\begin{verbatim} - % bin/mailmanctl start -\end{verbatim} - -You probably want to start Mailman every time you reboot your system. Exactly -how to do this depends on your operating system. If your OS supports the -\program{chkconfig} command (e.g. RedHat and Mandrake Linuxes) you can -do the following (as root, from the Mailman install directory): - -\begin{verbatim} - % cp scripts/mailman /etc/init.d/mailman - % chkconfig --add mailman -\end{verbatim} - -Note that \file{/etc/init.d} may be \file{/etc/rc.d/init.d} on some systems. - -On Gentoo Linux, you can do the following: - -\begin{verbatim} - % cp scripts/mailman /etc/init.d/mailman - % rc-update add mailman default -\end{verbatim} - -On Debian, you probably want to use: - -\begin{verbatim} - % update-rc.d mailman defaults -\end{verbatim} - -For \UNIX{}es that don't support \program{chkconfig}, you might try the -following set of commands: - -\begin{verbatim} - % cp scripts/mailman /etc/init.d/mailman - % cp misc/mailman /etc/init.d - % cd /etc/rc.d/rc0.d - % ln -s ../init.d/mailman K12mailman - % cd ../rc1.d - % ln -s ../init.d/mailman K12mailman - % cd ../rc2.d - % ln -s ../init.d/mailman S98mailman - % cd ../rc3.d - % ln -s ../init.d/mailman S98mailman - % cd ../rc4.d - % ln -s ../init.d/mailman S98mailman - % cd ../rc5.d - % ln -s ../init.d/mailman S98mailman - % cd ../rc6.d - % ln -s ../init.d/mailman K12mailman -\end{verbatim} - -\section{Check the hostname settings} - -You should check the values for \var{DEFAULT_EMAIL_HOST} and -\var{DEFAULT_URL_HOST} in \file{Defaults.py}. Make any necessary changes in -the \file{mm_cfg.py} file, \strong{not} in the \file{Defaults.py} file. If you -change either of these two values, you'll want to add the following afterwards -in the \file{mm_cfg.py} file: - -\begin{verbatim} - add_virtualhost(DEFAULT_URL_HOST, DEFAULT_EMAIL_HOST) -\end{verbatim} - -You will want to run the \program{bin/fix_url.py} to change the domain of any -existing lists. - -\section{Create the site password} - -There are two site-wide passwords that you can create from the command line, -using the \program{bin/mmsitepass} script. The first is the ``site password'' -which can be used anywhere a password is required in the system. The site -password will get you into the administration page for any list, and it can be -used to log in as any user. Think \code{root} for a Unix system, so pick this -password wisely! - -The second password is a site-wide ``list creator'' password. You can use -this to delegate the ability to create new mailing lists without providing all -the privileges of the site password. Of course, the owner of the site -password can also create new mailing lists, but the list creator password is -limited to just that special role. - -To set the site password, use this command: - -\begin{verbatim} - % $prefix/bin/mmsitepass <your-site-password> -\end{verbatim} - -To set the list creator password, use this command: - -\begin{verbatim} - % $prefix/bin/mmsitepass -c <list-creator-password> -\end{verbatim} - -It is okay not to set a list creator password, but you probably do want a site -password. - -\section{Create your first mailing list} - -For more detailed information about using Mailman, including creating and -configuring mailing lists, see the Mailman List Adminstration Manual. These -instructions provide a quick guide to creating your first mailing list via the -web interface: - -\begin{itemize} -\item Start by visiting the url \code{http://my.dom.ain/mailman/create}. - -\item Fill out the form as described in the on-screen instructions, and in the - ``List creator's password'' field, type the password you entered in - section \ref{customizing}. Type your own email address for the - ``Initial list owner address'', and select ``Yes'' to notify the list - administrator. - -\item Click on the ``Create List'' button. - -\item Check your email for a message from Mailman informing you that your new - mailing list was created. - -\item Now visit the list's administration page, either by following the link - on the confirmation web page or clicking on the link from the email - Mailman just sent you. Typically the url will be something like - \code{http://my.dom.ain/mailman/admin/mylist}. - -\item Type in the list's password and click on ``Let me in...'' - -\item Click on ``Membership Management'' and then on ``Mass Subscription''. - -\item Enter your email address in the big text field, and click on ``Submit - Your Changes''. - -\item Now go to your email and send a message to \code{mylist@my.dom.ain}. - Within a minute or two you should see your message reflected back to you - via Mailman. -\end{itemize} - -Congratulations! You've just set up and tested your first Mailman mailing -list. If you had any problems along the way, please see the -\ref{troubleshooting} section. - -\section{Troubleshooting\label{troubleshooting}} - -If you encounter problems with running Mailman, first check the question and -answer section below. If your problem is not covered there, check the -\ulink{online help}{http://www.list.org/help.html}, including the -\ulink{FAQ}{http://www.list.org/faq.html} and the -\ulink{interactive FAQ wizard}{http://www.python.org/cgi-bin/faqw-mm.py}. - -Also check for errors in your syslog files, your mail and web server log files -and in Mailman's \file{\var{\$prefix}/logs/error} file. If you're still -having problems, you should send a message to the -\email{mailman-users@python.org} mailing list\footnote{You must subscribe to -this mailing list in order to post to it, but the mailing list's archives are -publicly visible.}; see -\url{http://mail.python.org/mailman/listinfo/mailman-users} for more -information. - -Be sure to including information on your operating system, which version of -Python you're using, and which version of Mailman you're installing. - -Here is a list of some common questions and answers: - -\begin{itemize} - -\item \strong{Problem:} All Mailman web pages give a 404 File not found - error. - - \strong{Solution:} Your web server has not been set up properly for - handling Mailman's CGI programs. Make sure you have: - - \begin{enumerate} - \item configured the web server to give permissions to - \file{\var{\$prefix}/cgi-bin} - - \item restarted the web server properly. - \end{enumerate} - - Consult your web server's documentation for instructions on how to do - check these issues. - -\item \strong{Problem:} All Mailman web pages give an "Internal Server - Error". - - \strong{Solution:} The likely problem is that you are using the wrong - user or group for the CGI scripts. Check your web server's log files. - If you see a line like - - \begin{verbatim} - Attempt to exec script with invalid gid 51, expected 99 - \end{verbatim} - - you will need to reinstall Mailman, specifying the proper CGI group id, - as described in the \label{building} section. - -\item \strong{Problem:} I send mail to the list, and get back mail saying the - list is not found! - - \strong{Solution:} You probably didn't add the necessary aliases to the - system alias database, or you didn't properly integrate Mailman with - your mail server. Perhaps you didn't update the alias database, or your - system requires you to run \program{newaliases} explicitly. Refer to - your server specific instructions in the \ref{mail-server} section. - -\item \strong{Problem:} I send mail to the list, and get back mail saying, - ``unknown mailer error''. - - \strong{Solution:} The likely problem is that you are using the wrong - user or group id for the mail wrappers. Check your mail server's log - files; if you see a line like - - \begin{verbatim} - Attempt to exec script with invalid gid 51, expected 99 - \end{verbatim} - - you will need to reinstall Mailman, specifying the proper mail group id - as described in the \label{building} section. - -\item \strong{Problem:} I use Postfix as my mail server and the mail wrapper - programs are logging complaints about the wrong GID. - - \strong{Solution:} Make sure the \file{\var{\$prefix}/data/aliases.db} - file is user owned by \code{mailman} (or whatever user name you used - in the \program{configure} command). If this file is not user owned by - \code{mailman}, Postfix will not run the mail programs as the correct - user. - -\item \strong{Problem:} I use Sendmail as my mail server, and when I send mail - to the list, I get back mail saying, ``sh: mailman not available for - sendmail programs''. - - \strong{Solution:} Your system uses the Sendmail restricted shell - (smrsh). You need to configure smrsh by creating a symbolic link from - the mail wrapper (\file{\var{\$prefix}/mail/mailman}) to the directory - identifying executables allowed to run under smrsh. - - Some common names for this directory are \file{/var/admin/sm.bin}, - \file{/usr/admin/sm.bin} or \file{/etc/smrsh}. - - Note that on Debian Linux, the system makes \file{/usr/lib/sm.bin}, - which is wrong, you will need to create the directory - \file{/usr/admin/sm.bin} and add the link there. Note further any - aliases \program{newaliases} spits out will need to be adjusted to point - to the secure link to the wrapper. - -\item \strong{Problem:} I messed up when I called \program{configure}. How - do I clean things up and re-install? - - \strong{Solution:} - - \begin{verbatim} - % make clean - % ./configure --with-the-right-options - % make install - \end{verbatim} - -\end{itemize} - -\section{Platform and operating system notes} - -Generally, Mailman runs on any POSIX-based system, such as Solaris, the -various BSD variants, Linux systems, MacOSX, and other generic \UNIX{} -systems. It doesn't run on Windows. For the most part, the generic -instructions given in this document should be sufficient to get Mailman -working on any supported platform. Some operating systems have additional -recommended installation or configuration instructions. - -\subsection{GNU/Linux issues} - -Linux seems to be the most popular platform for running Mailman. Here are -some hints on getting Mailman to run on Linux: - -\begin{itemize} -\item If you are getting errors with hard link creations and/or you are using - a special secure kernel (securelinux/openwall/grsecurity), see the file - \file{contrib/README.check_perms_grsecurity} in the Mailman source - distribution. - - Note that if you are using Linux Mandrake in secure mode, you are - probably concerned by this. - -\item Apparently Mandrake 9.0 changed the permissions on gcc, so if you build - as the \code{mailman} user, you need to be sure \code{mailman} is in the - \code{cctools} group. - -\item If you installed Python from your Linux distribution's package manager - (e.g. .rpms for Redhat-derived systems or .deb for Debian), you must - install the ``development'' package of Python, or you may not get - everything you need. - - For example, using Python 2.2 on Debian, you will need to install the - \code{python2.2-dev} package. On Redhat, you probably need the - \code{python2-devel} package. - - If you install Python from source, you should be fine. - - One symptom of this problem, although for unknown reasons, is that you - might get an error such as this during your install: - - \begin{verbatim} - Traceback (most recent call last): - File "bin/update", line 44, in ? - import paths - ImportError: No module named paths - make: *** [update] Error 1 - \end{verbatim} - - If this happens, install the Python development package and try - \program{configure} and \program{make install} again. Or install the - latest version of Python from source, available from - \url{http://www.python.org}. - - This problem can manifest itself in other Linux distributions in - different ways, although usually it appears as \code{ImportErrors}. -\end{itemize} - -\subsection{BSD issues\label{bsd-issues}} - -Vivek Khera writes that some BSDs do nightly security scans for setuid file -changes. setgid directories also come up on the scan when they change. Also, -the setgid bit is not necessary on BSD systems because group ownership is -automatically inherited on files created in directories. On other \UNIX{}es, -this only happens when the directory has the setgid bit turned on. - -To install without turning on the setgid bit on directories, simply pass in -the \var{DIRSETGID} variable to \program{make}, after you've run -\program{configure}: - -\begin{verbatim} - % make DIRSETGID=: install -\end{verbatim} - -This disables the \program{chmod g+s} command on installed directories. - -\subsection{MacOSX issues} - -Many people run Mailman on MacOSX. Here are some pointers that have been -collected on getting Mailman to run on MacOSX. - -\begin{itemize} -\item Jaguar (MacOSX 10.2) comes with Python 2.2. While this isn't the very - latest stable version of Python, it ought to be sufficient to run - Mailman 2.1. - -\item David B. O'Donnell has a web page describing his configuration of - Mailman 2.0.13 and Postfix on MacOSX Server. - - \url{http://www.afp548.com/Articles/mail/python-mailman.html} - -\item Kathleen Webb posted her experiences in getting Mailman running on - Jaguar using Sendmail. - - \url{http://mail.python.org/pipermail/mailman-users/2002-October/022944.html} - -\item Panther server (MacOSX 10.3) comes with Mailman; Your operating system - should contain documentation that will help you, and Apple has a tech - document about a problem you might encounter running Mailman on Mac OS X - Server 10.3: - - \url{http://docs.info.apple.com/article.html?artnum=107889} -\end{itemize} - -Terry Allen provides the following detailed instructions on running Mailman on -the 'client' version of OSX, or in earlier versions of OSX: - -Mac OSX 10.3 and onwards has the basics for a successful Mailman installation. -Users of earlier versions of Mac OSX contains Sendmail and those users should -look at the Sendmail installation section for tips. You should follow the -basic installation steps as described earlier in this manual, substituting as -appropriate, the steps outlined in this section. - -By default, Mac OSX 10.3 'client' version does not have a fully functional -version of Postfix. Setting up a working MTA such as Postfix is beyond the -scope of this guide and you should refer to \url{http://www.postfix.org} for -tips on getting Postfix running. An easy way to set Postfix up is to install -and run Postfix Enabler, a stand-alone tool for configuring Postfix on Mac -OSX, available from -\url{http://www.roadstead.com/weblog/Tutorials/PostfixEnabler.html}. - -Likewise, Mac OSX 'client' version from 10.1 onwards includes a working Apache -webserver. This is switched on using the System Preferences control panel -under the 'Sharing tab'. A useful tool for configuring the Apache on Mac OSX -is Webmin, which can be obtained from -\url{http://www.webmin.com}. - -Webmin can also perform configuration for other system tasks, including -Postfix, adding jobs to your crontab, adding user and groups, plus adding -startup and shutdown jobs. - -In a stock installation of OSX, the requirement for Mailman is to have Python -installed. Python is not installed by default, so it is advised that you -install the developer's tools package, which may have been provided with your -system. It can also be downloaded from the Apple developer site at -\url{http://connect.apple.com}. Not only is the developer tools package an -essential requirement for installing Mailman, but it will come in handy at a -later date should you need other tools. The developer's tools are also know -by the name XCode tools. - -As a minimum, the Python version should be 2.2, but 2.3 is recommended. - -If you wish to add a user and group using the command line in OSX instead of -via Webmin or another GUI interface, open your terminal application and follow -the commands as indicated below - do not type the comments following the -\samp{\#} since they are just notes: - -\begin{verbatim} -sudo tcsh -niutil -create / /users/mailman -niutil -createprop / /users/mailman name mailman -# Note that xxx is a free user ID number on your system -niutil -createprop / /users/mailman uid xxx -niutil -createprop / /users/mailman home /usr/local/mailman -mkdir -p /usr/local/mailman -niutil -createprop / /users/mailman shell /bin/tcsh -passwd mailman -# To prevent malicious hacking, supply a secure password here -niutil -create / /groups/mailman -niutil -createprop / /groups/mailman name mailman -# Note that xxx is a free group ID number on your system -niutil -createprop / /groups/mailman gid xxx -niutil -createprop / /groups/mailman passwd '*' -niutil -createprop / /groups/mailman users 'mailman' -chown mailman:mailman /usr/local/mailman -cd /usr/local/mailman -chmod a+rx,g+ws . -exit -su mailman -\end{verbatim} - -For setting up Apache on OSX to handle Mailman, the steps are almost identical -and the configuration file on a stock Mac OSX Client version is stored in the -nearly standard location of \file{/etc/httpd/httpd.conf}. - -The \ulink{AFP548.com}{http://www.afp548.com} site has a time-saving automated startup item creator for -Mailman, which can be found at -\url{http://www.afp548.com/Software/MailmanStartup.tar.gz} - -To install it, copy it into your \file{/Library/StartupItems} directory. As -the root or superuser, from the terminal, enter the following: - -\begin{verbatim} -gunzip MailmanStartup.tar.gz -tar xvf MailmanStartup.tar -\end{verbatim} - -It will create the startup item for you so that when you reboot, Mailman will -start up. - -\end{document} |