simple and slim mailing list manager https://mlmmj.org
  • C 69.7%
  • Shell 15%
  • Tcl 6.6%
  • PHP 5%
  • Perl 1.5%
  • Other 2.1%
Find a file
2026-04-07 22:03:46 +02:00
.builds ci: add debian/unstable 2024-03-01 22:16:05 +01:00
autosetup build system, convert to autosetup + custom mk framework 2026-03-27 13:54:19 +01:00
contrib move the installation back to bin 2026-04-07 22:03:46 +02:00
include archive_open: remove ctrlfd argument 2026-03-30 19:44:59 +02:00
listtexts build system, convert to autosetup + custom mk framework 2026-03-27 13:54:19 +01:00
man Fix misc typos 2024-02-12 14:10:47 -05:00
mk build system, convert to autosetup + custom mk framework 2026-03-27 13:54:19 +01:00
src move the installation back to bin 2026-04-07 22:03:46 +02:00
tests archive_open: remove ctrlfd argument 2026-03-30 19:44:59 +02:00
.gitignore add forgotten configure scrip 2026-03-27 21:11:31 +01:00
.hgignore Improve compatibility with recent versions of Automake. 2017-05-25 08:50:33 +10:00
.hgtags Added tag RELEASE_1_3_0 for changeset 570dd6d4942b 2017-05-25 09:08:47 +10:00
AUTHORS Tidy up ChangeLog and AUTHORS. Release candidate 1.2.18rc1. 2012-05-03 10:12:15 +10:00
auto.def Prepare release 2.0.0 2026-03-29 10:07:42 +02:00
ChangeLog Prepare release 2.0.0 2026-03-29 10:07:42 +02:00
configure add forgotten configure scrip 2026-03-27 21:11:31 +01:00
COPYING Goodbye GPL license, Welcome MIT 2004-06-17 07:11:55 +10:00
FAQ Locallized listtexts for the new patch and updated TODO 2005-05-07 23:11:37 +10:00
kyua.conf.in Fix the test suite for Out of tree builds 2024-02-14 16:57:48 -05:00
Kyuafile Add a basic test suite 2022-10-20 15:50:22 +02:00
LICENSE Release 1.7.0 2026-01-11 20:51:17 +01:00
Makefile.in build system, convert to autosetup + custom mk framework 2026-03-27 13:54:19 +01:00
README.access.md access: document the dash-extension 2024-08-27 18:08:16 +02:00
README.archives.md README.archives: rename to .md 2024-05-06 10:45:48 +02:00
README.exim4.md Update exim4 configuration hints 2026-03-06 09:40:23 +01:00
README.footers.md foot filter: remove documentation 2024-09-17 17:00:35 +02:00
README.listtexts.md subrelease: finish the implementation started in 2012 2026-03-14 23:34:56 +01:00
README.md documentation: update with latest features 2026-03-29 10:01:58 +02:00
README.postfix.md README.*: convert all to READMEs to markdown 2024-05-06 11:26:12 +02:00
README.qmail.md README.*: convert all to READMEs to markdown 2024-05-06 11:26:12 +02:00
README.sendmail.md README.*: convert all to READMEs to markdown 2024-05-06 11:26:12 +02:00
TODO Locallized listtexts for the new patch and updated TODO 2005-05-07 23:11:37 +10:00
TUNABLES.md documentation: update with latest features 2026-03-29 10:01:58 +02:00
UPGRADE Fix misc typos 2024-02-12 14:10:47 -05:00

This is an attempt at implementing a mailing list manager with the same functionality as the brilliant ezmlm, but with a decent license and mail server independence.

The functionality:

  • Archive
  • Custom headers / footer
  • Fully automated bounce handling (similar to ezmlm)
  • Complete requeueing functionality
  • Moderation functionality
  • Subject prefix
  • Subscribers only posting
  • Regular expression access control
  • Functionality to retrieve old posts
  • Web interface
  • Digests
  • No-mail subscription
  • VERP support
  • Delivery Status Notification (RFC1891) support
  • Rich, customisable texts for automated operations
  • RFC 2919/2369 List-Id, List-Post, List-Help, List-Subscribe, List-Unsubscribe and Precedence headers (can be disabled)
  • Optional Deliverability headers (X-Forwarded-To, X-Signed-Recipient / DARA)
  • Optional Partitioned archive directories (YYYY/MM layout)

