This mailing list manager has been designed to allow control and operate like the most commonly used mailing lists on the Internet today, namely Listserv and Majordomo. While it only has a subset of their features (specifically that subset which is possible when you don't store an archive of your list messages locally), what it has should operate as users of those types of lists expect.
In addition, it has configuration to allow adaptation to the future trends in mailing lists such as special mailing list routing options in the header. Since these aren't fully known now, a general method has been implemented to handle them as they occur. Examples will follow:
There is NO IPAD.CTL configuration to use mailing lists. The only configuration occurs in the MAIL_AUTH file, using the new LIST and LISTMNGR commands.
You define a mailing list using the LIST command as follows:
LIST <address> <ctl_file>
You define the access to the list manager (where email is sent to subscribe, unsubscribe, etc.) as follows:
LISTMGR <address> LIST=<ctl_file>
Users have three control options through the list manager:
Messages addressed to a LISTMGR address are processed by looking for one of the control verbs in either the Subject: field or the body of the message. Note: You can define the text for these control verbs in the LIST configuration file as described below.
An alternate form of the LISTMGR command allows a general
manager
entry point that can manage multiple lists. This form
is:
LISTMGR <address> GROUP=<grp_file>
LIST=<address> <ctl_file>
which specifies the address of the list and its list control file. Note: A Group control file also accepts the commands:
As for a list control file to define the action verbs as you wish.
It also accepts the commands:
To define the response to a help request with no list named or a request with no invalid inputs.
A group file enables multiple lists to be managed by a single list manager. Note that in this mode, several list commands can be handled in a single message (no more than one per line). Commands are the manager command verb followed by the list address that it should apply to. For example:
Two lists are defined as:
The body of a message to a GROUP manager could say:
And both requests would be honored.
The mailing list <ctl_file> defines the behavior of a mailing list and contains records (one per line) of the form:
<verb>=<setting>
The commands and their meaning are:
ERRORS-TO=<address> Defines the address where errors should be sent (bounce messages, etc.) This should be an address a human monitors so that the list can be properly updated when errors occur.
REPLY-TO=<address> The address where standard replies should go. Generally this will be the address of the list, but it could also be a moderator address.
NAME=list name
A text string that is the name of the
list. If it is more than one word, it should be enclosed in quotes.
HEADER=<hdrline> An RFC-822 header line that should be replaced in the original message if present, or added to the message if not present.
Example:
Will place the X-Mailer line in the header of each list message sent out, while deleting any X-Mailer: line in the received message.
TYPE=<keyword>
ADDRESSES=<filename>
<filename> is the fully qualified name of the file where the addresses of list members will be found. Each address is listed on a separate line.
Note: Any address listed with a +
as the first
character is ignored.
If the list is TYPE=RESTRICTED, then names with a +
are
not in the list, but ARE allowed to subscribe. In a restricted list, an
unsubscribe adds a +
to a name rather than delete it, so
a member can unsubscribe for a while and then re-subscribe.
If the list is TYPE=MEMBERS or TYPE=ACCEPT_ALL, then names with a
+
are not in the list AND they are NOT ALLOWED TO
SUBSCRIBE.
A line with the word CLOSED
(without quotes) is special
in the addresses file. If a CLOSED line is found in the file, those
members ABOVE the line are considered full members, while those below the
line are not. A message sent to the list is NOT sent to members BELOW the
CLOSED line UNLESS it originated from one of the full members above the
line. Messages from members BELOW the CLOSED line WILL be sent to all full
members ABOVE the CLOSED line but no on else. In effect, names above the
closed line are moderators of the list. Note: The effect of CLOSED is the
same regardless of list TYPE=.
HELP_FILE=<filename> <filename> is the fully qualified name of an ASCII text file to which is sent as a response to a LISTMGR help request message.
WELCOME_FILE=<filename> <filename> is the fully qualified name of an ASCII text file which is sent as a response welcoming new subscribers to a mailing list.
REMOVE_FILE=<filename> <filename> is the fully qualified name of an ASCII text file which is sent as a response when a person successfully removes themselves from a mailing list.
INVALID_FILE=<filename> <filename> is the fully qualified name of file to send when a person sends a LISTMGR a request that doesn't have any known keywords in it. A LISTMGR keyword can appear anywhere in the Subject: line or the body of the message, but no valid one appeared there so this file is sent as a response.
SUBSCRIBE=<keyword> <keyword> defines a valid string in a submitted control message which means the user wants to subscribe to a list. This command allows you to defined this keyword. The SUBSCRIBE command may appear as many times as you wish, to define synonyms for subscribe.
UNSUBSCRIBE=<keyword> <keyword> defines a valid string in a submitted control message which means the user wants to unsubscribe from a list. This command allows you to defined this keyword. The UNSUBSCRIBE command may appear as many times as you wish, to define synonyms for unsubscribe.
HELP=<keyword> <keyword> defines a valid string in a submitted control message which means the user wants help information for a list. This command allows you to defined this keyword. The HELP command may appear as many times as you wish, to define synonyms for help.
The following example defines the IPAD owners mailing list. The list is to respond to the email address:
ipadowners@example.com
MAIL_AUTH Configuration:
ipadown.ctl Configuration:
IPAD Owners Mailing List
ipadown.lst contents:
Only members may issue a subscribe request for the list. By default (if no ALLOW= verbs are present in a list control file) the membership is ALLOW=*@* (everyone is a member).
Wildcards here operate with the same rules as in the MAIL_AUTH file. If a non-member attempts to subscribe (i.e., their email address does not match an ALLOW= statement in the list control file) the subscribe request will be rejected.
Notes: The interaction of ALLOW= and TYPE= on list actions is:
+indicating currently inactive).
semi-restrictedlist which is open, but only to certain email addresses.
Example:
ALLOW=*@example.com
This would allow bhartman@example.com to subscribe, but would not allow bhartman@lab.example.com to subscribe.
This would allow anyone in domain example.org (including sub-domains), anyone at top level example.net or sub-level extra.example.net and the single address phil@example.com to subscribe.
These are items that have been seen in the ipadowners@example.com mailing
list and probably are inappropriate for general distribution. Certainly
the Return-receipt-to:
line is inappropriate as Steve
Sherwick will attest!
Note, as is the case with HEADER=, the following header fields cannot be stripped or modified:
While on the subject, it probably also makes sense to have a minimum number of header lines that get exchanged out. These should include:
Replace listserver@example.com and listname@example.com with the things that are appropriate for your list. The last four header lines implement what is currently a draft specification for mailing list header lines that make it easier for mere mortal end users to use mailing lists. The theory is that someone can click on a URL to do various functions with the mailing list (the four functions shown in the case of an IPAD). There will probably be mail clients out in the future which will put buttons on the toolbar for these functions if the proper header lines are found in the message (David Harris, author of Pegasus Mail has pledged to implement some sort of client side implementation as an example).
Internal POP mail.
MLST msg generationwill appear in the client/server portion of the console screen.
compiledto a temp file with a RAM index, and the actual MAIL_AUTH file is not scanned. If the MAIL_AUTH file is changed (seen by the IPAD as a change in its date/time from the compiled version) then the new file will be dynamically re-compiled on the next email access.
This change has the following good effects:
1. It makes looking things up in MAIL_AUTH be MUCH faster than before. The result is that REJ*, DIS*, BAD* records no longer impact system email performance very much at all and POP3 login is extremely rapid regardless of the order or size of the MAIL_AUTH file.
2. On systems that are very busy with email, updating the MAIL_AUTH file is now not only possible but easy. The update should be accomplished via FTP or CIFS as follows:
a. Copy in the new MAIL_AUTH file under a temporary name.
b. Delete the current MAIL_AUTH file.
c. Rename the new MAIL_AUTH file to the real name.
Note: The indexing of MAIL_AUTH takes approximately 25K of memory for each 500 records. This makes it even more important that older IPADs have at least 8MB of RAM installed. The first MAIL_AUTH lookup will take slightly longer than before because the MAIL_AUTH file has to be compiled into a temp file. After that, lookups are DRAMATICALLY faster.
Note: If you delete MAIL_AUTH, the IPAD continues to use the last one it compiled until a new MAIL_AUTH file shows up. This is why the above update method works cleanly.
COPY <name> <copyto>
<name> and <copyto> can have wild cards with the same rules as REDIR. The copy is placed in the IPAD outbound mail directory and sent via SMTP so it may go anywhere, not just to local POP boxes or inbound UUCP gateway directories.
NOTE: COPY will only make a single COPY, and it will only trigger on the TO: name of the received message. That is, a COPY will not be activated by the target address of a REDIR verb (this is the same rule described in detail below for pass-thru responders).
Example:
Any message received by pbecker@example.com is placed in the POP box and
a copy of it is generated and mailed to
phil@example.net
.
Note: If you generate a COPY loop, it will make 5 copies and then
stop with a cannot route email
error message just like
any other routing loop does.
RESP <name> [d:[\path\]file[.ext]] [PASS_THRU | DEAD_END]
The default option is DEAD_END if neither is specified, for backward
compatibility. If PASS_THRU is chosen, the responder is no longer a
destination
for the message, but rather becomes an acknowledgment
of the message's handling. The response file is sent out as a message the
same as with a DEAD_END responder, but rather than discard the message and
end processing, the message is routed as if the RESP command didn't exist.
This allows several new capabilities for example:
Keeping the messages sent to an auto-responder:
This same structure becomes a notification mechanism as well:
Using REDIR with PASS_THRU responders
The introduction of pass-thru responders creates many interesting ways
to tie things in knots
when combined with REDIR, and I've
made some rules I think are easy to understand to resolve these
situations. Let me first create an example using a sample MAIL_AUTH
file:
Example: A message is sent to sales@example.com.
The desired result is for the sender to receive the
thankyou.txt
file which tells him he will get a response
from a salesman and maybe gives him directions to the web site, to
info@example.com for lots of info, etc.
Then his message should be redirected to Joe Green's mailbox for handling.
However, Joe has gone on vacation, and has put a responder on his mailbox to say he'll be back next week and his mail is being handled by me. And he has re-directed his mail to me.
The problem: The user who sent mail to sales@example.com wouldn't understand hearing that Joe was on vacation, he just needs to know that someone will call as per the normal sales responder. But if someone sends mail directly to jgreen@example.com, they WILL want to know that Joe is on vacation, since it may be part of some discussion I don't know about and can't handle until Joe returns. And in no case do they want the response that I got the message and will be back to them within 24 hours!
To address these issues I've made ONE rule about pass_thru responders and redirection as follows:
Note that DEAD_END responders will trigger whenever they are hit, via
a REDIR or not as always. They don't create these problems. I think that
this rule will make PASS_THRU responders tame
enough to
allow them into the world at large and not cause mail storms of multiple
responses to a single message.