ezmlm-idx

November 26, 2025 by Roberto Puzzanghera 26 comments

ezmlm is an easy-to-use, high-speed mailing list manager for qmail. ezmlm-idx is an extension of the original ezmlm software of D.J. Bernstein.

Since version 7.2.0 ezml-idx is able to alter the From: address in messages from domains with strict SPF policies as announced here. This will solve DMARC reject problems with users having yahoo or AOL addresses. Some changes were made in 7.2.1 and 7.2.2 to improve the process (read here).

My ezmlm-idx clone contains a few patches from third-party and passes an option to the compiler in order to solve compilation breaks with modern compilers.

Download, generate the Makefile and compile:

git clone https://github.com/sagredo-dev/ezmlm-idx.git
cd ezmlm-idx
tools/makemake
make
make man

The default language is set to en_US:

# ls -l lang/default 
lrwxrwxrwx 1 root root 5 Nov 26 20:13 lang/default -> en_US/

If you prefer to define your local language as default you have to change the above symbolic link.

Test:

# bin/ezmlm-test

getconfopt library:   OK
ezmlm-make:           OK
Using subdb plugin:   std
ezmlm-reject:         OK
ezmlm-[un|is]sub[n]:  OK
ezmlm-checksub:       OK
ezmlm-send:           OK
ezmlm-tstdig:         OK
ezmlm-weed:           OK
ezmlmrc contents:     OK
ezmlm-clean:          OK
ezmlm-store:          OK
ezmlm-return:         OK
ezmlm-warn (1/2):     OK
ezmlm-manage (1/2):   OK
ezmlm-request:        OK
ezmlm-split:          OK
ezmlm-gate:           OK
ezmlm-idx:            OK
ezmlm-get (index):    OK
ezmlm-get (get):      OK
ezmlm-get (thread):   OK
ezmlm-get (digest):   OK
ezmlm-manage (2/2):   OK
ezmlm-moderate:       OK
ezmlm-warn (2/2):     OK
ezmlm-archive:        OK
ezmlm-dispatch:       OK                                                                                                                    
dispatch editor:      OK                                                                                                                    
decode sender:        OK                                                                                                                    
Verifying message header and body contents...                                                                                               
flags:                OK                                                                                                                    
substitutions:        OK                                                                                                                    
messages:             OK                                                                                                                    
subscribe nop:        OK                                                                                                                    
unsubscribe nop:      OK                                                                                                                    
subscribe probe:      OK                                                                                                                    
unsubscribe probe:    OK
subscribe:            OK
unsubscribe:          OK
moderated subscribe:  OK
moderated unsub:      OK
subscribe by mod:     OK
unsubscribe by mod:   OK
copylines:            OK
ezmlm-send:           OK
ezmlm-send trailer:   OK
omitbottom (-manage): OK
omitbottom (-get):    OK
Cleaning up...

Install:

make install

Install mysql support

The main advantages are that you are using an address database system that can easily be accessed from any number of other programs via ODBC, perl, java, PHP, ... You can easily hook up ezmlm with your customer database, etc. ezmlm programs compiled with SQL support (and when available also those compiled with support for other SQL servers) are entirely backwards compatible. You can mix SQL dbs with normal ezmlm dbs, and convert lists between them.

Unfortunately the ezmlm-idx program is not able to separate the lists in different tables, but separated databases have to be created for each list. This is why I don't suggest to use the SQL support. Anyway, let's see how to install it. 

Be aware that, when setting up the MySQL support in qmailadmin, you have to provide the server name as mysql:localhost or mysql:ip-address.

Once you have created the list, an sql file containing the connection info is added to its basedir. When this file exists, the list has MySQL support.

Create the database:

# mysql -u root -p

CREATE USER 'ezmlm'@'localhost' IDENTIFIED BY '[ezmlm-password]';

GRANT USAGE ON * . * TO 'ezmlm'@'localhost' IDENTIFIED BY '[ezmlm-password]' WITH MAX_QUERIES_PER_HOUR 0
MAX_CONNECTIONS_PER_HOUR 0
MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

CREATE DATABASE IF NOT EXISTS `ezmlm` ;
GRANT ALL PRIVILEGES ON `ezmlm` . * TO 'ezmlm'@'localhost';

Compile:

make mysql

