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
- Postfix, or another mail server that can pipe a message to a program
- a sendmail command
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-]*$:
descriptionone line describing the listownerthe owner's addresspostwho may post:anyone,subscribersorowner(the owner always can)subscribeopenorclosedpublicpresent if the archive is publicsubscribersone lowercase address per line, written by pollenpending/tokenopen requests, written by pollenarchive/Maildir of every distributed post, exactly as sent
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:
subscribe,unsubscribemail a confirmation request to theFromaddress; on a closed list, subscriptions go to the owner insteadconfirm-tokenapplies a pending request; requests expire afterexpirybounceslogs the bounce to syslog, subscribers are not removedhelp, or anything else, replies with the list of command addresses
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
- herbarium, to read the archives
- pollen(1), pipe(8), sendmail(1)