Antispam with listhelper

If you're using a mailman list on for your group, most incoming spam can be automatically deleted. This is done by default for lists created through Savannah. The system is called listhelper, and its home page is

Here is how to set it up (again, this is done by default):

  • On the General Options page:
  • add as a moderator (not administrator).
  • ensure admin_immed_notify=yes
  • ensure respond_to_post_requests=no (**)
  • On the Privacy Options > Sender Filters page:
  • ensure generic_nonmember_action=hold
  • (recommended) ensure default_member_moderation=yes ([**])

If you change these settings, we will assume you want to delete all spam yourself and not use listhelper.

  • Spam removal via listhelper@ is not tied to A few people are using it for handling mailman lists outside of Savannah and GNU as well. If you'd like to do that, email us. On the other hand, the shared moderation help via listhelper-moderate requires a script and cron job on the target system.

  • respond_to_post_requests has nothing to do with the listhelper system. But it's important to do, because it reduces backscatter from, which in turn decreases our chance of being blacklisted.

  • Setting default_member_moderation=yes protects against the spammers who know how to subscribe to a list and then send out their spam. We have seen these on, although thankfully they are not yet widespread. The cost is manually approving new members' first message (only).

Shared moderation

In addition, any list @(non) can use as an administrator or moderator to help spread the moderation load. Human volunteers with listhelper will then try to approve real messages and delete missed spam. Approval of real messages is never done automatically, and is entirely independent of the automated deletion of spam.

By the way, there is no difference between listhelper[-moderate] and We tend to use for GNU lists and for non-GNU lists, but we aren't rigorous about it, and it makes no practical difference.

How it works

The general idea is that messages that end up in mailman hold queue for the list will be piped through a conservatively configured spamassassin, bogofilter, and crm114, and 95+% of spam will be automatically deleted after a short delay (usually measured in minutes, unless things get backlogged).

Real messages from non-members (or non-approved addresses) will remain in the hold queue, and need to be approved by a human. (We recommend adding real addresses to the "accept in the future" list when approving them.) Thus, you should pay attention to the once-per-day mailman notification when there are "pending messages", but ignore the once-per-message mailman notification.

The process does not affect messages from approved members and other approved addresses, which continue go through without delay.

Extensive suggestions and comments about many other Mailman configuration settings, based on listhelper experiences over the years, are at Many of those settings are made by default for Savannah lists.

Please feel free to add other GNU lists; we don't need to be explicitly informed, although we are happy to answer any questions. If you want help moderating the list, likewise let us know.

Non-English lists

After some time, we realized that listhelper has problems when most of the real mail to a list is not in English. This is because the Bayes classifier is a large part of the spam vs. nonspam determination, and it doesn't have enough real mail in other languages. Although there's no way to explicitly determine the language which is mostly used on a given list, we figured that if the mailman interface language (the preferred_language value) is not English, most likely the mail to the list was mostly not English either.

So, around 1 June 2013, we removed listhelper from all lists which had a different interface language, and will continue to do so with new lists as they arise. We know this makes for extra work for those list moderators, which we regret, but too much real mail was being deleted. We also set max_days_to_hold to 300 for these lists, since we knew many of them were unattended, and did not want spam to build up literally forever. 10 months should be enough to handle incoming messages.

This whole issue could be ameliorated with sufficient work; if anyone is interested in pursuing it, contact us.

Inside listhelper

The system was set up by Bob Proulx, with kibitzing from Karl Berry. We all attempt to review both the spam and nonspam that goes through the system, to try to catch misclassified messages. (Very few real messages are classified as spam; the other direction is naturally somewhat less precise.)

We do not claim this is anything like an optimal or efficient system. But it is what we could do, without requiring deep mail system infrastructure changes. Maybe someday a better system will be possible.

Nearly every list on is checked to some extent. The known exceptions are those whose administrators explicitly did not want any checking, such as FSF member and campaign lists. The exception list is given in the file ~list/etc/ignorelists.egrep on lists. We spend about 15 minutes a day x 2 volunteers dealing with the normal flow, on average.

On, there is a cron entry for user list which lists the lists with recent pending messages.

Email-based trackers

The email-based trackers at (see the section in SavaneTasks for a bit more) are filtered via the debbugs frontend Mailman, but still go through listhelper and mailman if it passes that. Therefore the message approvals etc. happen as usual.

When trying to re-vivify a message for one of the debbugs lists, look at It won't show up in the regular queue on