Test:

# bin/ezmlm-test -s mysql -u ezmlm -p [ezmlm-password] -h localhost

getconfopt library:   OK
ezmlm-make:           OK
Using subdb plugin:   mysql
ezmlm-reject:         OK
ezmlm-[un|is]sub[n]:  OK
ezmlm-checksub:       OK
ezmlm non-SQL:        OK
ezmlm SQL:            OK
ezmlm-send:           OK
ezmlm-tstdig:         OK
ezmlm-weed:           OK
ezmlmrc contents:     OK
ezmlm-clean:          OK
ezmlm-store:          OK
ezmlm-return:         OK
ezmlm-warn (1/2):     OK
ezmlm-manage (1/2):   OK
ezmlm-request:        OK
ezmlm-split:          OK
ezmlm-gate:           OK
ezmlm-idx:            OK
ezmlm-get (index):    OK
ezmlm-get (get):      OK
ezmlm-get (thread):   OK
ezmlm-get (digest):   OK
ezmlm-manage (2/2):   OK
ezmlm-moderate:       OK
ezmlm-warn (2/2):     OK
ezmlm-archive:        OK
ezmlm-dispatch:       OK
dispatch editor:      OK
decode sender:        OK
Verifying message header and body contents...
flags:                OK
substitutions:        OK
subscribe nop:        OK
unsubscribe nop:      OK
subscribe probe:      OK
unsubscribe probe:    OK
subscribe:            OK
unsubscribe:          OK
moderated subscribe:  OK
moderated unsub:      OK
subscribe by mod:     OK
unsubscribe by mod:   OK
copylines:            OK
ezmlm-send:           OK
ezmlm-send trailer:   OK
omitbottom (-manage): OK
omitbottom (-get):    OK
Cleaning up...

Now you are ready to install:

make install

Comments

ezmlm-test fails

Getting the message of:

ezmlm-send: Header is missing or wrong From: line:
From: "test1.example.org via __tstlist" <__tstlist@example.com>
..............: Header is missing or wrong From: line:
From: "test2.example.org via __tstlist" <__tstlist@example.com>
..............: Headers contained extra lines:
Cc: test2@example.org

Reply |

ezmlm-test fails

I've no idea. I see it only on debian. I would tell you to post a request on the developer's github, but I already know he won't respond because this package seems to be unmaintained. I know that Erwin Hoffmann is working on a fork of the original djb ezmlm but I didn't check if it's stable or not. Let me know if you solve in some way

Reply |

Does not compile

Hi,

Here's what I'm getting :

./compile ezmlm-send.c
In file included from ezmlm-send.c:26:
getconfopt.h:46:43: error: initialization of ‘const char **’ from incompatible pointer type ‘char **’ [-Wincompatible-pointer-types]
46 | #define OPT_CSTR(VAR,CH,FILENAME) {{.cstr=&VAR},CH,&opt_cstr,{0},FILENAME}
| ^
ezmlm-send.c:60:3: note: in expansion of macro ‘OPT_CSTR’
60 | OPT_CSTR(mlheader,'H',0), /* Alternative sublist check header */
| ^~~~~~~~
getconfopt.h:46:43: note: (near initialization for ‘options[2].var.cstr’)
46 | #define OPT_CSTR(VAR,CH,FILENAME) {{.cstr=&VAR},CH,&opt_cstr,{0},FILENAME}
| ^
ezmlm-send.c:60:3: note: in expansion of macro ‘OPT_CSTR’
60 | OPT_CSTR(mlheader,'H',0), /* Alternative sublist check header */
| ^~~~~~~~
make: *** [Makefile:683: ezmlm-send.o] Error 1

Reply |

Does not compile

you have to add -std=gnu89 to conf-cc in this way

gcc -std=gnu89 -O -g -I/usr/include/mysql -I/usr/include/pgsql

Reply |

Does not compile

compiler? OS? 

Reply |

Ezmlm with ##L@##H posibilities

So for the past 24 years I have been running a qmail+ezmlm subscription service for Bible-in-a-Year and devotionals.

Not sure if it was a patch or what but I could add a "#" to "Precedence: bulk" in the headeradd file and then reference the subscriber's email address as "##L@##H" that was added when the individual emails were sent out.  This way I could add a link for them to unsubscribe without them having to enter their email address.  I know that as of ezmlm-idx-40-0.40 this was possible.  Have you heard of this feature and if so, was it removed or is there a way to activate it again in your latest version?