To use mlmmj, do the following:

  1. Compile it if you're not using a binary package such as dpkg, rpm or a ports collection from a BSD or Gentoo. To compile, untar the tar-ball and do:

    $ ./configure && make && make install
    

    If you want to filter multipart/mime messages, pass the option --enable-receive-strip to configure, and take a look at contrib/receivestrip/README.

  2. Configure a recipient delimiter. The default is to use '+', and in Postfix it's done by adding

    recipient_delimiter = +
    

    to /etc/postfix/main.cf. In Exim it can be done by adding

    local_part_suffix = +*
    local_part_suffix_optional
    

    to the "userforward:" and the "localuser:" router in /etc/exim/exim.conf, and also add "local_part_suffix = +*" to the system_aliases function. Also make sure that exim will add the envelope from in the Return-Path: header.

    There is a nice FAQ explaining recipient delimiter configuration here:

    http://faqs.org/faqs/mail/addressing/

    The mlmmj TUNABLE "delimiter" configures this on a per list basis

    NOTE: Using '-' as a delimiter is unlikely to work. Mlmmj uses '-' as its own kind of minor delimiter. Of course, you also cannot use the delimiter in your list names or you will encounter problems.

  3. Create the mailinglist. There's a script, mlmmj-make-ml, that will make a mailinglist for mlmmj. It is highly recommended to use this script to make the lists! What is does is described here:

    In the case of a list called mlmmj-test below /var/spool/mlmmj it makes the following directories:

    /var/spool/mlmmj/mlmmj-test/incoming
    /var/spool/mlmmj/mlmmj-test/queue
    /var/spool/mlmmj/mlmmj-test/queue/discarded
    /var/spool/mlmmj/mlmmj-test/archive
    /var/spool/mlmmj/mlmmj-test/text
    /var/spool/mlmmj/mlmmj-test/subconf
    /var/spool/mlmmj/mlmmj-test/unsubconf
    /var/spool/mlmmj/mlmmj-test/bounce
    /var/spool/mlmmj/mlmmj-test/control
    /var/spool/mlmmj/mlmmj-test/moderation
    /var/spool/mlmmj/mlmmj-test/subscribers.d
    /var/spool/mlmmj/mlmmj-test/digesters.d
    /var/spool/mlmmj/mlmmj-test/nomailsubs.d
    /var/spool/mlmmj/mlmmj-test/requeue
    

    NOTE: The mailinglist directory (/var/spool/mlmmj/mlmmj-test in our example) have to be owned by the user the mailserver writes as. On some Postfix installations Postfix is run by the user postfix, but still writes files as nobody:nogroup or nobody:nobody

  4. Make the changes to your mailserver aliases that came as output from mlmmj-make-ml. Following the example above they will look like this:

    mlmmj-test:     "|/usr/bin/mlmmj-receive -L /var/spool/mlmmj/mlmmj-test"
    

    NOTE: Don't forget newaliases.

  5. Start mlmmj-maintd (remember full path when starting it!) or add it to crontab with -F switch. The recommended way for now is to run it via cron:

    "0 */2 * * *  /usr/bin/mlmmj-maintd -F -L /var/spool/mlmmj/mlmmj-test"
    

    It should be started as root, as mlmmj-maintd will become the user owning the listdir (/var/spool/mlmmj/mlmmj-test), and log it's last maintenance run to listdir/mlmmj-maintd.lastrun.log.

    If you have several lists below /var/spool/mlmmj you can use -d: /usr/bin/mlmmj-maintd -F -d /var/spool/mlmmj

    If you have lists more deeply nested below /var/spool/mlmmj, use something like:

    find /var/spool/mlmmj -mindepth 1 -maxdepth 1 -type d \
        -exec /usr/bin/mlmmj-maintd -F -d {} \;

That's it! You probably want to go through the next steps too.

  1. Subscribe some people

    /usr/bin/mlmmj-sub -L /var/spool/mlmmj/mlmmj-test/ -a joe@domain.tld
    

    etc.

  2. mlmmj automatically generates RFC 2919/2369 headers (List-Id, List-Post, List-Help, List-Subscribe, List-Unsubscribe, Precedence) on all list messages. List-Owner is included when control/owner exists. To disable these, create control/nolistheaders.

    If you want additional custom headers like X-Mailinglist, Reply-To: etc. just add a file called 'customheaders' in the list control/ directory like this: $ cat /var/spool/mlmmj/mlmmj-test/control/customheaders X-Mailinglist: mlmmj-test Reply-To: mlmmj-test@domain.tld

  3. If you want every mail to have something like:

    To unsubscribe send a mail to coollist+unsubscribe@lists.domain.net
    

    Just add what you want to a file named "footer" in the same dir as "customheaders" (listdir/control/).

  4. If you want a prefix on the subject, to make it look like this:

    Subject: [mlmmj-test] how are we doing?
    Simply do 'echo "[mlmmj-test]" > control/prefix
    
  5. For having a moderated list, simply create a file called 'moderated' in the control/ directory. Moderators are added to a file called 'moderators' in the control/ dir as well.

  6. Have a look at the file TUNABLES for runtime configurable things.

Tunables in include/mlmmj.h: · There's some time intervals for how mlmmj-maintd operates. I've chosen non-strict defaults, so depending on your BOFH rate you might want to tweak. The defaults should be good for most people though.

Have fun!