This chapter tells you how to deal with common problems and introduces
you to the power and technical aspects of ezmlm/idx. If you want to
customize your list, please use the man pages and FAQ included in the
ezmlm and ezmlm-idx packages (see
As the owner of an ezmlm list you will appreciate the high degree
of speed and automation of ezmlm.
Even with large numbers of subscribers, the parallelism of ezmlm/qmail
results in rapid delivery of the message to the subscribers. This makes
it easy to have discussions among list members. With slower list managers
the discussion is often limited to a small set of users who send mail
on the topic to each other, ``Cc:ing'' the message to the list. When the
other subscribers receive the message, the discussion is way past this
Features available only if ezmlm-idx is used are marked ``(*)''.
Ezmlm -subscribe and -unsubscribe
commands result in a handshake which essentially eliminates the possibility
of people other than the user adding or removing the user's address
from the list.
For the list
mail to the
firstname.lastname@example.org address returns a message
with all the relevant ezmlm commands for subscription and message archive
related functions. Archive access is simple and powerful.
Together these features make it very easy to set up and manage an ezmlm
mailing list. The rare messages to the list-owner address
email@example.com, in the example) are usually due to
subscribers who have subscribed under one address, and now use another.
Even they can (un)subscribe without owner intervention, but some
subscribers may be unable/unwilling to read the ezmlm help message and
follow the instructions therein.
In addition to the regular subscriber address databases for the list
and list-digest, ezmlm may use up to three other address databases.
One of these the ``allow'' database is housed in DIR/extra/
File names are shown in boldface.
Directories end with a slash. ``DIR/'' is the list directory.
. In case posts or access
to the archive is restricted to subscribers, addresses present in
DIR/extra/ are also accepted.
If the subscriber
sometimes posts from
firstname.lastname@example.org, you can just add the second
address to DIR/extra/ to allow this. The previous chapter describes
how to do this via the ``allow'' command extension (see
Adding subscriber aliases).
If you have shell access, you can simply:
To list all the addresses in DIR/extra/:
% ezmlm-sub ~/listDIR/extra email@example.com
Similarly, you can use
ezmlm-list(1) to remove and
list addresses, respectively.
Another address database is DIR/blacklist/. If the list was
configured with the
ezmlm-make(1) ``-k'' switch, posts from addresses
in this database are rejected. This is easy to circumvent, but very handy
if a subscriber creates a mail loop (ezmlm/qmail has excellent loop detection,
but some subscriber vacation programs generate a new message to the list
for every message received and ezmlm has no way of knowing that this is
not a legitimate post). For such a subscriber address, you can just
temporarily add it to DIR/blacklist/, which is some cases is
preferable to simply unsubscribing the user. If this database is configured,
remote administrators can access it via the ``deny'' command
Preventing an address from posting).
The final database is DIR/mod/ in which moderator and remote
administrator addresses are stored. Remote administrators may themselves
(un)subscribe any address. Remote administration (see
is configured with the
ezmlm-make(1) ``-r'' switch. The same addresses may also be subscription
moderators. If configured (``-s'' switch) a user can subscribe only if
one or more of the moderators approve.
Messages to the list can also be moderated.
This is configured with the ``-m'' switch. Again, the moderators are
stored in DIR/mod/, although it is possible to configure the list
so that message and subscription moderators are different sets of addresses
To add a moderator/administrator:
% ezmlm-list ~/listDIR/extra
ezmlm-list(1) and ezmlm-unsubscribe(1) are used to list and remove
moderators. Normally, the moderator database cannot be accessed remotely.
However, remote access can be arranged (see
Ezmlm lists are set up with a one line
ezmlm-make(1) command. Existing
lists can be modified using the ezmlm-make ``-e''(*) switch, without
loss of archive, subscriber database, or other state information.
of ezmlm-make is controlled by ezmlmrc(*). To customize ezmlm list
setup on a host-wide
or user (virtual domain)-wide basis, copy this file from the ezmlm binary
directory to /etc/ezmlmrc of ~user/.ezmlmrc and
ezmlm offers virtually infinite possibilities for customization. The more
common types of lists can be created and configured with a single ezmlm-make
command. For more complicated lists and a discussion of how ezmlm works,
ezmlm-sub ~/DIR/mod firstname.lastname@example.org
Public vs. non-public lists.
Normal mailing lists are public,
i.e. anyone can subscribe/unsubscribe, and
access the list archive. Occasionally, you may want to set up a non-public
list, where (un)subscribe actions are possible only from the command line
or remotely by the administrator(s). This is controlled by the
ezmlm-make(1) ``-P'' switch.
Adding a digest list to your ezmlm list(*).
The digest is a collection of messages, produced about every two days.
If more than 30 messages or 64 kbytes of ``message body'' have
arrived since the latest digest, the digest is sent earlier. All
these criteria can be changed (see
Also, lists can be set up
to produce digests at a specific time each day, every other day,
Some users do not get involved in discussions on the list
but rather want to read messages on a specific topic. For these
users, a digest with sorted messages is much preferable to receiving the
messages one at a time. These users would subscribe to the digest list,
rather than to the list itself.
To set up a digest list with the list, all you need to do is to
use the ezmlm-make ``-d'' switch. The digest of the list
is always called
list-digest@host. Thus for the list
email@example.com, the digest list would be
The digest can be sent in several formats. The default, MIME with
removal of ``non-essential'' headers is virtually always the best.
A ``format-specifier'' can be used with the
ezmlm-get(1) ``-f'' switch
to override this. ``v'' returns MIME with all headers, and ``r'' a
rfc1153-like non-MIME format (see
You can use
DIR/digheaders to specify the message headers shown for archive
excerpts when using the ``m'' (default) format.
Ezmlm mailing lists are by default set up to keep an archive of all
the messages sent to the list. This archive is used to create digests.
Users can also access messages in the archive,
using the -get, -thread(*),
and -index(*) addresses (see above).
If the users
would like to receive messages in a non-default format, they may
do so by adding a format specifier(*) to the command address name.
Thus, to receive messages 45-65 from
the ``v'' (virgin - MIME with all headers) format, the user would send
a message to
Ezmlm mailing lists can be set up with many restrictions, both for posts
and archive access. Through customization of ezmlm, there are
many variations. The more common ones are accessible through
switches when the list is created or modified (see
Placing restrictions on messages to the list.
By default, ezmlm rejects all messages that have an empty subject
or a subject consisting of a command name (such as ``subscribe'') only.
The lists will also reject messages that do not have the list address
in the ``To:'' or ``Cc:'' header(*). This removes the majority of spam without
affecting normal posts.
In addition, lists may be configured to reject messages below or
above a certain size(*), measured on the message body. Ezmlm can also
reject messages containing
certain MIME content types(*). It may make sense to reject messages
consisting only of ``text/rtf'' on lists with users on multiple platforms,
many of which would be unable to read the message. Similarly, restricting
the maximal size of messages to e.g. 20000 bytes may save inexperienced
users from quoting entire digests or sending large programs or such as an
attachment. All these restrictions are handled by
in the DIR/editor file in the list directory (see
Placing restrictions on subscribers(*).
To set up lists with subscription moderation so that each -subscribe
request must be approved by a moderator, use the
Lists set up with the
ezmlm-make(1) ``-u'' switch allow posts only from subscribers of
the list or list-digest. Use of the ``-m'' switch makes all posts
moderated (see below). A combination of these switches (``-um'')
has a special meaning: posts from subscribers go directly
to the list, whereas posts from others are sent out for moderation.
Also, messages that are ignored (neither accepted nor rejected) by
the moderators, usually result in an informative error message to
the sender after about 5 days. However, for ``-um'' lists, such
posts are ignored. This gives the moderator the choice of accepting
the message, rejecting it with the accompanying notification of
the sender, and silently ignoring it (most appropriate for e.g.
Placing restrictions on archive access(*).
For some lists, you may not want non-subscribers to be able to read archived
messages. This restriction can be placed on a list with the
ezmlm-make(1) ``-g'' switch. Since ezmlm always sends archive
excerpts to the sender of the request this ensures that only
persons able to read mail to a subscriber address can receive
archive excerpts. All such persons can already read the list traffic.
The DIR/extra/ directory holding the ``allow'' addresses can be
useful to give archive access to addresses not in the list or list-digest
subscriber databases. Addresses in this database are treated as subscribers,
both for archive access and posts, but of course they will not receive
You can also make the list non-public. This can be done by removing
DIR/public or by using the ezmlm-make ``-P'' switch (see
This results in
a list where only remote administrators can access the archive. You
can eliminate the archive altogether, but it may be required for
other purposes (such as digest generation).
All these additions can be made default for all lists by modifying
Adding a trailer to each message(*).
You can add small ``trailer'' to each message. This usually would
contain information on how to unsubscribe from the list, or where
the list html archive is kept. To add a trailer, simply
put the text in the file text/trailer in the list directory.
You can use the
ezmlm-make(1) ``-t'' switch to set up the list with
a simple trailer that gives ``unsubscribe'' instructions.
Removing certain headers from messages.
DIR/headerremove contains headers that are removed from all
messages before they are sent to the subscribers. Some of these must be
removed in order for the list to function. You can add others (see
Adding headers to list messages.
Headers in DIR/headeradd are added to posts before they are sent
to subscribers. They are also added to the archived version of the message.
Ezmlm can add a sequence number header(*) showing the
message number. To achieve this, just place the desired header
name (e.g. ``X-Seq:'')
in the file DIR/sequence.
Stripping certain MIME parts from multipart messages(*).
Ezmlm can strip out MIME parts from multipart MIME messages. Some
mail clients use ``multipart/alternative'' to send both plain text
and html versions of the same message. On many lists this is considered
annoying and wasteful (messages are usually 2-3 times as large). You
can have ezmlm remove the html part from such messages by adding the
line ``text/html'' to DIR/mimeremove.
Adding a subject prefix to messages(*).
Ezmlm can also add a ``prefix'' to the subject line of each message
that does not already contain it. This was common on old lists, when
mail readers were unable to sort mail, except by subject. It still
popular for historical reasons, even though it violates mail standards.
Use this only if you feel that it is necessary, and for novice users
where ``look'' is more important than correctness. If you do use this
make it the list name and short, e.g. ``[mailinglist]'' (well, that's
from the example, in real life this is too long and too long a name
for a mailinglist as well.
firstname.lastname@example.org with ''
would be better).
The prefix with the list name can be configured with the
ezmlm-make(1) ``-f'' switch. Alternatively, just place the text in
the file DIR/prefix.
For a real thrill, you can use ``[ml-#]''.
Here, ``#'' will be
replaced by the message number, labelling all messages with the
message number of the first message in the thread. This is not only
a mail standard violation, but will inconvenience many users and
html archiving programs. Still, it may be useful and help novice
users use the archive efficiently (mail
where ``#'' is the number in the prefix of the message to get
the entire thread from the archive). This works also with partially
rfc2047-encoded subjects. (See the
ezmlm-send(1) man page for more info.)
Many old mailing list managers allow users to list the addresses of
all subscribers. This used to be OK, but has lately become a means
for junkmailers/spammers to acquire large collections of addresses.
Consequently, ezmlm does not allow this. Still, it may be useful for
the list owner to be able to get such a list to help a user unsubscribe
or to remotely backup the subscriber list.
Ezmlm will supply such a list if the
list was set up with the
ezmlm-make(1) ``-r'' and ``-l'' switches
and the recipient of the list is a ``remote administrator'' (see
The remote administrator right apply to all address databases of the list
(subscribers of list and list-digest, ``allow'' and ``deny''), except
the moderator addresses. Moderators' addresses cannot be accessed remotely.
ezmlm-make(1) ``-n'' switch to allow remote editing of text files
to remote administrators. Editing is allowed for all existing
text files. Thus, in order to allow editing of the DIR/text/info
file (sent in response to the -info command), you must at least
have created such a file from the shell command line, or via
ezmlmrc (default for new lists). See
More information for more information.
A list of editable files is contained in the DIR/text/edit-list
file. This file itself for the list
is editable via
This file has no effect on which
files can be edited, but it useful since it contains the instructions
returned in reply to the -edit command. Hyphens in file names
need to be replaced by underscores in the edit commands.
More information for more information.
are fault tolerant by virtue of a queuing mechanism where
a message is removed from the queue only when the recipient mail
transfer agent (MTA) has acknowledged receipt of the message. With this,
the responsibility for the message has been transferred from the sending
MTA to the receiving MTA. For messages that remain in the queue, the
sending MTA will retry the transmission. After a set period of time, the
message will be bounced, i.e. returned as ``undeliverable''. If the
recipient does not exist (which may be caused by a misconfiguration of
e.g. the domain naming service) the message is returned immediately
as ``recipient unknown''.
Ezmlm uses the subscriber address and message number encoded within
the sender address to keep track of which message have ``bounced''
for which recipient. Since messages can bounce for a variety of reasons,
ezmlm doesn't remove a subscriber from the list after a single bounce.
Rather, it waits about 12 days after the first bounce, then sends
a ``warning'' message to the subscriber. The warning message lists the
numbers of the messages missed.
The user can retrieve these from the archive. If this warning message bounces
as well, ezmlm waits another 12 days, then sends a ``probe''. First
when this message bounces is the subscriber removed from the subscriber
database. This mechanism
guarantees that a subscriber won't be removed due to a temporary
error, while assuring that all non-existent or permanently failing
addresses will be removed eventually.
Some users never learn and don't want to spend the time to figure out how
to unsubscribe. As a remote administrator(*), you can unsubscribe them entirely
on your own (see
You can also do this from the command line. Alternatively, you can as a normal
user send a -unsubscribe request for the subscriber address and
let the subscriber confirm. Another alternative is to tell the user to send
a message to
listname-help@listhost and ask the user to follow the
instructions, which are very explicit.
Other users have attempted to unsubscribe, but failed. They usually will tell
you what they've tried, and forward a list message to you.
Most likely, they are subscribed with an address other than their
normal sender address. If you're lucky, the subscriber address is in the users
E-mail to you. If not, you can ask the user to give you a list of possible
addresses. You can then send mail to
enabled) and use ``Find'' or ``grep'' to search through the list for parts
of the users addresses. If remote subscriber listing is not available, try:
Then send an unsubscribe for the address(es). The user will usually receive
a confirmation request (if you found the correct address), and can reply
to it to get off the list.
Subscriber-only lists allow posts and archive access only to subscribers of the
main list or the digest list. If a subscriber's posts or archive access
attempts are rejected, the subscriber is working with a sender address that
is not the one s/he is subscribed under. Usually, the user's sender address
will be in the E-mail to you. Ezmlm-idx keeps a database of ``extra'' addresses
which are treated like subscribers for the purpose of subscriber-only
restrictions. To add an address, send mail to
% ezmlm-list DIR | grep -i 'part_of_user_address'
listname-allow-subscribe-user=userhost@listhost. If you're a remote
administrator the confirmation request will come to you, otherwise to
user@userhost. Replying to the request will add the address. The
user should now be able to post and access the archive. To remove an address,
user the same procedure, but with the -unsubscribe command. Users
can manipulate the database themselves, but this may be too complicated for
all but advanced users.
Qmail and ezmlm have built-in advanced mail loop prevention. However, some
autoresponders are misconfigured and create a new message to the list for
every message received. Since this is a completely new message, ezmlm has
no way of knowing that it is not a post. This is very rare, but may happen.
The symptom is that a ``John is on vacation'' messages will arrive at the list,
go out to subscribers, only to be followed by another ``John is on vacation''
message, and so on.
To stop this, look at the sender of the ``vacation'' message. Unsubscribe the
Even rarer is that there is a mail loop somewhere on the Internet, and that
it sends of messages to your list. Unsubscribing doesn't help. Your only
recourse is to block the sender of the message from posting. Easiest is
to use the ``blacklist''(*) function with the
ezmlm-make(1) ``-k'' switch,
then add the sender address:
or if configured, send mail as a remote administrator to
% ezmlm-sub DIR/blacklist badname@badhost
listname-deny-subscribe-badname=badhost@listhost. You could also
add a line:
to DIR/editor of the list.
Ezmlm/idx lists by default(*) reject messages that do not have the list address
in the ``To:'' or ``Cc:'' headers. Most ``bulk E-mail'' does not pass this
test. If you still receive too much junk mail to your list, you can set up
your list as a subscriber-only(*) list. This creates a small overhead of
users who try to post from addresses that are not their subscriber address.
See above on how to deal with this.
Since the message sender is easy to fake, this is not secure. A determined
SPAMMER can subscribe to the list or just send mail ``From:'' a subscriber
address. The next level of countermeasure is to have a message moderated(*) (and
possibly subscription moderated(*)) list. The overhead is higher - someone
has to approve each message - but it is much more secure. Ezmlm-idx has
support for multiple moderators making it easy to set up a list with
fast and efficient moderation.
Several sites on the Internet subscribe to mailing lists, archive the messages,
and make them publicly available. This may not be desirable, as the
this often exposes the addresses of the subscribers. The subscribers, while
happy to discuss their work on a peer list, may not appreciate messages
from the general public asking for follow-ups to messages posted to the list.
Ezmlm lists, by default(*), are set up with a ``X-No-Archive: yes'' header.
For older lists or lists using ezmlm alone, just add this header to
Well-behaved archiving servers respect this. If you want to maintain full
control, the only recourse is to make the list subscription moderated(*).
Of course, the messages are no more ``secure'' than the least reliable
Like other list changes, you can use ezmlm-make with the ``-e'' edit switch
together with other desired switches and arguments. An existing list can be
made message moderated with:
|/bin/echo -- "$SENDER" |/usr/bin/grep -iv 'badname@badhost' || exit 99
To add remote administration, add the ``-r'' switch. To add subscription
moderation, add the ``-s'' switch.
The archive is a set of files, one per message, kept in the archive
subdirectory of the list directory. The directory archive/0/
contains messages 1-99, archive/1/ messages 100-199, etc. The files
within the directories are named by the last 2 digits of the message
number, ``01-99'' for archive/0/ and ``00-99'' for others. In
addition, each set of messages is indexed(*) in the file index
stored with the corresponding message files.
With time, the archive grows and it may become necessary to remove
some messages. When the list is at message ``12301'' one may wish to
remove messages 1-9999 from the archive. Easiest is to remove messages
as entire subdirectories. For the above, do:
% ezmlm-make -em DIR
The ``dir'' here is the list directory. (You may be able to combine
the ``gzip'' action with the ``tar'' command by adding the ``z'' switch.)
Save listarch1_9999.tar.gz in a safe place. (Usually, you would
choose a better name for the backup ``tar'' file).
Nothing else needs to be done. If
instead you remove individual messages and use ezmlm-idx, it is useful, but not
necessary to do:
% cd ~/
% tar -cvf listarch1_9999.tar DIR/archive/? DIR/archive/1?
% gzip listarch1_9999.tar
% rm -rf ~/DIR/archive/? ~/DIR/archive/1?
to re-index the archive. (For a large archive on a slow machine, this command
may take a few minutes.)
To restore the messages saved in the example above to the archive, simply:
% ezmlm-idx ~/dir
Re-indexing the archive (as shown) is recommended, since the format
for the index file may have been changed if ezmlm was upgraded
since the backup.
% cd ~/
% gunzip listarch1_9999.tar.gz
% tar -xvf listarcg1_9999.tar.gz
% ezmlm-idx ~/dir