Integrate mlmmj mailing list manager in iRedMail (MySQL/MariaDB backends)


In iRedMail-0.9.8, we integrate mlmmj ( - a simple and slim mailing list manager. It uses very few resources, and requires no daemons, easy to install, configure and manage. if offers a great set of features, including:

With mlmmj integration, you can create as many mailing lists as you want. End user can subscribe to mailing list listname@domain.dom by sending email to, unsubscribe from the list by sending email to Of course you can disable the subscription and unsubscription with a setting.

iRedMail team also developes a simple RESTful API server called mlmmjadmin to help manage mailing lists, it also offers script tool to manage mailing lists from command line.

We will show you how to integrate both mlmmj and mlmmjadmin in this tutorial.

Backup SQL database first

Although we don't modify any existing SQL data in this tutorial, but it's a good idea to backup it now before you adding any new mailing lists.

Please run command bash /var/vmail/backup/ to backup SQL databases.

Install mlmmj package


Package uwsgi is required by the RESTful API server mlmmjadmin.

yum install mlmmj uwsgi uwsgi-plugin-python uwsgi-logger-syslog python-requests
apt-get install mlmmj uwsgi uwsgi-plugin-python python-requests
cd /usr/ports/mail/mlmmj
make install clean
cd /usr/ports/www/uwsgi
make install clean
cd /usr/ports/www/py-requests
make install clean
pkg_add mlmmj altermime

Create required system account

mlmmj will be ran as user mlmmj and group mlmmj, all mailing list data will be stored under its home directory /var/vmail/mlmmj:

On Linux or OpenBSD:

groupadd mlmmj
useradd -m -g mlmmj -d /var/vmail/mlmmj -s /sbin/nologin mlmmj
mkdir /var/vmail/mlmmj-archive
chown -R mlmmj:mlmmj /var/vmail/mlmmj /var/vmail/mlmmj-archive
chmod -R 0700 /var/vmail/mlmmj /var/vmail/mlmmj-archive
chmod 0755 /var/vmail           # Make sure this directory is accessible by other users

On FreeBSD:

pw groupadd mlmmj
pw useradd mlmmj -m -g mlmmj -s /sbin/nologin -d /var/vmail/mlmmj
mkdir /var/vmail/mlmmj-archive
chown -R mlmmj:mlmmj /var/vmail/mlmmj /var/vmail/mlmmj-archive
chmod -R 0700 /var/vmail/mlmmj /var/vmail/mlmmj-archive
chmod 0755 /var/vmail           # Make sure this directory is accessible by other users

Update SQL tables in vmail database

We need some updates in vmail SQL database:

This SQL structure was introduced in iRedMail-0.9.8, if you're running an old iRedMail release, please upgrade iRedMail to the latest stable release by following our tutorials first:

Postfix integration

# ${nexthop} is '%d/%u' in transport ('mlmmj:%d/%u')
mlmmj   unix  -       n       n       -       -       pipe
    flags=ORhu user=mlmmj argv=/usr/bin/mlmmj-amime-receive -L /var/vmail/mlmmj/${nexthop}
mlmmj_destination_recipient_limit = 1
transport_maps =
    proxy:mysql:/etc/postfix/mysql/   # <- Add this line


Please update the password = line with the real password of SQL user vmail, you can find it in files under /etc/postfix/mysql/.

user        = vmail
password    = qsescZvV03f6YUtTMN2bQTejmjatzz
hosts       =
port        = 3306
dbname      = vmail
query       = SELECT maillists.transport FROM maillists,domain WHERE maillists.address='%s' AND AND maillists.domain = domain.domain AND


mlmmj doesn't support signature signing very well, so we follow mlmmj official document and create this script to sign signature properly with command altermime. All iRedMail installation should have command altermime (package AlterMIME) available, so you don't need to install it manually

On Linux:

cd /usr/bin/
chown mlmmj:mlmmj mlmmj-amime-receive
chmod 0550 mlmmj-amime-receive
perl -pi -e 's#PH_CMD_MLMMJ_RECEIVE#/usr/bin/mlmmj-receive#g' mlmmj-amime-receive
perl -pi -e 's#PH_CMD_ALTERMIME#/usr/bin/altermime#g' mlmmj-amime-receive

On FreeBSD or OpenBSD:

cd /usr/local/bin/
chown mlmmj:mlmmj mlmmj-amime-receive
chmod 0550 mlmmj-amime-receive
perl -pi -e 's#PH_CMD_MLMMJ_RECEIVE#/usr/local/bin/mlmmj-receive#g' mlmmj-amime-receive
perl -pi -e 's#PH_CMD_ALTERMIME#/usr/local/bin/altermime#g' mlmmj-amime-receive

Amavisd Integration

We need Amavisd to listen on one more port 10027, it will be used to scan spam/virus for emails posted to mailing list.

$inet_socket_port = [10024, 10026, 10027, 9998];
$interface_policy{'10027'} = 'MLMMJ';
$policy_bank{'MLMMJ'} = {
    originating => 1,           # declare that mail was submitted by our smtp client
    allow_disclaimers => 0,     # mailing list should use footer text instead.
    enable_dkim_signing => 1,   # sign DKIm signature
    smtpd_discard_ehlo_keywords => ['8BITMIME'],
    terminate_dsn_on_notify_success => 0,  # don't remove NOTIFY=SUCCESS option
    bypass_spam_checks_maps => [1],     # don't check spam
    bypass_virus_checks_maps => [1],    # don't check virus
    bypass_banned_checks_maps => [1],   # don't check banned file names and types
    bypass_header_checks_maps => [1],   # don't check bad header

Now restart Amavisd and Postfix service, mlmmj mailing list manager is now fully integrated.

We will setup mlmmjadmin program to make managing mailing lists easier.

Setup mlmmjadmin: RESTful API server used to manage mlmmj mailing lists

cd /root/
tar zxf 1.5.tar.gz -C /opt
rm -f 1.5.tar.gz
ln -s /opt/mlmmjadmin-1.5 /opt/mlmmjadmin
cd /opt/mlmmjadmin
chown mlmmj:mlmmj
chmod 0400
$ echo $RANDOM | md5sum
api_auth_tokens = ['43a89b7aa34354089e629ed9f9be0b3b']

You can add as many token as you want for different API clients. For example:

api_auth_tokens = ['43a89b7aa34354089e629ed9f9be0b3b', '703ed37b20243d7c51c56ce6cd90e94c']
backend_api = 'bk_none'
backend_cli = 'bk_iredmail_sql'
backend_api = 'bk_iredmail_sql'
backend_cli = 'bk_iredmail_sql'
iredmail_sql_db_type = 'mysql'
iredmail_sql_db_server = ''
iredmail_sql_db_port = 3306
iredmail_sql_db_name = 'vmail'
iredmail_sql_db_user = 'vmailadmin'
iredmail_sql_db_password = '<password>'
MLMMJ_SPOOL_DIR = '/var/vmail/mlmmj'
MLMMJ_ARCHIVE_DIR = '/var/vmail/mlmmj-archive'
MLMMJ_DEFAULT_PROFILE_SETTINGS.update({'smtp_port': 10027})
MLMMJ_SKEL_DIR = '/usr/local/share/mlmmj/text.skel'
# For RHEL/CentOS 6
cp /opt/mlmmjadmin/rc_scripts/mlmmjadmin.rhel /etc/init.d/mlmmjadmin
chmod 0755 /etc/init.d/mlmmjadmin
chkconfig --level 345 mlmmjadmin on

# For RHEL/CentOS 7
cp /opt/mlmmjadmin/rc_scripts/systemd/rhel.service /lib/systemd/system/mlmmjadmin.service
chmod 0644 /lib/systemd/system/mlmmjadmin.service
systemctl daemon-reload
systemctl enable mlmmjadmin

# For Debian 8, Ubuntu 14.04 and earlier releases which does NOT use systemd
cp /opt/mlmmjadmin/rc_scripts/mlmmjadmin.debian /etc/init.d/mlmmjadmin
chmod 0755 /etc/init.d/mlmmjadmin
update-rc.d mlmmjadmin defaults

# For Debian 9 and Ubuntu 16.04 which uses systemd
cp /opt/mlmmjadmin/rc_scripts/systemd/debian.service /lib/systemd/system/mlmmjadmin.service
chmod 0644 /lib/systemd/system/mlmmjadmin.service
systemctl daemon-reload
systemctl enable mlmmjadmin

# For FreeBSD
cp /opt/mlmmjadmin/rc_scripts/mlmmjadmin.freebsd /usr/local/etc/rc.d/mlmmjadmin
chmod 0755 /usr/local/etc/rc.d/mlmmjadmin
echo 'mlmmjadmin_enable=YES' >> /etc/rc.conf.local

# For OpenBSD
cp /opt/mlmmjadmin/rc_scripts/mlmmjadmin.openbsd /etc/rc.d/mlmmjadmin
chmod 0755 /etc/rc.d/mlmmjadmin
rcctl enable mlmmjadmin
# For RHEL/CentOS
mkdir /var/log/mlmmjadmin
chown root:root /var/log/mlmmjadmin
chmod 0755 /var/log/mlmmjadmin

# For Debian
mkdir /var/log/mlmmjadmin
chown root:adm /var/log/mlmmjadmin
chmod 0755 /var/log/mlmmjadmin

# For Ubuntu
mkdir /var/log/mlmmjadmin
chown syslog:adm /var/log/mlmmjadmin
chmod 0755 /var/log/mlmmjadmin

# For OpenBSD/FreeBSD
mkdir /var/log/mlmmjadmin
chown root:wheel /var/log/mlmmjadmin
chmod 0755 /var/log/mlmmjadmin

For Linux

cp /opt/mlmmjadmin/samples/rsyslog/mlmmjadmin.conf /etc/rsyslog.d/
service rsyslog restart

For OpenBSD, please append below lines in /etc/syslog.conf:

local5.*            /var/log/mlmmjadmin/mlmmjadmin.log

For FreeBSD, please append below lines in /etc/syslog.conf:

local5.*            /var/log/mlmmjadmin/mlmmjadmin.log
# On Linux/FreeBSD:
service mlmmjadmin restart

# On OpenBSD
rcctl start mlmmjadmin

On Linux, you can check the port number with command netstat or ss like below:

netstat -ntlp | grep 7790
ss -ntlp | grep 7790

On FreeBSD/OpenBSD, run:

netstat -anl -p tcp | grep 7790

Manage mailing lists with iRedAdmin-Pro

With iRedAdmin-Pro, you can easily manage mailing list accounts with its web UI. Here's a screenshot of mailing list profile page in iRedAdmin-Pro:

Manage mailing lists with mlmmjadmin command line tool

mlmmjadmin ships script tools/ to help you manage mailing lists. You can find this script under directory /opt/mlmmjadmin/tools/.


All settings used to create or update mailing list profiles are listed on mlmmjadmin document.

python create only_subscriber_can_post=yes disable_archive=no

python info

python update only_moderator_can_post=yes disable_subscription=yes

python delete archive=yes

python subscribers

python subscribed

python has_subscriber