A procmail based script to run simple and small mailing lists


kiss_procmail_list.rc allows to create simple and small mailing lists to facilitate e-mail communication of a bunch of people. It is definitely no replacement for full-blown mailing lists such as provided by Mailman. It's for cases where all their features are not required and the number of participants fit into a procmail recipe ;-)


  • Tries to be simple
  • Requires only procmail, formail, sed, grep, and some sendmail
  • Shortcomings
    • Checks only validity of "From:" address1)
    • No automatic handling of (un)subscription
    • No support for adding header or footer text to messages
    • No archiving
    • No VERP support2)
    • No automatic handling of bounces
    • Messages to multiple lists are sent only to 13)
  • Features
    • Verification of senders' "From:" header addresses
    • Subject tagging
    • Workaround for subscribers whose mail gets blocked due to invalid DKIM headers or DMARC reject policies such as Yahoo (rewrites the "From:" to "Original Name via NameOfList <List@address>" and removes DKIM and other headers)
    • Optionally add list of subscribers to messages (for now only if there content is text/plain)
    • Not fool-proof


The script is installed in the .procmailrc of the person who will be the list-moderator, who will be in charge of subscribing and unsubscribing participants and who will receive messages which were intended for the list but didn't fit the criteria.

So, create an alias address for the list that points to the account where the script is included. For example, add the following to /etc/aliases assuming that coolrat is the username of the list-moderator:

example-l: coolrat

In coolrat's .procmailrc setup the list by setting the required variables (see the script for details) and then INCLUDERC the script itself. For example:

# KISS example mailing list

Finally, we need to add the e-mail addresses of the participants to example_list_subscribers.txt. The format is 1 address per line wrapped in < and >. For example:


Postfix forwarding loop workaround

When I installed the script on my account running Postfix my own address was of course included and triggered Postfix' mail forwarding loop detection. So, we need to carefully work around it. Here's an example of what I used:

# KISS example mailing list
* $ ^((Resent-)?To|CC): (.*[<+])?$LISTADDRESS(>|$)
* !$ ^(From|Return-Path:) .*$LISTNAME
  # workaround postfix mail loop bouncing for our own address
  :0 f
  * ^Delivered-To: coolrat@example\.net$
  | formail -I Delivered-To:



Use at your own risk! Not much tested yet, tried only on Debian 7. Feedback and bug reports welcome.

The script checks whether the sender's "From:" address is "subscribed" to the list. Optionally, this can be turned off, and one can setup other means of sender verification.
It'd be trivial to add VERP but it's pointless since the number of participants should be small anyway and bounces are handled manually.
Probably, one could work around this limitation with some more procmail foo. Right now, the script is a "delivering recipe". So, even if it is included/run multiple times, a single message is delivered only once unless a "c" flag is used to generate a carbon copy.
kiss_procmail_lists.txt · Last modified: 2017-07-30 15:39 by andreas