Reply |

Ezmlm with ##L@##H posibilities

Hi Jeffrey,

I haven't used ezmlm in recent times and in fact I switched to mailman for a big project in 2024. ezmlm-idx is the only package of the qmail chain whose author should be still in charge for the continuation of the project, even though it's not updated since a long time. This is the reason why I haven't had a look at it in detail. Also I don't think that old versions of ezmlm would compile with recent gcc or clang.

Anyway a quick google seems to suggest that what you are looking for is still possible in ezmlm-idx. Have a look here https://untroubled.org/ezmlm/manual/Adding-Headers.html

Reply |

Ezmlm with ##L@##H posibilities

Thanks for the quick response.  Will contact someone there.

Reply |

download link error

Hi,

The link for download http://ezmlm.untroubled.org/archive/7.2.2/ezmlm-idx-7.2.2.tar.gz is broken. Do you have the source, please?

Thank you

Joao

Reply |

download link error

Hi Roberto, thank you for replying!

Do you know about this error?

# ./ezmlm-test
getconfopt library: OK
ezmlm-make: OK
Using subdb plugin: std
ezmlm-reject: OK
ezmlm-[un|is]sub[n]: OK
ezmlm-checksub: OK
ezmlm-send: OK
ezmlm-tstdig: OK
ezmlm-weed: OK
ezmlmrc contents: OK
ezmlm-clean: OK
ezmlm-store: OK
ezmlm-return: OK
ezmlm-warn (1/2): OK
ezmlm-manage (1/2): OK
ezmlm-request: OK
ezmlm-split: OK
ezmlm-gate: OK
ezmlm-idx: OK
ezmlm-get (index): OK
ezmlm-get (get): OK
ezmlm-get (thread): OK
ezmlm-get (digest): OK
ezmlm-manage (2/2): OK
ezmlm-moderate: OK
ezmlm-warn (2/2): OK
ezmlm-archive: OK
ezmlm-dispatch: OK
dispatch editor: Error delivering confirmed post

Reply |

download link error

I've never seen it. Tomorrow I'll try to find information in the code

Reply |

download link error

I had a look at the code, but i'ts not so easy to understand what's going on with that error... I'm sorry

Reply |

download link error

Hi Roberto, thank you for replying.

I'm trying to compile in rocky linux 9.
I'll try in rocky linux 8.

Thanks
joao

Reply |

How do I add List-Unsubscribe header to email?

Hi,

Recently I come across the email reputation "Your message does not contain a List-Unsubscribe header".

How do I add the "List-Unsubscribe" into the email's header?

If found from https://mailtrap.io/blog/list-unsubscribe-header/

There is not qmail implementation method.

Thx.

Reply |

How do I add List-Unsubscribe header to email?

Hi, which mailing list program are you using? ezmlm-idx already has this feature...

Reply |

I get stuck on ezml-test

Hi

After compiling everything I get stuck in ezml-test

Testing with and without sql I get the same result after a while

Coud be some problem with the domain used for test (example.com), because I have a lot of filter on who can sent mail from the server where I'm doing the test ?

ezmlm-archive: Segmentation fault (core dumped)
failed after "num" was restored

I created the DB and I see that there is a lot of tables on it now

list
list_allow
list_allow_slog
list_cookie
list_deny
list_deny_slog
list_digest
list_digest_cookie
list_digest_mlog
list_digest_slog
list_mlog
list_mod
list_mod_slog
list_slog

Do I have to create a file with the connection parameters some where ?

Is very confusing this point

I think if I don't put anywhere user/pass/db there is no way that the program can conect to the db :D

One more thing I don't understand very well is if all the domains use the same DB to store the lists info, or I can give a different DB to every domain ?

I'm very LOST !!!!

Reply |

I get stuck on ezml-test

I haven't used it in a long time and I honestly don't remember much anymore. To troubleshoot your breaks I would look at strace in the following way

strace -o test.log ./ezmlm-test

Reply |

I get stuck on ezml-test

Finally I do a trace ( truss ) on FreeBSD, but I don't know what is happening

