Mailing-List Managers
Running mailing lists within Postfix is fine for static lists. But lists that change frequently are better handled by a mailing-list manager (MLM). With an MLM, the administrator of the list doesn't have to manually edit the list file to add, delete, or change addresses because list members can subscribe and unsubscribe themselves. MLMs also support other features such as archiving of messages, digests of discussions, and the ability to moderate a list by allowing an administrator to review messages before they are posted to all members.
MLMs work by pointing normal Postfix aliases to commands that handle the distribution of messages and management of lists. MLMs use administrative aliases that point to programs to handle list functions such as subscribing and unsubscribing members from the list, handling bounced messages, and possibly filtering messages sent to the list. The lists themselves actually work the same way as the simple aliases from the last section. Each list has its own file to store list members, but rather than editing the file yourself, you can have the MLM automatically add and remove addresses.
The next two sections look at two popular MLMs: Majordomo and Mailman.
10.2.1 Majordomo
Majordomo is one of the more popular MLMs and has been available since the early 1990's. It offers a complete set of MLM features, and nearly all administration takes place by sending commands through email messages. Little to no intervention is required by a postmaster once a list has been created. There are also web-based administration packages available to work with Majordomo, allowing much of the list administration to take place from a web site.
Majordomo is available at the Majordomo home page (http://www.greatcircle.com/majordomo/.) It requires Perl and works with Perl4 Version 4.036 or Perl5 Version 5.002 or better. Future releases will probably require Perl5. Majordomo also makes use of a small wrapper program written in C. If you are planning to build the package from scratch, you must have an ANSI C compiler.
If you configure Majordomo for moderated lists, where a list administrator approves posts using the Majordomo-supplied approve, you have to make an adjustment for Postfix and Majordomo to work together correctly. Postfix prepends a Delivered-To: header to messages it handles. It then uses the header to detect mailer loops. When a Majordomo message is delivered to a moderator for approval who then pipes the message through the approve command, it is sent back to the list with all of its original headers intact. When Postfix receives the message again, it recognizes that it has already seen the message and reports a mail delivery loop.
The easiest way to fix this issue is to make a small change to the Majordomo approve script (which is written in Perl). You'll have to edit the file, normally located in the /bin directory located below the main Majordomo installation directory. If you follow the steps in the procedure below, your file will be located at /usr/local/majordomo/bin/approve. Edit the file and find the subroutine called process_bounce. Within that routine, there is a while loop, as shown below. Insert the emphasized line as shown, save the file, and you're done:
while (<$FILE>) { if (/^>?From / && ! defined($from_skipped)) { # Skip any initial "From " or ">From " line $from_skipped = 1; next; } next if ( /^delivered-to:/i ); # Added for Postfix s/^~/~~/; print MAIL $_; }
10.2.1.1 Creating a Majordomo list
The following steps walk you through setting up the astronomy list alias using Majordomo and Postfix. These instructions assume that you will create a user called majordom and install the package at /usr/local/majordomo. If you create a different username or install to a different location, keep that in mind as you read through this example.
- Make sure that you have Perl installed on your system and that it is at least Version 5.002 or better. You can check your Perl installation by typing perl -v at a command prompt. This will display license and other information about your installation of Perl, including the version number:
$ perl -v This is perl, version 5.005_03 built for i386-freebsd Copyright 1987-1999, Larry Wall ...
- Obtain a copy of Majordomo either in source form from the Majordomo home page or find a prepackaged version from your normal software sources. Follow the instructions that come with your bundle to install Majordomo on your system. If you are installing from source, you will need an ANSI C compiler to build it.
If you build Majordomo yourself, when you modify the Makefile and majordomo.cf file, you should be able to follow the instructions as if you were installing Majordomo to work with Sendmail as the MTA. If the location for $sendmail_command in majordomo.cf is correct, the rest of the mailer variables with the default options will be correct.
- Create and edit a file called /usr/local/majordomo/aliases to store the Majordomo aliases. Add the aliases for the Majordomo commands as specified in the Majordomo instructions. Then add the aliases for your list. The file should look like the following:
majordomo: "| /usr/local/majordomo/wrapper majordomo" owner-majordomo: kdent@example.com majordomo-owner: kdent@example.com # astronomy list astronomy: :include:/usr/local/majordomo/lists/astronomy owner-astronomy: csagan@example.com astronomy-request: "|/usr/local/majordomo/wrapper request-answer astronomy" astronomy-approval: csagan@example.com
- Edit /etc/postfix/main.cf to add the Majordomo alias file to the alias_maps parameter:
alias_maps = hash:/etc/aliases, hash:/usr/local/majordomo/aliases
- You can also add the new alias file to the alias_database parameter to automatically rebuild the datafile when you run the newaliases command:
alias_database = hash:/etc/aliases, hash:/usr/local/majordomo/aliases
- Reload Postfix so that it recognizes the changes in its main.cf configuration file:
# postfix reload
- Create the file to hold the email addresses for the astronomy list. Set its ownership to the majordom account:
# touch /usr/local/majordomo/lists/astronomy # chown majordom /usr/local/majordomo/lists/astronomy
- Create the info file that contains the message sent to new members of the list and anyone who sends the info command. Create the file as /usr/local/majordomo/lists/astronomy.info and include any text that is appropriate for your list:
Welcome to the astronomy discussion list at example.com. The purpose of this list is to discuss new astronomical phenomena. To send a message to all the members of the list, address your email to . The basic rules and etiquette for the list are as follows: 1. ...
- Make sure that the info file is accessible by the majordom account:
# chown majordom /usr/local/majordomo/lists/astronomy.info
- Build the alias database:
# postalias /usr/local/majordomo/aliases
Or, if you added the Majordomo alias file to alias_database, just type newaliases.
You can test your Majordomo installation by running the following command:
$ echo 'lists' | mail majordomo
Executing the above sends an email message to Majordomo containing the command 'lists', telling Majordomo to send you information about all of the lists it maintains. On our example system, the reply from Majordomo looks like the following:
Date: Tue, 16 Jul 2002 18:14:59 -0400 (EDT) From: Majordomo@example.com To: kdent@example.com Subject: Majordomo results -- >>>> lists Majordomo@example.com serves the following lists: astronomy Use the 'info ' command to get more information about a specific list. >>>> >>>>
You or your users can now send Majordomo commands at the address majordomo@example.com to get help and be added to lists. To add yourself to the new mailing list, send a message to majordomo with the subscribe command in the body of the message:
To: majordomo@example.com From: tbrahe@porcupine.org Subject: subscribe astronomy
If you send a subscription request, you should receive a confirmation message from Majordomo. You must reply to the message with the authentication code provided to complete your subscription to the list (see the Majordomo documentation).
10.2.1.2 Potential problems
If you had no problems during the Majordomo installation, everything should work as expected. The main issue that you may run into has to do with file permissions. If you send a message to the list and receive a bounce notification like the following, then you know you have a permissions problem:
... The Postfix program : cannot open include file /usr/local/majordomo/lists/astronomy: Permission denied ...
Majordomo needs read access to the list file (/usr/local/majordomo/astronomy) and the list configuration file (/usr/local/majordomo/astronomy.config) when Postfix invokes it for deliveries to the list. Postfix delivers the message to Majordomo running with the privileges of the user that owns the alias map file containing the majordomo alias, /usr/local/majordomo/aliases.db. The normal mechanism used to ensure that Majordomo has access to the necessary files is to set the Majordomo wrapper program to set user ID (suid) with root as the owner. This means that regardless of the user executing the command, the process runs with root privileges. The Majordomo installation takes care of setting the permissions properly, but if for some reason they are not correct, you will see an error message like the one described above. You can correct the problem by setting the permissions yourself:
# chmod 4755 /usr/local/majordomo/wrapper
A better solution than setting the wrapper program suid is to make sure that the alias file and all of the list files are owned by the majordom user.
10.2.2 Mailman
Mailman is another full-featured MLM. It is available at the Mailman home page at http://www.gnu.org/software/mailman/. It includes web-based administration and creates a home page for each list where list administrators and members can perform administrative functions. It also accepts administrative commands via email much like Majordomo does.
Mailman requires at least Version 1.5.2 of Python. It includes some security wrapper programs that are written in C, so you must have an ANSI C compiler if you are planning to build the package from scratch.
There is one slightly tricky aspect to get Postfix and Mailman working together correctly. Mailman expects to be invoked by a process running with a particular group ID (GID). The GID it expects is specified at the time the Mailman package is built. If you are building the package yourself, make sure that you first create an account and a group called mailman. You should be able to use the normal administrative tools on your system to create both the account and the group. When you are finished, you should have an entry in /etc/passwd that resembles the following:
mailman:*:26413:60003:Mailman List Manager:/home/mailman:/bin/sh
and an entry in /etc/group like the following:
mailman:*:60003:
Make sure that the account mailman has the group mailman as its primary group. In the examples above, 60003 specifies the mailman group and the mailman account has that as its primary group.
When you run configure for Mailman, be sure that you include the option --with-mail-gid=xxx, where xxx is the actual GID for the mailman group that you created. According to the examples above, you should execute configure using 60003 for the GID option:
$ ./configure --with-mail-gid=60003
You may have additional options for configure according to your environment. Be sure to read the Mailman documentation for building the package. If you have already built your Mailman package and you did not specify the group, build it again. If you didn't build your Mailman package, see the sidebar below.
10.2.2.1 Creating a Mailman list
The following steps walk you through setting up the astronomy list alias using Mailman and Postfix. They assume that you create an account and a group called mailman and install the package in /home/mailman.
- Make sure that you have Python installed on your system and that you have at least Version 1.5.2. Test this by executing the python command, which will display version information and a Python prompt. You can exit the Python shell by typing Ctrl-D:
$ python Python 1.5.2 (#1, Jul 5 2001, 03:02:19) [GCC... Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam >>> ^D $
If the version number following "Python" on the first line of output is not at least 1.5.2, you will have to upgrade your copy of Python.
- Obtain a copy of Mailman either in source form from the Mailman home page or find a prepackaged version from your normal software sources. Follow the instructions that come with your bundle to install Mailman on your system. If you are installing from source, you will need an ANSI C compiler to build it. Be sure to specify the correct GID when you build Mailman. (See the discussion earlier in this chapter.)
- You should create a separate alias file to store all of your Mailman aliases and set the owner and group correctly. Become the mailman user and execute the following commands. This example assumes that you want the alias file in the mailman home directory located at /home/mailman:
$ cd /home/mailman $ touch aliases $ postalias aliases
These commands create both the alias file and the necessary map files that Postfix uses for lookups. Since you perform these steps as the mailman user, the group and ownership of the files will automatically be correct, assuming your account is set up as it should be.
- Edit /etc/postfix/main.cf to add the new alias file for storing Mailman mailing lists. Simply add the Mailman alias file to the existing list of files for the alias_maps parameter:
alias_maps = hash:/etc/aliases, hash:/home/mailman/aliases
- You can also add the new alias file to the alias_database parameter to automatically rebuild the datafile when you run the newaliases command:
alias_database = hash:/etc/aliases, hash:/home/mailman/aliases
- Reload Postfix so that it recognizes the changes in its main.cf configuration file:
# postfix reload
- Execute the Mailman command newlist to initialize your new mailing list. The output of newlist includes lines of text that must be inserted into the /home/mailman/aliases file. Copy the lines from the newlist output into /home/mailman/aliases. Save and exit the file. The emphasized lines in Example 10-4 are the lines that must be added to /home/mailman/aliases.
- Build the new alias datafile:
# postalias /home/mailman/aliases
Or, if you added the Mailman alias file to alias_database, just run the newaliases command.
Example 10-4. Executing the Mailman newlist command
# bin/newlist Enter the name of the list: astronomy Enter the email of the person running the list: kdent@example.com Initial astronomy password: Entry for aliases file: ## astronomy mailing list ## created: 08-Mar-2002 root astronomy: "|/home/mailman/mail/wrapper post astronomy" astronomy-admin: "|/home/mailman/mail/wrapper mailowner astronomy" astronomy-request: "|/home/mailman/mail/wrapper mailcmd astronomy" astronomy-owner: astronomy-admin Hit enter to continue with astronomy owner notification...
You or your users can now send requests to astronomy-request@example.com to get help and be added to the list. You can now use Mailman's web- or email-based command interface to specify options for your new list. See the Mailman documentation to learn its options and other ways to work with the package.