pollen

pollen is a mailing list manager. It delivers posts to the subscribers of a list, keeps an archive, and handles subscribe, unsubscribe and help requests sent by mail.

Requirements

Installation

cd pollen
make clean install

Postfix

master.cf:

pollen unix - n n - - pipe
  flags=Rq user=pollen argv=/usr/local/bin/pollen ${user} ${extension}

main.cf:

recipient_delimiter = +
transport_maps = hash:/etc/postfix/transport
pollen_destination_recipient_limit = 1
relay_domains = lists.lostduk.com
relay_recipient_maps = hash:/etc/postfix/lists

transport:

lists.lostduk.com pollen:

relay_recipient_maps lists every list, so Postfix rejects unknown lists before queueing. pollen_destination_recipient_limit must be 1, and the pollen user needs write access to every list directory.

Lists

Each list is a directory root/list, its name matching ^[a-z0-9][a-z0-9-]*$:

The archive is group-readable for readers such as herbarium; everything else pollen writes is private to its user.

Posting

A message to list@domain is a post. It is rejected if it has no Message-ID, already carries this list's List-Id, is larger than maxsize, or its single From address may not post.

Otherwise pollen prepends the List-* and Precedence headers (plus List-Archive for public lists when web is set), drops incoming List-*, Return-Path and Delivered-To headers, keeps everything else byte for byte, archives the result and hands it to sendmail in a single call for all subscribers, with list+bounces@domain as envelope sender. If that call fails, the archived copy is removed again so Postfix can retry cleanly.

Commands

Commands are sent to list+command@domain:

No reply is ever sent to automatic mail: an Auto-Submitted header other than no, a Precedence of bulk, list or junk, or a null or MAILER-DAEMON sender.

Configuration

setting default meaning
root /srv/lists directory of lists
domain lists.lostduk.com domain of the list addresses
web https://lists.lostduk.com/ archive URL for List-Archive
sendmail /usr/sbin/sendmail command used for delivery
maxsize 10 * 1024 * 1024 largest post, in bytes
expiry 7 * 24 * 3600 lifetime of a pending request, in seconds

See also