I don't have time tu debug, so, I will use it without mysqlcry

stat("/var/ports/usr/ports/mail/ezmlm-idx/work/ezmlm-idx-7.2.2/__TSTDIR/num",0x7fffffffe6c8) ERR#2 'No such file or directory'
stat("/var/ports/usr/ports/mail/ezmlm-idx/work/ezmlm-idx-7.2.2/__TSTDIR/archive/authors",0x7fffffffe6c8) ERR#2 'No such file or directory'
stat("/var/ports/usr/ports/mail/ezmlm-idx/work/ezmlm-idx-7.2.2/__TSTDIR/archive/lock",0x7fffffffe6a8) ERR#2 'No such file or directory'
stat("/var/ports/usr/ports/mail/ezmlm-idx/work/ezmlm-idx-7.2.2/__TSTDIR/archive/subjects",0x7fffffffe688) ERR#2 'No such file or directory'
stat("/var/ports/usr/ports/mail/ezmlm-idx/work/ezmlm-idx-7.2.2/__TSTDIR/archive/threads",0x7fffffffe668) ERR#2 'No such file or directory'
stat("/var/ports/usr/ports/mail/ezmlm-idx/work/ezmlm-idx-7.2.2/__TSTDIR/archnum",0x7fffffffe648) ERR#2 'No such file or directory'
vfork() = 88390 (0x15946)
wait4(-1,{ EXITED,val=0 },0x0,0x0) = 88390 (0x15946)
fork() = 88391 (0x15947)
wait4(-1,{ SIGNALED,sig=SIGSEGV,cored },0x0,0x0) = 88391 (0x15947)
stat("/usr/share/nls/C/libc.cat",0x7fffffffe1c8) ERR#2 'No such file or directory'
stat("/usr/share/nls/libc/C",0x7fffffffe1c8) ERR#2 'No such file or directory'
stat("/usr/local/share/nls/C/libc.cat",0x7fffffffe1c8) ERR#2 'No such file or directory'
stat("/usr/local/share/nls/libc/C",0x7fffffffe1c8) ERR#2 'No such file or directory'
write(2,"Segmentation fault (core dumped)"...,33) = 33 (0x21)
fcntl(1,F_DUPFD_CLOEXEC,0xa) = 11 (0xb)
dup2(2,1) = 1 (0x1)
write(1,"failed after "num" was restored"...,32) = 32 (0x20)
dup2(11,1) = 1 (0x1)
close(11) = 0 (0x0)
exit(0x64)
process exit, rval = 100

Reply |

compiling ezmlm-idx

also after make

must be added:

make mysql

it do not makes it by default

Reply |

compiling ezmlm-idx

yes, as you can see above this is explained later. The mysql installation is described separately

Reply |

compile ezmlm-idx

just before make u must create a file describing your mysql installation path

>conf-mysql

In my case it contains:

/usr

else plugin-mysql will not be compiled

Reply |

compile ezmlm-idx

as described above, the mysql installation path is declared inside conf-cc and conf-ld

Reply |

FreeBSD 10.3 Install fail -help?

./ezmlm-test -s mysql -u ezmlm -p [ezmlm-password] -h [mailserver-IP]

getconfopt library:   OK
ezmlm-make:           OK
Using subdb plugin:   mysql
ezmlm-make: fatal: Could not load plugin /package/ezmlm-idx-7.2.2/sub-mysql.so: Cannot open "/package/ezmlm-idx-7.2.2/sub-mysql.so"
ezmlm-make failed to add subdb config info

Reply |

Hopefully someone else can be

Hopefully someone else can be of any help, as I can't do tests on freeBSD

Reply |

ezmlm strange error

Hi guyst,

new day, new strange error :-)

from /var/log/qmail/qmail/current:

delivery 152: deferral: ezmlm-send:_fatal:_error_fetching_DNS_record_for_mxtoolbox.com:_temporary_failure/

I have been receiving mail from mxtoolbox without problems for years, but they might have changed something; anyway, the recipient is a mailing list (all subscribers are local users), the mail is stuck in the queue and it is not delivered; I googled for this ezmlm-idx error with no luck, and I really do not understand why ezmlm-send should be doing a DNS lookup on the sender address...

thank you !

Reply |

Recent comments
See also...
Recent posts

RSS feeds