How to set up Mailman on Debian Jessie using Apache, Postfix and SpamAssassin in a virtualhost

In this post, I describe how to install and configure mailman for a virtual host on a Debian Jessie server using Apache, Postfix and SpamAssassin. Instructions on how to do this are in various places on the internet, but I didn’t find anywhere that collected all the different pieces together. These instructions should also work for Ubuntu.

Prerequisites

Before starting, you’ll need to install Apache, Postfix and SpamAssassin. As this post is focused on Mailman I won’t talk about how to set up Apache, Postfix or SpamAssassin, as there are already plenty of good guides out there explaining how to configure them. I’ll only mention the changes required to their configuration for them to work with Mailman. Throughout this guide, I'll assume that you’re setting up Mailman on the domain example.com.

Install Mailman

Once Apache, Postfix and SpamAssassin are all set up and working, install Mailman with apt-get install mailman.

Configure Apache

Next, edit the Apache config for your site. In the <VirtualHost> section belonging to example.com, add the following lines:
# We can find mailman here:
ScriptAlias /cgi-bin/mailman/ /usr/lib/cgi-bin/mailman/
# And the public archives:
Alias /pipermail/ /var/lib/mailman/archives/public/
# Logos:
Alias /images/mailman/ /usr/share/images/mailman/
<Directory /usr/lib/cgi-bin/mailman/>
	AllowOverride None
	Options ExecCGI
	AddHandler cgi-script .cgi
	Order allow,deny
	Allow from all
</Directory>
<Directory /var/lib/mailman/archives/public/>
	Options FollowSymlinks
	AllowOverride None
	Order allow,deny
	Allow from all
</Directory>
<Directory /usr/share/images/mailman/>
	AllowOverride None
	Order allow,deny
	Allow from all
</Directory>
Check that the new Apache config is valid using apache2ctl configtest. Assuming there are no errors, you can then tell Apache to pick up the new config with service apache2 reload.

Configure Mailman

Now create the default mailman mailing list. This is required before you can set up your own lists. The command is newlist --urlhost=example.com --emailhost=example.com mailman. Replace both instances of example.com with your domain name. Next, edit the Mailman config to tell it to use Postfix and SpamAssassin. Open /etc/mailman/mm_cfg.py and add the following lines:
MTA='Postfix'
SPAMD_HOST    = 'localhost'
DISCARD_SCORE = 8
HOLD_SCORE    = 4
MEMBER_BONUS  = 0
POSTFIX_STYLE_VIRTUAL_DOMAINS = ['example.com']
You can adjust the DISCARD_SCORE, HOLD_SCORE and MEMBER_BONUS as you prefer. Once that’s done, run service mailman restart. Then generate the mail aliases files with the command /usr/lib/mailman/bin/genaliases. This will automatically be kept up to date by Mailman when you add further mailing lists, but you need to manually generate it the first time.

DKIM considerations

You will probably want to add REMOVE_DKIM_HEADERS = Yes to /etc/mailman/mm_cfg.py. If you don’t, mail from domains that sign their messages using DKIM (this includes pretty much all major providers, including Gmail) are likely not to reach recipients’ inboxes due to spam filtering. The changes that Mailman makes to the message body before sending it on tend to invalidate the DKIM signature, but by default Mailman leaves DKIM headers intact even though they are no longer valid.

Configure Postfix

Edit /etc/postfix/main.cf and put in the lines below. Most if not all of these lines should already be there. The key points are:
  1. alias_database should NOT include the Mailman aliases file.
  2. alias_maps must include the Mailman aliases file.
  3. virtual_alias_domains must include the domain(s) for your email lists, as well as any other active virtual domains (the sample config below includes example.net as an active virtual mail domain that isn’t used by Mailman).
  4. virtual_alias_maps must include the Mailman virtual alias file.
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases, hash:/var/lib/mailman/data/aliases
virtual_alias_domains = example.com example.net
virtual_alias_maps = hash:/etc/postfix/virtual, hash:/var/lib/mailman/data/virtual-mailman

Test

Now you’re ready to test. Create a test mailing list with newlist --urlhost=example.com --emailhost=example.com test. Open http://example.com/cgi-bin/mailman/listinfo/test in your browser, and you should see the mailing list’s information page. Subscribe to the list and try sending a test message to test@example.com. If it didn’t work, check your logs: /var/log/mail.log for Postfix, and /var/log/mailman/error for Mailman. Try sending a regular message to make sure that it gets through, and a message including the GTUBE to make sure that spam is being filtered correctly.

Add Mailman cron jobs

Finally, set up cron jobs so that Mailman automatically does regular housekeeping by running the command crontab -u list /var/lib/mailman/cron/crontab.in.

Add new comment

(If you're a human, don't change the following field)
Your first name.
(If you're a human, don't change the following field)
Your first name.

Filtered HTML

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.