1
0
Fork
You've already forked mlmmj
0
forked from mlmmj/mlmmj
simple and slim mailing list manager
  • C 65.5%
  • Shell 18.6%
  • PHP 9.1%
  • Perl 2.7%
  • Prolog 2.2%
  • Other 1.9%
Find a file
2026年07月09日 08:33:31 +02:00
.builds ci: kyua is in freebsd base now 2026年06月02日 15:45:39 +02:00
contrib fixed a typo (wasn't escaping quotation marks). 2026年06月12日 15:27:34 +02:00
include refactor: replace xstring by simpler sb_t 2026年07月09日 08:33:31 +02:00
listtexts build: bbuild system 2026年04月23日 09:29:47 +02:00
man mlmmj-sub: add batch subscribe via stdin 2026年06月12日 17:27:43 +02:00
mk Sync with latest bbuild 2026年06月02日 15:45:39 +02:00
src refactor: replace xstring by simpler sb_t 2026年07月09日 08:33:31 +02:00
tests Add send_or_queue, factor send-or-refile 2026年06月28日 07:57:51 +02:00
.editorconfig Add editorconfig to project 2026年05月16日 07:32:46 +02:00
.gitignore make: fixes to clean target 2026年05月18日 11:32:02 +02: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
ChangeLog Release: 2.1.0 2026年06月12日 17:28:25 +02:00
configure Sync with latest bbuild 2026年06月02日 15:45:39 +02:00
configure.def Release: 2.1.0 2026年06月12日 17:28:25 +02: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: fix warnings 2026年04月23日 10:41:28 +02: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 Add $disarmedfrom$ substitution in customheaders 2026年06月12日 15:10:04 +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 Update README.sendmail.md 2026年06月02日 15:46:42 +02:00
TODO Locallized listtexts for the new patch and updated TODO 2005年05月07日 23:11:37 +10:00
TUNABLES.md TUNABLES: clarify the documentation for subonlypost and modonlypost 2026年04月17日 11:33:09 +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

    Two special variables are available in customheaders:

    posteraddr — expands to the email address of the original sender (extracted from the From: header). Example: "me@here.com"

    disarmedfrom — expands to the full From: value with special characters replaced for safe use in a display name: '<' → '(', '>' → ')', '@' → '='. Example: "Martin (me=here.com)"

    DKIM / From: munging recipe

    Some mail servers reject unsigned messages. If your MTA only DKIM-signs mail with a From: domain it owns, list messages (which preserve the original sender's external domain) will go out unsigned.

    You can rewrite the From: header to use the list's domain — so your MTA will sign it — while keeping a Reply-To: back to the original author. No code changes needed, just three control files:

    control/customheaders: From: disarmedfrom via MyList mylist@lists.example.com Reply-To: posteraddr

    control/delheaders: From: Reply-To:

    control/replyto: (empty file — just touch it)

    This strips the original From: and Reply-To:, then injects new ones. The resulting From: uses your list domain → MTA signs it → DKIM passes. Replies still go to the original sender thanks to Reply-To:.

    Use posteraddr instead of disarmedfrom in the From: line if you prefer to show only the email address (e.g. for privacy reasons).

  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!