#list #manager #group #tiny #command #archive #community

app mulm

A small mailing list manager for tiny community groups

6 stable releases

1.1.1 Aug 10, 2020
1.1.0 Jul 11, 2020
1.0.3 Jul 7, 2020
1.0.1 Jul 6, 2020

#144 in Email

Custom license

22KB
458 lines

mulm, a tiny mailing list manager

Free for noncommercial use. For commercial use buy a license

Quick Start

Install this package with cargo install mulm --root /usr/local. Then

mkdir /path/to/list/store.list

Create /path/to/list/store.list/config.toml with the content

[config]
name = "A List"
slug = "listname"

In your MTA's aliases file, add listname: |/usr/local/bin/mulm /path/to/list/store.list

Send mail to listname@yourdomain to post; use the subject line "subscribe" to subscribe, and "unsubscribe" to remove yourself from the list.

Features

  • in-band commands: we honor unsubscribe and subscribe sent to list address.
  • resumable sending if interrupted
  • archives all messages to a group of mboxes

Current Status

No privacy, it works but it's super simple. It's best used for groups that trust each other.

Configuration

  • config.name — a user-oriented title for the list. A string, required.
  • config.slug — an identifier for the list, ideally the local part of the address. A string, required.
  • config.open_posting — whether or not posters must be a member of the list. Boolean, optional, Default false.
  • config.tag_subject - whether to add [list slug] to the subject of messages. Boolean, optional. Default false.

Internal Design

The design of this software is meant for small system use. Each list is stored in a Maildir, making message archives pretty reliable in the face of failure.

Added to the maildir are several control files and the queue directory.

config.toml is the list configuration file.

The queue of messages being relayed to the MTA is resumable (though this does use file locking, unlike plain maildir, so old school NFS is a hazard there — duplicate delivery is possible if file locking does not work).

The queue is integrated into the Maildir in the queue directory. There are three files for each queue entry: a position file ({id}.pos) tracking the position in the destination list sent so far and where to stop for this message, a destination list ({id}.dest) with a recipient per line, and the message ({id}.msg). All three are removed when an entry is sent, and the message is locked while sending. The destination list can be a hard link to the current subscription list, and the message is a hard link to the message file as delivered to the maildir.

The recipient lists are appended to for subscriptions, and rewritten as a new file for unsubscribes.

Licensing

This code is licensed under License Zero Prosperity. It is not free software! However, it is available for noncommercial use without payment, and contributions are welcome. See below.

Future work

  • More complete unit tests
  • Add list management headers
  • Parsing HTML parts and reducing them to simple markup only
  • Censoring originating headers for privacy
  • Masking email addresses entirely
  • Welcome messages
  • VERP for bounce detection
    • It still has to work with a single line in /etc/mail/aliases though so perhaps it's time to move to + addresses rather than anything more complex.
  • A moderation queue
    • Joins
    • Posting
  • A web interface
    • Should be a separate project really.
  • A command line for subscribing and unsubscribing people

If you'd like to work on any of these, feel free. Talk to me and we can discuss payment. You don't need to be super experienced — this is my first Rust project, and a learning one. Some of those things above are pretty simple if you want to take a stab at it.

Dependencies

~5MB
~156K SLoC