[LISTSERV logo] [Online documentation]

L-Soft international, Inc.

Site Manager's Operations Manual

for

LISTSERV®, version 1.8d

5 May 2000

Revision 2


The reference number of this document is 0005-MD-01 .

Information in this document is subject to change without notice. Companies, names and data used in examples herein are fictitious unless otherwise noted. L-Soft international, Inc. does not endorse or approve the use of any of the product names or trademarks appearing in this document.

Permission is granted to copy this document, at no charge and in its entirety, provided that the copies are not used for commercial advantage, that the source is cited and that the present copyright notice is included in all copies, so that the recipients of such copies are equally bound to abide by the present conditions. Prior written permission is required for any commercial use of this document, in whole or in part, and for any partial reproduction of the contents of this document exceeding 50 lines of up to 80 characters, or equivalent. The title page, table of contents and index, if any, are not considered to be part of the document for the purposes of this copyright notice, and can be freely removed if present.

The purpose of this copyright is to protect your right to make free copies of this manual for your friends and colleagues, to prevent publishers from using it for commercial advantage, and to prevent ill-meaning people from altering the meaning of the document by changing or removing a few paragraphs.

Copyright © 1996-2000 L-Soft international, Inc.

All Rights Reserved Worldwide.

L-SOFT, LISTSERV and LSMTP are a registered trademarks of L-Soft international, Inc.
LMail is a trademark of L-Soft international.
EASE and CataList are service marks of L-Soft international, Inc.
UNIX is a registered trademark of X/Open Company Limited.
AIX and IBM are registered trademarks of International Business Machines Corporation.
Alpha AXP, Ultrix, OpenVMS and VMS are trademarks of Digital Equipment Corporation.
OSF/1 is a registered trademark of Open Software Foundation, Inc.
Microsoft is a registered trademark and Windows, Windows NT and Windows 95 are trademarks of Microsoft Corporation.
HP is a registered trademark of Hewlett-Packard Company.
Sun is a registered trademark of Sun Microsystems, Inc.
IRIX is a trademark of Silicon Graphics, Inc.
PMDF is a registered trademark of Innosoft International.
Pentium and Pentium Pro are registered trademarks of Intel Corporation.
All other trademarks, both marked and not marked, are the property of their respective owners.

All of L-Soft's manuals for LISTSERV are available in ascii-text format via LISTSERV and in popular word-processing formats via ftp.lsoft.com. They are also available on the World Wide Web at the following URL:

http://www.lsoft.com/manuals/index.html

L-Soft invites comment on its manuals. Please feel free to send your comments via e-mail to MANUALS@LSOFT.COM, and mention which manual you are commenting on. (However, please do not send support questions to this address. See chapter 19 of this manual for appropriate support addresses.)

"Hot fix" revisions to this and other L-Soft manuals are posted as they are made to the master document, on the announcement-only mailing list:

LSOFT-DOC-UPDATES@PEACH.EASE.LSOFT.COM

Reference Number 0005-MD-01


Table of Contents

Preface: LISTSERV Command Syntax Conventions

1. Who should read this book

1.1. Changes in this edition of the manual

2. Differences Between Architectures and Implementations

2.1. Differences between architectures
2.2. Differences between LISTSERV and LISTSERV Lite

3. Principles of Operation

4. How your organization can use LISTSERV® to its benefit

4.1. A practical example: Mike’s Bikes

5. Configuring your LISTSERV® site

5.1. Site configuration files
5.2. What can be configured?
5.3. Files used by LISTSERV
5.4. Installing and configuring LISTSERV's WWW Archive Interface 5.4.1. The WWW Archive Interface described
5.4.2. The WWW Administration Interface described
5.4.3. Installing a web server
5.4.4. Installing the web archive interface script
5.4.5. Creating a subdirectory for the archive interface
5.4.6. Configure LISTSERV to activate the web archive interface
5.4.7. Customizing the web pages LISTSERV creates
5.4.8. Enabling individual lists
5.4.9. Enabling web-based bulk operations
5.5. The "spam" detector 5.5.1. Spam quarantine
5.5.2. "Anonymous" spam alerts
5.6. Server Registration 5.6.1. Registering LISTSERV Classic Servers
5.6.2. The LISTSERV backbone
5.6.3. Automatic Registration for LISTSERV Lite Servers
5.7. Inter-server Updates
5.8. Setting up directories for use with LISTSERV
5.9. DBMS and Mail Merge Functions
5.10. Synonymous host name registration via ALIASES NAMES

6. LISTSERV Commands

6.1. General Commands
6.1.1. List subscription commands (from most to least important)
6.1.2. Other list-related commands
6.1.3. Informational commands
6.1.4. Commands related to file server and web functions
6.1.5. Other (advanced) commands
6.2. List Owner and File Owner Commands 6.2.1. File management commands (for file owners only)
6.2.2. List management functions
6.3. LISTSERV Maintainer Commands

7. Creating and Maintaining Lists

7.1. Basic list creation
7.2. Architecture-Specific Steps for List Creation
7.2.1. Unix: Creating required Sendmail aliases
7.2.2. OpenVMS: Creating required PMDF aliases
7.3. A sample checklist for creating lists
7.4. Naming Conventions
7.5. List Header Keywords and what they do
7.6. Retrieving and editing the list - some considerations
7.7. Adding a list password (obsolete since 1.8c)
7.8. Storing a modified list on the host machine
7.9. Fixing mistakes
7.10. A sample list header file
7.11. Deleting a list
7.12. Adding HTML to a list header for the CataList
7.12.1. Update latency
7.12.2. Inserting a pointer to another list
7.12.3. Restrictions on the placement of equal signs
7.13. How to set up lists for specific purposes
7.13.1. Public discussion lists
7.13.2. Private discussion lists
7.13.3. Edited lists
7.13.4. Moderated lists
7.13.5. Semi-moderated lists
7.13.6. Self-moderated lists
7.13.7. Auto-responders
7.13.8. Announce-only lists
7.13.9. Restricted subscription lists with automatically-generated questionnaire
7.13.10. Peered lists
7.13.11. "Super-lists" and "sub-lists"
7.13.12. "Cloning" lists
7.14. Merging existing LISTSERV lists
7.14.1. Merging list A into list B; list A user options not preserved
7.14.2. Merging list A into list B; list A user options preserved
7.14.3. Merging list A and list B into list C
7.15. Migrating lists from one site to another
7.15.1. Migrating lists from one LISTSERV site to another LISTSERV site
7.15.2. Migrating lists from non-LISTSERV sites
7.15.3. Migrating lists from Sendmail alias files, databases, etc.
7.16. Changing the name of an existing list
7.17. Bulk operations (ADD and DELETE)
7.17.1. Bulk ADD operations
7.17.2. Bulk DELETE operations

8. File and Notebook Archives

8.1. What is the file archive?
8.2. Starting a file archive for your list
8.3. Filelist maintenance (VM systems only) 8.3.1. Creating a filelist
8.3.2. Adding FAC codes
8.3.3. Retrieving the filelist
8.3.4. Adding file descriptors to the filelist
8.3.5. File Access Codes (FAC) for user access
8.3.6. Deleting file descriptors from the filelist
8.3.7. Storing the filelist
8.4. The listname.CATALOG system on non-VM systems 8.4.1. Adding files to the SITE.CATALOG
8.4.2. Delegating file management authority
8.4.3. Creating a sub-catalog
8.4.4. Updating the sub-catalog
8.4.5. Indexing the sub-catalog
8.5. Storing files on the host machine
8.6. Deleting files from the host machine
8.7. Automatic File Distribution (AFD) and File Update Information (FUI)
8.8. File "Packages"
8.9. Where to find more information on File Archives
8.10. Notebook Archives 8.10.1. Setting up notebook archives for a list
8.10.2. Migrating old notebook archives to a new site (LISTSERV to LISTSERV)
8.10.3. Migrating old notebook archives (non-LISTSERV to LISTSERV)
8.10.4. Deleting old notebook archives
8.10.5. Indexing existing notebook archives

9. Creating and Editing LISTSERV's Mail and Web Templates

9.1. What LISTSERV uses templates for
9.2. The default template files and how to get copies
9.3. Mail template format and embedded formatting commands 9.3.1. 8-bit characters in templates 9.4. Creating and editing a <listname>.MAILTPL file for a list 9.4.1. The INFO template form
9.4.2. Other available template forms
9.4.3. Tips for using templates
9.5. Storing the <listname>.MAILTPL file on the host machine
9.6. Other template files: DIGEST-H and INDEX-H
9.7. Templates and template forms for the WWW interface 9.7.1. Forms contained in DEFAULT MAILTPL
9.7.2. The www_archive.mailtpl file (optional)
9.7.3. The default.wwwtpl file
9.7.4. The site.wwwtpl file (optional)
9.7.5. National language template files (idiom.mailtpl) (optional)
9.7.6. Template precedence
9.8. Using the DAYSEQ(n) function 9.8.1. Rotating bottom banner
9.8.2. Rotating FAQ via the PROBE1 template and "Renewal= xx-Daily" 9.8.3. Calculating the value for DAYSEQ()
9.9. Modifying the output of LISTSERV's HELP command (non-VM)
9.10. The $SITE$.MAILTPL file

10. Interpreting and Managing LISTSERV's log files

10.1. Logs kept by LISTSERV
10.2. Managing the logs
10.3. Interpreting the LISTSERV log 10.3.1. Expiring cookies
10.3.2. Releasing and reallocating a disk slot
10.3.3. Reindexing a list
10.3.4. Distributing a digest
10.3.5. Daily error monitoring reports
10.3.6. Processing mail for local lists
10.3.7. Administrative mail (X-ADMMAIL)
10.3.8. DISTRIBUTE jobs from remote hosts
10.3.9. Requesting "OK" confirmation for commands
10.3.10. Subscription summary updates (SUPD jobs)
10.3.11. Global list of lists updates (LUPD jobs)
10.3.12. Valid "OK" confirmation received
10.3.13. Invalid "OK" confirmation received
10.3.14. User is already subscribed to a given list
10.3.15. User has included non-command text (e.g., a .sig file) in his mail to LISTSERV
10.3.16. Response to list owner or LISTSERV maintainer commands
10.3.17. Response to a user who tries to post to a held list (or one for which PRIMETIME is in effect)
10.3.18. Command forwarded via GLX from another host
10.3.19. Netwide DELETE (X-DEL jobs)
10.3.20. FIOC cache notifications
10.3.21. Web archive/administration interface logging (starting with 1.8d) 10.3.22. X-SPAM jobs 10.3.23. X-TBREG jobs 10.3.24. Responses to LVMON@VM.SE.LSOFT.COM
10.4. Interpreting the SMTP logs (Windows servers only)
10.5. Interpreting the SMTP "worker" log entries (non-VM only)
10.6. Change logs
10.7. Using LISTSERV logs and SHOW CTR to extract server statistics 10.7.1. Sample log-processing scripts
10.7.2. Interpreting the output of SHOW CTR

11. Using the Web Adminstration Interface

11.1. Default LISTSERV Home Page
11.2. Logging in
11.3. Setting a LISTSERV password
11.4. The List Management main page
11.5. Maintaining subcriptions via the web
11.5.1. Examine or delete a subscription
11.5.2. Add a new user to the list
11.6. Maintaining the list header via the web
11.7. Customizing how a list's pages look
11.8. Maintaining mail and WWW templates via the web
11.9. Bulk operations via the web
11.10. Sending interactive commands via the web
11.11. Mail merge
11.12. Server administration interface

12. Distribution Features and Functions

12.1. Controlling the default level of acknowledgement to user postings
12.2. Controlling the maximum number of postings per day 12.2.1. Controlling total postings to the list per day
12.2.2. Controlling the number of postings per day from individual users
12.3. Controlling "prime" time
12.4. "Holding" and "freeing" a list 12.4.1. Automatic list holds
12.4.2. Manual list holds
12.5. Controlling the list digest feature
12.6. Setting up list topics 12.7. Allowing/Blocking MIME Attachments

13. Error Handling Features and Functions

13.1. Defining list-level error handling addresses
13.2. The auto-deletion feature
13.3. LISTSERV's loop detection feature 13.3.1. The anti-spamming filter 13.4. RFC822 mail header parsing
13.5. Address Probing 13.5.1. Active address probing
13.5.2. Passive address probing 13.5.3. OS-specific issues with probing
13.6. Defining server-level error handling addresses 13.6.1. BOUNCES_TO=
13.6.2. Crash reports and CRASH_MONITOR=

14. List Maintenance and Moderation Features and Functions

14.1. Setting up edited/moderated mailing lists
14.2. Restricting the size of messages posted to the list
14.3. Restricting the number of posts per user per day
14.4. Moving a list to a new location: the New-List= keyword

15. Security Features and Functions

15.1. First line of defense: The VALIDATE= keyword
15.2. Controlling subscription requests
15.3. Controlling the service area of the list
15.4. Controlling who may review the list of subscribers
15.5. Controlling who may access the notebook files
15.6. Controlling who may post mail to the list
15.7. The "OK" confirmation mechanism
15.8. Denying Service to Problem Users 15.8.1. The "Filter=" list header keyword
15.8.2. The "FILTER_ALSO" configuration file variable
15.8.3 The "SERVE" command
15.8.4. The POST_FILTER list exit point
15.9. Hiding selected header lines
15.10. Tracking subscription changes with the Change-Log keyword

16. Subscription Features and Functions

16.1. Setting up subscription confirmation
16.2. Defining default options for subscribers at subscription time
16.3. Setting up subscription renewal

17. Other Features and Functions

17.1. Setting up national language mail templates
17.2. Translating control characters included in list mail
17.3. Communicating with list owners 17.3.1. The listname-REQUEST alias
17.3.2. The ALL-REQUEST alias
17.3.3. Configuration required for unix servers and VMS servers running PMDF
17.3.4. Other aliases used by LISTSERV

18. Special Functionality for ISP's

18.1. Directory quotas for individual lists 18.1.1. The QUOTA.FILE
18.1.2. Displaying quota information
18.1.3. Reloading quota information after making changes
18.2. Limiting the number of subscribers to a list

19. Contacting L-Soft

19.1. Support
19.2. Sales
19.3. Manuals

Appendix A: Command Reference Card for LISTSERV® version 1.8d

Appendix B: List Keyword Reference for LISTSERV® version 1.8d

Appendix C: Site Configuration Keyword Reference

Appendix D: Sample Boilerplate Files

Appendix E: Related Documentation and Support

Appendix F: Acknowledgements


List of Tables and Figures

Table 5.1. LISTSERV site configuration variables
Figure 6.1. Sample output of an INDEX listname command.
Figure 7.1. A sample list header.
Figure 7.2. A sample list header file for a list called MYLIST.
Figure 7.3. The edited list header file ready to be sent back to the server.
Figure 8.1. Sample filelist retrieved with (CTL option.
Figure 8.2. Adding a file descriptor to the filelist
Figure 8.3. This output will appear either if an attempt is made to change "Notebook= No" to "Notebook= Yes", or if an attempt is made to change the location where notebook archives are stored on the server, by anyone who is not a LISTSERV maintainer.
Figure 9.1. The default contents of the INFO template form of DEFAULT.MAILTPL.
Figure 9.2. Sample edited INFO template form.
Figure 9.3. Typical contents of a DIGEST-H or INDEX-H file.
Figure 9.4. Sample DIGEST output for a list with a DIGEST-H file. The INDEX-H output would be similar, following the list of postings.
Figure 10.1. Sample CLEANLOG.REXX script for managing LISTSERV's log files. This particular script runs under Regina REXX on Windows NT or 95.
Figure 10.2 Typical SMTP log for the SMTPL.EXE "listener"
Figure 10.3 Typical SMTPS log for the SMTPW.EXE SMTP "workers"
Figure 13.1. A typical daily error monitoring report.
Figure 13.2. Sample RFC822 parser error.
Figure 15.1 The editor-header for a list set to Send= Editor,Hold
Figure 15.2. A typical command confirmation request.
Figure 16.1. Typical daily subscription renewal monitoring report.
Figure 18.1. Typical output of a SHOW QUOTA command issued by privileged user
Table B.1. LISTSERV list-level commands and how they are affected by Validate=.

Preface: LISTSERV Command Syntax Conventions

Generally, parameters used in this document can consist of 1 to 8 characters from the following set:

A-Z 0-9 $#@+-_:

Deviations from this include:

fformat Netdata, Card, Disk, Punch, LPunch, UUencode, XXencode, VMSdump, MIME/text, MIME/Appl, Mail
full_name first_name [middle_initial] surname (not your e-mail address)
listname name of an existing list
node Either: the fully-qualified domain name (FQDN) of an Internet host; or the BITNET nodeid or Internet hostname of a BITNET machine which has taken care of supplying an ':internet' tag in its BITEARN NODES entry;
host Generally the same as node, but normally refers specificallly to the fully-qualified domain name (FQDN) of an Internet host rather than to a BITNET nodeid.
pw a password containing characters from the set: A-Z 0-9 $#@_-?!|%
userid Any valid RFC822 network address not longer than 80 characters; if omitted, the 'hostname' part defaults to that of the command originator

Other deviations from the standard set will be noted along with the affected commands.

Also please note the following conventions for representing variable or optional parameters:

italic type always indicates required parameter names that must be replaced by appropriate data when sending commands to LISTSERV
< > Angle brackets may sometimes enclose required parameter names that must be replaced by appropriate data when sending commands to LISTSERV. Sometimes used for clarity when italic type is inappropriate
[ ] Square brackets enclose optional parameters which, if used, must be replaced by appropriate data when sending commands to LISTSERV


1. Who should read this book

This manual makes the following assumptions:

In other words, we expect you already to be knowledgeable about the system on which you plan to install and run LISTSERV.

L-Soft international’s LISTSERV software is designed to run on various platforms that have widely-differing configurations. Therefore it is not within the scope of this manual to describe in detail (for instance) how you can tune sendmail 8.7.3 under Linux for optimum performance with LISTSERV. However, general tips that could work on all systems will be offered within these pages.

Overall you will find that LISTSERV works much the same way on a unix workstation or a VMS minicomputer or an Intel Pentium machine running Windows NT as it has for years on VM mainframes. Where LISTSERV procedures do differ between platforms, we will detail those differences in order to minimize confusion.

1.1. Changes in this edition of the manual

Due to the fact that the manual was getting quite hefty, it was decided to move certain parts of the book into a separate Developer's Guide for LISTSERV, which will be available as a companion volume to the Site Manager's Operations Manual. Information about the database functions, CJLI "Commands-Jobs", DISTRIBUTE, and list exits which was formerly part of this manual is now contained in the Developers Guide.

Other changes are documented in the Revision History, found at the end of the book.


2. Differences Between Architectures and Implementations

This chapter outlines differences between how LISTSERV is implemented on VM and non-VM machines, and the differences between LISTSERV and LISTSERV Lite.

2.1. Differences between architectures

In version 1.8d, LISTSERV running under VM differs in some regards from its counterparts on the other architectures. Here is a short list of these differences:

However, note that 1.8d running on non-VM systems actually has about 98% of the functionality of the VM version, and nearly 100% of the functionality that people actually use day-to-day.

The File Server

There are actually two different file server systems in operation across the LISTSERV network. One is the original version running on VM, which includes the ability to create "filelists" (indexes) which point in turn to more files which can be stored on the server, and the AFD and FUI functions mentioned above. This file server system, while still quite powerful and easy to use, is unfortunately written in a non-portable language, making a complete rewrite from the beginning a necessity. There has been no change in the VM file server from 1.8b through 1.8d.

The second file server system currently in operation runs on the VMS, unix, and Windows ports of LISTSERV. This is in essence still a subset of the old system in which the LISTSERV maintainer creates entries in a SITE.CATALOG file for each file that will be made available to users. With the release of 1.8c, it became possible for the LISTSERV maintainer to create sub-catalogs, which can be maintained by list owners or other responsible people. 1.8d adds the GIVE command and the ability to create file "packages" to the non-VM versions. For more information, please see chapter 8 of this manual.

L-Soft is still developing LISTSERV's file server, which will eventually include a super-set of the original VM file server command set. Complete details are not available as of this writing, but pains are being taken to ensure that the most common commands will not change along the development path. This will help to keep a great deal of existing documentation that has been passed along the Internet from becoming obsolete overnight. The fully-developed file server will also include AFD (Automatic File Distribution) and FUI (File Update Information) in addition to other new functionality.

The WWW List Archive Search Interface

Prior to Version 1.8d, the lack of named pipes in Windows 95 kept the web-based Search function from working. L-Soft has found a satisfactory workaround for this and the web-based search functionality is now available in LISTSERV Classic Version 1.8d for Windows 95 along with all of the other ports of LISTSERV Classic. (The Search function is not available in any port of LISTSERV Lite.)

Year 2000 Compliance

Year 2000 compliance is addressed in L-Soft's Year 2000 Compliance FAQ, which can be viewed at http://www.lsoft.com/corporate/default.asp?item=y2k .

2.2. Differences between LISTSERV and LISTSERV Lite

LISTSERV Lite is LISTSERV running with a special license activation key (LAK) which is both free and perpetual, but is limited in its scope. With the Free Edition of LISTSERV Lite, you can run up to 10 mailing lists as long as you do not derive a profit from this activity. Note also that LISTSERV Lite does not have all of the functionality of a full version--a list of the keywords and functions disabled in LISTSERV Lite follows this paragraph. For more information on the exact terms and conditions under which you may run LISTSERV Lite, please see L-Soft's World Wide Web site or contact L-Soft's sales department.

LISTSERV Classic Keywords disabled in LISTSERV Lite

Change-Log Confirm-Delay DBMS Default-Topics
Editor-Header Exit Files Indent
Internet-Via Language List-Address List-ID
Local Long-Lines Loopcheck Mail-Merge
Mail-Via Moderator New-List Newsgroups
NJE-Via Peers Prime Renewal
Sender Service Sizelim Stats
Sub-Lists Topics X-Tags    

Note: the fact that the keyword is disabled only means that the default value cannot be changed. For instance, loop checking is still present, you just cannot control the details of its operation. On the other hand, if the default value is that the function in question is disabled (as is the case with "Peers="), then the function is actually gone. See Appendix B for more information on keyword defaults.


3. Principles of Operation

LISTSERV® is a system that allows you to create, manage and control electronic "mailing lists" on a corporate network or on the Internet. Since its inception in 1986 for IBM mainframes on the BITNET academic network, LISTSERV has been continually improved and expanded to become the predominant system in use today. LISTSERV is now available for VM, VMS™, unix® and Windows NT™, and has been released as shareware for Windows 95™.

Consider for a moment what the users of your electronic mail system actually use electronic mail for. Do they discuss problems and issues that face your organization, down to the departmental level? In an academic setting, do your faculty and students communicate via electronic mail? As with "real world" distribution lists, electronic mailing lists can make it possible for people to confer in a painless manner via the written word. The electronic mail software simply replaces the copying machine, with its associated costs, delays and frustrations. In fact, electronic mail lists are easier to use than most modern copiers, and a lot less likely to jam at just the worst possible moment.

Because electronic mail is delivered in a matter of seconds, or occasionally minutes, electronic mailing lists can do a lot more than supplement the traditional paper distribution lists. In some cases, an electronic mailing list can replace a conference call. Even when a conference call is more suitable, the electronic mailing list can prove a powerful tool for the distribution of papers, figures and other material needed in preparation for the conference call. And, when the call is over, it can be used to distribute a summary of the discussion and the decisions that were made. What before might have been an exchange of views between two or three people can now become an ongoing conference on the issue or problem at hand. Announcement lists and even refereed electronic journals can be made available to your audience, which can be as small as a few people or as large as the entire Internet community.

LISTSERV accomplishes its design goals very efficiently and very quickly. This is due primarily to its use of the proprietary DISTRIBUTE algorithm (described in RFC1429, and in the Developer's Guide for LISTSERV, available separately) and to the large (and growing) network of LISTSERV servers.

The LISTSERV network of servers helps to enhance LISTSERV's performance by providing a "backbone" through which large quantities of mail can be quickly distributed. The backbone also allows LISTSERV servers to "talk" to each other and exchange information. Among other things, this exchange of information between servers allows your own local server to participate in the global List of Lists service and L-Soft's CataList service on the World Wide Web (just point a web browser at http://www.lsoft.com/catalist.html to use the CataList service).

LISTSERV's nature as a distributed network of interconnected servers also makes it possible to identify and eliminate unsolicited advertisements sent to multiple lists (known colloquially as "spams") before they do much harm. While it is virtually impossible for a small isolated server to detect a spam (unless the sender listed the thousands of lists he was targeting in the "To:" field), for the simple reason that it will only ever receive a few copies for its own public lists, the LISTSERV network as a whole receives thousands of copies of the spam. By comparing notes with each other, the servers can quickly determine that a spam is occurring and raise a network-wide "spamming alert", stopping the message before it does much damage at all. Since the introduction of LISTSERV's anti-spam technology in version 1.8b, the growing number of sites that are participating in the anti-spamming warnings have virtually stopped the distribution of such messages in their tracks. L-Soft's developers are constantly upgrading and refining the anti-spam algorithms, to the effect that LISTSERV version 1.8d has an even better anti-spam filter than before.

In addition to the anti-spamming filter, LISTSERV also incorporates an anti-spoofing filter, to keep mischevious (and often malicious) users from subscribing other users to mailing lists in order to "mailbomb" them.

LISTSERV makes it possible for you to offer the same mailing list in four different formats:

These modes are set by sending SET commands to LISTSERV. Unlike some other mailing list management systems, LISTSERV does not require the user to unsubscribe from one version of the list and resubscribe to another just to change delivery modes.

LISTSERV includes database search capability for list archive notebooks. A fast reverse indexing feature is available for servers running lists with large archives. Users can use a simple search syntax to comb list archives for specific terms of interest. And L-Soft provides a World Wide Web archive interface (not currently available on VM for technical reasons unrelated to LISTSERV itself) with which the notebook archives for all public lists can be viewed and searched from a web browser. The new WWW interface differs from (and has advantages over) "hypermail" style web archiving in that new postings are shown as soon as they are received; postings can be organized in a manner that best suits the reader; there is no duplication of effort, as the LISTSERV WWW interface works from the list’s notebook archives rather than creating a separate HTML file for each posting; and the list owner can customize the main page for their list by simply modifying their mail template file.

L-Soft has added a number of list and server management functions to the WWW interface for 1.8d, including the ability to edit list headers and associated mail and WWW templates, and to manage subscribers via the Web. See chapter 11 of this manual for details.

Two of the most significant enhancements in version 1.8d of LISTSERV are DBMS and mail-merge support. These new features are documented in the Developer's Guide for LISTSERV, available separately.

Many other enhancements have been introduced in 1.8d. Please see the release notes for complete details at http://www.lsoft.com/manuals/index.html.


4. How your organization can use LISTSERV® to its benefit

Universities that have used LISTSERV for many years can attest to the value of LISTSERV as both an educational and administrative tool. Lately, more and more commercial enterprises have come to realize that LISTSERV can work for them, too.

4.1. A practical example: Mike’s Bikes

How can LISTSERV improve your business? Although hundreds of businesses have used LISTSERV for years, we are ever impressed by the number of creative and new ways that businesses use LISTSERV. Let's follow the fictitious "Mike's Bikes" bicycle company, and see how using LISTSERV increases sales and product visibility, reduces costs and makes a business more efficient.

Public Relations Lists

When Mike first got LISTSERV, his main goal was to increase name recognition for Mike's Bikes, so he set up a few mailing lists that bicycle enthusiasts would want to subscribe to: the Bicycle Travel list, the Bicycle Maintenance list, and the Bicycle Safety list. News of the lists was sent to various bicycle and sports magazines, and before long hundreds of subscribers were exchanging their views and experiences on the three lists. Thousands of letters were distributed by LISTSERV every week, and, best of all, by using LISTSERV's Banner feature, each letter carried the message:

"This list is sponsored by Mike's Bikes; visit our web site at
http://www.bikes.com or call us at 1-800-bicycle for our latest catalog"

Mike also set up a newsletter list for his clients who preferred to receive the Mike's Bikes monthly newsletter, "In Gear" via email. Mike knew that every newsletter he could send out via the list saved him in printing and postage costs, and made the newsletter more convenient for his customers to save and store. Visitors to the Mike's Bikes home page could get on the "In Gear" subscriber list right from the web site. By using LISTSERV, Mike had developed the cutting-edge image he wanted for his company.

Announcement and Product Support Lists

Mike started selling so many bicycles that his customer service telephone line was busy constantly. People wanted catalogs; they wanted information on how to attach the new "Nite-Lite Reflectors" that Mike had mentioned on the Bicycle Safety list (sales were great, but the manufacturer's instructions were lacking); they wanted to know when the next sale was (those reflectors were pricey). The phone bill for all of those 800 number calls was getting out of hand! Mike responded by setting up a Product Announcement List, a New Catalog list, and a Product Support list. Mike made both the Product Announcement list and the New Catalog list "announce only" lists: information could be distributed to these lists only by Mike and his sales team.

The Product Announcement list was for customers who wanted to know immediately about new products and services from Mike's Bikes. People who visited the Mike's Bikes home page on the World Wide Web could ask to be added to the list from the web site. When Mike announced a sale, his customers got the word in minutes, and consequently placed their orders sooner.

The New Catalog list was set up for customers who wanted to have Mike's Bikes catalogs sent to them as soon as they were published. Because the catalogs came by email, customers received them within minutes. In addition, customers could save the catalogs instantly on their computers, and didn't have to be concerned about storing or losing a paper copy. Mike was happy because it reduced the number of his paper catalogs, which meant reduced printing and postage costs for the business. Mike's customers were happier because they could search for specific items with their word processor and find them instantly. The reputation Mike's Bikes got for being an environmentally friendly company didn't hurt, either.

Mike also announced to his Catalog list that a deluxe, full color version of the new catalog, including graphics and hypertext, was now on the Mike's Bikes home page on the World Wide Web, and that anyone who wanted the deluxe version of the catalog on their own PC could retrieve specific chapters by using LISTSERV's file retrieval function.

The Product Support list was set up as a moderated "discussion" list. It worked somewhat like a "Letters to the Editor" page in a magazine: any subscriber could submit mail to the list, but Mike filtered the mail, posting only the letters which best articulated a problem, then answering the letters. Sometimes he sent a copy of the letter to the Bicycle Maintenance list, or included it in the "Letters" section of "In Gear". This way, Mike was able to be proactive about addressing issues he knew would be important to his customers.

File Serving

Mike also wrote his own installation instructions for that problem reflector. He made the file available to anyone who needed it using LISTSERV's file server function, as he had done for his deluxe version of the Mike's Bikes catalog. He posted the simple directions on how to get the file to the Bicycle Maintenance list, the Bicycle Safety list, the Announcement list, and the Product Support list. He also mentioned it in the "In Gear" newsletter and on the web site. When word of this got to a major bicycle magazine, instructions for getting the file and visiting the Mike's Bikes homepage were mentioned in the next issue. Mike's use of LISTSERV in handling the reflector dilemma turned apotential problem into an opportunity to attract new customers and improve public relations.

Internal Lists

Mike's Bikes eventually opened manufacturing plants, branch offices and retail stores all over the world. In order to keep his company connected, Mike set up internal mailing lists. Although these lists sent mail through the Internet, they were concealed lists that only people within the company were aware of. Mike could also set up lists on his Wide Area Network. LISTSERV even worked through his firewall.

Mike set up lists for the sales and marketing divisions, branch managers, the import/export teams, and the regional vice-presidents. The US West Coast division had its own list, as did the South America and Tokyo/Far East divisions. There was even a general staff list that included everyone in the world who was employed by Mike's Bikes.

Product Development Lists

Mike's dream was to develop a "carcycle"--a car/bicycle hybrid which would keep 2-4 peddling passengers protected from rain and cold. A market study had shown that people in Japan and the Netherlands were particularly interested in the carcycle, and Mike was confident that once he built a stronghold in these markets, interest would spread worldwide.

The project had been stalled, however, because the development teams in Chicago, Amsterdam, New Delhi, Singapore and Aqaba had such a hard time coordinating international conference calls and scheduling local meetings. Mike started a "carcycle" list for the team. Each time one of them had an idea for the carcycle, they would send it to the list, knowing that LISTSERV would automatically copy and send the information to the others on the team within minutes. The team became a virtual community, without having to schedule conference calls or meetings, and without geographical restrictions.

File Serving Functions

The plans for the carcycle were in a series of computer files. Everyone on the carcycle list had "read" access to the files and could retrieve them. The head engineers also had "write access" to the files which corresponded to their part of the project, meaning they could make changes to those files. Whenever someone updated a file, they sent a message to the list, so everyone on the carcycle development team would be informed of the change and could get the latest version of the file. Because of the international nature of the teams, development was going on 'round the clock, which sped up the development process considerably. The team was able to concentrate on developing the carcycle instead of faxing photocopies of plans and scheduling meetings.

Although Mike's Bikes is a fictional company, these examples are taken from actual LISTSERV use. LISTSERV helps medical research teams coordinate their work worldwide; software developers use it to develop, beta test and support their products. Promotional and Public Service lists give companies elevated profile and "reach" they strive so hard to maintain. Lobbying lists allow organizations to email form letters to their members, who in turn forward the letters to members of Congress.

Copyright © 1995 by L-Soft international, Inc. Comments and questions may be sent to marketing@lsoft.com.


5. Configuring your LISTSERV® site

Please note that this manual is not intended to replace the individual installation manuals for LISTSERV on the various platforms supported by L-Soft. This is because the installation procedures vary radically from platform to platform and this manual is intended to assist LISTSERV maintainers on operational LISTSERV sites. The installation guides for all platforms are included in the software distributions, and are also available on L-Soft's World Wide Web and FTP sites.

For the purposes of this chapter, therefore, it is assumed that you have already installed LISTSERV on your host computer and have been able to start it in successfully in interactive mode. If you have not reached this point, this chapter will be of little use to you.

5.1. Site configuration files

These files have different names depending on the platform. They are located in the same directory with the executable binaries.

Platform Site configuration file
VM LOCAL SYSVARS
OpenVMS SITE_CONFIG.DAT
Unix (all) go.user
Windows NT SITE.CFG
Windows 95 SITE.CFG

These are the only configuration files that should be changed on any LISTSERV installation. Software upgrades may overwrite any other configuration files located in LISTSERV’s home directory. They will never overwrite the files listed above. The intent is to help preserve your system settings from one version to the next so that you do not experience the inconvenience of having to reconfigure LISTSERV after an upgrade.

L-Soft international, Inc., is not responsible for system downtime or misoperation occassioned by the loss of any changes that you make to configuration files other than the ones listed above.

5.2. What can be configured?

Depending on the platform, a large number of control variables are available to "fine tune" the performance and behavior of LISTSERV. The following table indicates the variables, under which platforms they are supported, and briefly what they control. Please see Appendix C of this manual for details before setting any control variable.

Table 5.1. LISTSERV site configuration variables

Variable

Short Description

VM VMS Unix Win
BITNET_ROUTE

Defines the hostname of a machine that knows how to route mail to BITNET addresses

yes yes yes yes
BOUNCES_TO

Tells LISTSERV where to send bounces not related to any particular list

yes yes yes yes
CHECKMDISK

List of library minidisks to be checked at startup

yes no no no
CMDPIPE_HOSTNAME

Defines the hostname used by the LCMD utility

no yes yes yes
CMSNAME

The name of the CMS system to be used on IPL commands

yes no no no
CRASH_MONITOR

Where to send VMS or NT crash reports

no yes no yes
CREATEPW

The password required to create new lists

yes yes yes yes
DATABASE

Indicates whether the (old) VM database functions are enabled or not

yes no no no
DBRINDEX

Determines whether or not the new LISTSERV database functions use reverse indexing

yes yes yes yes
DEFAULT_LANGUAGE

Sets the default national language template for use by all lists on the server

yes yes yes yes
DEFAULT_PROBE

Sets defaults for passive probing

yes yes yes yes
DEFAULT_SPLIT

Provides a default value for the "SPLIT=" command line keyword

yes yes yes yes
DELAY

The delay between two reader-scan operations

yes no no no
DIAGD4

Indicates whether LISTSERV should use diagnose X'D4' to mimic the RSCS origin on files it DISTRIBUTEs

yes no no no
DIST_ALLOWED_USERS

In 1.8d and following, space-separated list of non-POSTMASTER users who are to be allowed to use DISTRIBUTE

yes yes yes yes
DIST_SECURITY

In 1.8d and following, Boolean value which controls security validation feature for the DISTRIBUTE command. WARNING: See Appendix C before changing this value.

yes yes yes yes
FILEDISK

The filemode of the DEFAULT disk to be used for storing files via a PUT command

yes yes yes yes
FILEMAXL

The maximum number of lines for any incoming non-mail file to be accepted

yes yes yes yes
FILTER_ALLOW

Defines users or classes of users who should be exempt from LISTSERV's standard filter

yes yes yes yes
FILTER_ALSO

Defines users or classes of users who should not be allowed to post to any list on the server.

yes yes yes yes
FIOC_TARGET

Defines (in kilobytes) the "target size" for LISTSERV's file cache.

yes yes yes yes
FIOC_TRIM

Defines (in kilobytes) the threshold at which point LISTSERV should start aggressively trimming the cache.

yes yes yes yes
FIOC_WARNING

Defines (in kilobytes) the cache size at which LISTSERV should write a warning to the console log.

yes yes yes yes
GETQWAIVE

Internet addresses of persons to be granted an "infinite" GET quota

yes no no no
IGNORE

A list of userid@nodes whose messages and files are to be ignored

yes no no no
INDEX_VIA_GETPOST

On VM, determines whether INDEX subscriptions use GETPOST or old-style database jobs by default.

yes no no no
INSTPW

The optional local "installation password" associated with the INSTALL command

yes no no no
JOB_STAT_DEFAULT

Boolean value determining whether or not the "Summary of resource utilization" is generated or suppressed in a CJLI JOB command response.

yes yes yes yes
LICENSE_WARNING

Toggles license warnings on and off. WARNING: See Appendix C before changing this value.

yes yes yes yes
LIST_ADDRESS

Default value for the "List-Address=" keyword

yes yes yes yes
LIST_EXITS

Filenames of EXEC files that can be defined as exits by an "Exit=" list header keyword

yes yes yes yes
LMCPUT

a boolean variable indicating how PUT commands for datafiles associated with the LMC FAC are handled

yes no no no
LOCAL

a list of nodes to be associated with the hardcoded LCL FAC. Also used as the default for the "Local=" list keyword

yes yes yes yes
MAILER

Internet address of the local mailer

yes no no no
MAILMAXL

the maximum number of lines for an incoming MAIL file to be accepted

yes yes yes yes
MAXBSMTP

Maximum number of 'RCPT TO:' lines per BSMTP file sent to the mailer

yes yes yes yes
MAXDISTN

Maximum number of recipients in forwarded DISTRIBUTE jobs

yes yes yes yes
MAXGET

Maximum number of GET requests a user can make per day

yes no no no
MAXGETK

Maximum number of kilobytes of data a user may obtain a day via GET requests.

yes no no no
MDISK.cuu

Information about library minidisks

yes no no no
MSGD

Userid of the virtual machine running a RFC1312/MSP server, if "Internet TELL" support is desired

yes no no no
MYDOMAIN

The list of domain names which are equivalent to NODE--e.g., MX addresses, CNAMEs, etc.

yes yes yes yes
MYORG

Short organization name that appears in the RFC-822 "Sender:" line.

yes yes yes yes
NDMAIL

Whether to send mail to the local MAILER in Netdata format

yes no no no
NODE

Internet address of this LISTSERV host

yes yes yes yes
NO_NJE_JOBS

Directs a VMS™ server running in NJE mode to send all outgoing server-to-server requests via the Internet

no yes no no
OFFLINETHR

Defines the system and RSCS spool thresholds for automatic offline/online control

yes yes no no
POSTMASTER

A list of userid@nodes, of which the first one is the "main" postmaster (to receive transferred files).

yes yes yes yes
PRIMETIME

Defines the "prime time" for your node

yes yes yes yes
QUALIFY_DOMAIN

Defines domain to be appended to all non-qualified addresses

yes yes yes yes
RESMODES

Defines a list of filemodes which are to be considered as "reserved" and never available for dynamic ACCESS

yes no no no
RSCS

A list of local userids which must be treated as RSCS virtual machines

yes yes no no
RUNMODE

The mode (NETWORKED, STANDALONE, or TABLELESS) that LISTSERV runs in.

yes yes yes yes
SEARCH_DISABLED

Determines whether or not the (new) SEARCH command is enabled.

yes yes yes yes
SMTP_FORWARD

The Internet hostname of the server to which all outgoing SMTP mail should be forwarded for delivery

yes yes yes yes
SMTP_FORWARD_n

Defines n number of "SMTP workers" used to split up the SMTP forwarding load

no yes no yes
SMTP_LISTENER_IP Dotted-decimal IP address which sets the IP address to which the SMTPL.EXE "listener" will bind at boot time. no no no yes
SMTP_LISTENER_PORT Integer value which sets the port number to which the SMTPL.EXE "listener" will bind at boot time no no no yes
SMTP_RESET_EVERY

Directs LISTSERV to reset open SMTP connections every n minutes

no yes yes yes
SORT_RECIPIENTS

Determines whether or not to sort recipients in the RFC821 mail envelope

yes yes yes yes
SPAM_DELAY

Sets the server-wide value (in minutes) for the anti-spam quarantine period

yes yes yes yes
SSI

Flag telling LISTSERV that it runs in a SSI system

yes no no no
STARTMSG

Recipients of start and stop messages

yes yes yes yes
STOREPW

The password to be used by postmasters when executing CP/CMS commands and when storing files in the server by means of the PUTC command

yes yes* yes* yes*
TCPGUI_IPADDR

Defines the IP address used by the TCPGUI interface

no yes yes yes
TCPGUI_PORT

Defines the port number used by the TCPGUI interface

no yes yes yes
TRAPIN

List of userid@node templates from whom LISTSERV should never accept mail

yes yes yes yes
TRAPOUT

List of userid@node templates to whom LISTSERV should never send mail

yes yes yes yes
VM30091

Indicates whether or not the VM30091 message suppression functions are available

yes no no no
WEB_BROWSER_CONFIRM

Indicates whether or not LISTSERV should require "OK" confirmation for commands sent from WWW browsers.

yes yes yes yes
WWW_ARCHIVE_CGI

The relative URL that leads to the WWW archive CGI script. (This is a URL, not an OS path name.)

no yes yes yes
WWW_ARCHIVE_DIR

The full OS path name to the WWW archive directory

no yes yes yes
WWW_AUTHINFO_DISABLE

Disable/enable the web archive interface's IP address verification function

no yes yes yes
XFERTO

Userid of the virtual machine to which files found in the lists readers should be transferred

yes no no no

There are also a number of configuration variables pertaining to the DBMS/Mail Merge functions introduced in LISTSERV 1.8d. These variables are documented in the Developer's Guide for LISTSERV, available separately.

Notes:

* For non-VM systems, STOREPW is a secondary password that is functionally identical to CREATEPW. You should use the same value for both passwords, i.e., set STOREPW= %CREATEPW% (for Windows NT and 95), etc.

5.3. Files used by LISTSERV

The proper operation of LISTSERV is dependent on LISTSERV’s ability to find a number of files that belong to it. The following list of files are required to operate the product, and must be located in the same directory with the LISTSERV executables. (Note that under certain conditions, some required files aren’t necessary; these will be noted where applicable. Note also that some files are not shipped with the distribution, but are generated automatically the first time you run LISTSERV.)

Program Executables

Dependent on the platform, the required executables are:

VM: LSV EXEC
OpenVMS: LSV.EXE
unix: lsv*
Windows NT, 95: LSV.EXE

For OpenVMS and Windows systems, the executable SMTPW.EXE is also required.

For Windows NT systems not running LSMTP and for all Windows 95 systems, the executable SMTPL.EXE is also required.

The executables listed above belong in the following places (depending on the platform):

VM:

on LISTSERV's A disk

OpenVMS:

in LISTSERV's "A" directory, normally LISTSERV_ROOT:[MAIN]

unix:

in the LSVROOT directory, i.e., ~listserv/

Windows NT, 95:

in LISTSERV's "A" directory, normally drive:\LISTSERV\MAIN

Finally, the Web Archive ('wa') interface CGI script is shipped in the A directory of the non-VM servers. This script must be copied into the appropriate script directory for your Web server (per chapter 5.4, below) if you plan to use the Web Archive interface. On OpenVMS and Windows servers, this file is WA.EXE, while on unix machines it is wa*.

BITNET Network Table files

These files are not required when running LISTSERV with RUNMODE=TABLELESS, and are not shipped with evaluation copies for Windows 95 or with LISTSERV Lite. Network table files include:

bitearn.nodes bitearn.dbindex bitearn.distsum2 bitearn.linkdef2
bitearn.linksum2 bitearn.nodesum3    

With the exception of BITEARN NODES, all files are regenerated whenever BITEARN NODES is updated or when an explicit NODESGEN command is issued. For pre-1.8c servers (or non-registered 1.8c or later servers), BITEARN NODES must be downloaded on an approximately monthly basis from

ftp://ftp.lsoft.com/listserv-data/bitearn.nodes

or from the European mirror at

ftp://segate.sunet.se/listserv-data/bitearn.nodes

Beginning with 1.8c, BITEARN NODES on registered networked servers is updated using the same mechanism as PEERS NAMES and other LISTSERV tables. Note that this requires that your mail server support incoming files of at least 1.5M. VM sites have not been included as they typically maintain this file using the UPNODES procedure and store it on a public disk, applying change control procedures in the process.

Internet and Peer Networking Table files

aliases.names intlinks.file intpeers.names linkswt2.file
peers.dbindex peers.dbnames peers.distsum2 peers.names
peers.namesum service.names    

These files are used by LISTSERV to define its "backbone" and other peer servers, as well as to help determine the best routes for mail sent via the DISTRIBUTE algorithm. They are updated periodically by mail from other servers. The update process is automatic and does not require LISTSERV maintainer intervention unless a problem is noted.

LISTSERV's external data files

LISTSERV uses these files for a number of purposes. The fact that they are external to the executables makes it easy to update them when needed. These files include:

country.file default.mailtpl default.wwwtpl errfac.file
listkwd.file lsvhelp.file lsvinfo.file permvars.file
signup.filex stdcmd.file sysff.file site.catalog
system.catalog      

PERMVARS.FILE is LISTSERV's main "permanent variables" file; among other things, this is where LISTSERV registers spammers and users that have been served off. The SIGNUP.FILEx files (initially there are 9, e.g., SIGNUP.FILE1, SIGNUP.FILE2, etc.) are used to register users and their real name fields.

SYSTEM.CATALOG is used by LISTSERV to register system files; it should not be modified, as it is always shipped with new versions and will thus overwrite itself. Instead, SITE.CATALOG should be used to register files and list file archive catalogs (listname.CATALOG) for users to retrieve. (SITE.CATALOG is not shipped with LISTSERV; please see the chapter on Notebook and File Archives for details.)

DEFAULT.MAILTPL and DEFAULT.WWWTPL are the files from which LISTSERV gets its default mail templates and default web templates for responses to user input. See Chapter 9, Creating and Editing LISTSERV's Default Mail Templates, for details.

User reference material

The following files are LISTSERV's online documentation.

listdb.memo listfile.memo listkeyw.memo listmast.memo
listpres.memo listjob.memo listlpun.memo listownr.memo
listserv.memo listall.refcard    

LISTALL.REFCARD is broken into three parts internally. Part 1 is the response to the INFO REFCARD command; Parts 1 and 2 are the response to a GET LISTOWNR REFCARD command; and the whole document is sent in response to a GET LISTMAST REFCARD command.

Command line utilities (non-VM)

Depending on your platform, the following executables may have been shipped (under unix they must all be complied from the corresponding *.c files):

LCMD.EXE (or lcmd*)

LCMD is a command-line named-pipes interface to LISTSERV. You can use it to send commands directly to LISTSERV from the console and receive information in return, either on the console itself (Windows and VMS) or via mail (unix). The syntax is:

Windows: lcmd [\\computer[\serverid]] command

OpenVMS and unix: lcmd command

The user running LCMD must have appropriate permission (e.g., must be a list owner or LISTSERV maintainer) in order to issue the various protected commands.

LISTVIEW.EXE (or listview*)

LISTVIEW is a utility that allows you to type the binary-format .LIST files to standard output so that they can be viewed and/or redirected to text files. The syntax is:

listview [-h | -s | -e | -a] file1 file2...

You can choose only one of the command line options at a time. The options are:

-h   Show the header only

-s   Show the header + the subscribers (without the option string in columns 81-100)

-e   Show the list of subscribers only (without the option string

-a   Show the entire list file

LISTVIEW executed with no option is the same as 'listview -a'.

You can redirect the output of LISTVIEW with standard OS-dependent redirection symbols. For instance,

listview -h mylist > mylist.file

redirects the output to the ASCII file 'mylist.file'.

JOBVIEW.EXE (or jobview*)

JOBVIEW allows you to read the Base64-encoded spool files created by LISTSERV (see below for the types of files created in the spool directory that may be read with this utility). The syntax is simply

jobview file1 file2...

GUI site configuration utility (Windows NT and Windows 95 only)

SITE.EXE andSITE.HLP

The Site Configuration Utility for LISTSERV allows you to easily configure LISTSERV's operation. While this can also be done by manually editing LISTSERV's SITE.CFG file, the GUI gives you an easier way to take care of this task. Online help for the various configuration variables is provided, and new LAKs can be entered. Basic optimization for various pre-calculated loads can also be performed.

Line-mode site configuration utility (OpenVMS only)

LISTSERV_CONFIGURE.COM

A very basic line-mode utility that allows you to modify the VMS version of the site configuration file.

Other files that will appear during use

While in use, LISTSERV creates various files for itself. On the A disk or in the MAIN or HOME directory, these are typically:

.AUTODEL files Maintain data for LISTSERV's autodeletion functions; one for each list that has Auto-Delete enabled. If no auto-deletion reports are pending, this file will not exist.
.CHANGELOG files Contain data regarding subscription changes for a given list if that list has the "Change-Log= Yes" list header keyword setting. These files are called listname CHANGELG on VM.
.DIGEST files These files are the (volatile) digest files for each list that has digests enabled. They are deleted and restarted when the digest is cut. Note that if the location parameter of the Digest= keyword is not set to something that points to the MAIN or HOME directory, .DIGEST files will not appear in the MAIN or HOME directory, but rather in the directory specified.
.LIST files Mailing list files, including the header and subscriber information. Do not attempt to edit these files with a text editor; use the GET and PUT commands instead.
.OKxxxxxx files Usually found for edited lists, but can also appear for non-edited lists if users are set to REVIEW. These are mail messages that are awaiting "OK" confirmation. If they are not confirmed, they are automatically deleted after about a week.
.OLDLIST files These files contain the last saved version of the list file. If you PUT a header and find that you've made a fatal mistake (like adding users "on the fly" and deleting everyone else on the list, or editing the list file by hand and corrupting the record structure) you can send the command GET listname (OLD to have the listname.OLDLIST file sent to you.
.SUBJECT files Maintain the list of subjects for the digest. Again, if digests are not enabled for a specific list, this file does not exist for that list. Also, the same note for the location of these files as for .DIGEST files applies. .SUBJECT files are deleted and restarted when the digest is cut.

In the SPOOL directory, the following file types will be found:

.ERROR LISTSERV generates an .ERROR file in the spool when it encounters an error in a JOB file. These can be viewed with the jobview utility and are important for tracing certain errors back.
.JOB Files that have been received by LISTSERV and are queued for processing. These files are in Base64 format and can be viewed with the jobview utility.
.JOBH Held .JOB files. Such files are either being processed by LISTSERV (and are thus locked) or have generated an error message. These can also be viewed with the jobview utility.
.MAIL Files that have been processed through LISTSERV and are queued for delivery to the outgoing SMTP mail agent. These are plain-text files.
.MAIL-ERR Files that have been processed through LISTSERV and for which delivery has been attempted, but for which a "permanent" SMTP error has resulted. If you have reason to believe that the error was not actually "permanent", simply rename the file with the .MAIL extension and LISTSERV will pick it up for another try.

JOBH files containing the string $NOJOB$ in the filename are typically waiting to be processed because the list they are going to has an explicit Prime= variable set and the non-prime time has not yet arrived.

5.4. Installing and configuring LISTSERV's WWW Archive and Administration Interface

LISTSERV 1.8d includes an optional WWW archive and administration interface (not enabled by default). This interface is used to allow users to browse and search notebook archives for lists with the feature explicitly enabled, as well as to allow list owners to manage almost every aspect of their lists and to allow LISTSERV maintainers to perform a number of common site management tasks. The interface is secured by the use of LISTSERV personal passwords. List owners have administrative access only to their own lists; general users have access only to the archives of public lists or to private lists to which they are subscribed (in other words, there is no difference between the access one receives via the web interface and the access one receives via the mail interface).

LISTSERV 1.8c also included an optional WWW archive interface which did not have any of the administrative functions described in this chapter.

5.4.1. The WWW Archive Interface described

Postings can be organized by date, by topic or by author, and a search function with online help is provided. LISTSERV's WWW interface has the following advantages over "hypermail" style web archiving:

To take advantage of this new interface, you must first ensure that the "Notebook=" options for your list are compatible with the WWW interface. In most cases, you will not have to do anything, but certain options are incompatible with the use of the WWW interface and may need to be changed:

The LISTSERV maintainer must then enable the list for the WWW interface. This may require the installation of a web server and of the WWW interface code itself. You can then modify the WWW_INDEX mail template form to customize the main archive page for your list. See chapter 9 of this manual for more information on customizing mail templates.

5.4.2. The WWW Administration Interface described

In 1.8d and later, assuming that the WWW interface has been installed per the instructions below, the WWW administration interface is enabled automatically for all lists on the server that are not coded "Validate= Yes,Confirm,NoPW" or "Validate= All,Confirm,NoPW". The basic URL for the list owner section of the interface is

http://hostname/script-directory/wa[.exe]?LMGT1

where hostname is the name of the LISTSERV host, and script-directory is the name of the directory where "wa" is installed. For unix you specify "wa?LMGT1" and for Windows and VMS you specify " wa.exe?LMGT1". With some non-unix web servers you may have to type " WA.EXE?LMGT1" (that is, all in upper case) in order for this to work.

Site managers have a different entry point at

http://hostname/script-directory/wa[.exe]?ADMIN

which allows them to create lists, customize site-wide WWW templates, and manage DBMS and mail-merge operations. This entry point also has a link to the list owner section, so site managers may wish to bookmark this entry rather than the LMGT1 entry.

See chapter 11 for detailed information on the web administration interface.

5.4.3. Installing a web server

Please note that L-Soft cannot help you with the installation or configuration of your web server itself. L-Soft does not recommend or endorse specific web servers, nor does L-Soft have development machines with every possible web server installed. You should ensure that the web server software you choose is installed and operating properly before attempting to install the LISTSERV WWW interface script.

If you do not already have a World Wide Web server installed and operating on your LISTSERV machine, you will need to obtain and install one. There are quite a few free web servers available for downloading on the Internet for most systems; you may want to start your search for server software at the W3 Consortium's web site at http://www.w3.org. Naturally, commercial web servers can also be used.

Please note that for security purposes you should always disable directory browsing if it is not disabled by default by your web server.

5.4.4. Installing the web archive interface script

The CGI script for the web archive interface must be installed in the directory where your web server normally keeps CGI scripts and from which they are authorized to run. If in doubt, please read the manuals that came with your web server and/or contact the web server manufacturer's support group; L-Soft cannot help you with this. LISTSERV cannot install the script for you because installation depends on which server you use, which operating system you are running, how the server has been configured, etc.

System specific instructions:

While the script can be renamed, a short name will help keep the HTML documents small and speed up the site.

5.4.5. Creating a subdirectory for the archive interface

Create a subdirectory on your web server to contain the various files LISTSERV will be creating for the web archive interface. The suggested name (and the name LISTSERV will expect by default) for the subdirectory you will create in this step is 'archives'. Under IIS, you would typically make the directory C:\INETPUB\WWWROOT\ARCHIVES for this purpose. For a unix server running Apache it might be /usr/local/etc/httpd/htdocs/archives. Please note the following IMPORTANT restrictions carefully:

For specifics on what should be kept in what directories, see section 5.8, below.

System specific steps:

5.4.6. Configuring LISTSERV to activate the web archive interface

This is done by modifying LISTSERV's site configuration file (see Appendix C) to add two variables:

Under unix, you may have to export these variables (you can check the 'go' script to see if they are already exported for you; in early 1.8c versions they were not) by adding the lines

export WWW_ARCHIVE_CGI
export WWW_ARCHIVE_DIR

at the end of go.user. Again, if these variables are already exported in the 'go' script, there is no need to do this.

LISTSERV will then create and maintain a file called http://localhost/archives/index.html from which you can access all the postings. (This is made from the template WWW_ARCHIVE_INDEX--see below.)

Note that proper operation of the interface under LISTSERV 1.8d requires that the 'wa' script be able to talk to LISTSERV via TCP/IP to port 2306 (LISTSERV's TCPGUI port).

5.4.7. Customizing the web pages LISTSERV creates

Under LISTSERV 1.8d, the simplest (and recommended) way to make changes to the templates which contain the information for these pages is to use the tools provided in the WWW administration interface for changing the "look" of your site.

The LISTSERV maintainer can create a file called www_archive.mailtpl in the main LISTSERV directory to override the web archive template forms found in default.mailtpl. (See chapter 9 for more information on LISTSERV's mail templates.) There are 3 templates you typically might want to override:

The list owner can also control the main page for his own lists by creating the usual listname.MAILTPL file with a WWW_INDEX template. (Again, the recommended way of doing this is to use the template editing tools in the web administration interface.)

There are more templates for other parts of the web interface which are found in the file default.wwwtpl. These templates can be overridden by placing the edited template forms in a file called site.wwwtpl (or by using the template editing tools as already mentioned).

In any case you should not make changes to either default.mailtpl or default.wwwtpl themselves as any changes you make to these files will be overwritten during an upgrade of the software.

5.4.8. Enabling individual lists

Once the interface is installed, LISTSERV will automatically make any mailing list with public archives available through it, provided that a subdirectory has been created for them in the 'archives' subdirectory created above, and provided that LISTSERV has read/write access to the subdirectory.


WARNING:

Note that public notebooks for any list coded "Confidential= Yes" will be available via the interface if a subdirectory under 'archives' is created for that list. However, unlike the behavior in 1.8c, the list will not appear on the main archive index page if you have coded "Confidential= Yes". In this case there are two avenues for users who know the list exists and want to access the web archives:

http://www.yourhost.com/archives/yourlist.html

On the other hand, if you code "Confidential= Service", your list will show up on the main archive index page for your server but will not show up in the CataList or global list of lists.

Under 1.8d, "Private" notebooks can be viewed via the WWW interface by following the same instructions as for "Public" notebooks. However, in order to view the notebooks, subscribers must log in with their subscribed userid@host and their LISTSERV password (set with the PW ADD command or via the WWW interface). Please note carefully that if the user is subscribed as "joe@unix1.host.com" and tries to log in as "joe@host.com", he will be refused access. Also note that unless the list is coded "Confidential= Yes", there will be a link to its archives in the main archive index page.

If you do not want the confidential and/or "Private" list's notebooks available via the WWW interface at all, simply do not make a subdirectory for it under 'archives'.

Please note that when removing a list from the WWW archive interface, you MUST delete the list's directory under 'archives'. Otherwise someone with a bookmarked URL may still be able to access some of the archives via the web.


Also note that under unix, if the 'wa' script does not have the suid bit set, the interface will appear to work normally until you try to read a message. If the suid bit is not set, you will receive a message to the effect that the archives are not available and to try again in 30 seconds.

As an example, let's assume that you have a list called XYZ-L that you want to make available through the Web interface, and that so far you have used the defaults for the installation of the interface.

First, under the 'archives' directory you created above, you must create a directory with the same name as your list. Thus, in order to make the XYZ-L list accessible through the interface, you must create the directory 'archives/xyz-l' Next, you would edit the XYZ-L header to indicate how you want the list to appear to the interface. If you want the archives to be wide open, you must code

* Confidential= No
* Notebook= Yes,where,interval,Public

If you want the archives to be "wide open" but don't want a link on the main archives page, you would code

* Confidential= Yes
* Notebook= Yes,where,interval,Public

If you want the archives to be accessible only by subscribers (with a password) and to have a link on the main archives page, you would code

* Confidential= No
* Notebook= Yes,where,interval,Private

And if you want the archives to be accessible only by subscribers (with a password) but you do not want a link on the main archives page, you would code

* Confidential= Yes
* Notebook= Yes,where,interval,Private

Finally, if you want the archives to be available via the interface (either with or without a password), and you want a link on the main archives page, but you do not want your list to appear in the CataList or global list of lists, you would need to code

* Confidential= Service

and "Notebook=" would be either Public or Private depending on your preference, as above.

Please note carefully that coding the Confidential= keyword has other implications. For instance, if you want your list to show up in the CataList or be available via the Global List Exchange (GLX), you must set "Confidential= No". Thus advertising your list globally is not compatible with having your archives available via the web but not having a link on the server's main archives index page.

Finally, you would simply perform a GET and PUT of the XYZ-L header. When you PUT the header, LISTSERV will create the XYZ-L.HTML file in the 'archives' directory and build indexes for the list in the 'archives/xyz-l' directory.

Note: If you do not execute a list PUT operation after creating the directory for the list under ‘archives’ (for instance, if the list already had public archives and it was not necessary to edit the header), LISTSERV will wait until midnight to create the web archive files for the list rather than creating them immediately. (Naturally, stopping and restarting LISTSERV will also force a rebuild of all of the web interface files but is not recommended as the normal way to accomplish this.)

At this point you will be able to access XYZ-L's archives from the URL http://www.yourhost.com/archives/xyz-l.html.

5.4.9. Enabling web-based bulk operations

Bulk operations (part of the list owner administration section of the interface) are not enabled by default when the interface is installed. As the site manager, you must create a directory called "upload" under the directory specified in the WWW_ARCHIVE_DIR= site configuration variable, and give the userid under which the "wa" CGI program is run write permission in that directory. This is the only directory in which "wa" needs write authority, and only for this functionality. If you do not want the functionality, do not create the "upload" directory.

Please note carefully that your browser MUST support the RFC1867 file upload extension or you will not be able to use the bulk operations page. Most current browsers do support this extension, including but not limited to Netscape 3.x and later, and Internet Explorer 4.x and later.

(If you get an error 2 when you click on the "Import" button, this means that the "upload" directory has not been created. If you get an error 13 when you click on the "Import" button, this means that the "upload" directory has been created but the CGI program user does not have write permission in that directory.)

5.5. The "spam" detector and anti-subscription-"spoofing" feature

L-Soft acknowledges that these features have been continually upgraded and enhanced throughout the 1.8d development process, but in keeping with previously-announced policy, specifics are proprietary and will not be documented.

The spam detector was improved in version 1.8c, as follows:

5.5.1. Spam quarantine

One of the most arduous problems the spam detector has to face is the accurate detection of the first few copies of the spam. When the first copy reaches the first LISTSERV server worldwide, it is just a posting like any other. It will take repeated occurrences of this same posting for LISTSERV to realize that it is in fact a spam. However, it is desirable to block this very first copy as well, and this can only be accomplished by introducing a delay in the processing of "suspicious" messages. This "quarantine" gives the spam detector some time to gather the necessary evidence to determine if the message is a spam or not. The default value is 10 minutes, and can be changed by adding:

* Loopcheck= Spam-Delay(xxx)

in the list header (the value is in minutes). The LISTSERV maintainer can also change the system default by adding a SPAM_DELAY variable to the LISTSERV configuration with the desired value (also in minutes). A value of zero disables this new feature.

The default value of 10 minutes is adequate in most cases; it can be lowered on fast, large, active servers and may need to be increased on servers with chronical backlogs. Currently, LISTSERV determines whether a message is suspicious or not based on the sender's posting history. This however may be changed in future versions to further improve the efficiency of the spam detector.

5.5.2. "Anonymous" spam alerts

On occasion, you may receive a spam alert from LISTSERV where the offender's e-mail address is replaced with the word "anonymous". These alerts are generated by new detection algorithms where, for various reasons, it may sometimes be desirable to hide the identity of the potential offender, usually because there is a fair chance that the posting is in fact legitimate for the particular lists to which it was posted (for instance because these lists were configured to tolerate a high degree of cross-posting). In this case, information about the text of the message may be released and ultimately lead to a spamming alert that will block further copies of this same message, while the identity of the poster remains hidden.

5.5.3. Subscription anti-spoofing feature

Not long before the release of LISTSERV 1.8c (January 1997), a number of point and click utilities began to appear on anonymous FTP servers, allowing mischevious users to forge Internet mail on an industrial scale and subscribe an unfortunate victim to thousands of mailing lists. The resulting mail onslaught fills the victim's mailbox in minutes, rendering the account forever unusable. It also brings the mail server on which the account is hosted to its knees, causing, in some cases, tens of thousands of dollars in consequential damages as other users of the same system also lose precious e-mail.

In most cases, the account ends up being closed. Unfortunately, this usually doubles the load on the recipient's mail server, as a delivery error needs to be generated for every message received from the mailing list servers. Thus, it is not uncommon for the service provider to leave the account open and simply reconfigure it in such a way that incoming mail continues to be accepted, but is summarily discarded without generating a costly delivery error notification. While it is difficult to blame the service provider for wanting to minimize impact to their customers, the drawback is that the list owners may never be notified of the fact that the account was closed. On any large LISTSERV system, there are likely to be dozens of these addresses, each being sent hundreds or possibly thousands of messages a day which are simply discarded and waste resources.

Until now, the only defense against this attack was to configure mailing lists to require subscription confirmation:

* Subscription= Open,Confirm

LISTSERV will then send a confirmation request to the victim, who does not reply and thus is not added to the list. While this line of defense is 100% effective, it may not always be practical or desirable to configure the list to require confirmation.

Starting with version 1.8c, LISTSERV has been able to detect these "spoofed" subscription attacks automatically. When more than 50 subscription requests are received from the same account in a short time frame, LISTSERV automatically undoes all the subscription requests and rejects any further subscription attempt for a certain period of time. This applies even to requests that LISTSERV forwarded to other servers; LISTSERV will then send a SIGNOFF request to the remote server for the address in question. Note that, in some cases, the subscription may not be undone, either because of a temporary condition (locked list, etc.) preventing LISTSERV from deleting the user, or because the list was configured with "Subscription= By owner" and the owner manually added the victim after the arrival of the undo request.

This mechanism offers a very good degree of protection against the adverse effects that dead "spoofed accounts" can have on the performance of the LISTSERV host system. It does not, unfortunately, mean that people no longer have to fear subscription spoofing, as only LISTSERV lists are monitored and protected by the "spoof detector". Requests to subscribe to lists hosted by other mailing list managers are sent directly to the list managers in question, and LISTSERV can only act on the requests that it does receive.

5.6. Server Registration

5.6.1. Registering LISTSERV Classic Servers

NOTE: This section and 5.6.2, following, do not apply to evaluation kits or to LISTSERV Lite kits. Evaluation copies of LISTSERV should not be registered because they are (presumably) temporary servers running test lists, whose existence should not be broadcast. LISTSERV Lite copies run only in TABLELESS mode and therefore cannot be registered in the same manner as LISTSERV Classic, nor may they participate in the LISTSERV backbone. Further, Windows 95 Classic servers may not participate in the backbone as typically they do not have the capacity or stability to qualify for backbone status. For information about how LISTSERV Lite servers are registered, please see 5.6.3.

Also note that only those LISTSERV Classic servers running in NETWORKED mode may be registered.

Once the server is ready for production use (that is, once you have installed a permanent License Activation Key, and once you have arranged for LISTSERV to be started automatically when the system boots), you should register it with L-Soft by filling in a server registration form, and returning it to SUPPORT@LSOFT.COM. Registering the server is necessary to broadcast its existence to the other LISTSERV servers. Once you have registered, your server will be sent periodic updates about the lists hosted by other LISTSERV sites and updates to the files whose versions are shown in the output of the RELEASE command, among other things, and, similarly, other LISTSERV sites will receive information about the public lists you are hosting.

A platform-specific registration form can be found in the installation guide that came with the software, or in the on-line installation guides which can be found on L-Soft's WWW site at http://www.lsoft.com/manuals/index.html.

5.6.2. The LISTSERV backbone

The last question on the registration form is whether or not you wish for your site to participate in the LISTSERV backbone.

The LISTSERV backbone is a collection of servers which are operating 24 hours and maintained on a regular basis by their respective operation staffs. This backbone is used to support the DISTRIBUTE command and to host heavy-traffic network-wide peered lists.

LISTSERV servers can fall into one of two categories:

Sites which are willing to become part of the LISTSERV backbone should indicate it in the :backbone tag of the registration form returned to support@lsoft.com. However, please note that unless you have a large number of lists, or a number of very large lists, it is probably not necessary for you to join the backbone. Sites running a few small support or hobby lists, for instance, don't need to be on the backbone; sites running hundreds of lists both large and small do need to be on the backbone. Also, sites running one or two huge lists (greater than, say, 50K subscribers each) probably should be on the backbone; such sites should contact L-Soft for more information.

5.6.3. Automatic Registration for LISTSERV Lite Servers

LISTSERV Lite servers are registered automatically when you start the software for the first time. This auto-registration is not optional for Free Edition servers, and can only be disabled for non-Free Edition Lite servers by specifying STANDALONE runmode (see "RUNMODE=" in Appendix C).

The auto-registration allows you to take part in the global List of Lists and CataList services maintained by L-Soft. Registrations are verified on a regular basis by a central L-Soft server, which sends out several informational commands that return non-privileged information about your server (anyone can issue these commands). Since these registrations are maintained by regular communication with your server, please note that, should you decommission the server, registration verifications will continue to be mailed to your server for several days until the central server decides that your server is actually gone, and not simply unable to receive mail for some reason. Please note carefully that it is not possible for L-Soft to stop these registration queries manually even if you write to us and tell us that the server has been shut down permanently. They will stop after several days without a response.

5.7. Inter-server Updates

Because LISTSERV operates as a distributed system, LISTSERV servers do a certain amount of inter-server "chatting". This "chatting" takes the form of DISTRIBUTE jobs, X-LUPD jobs, X-SPAM jobs, and so forth. Some of the jobs are requests for statistics for the LISTSERV network; other jobs are updates to the list of lists; still other jobs are spam alerts. None of these jobs contain privileged or private information; L-Soft does not query your server for licensing information or any non-LISTSERV-related data, and in fact, all data sent out regarding your server can be retrieved by any user with documented LISTSERV commands.

If you are running LISTSERV Classic, and you do not want to participate in the full-fledged LISTSERV network for whatever reason, you can make a change in your site configuration file to run your server in "standalone" rather than "networked" mode. Simply set the RUNMODE= variable to the value "STANDALONE" and stop and restart your server (see Appendix C for the syntax applicable to your OS). Note that this will remove your server and all otherwise-public lists running on it from the CataList and the global List of Lists.

LISTSERV Lite (Free Edition) sites are not allowed to change their runmode. If this is a security issue for your site, L-Soft suggests purchasing either the commercial edition of LISTSERV Lite or LISTSERV Classic and running in "standalone" mode.

5.8. Setting up directories for use with LISTSERV

We have found that often people get confused about the difference between the directories where the mailing list's notebook archives are kept and the directories where the mailing list's web archive interface files are kept. Here are a few guidelines:

L-Soft's STRONG RECOMMENDATION is that each list be given a separate directory in which its notebook archives and any files available via LISTSERV's file server are kept. On VM this is not always practical, but the security concerns are different and (to date) the 'wa' interface is not available in any case. For VMS, unix, and Windows systems, our STRONG RECOMMENDATION is that a separate directory tree be established for the purpose of storing list notebook archives and other related files. For instance, you might create

On OpenVMS: Where LISTSERV's base directory is LISTSERV_ROOT:[MAIN]
  Create the directory LISTSERV_ROOT:[LISTS]
     
On unix: Where the LSVROOT directory is /home/listserv
  Create the directory /home/listserv/lists
     
In Windows: Where LISTSERV's base directory is C:\LISTSERV
  Create the directory C:\LISTSERV\LISTS

Then, under the main "lists" directory, you would create further subdirectories, one for each list that has archives.

For OpenVMS this would be something like LISTSERV_ROOT:[LISTS.MYLIST-L]
for unix something like /home/listserv/lists/mylist-l
and for Windows something like C:\LISTSERV\LISTS\MYLIST-L

Please note carefully that under unix, the directory path specification for notebook archives MUST IMPERATIVELY be in lower case. LISTSERV will not write notebooks to directory paths specified in upper- or mixed-case.

Where you locate list archives is is particularly important with regard to LISTSERV's file server functions. You MUST NOT set up a file server sub-catalog entry in site.catalog that points to LISTSERV's A directory! The catalog owner will be given FULL ACCESS to all the files in the directory you specify in the sub-catalog entry. Therefore in order to maintain security you MUST make a separate directory for each list catalog you define in site.catalog. For simplicity's sake, it is generally best to use this directory for the list's notebooks as well as any files the list owners may want to store except for the web archive interface files.

Files generated by LISTSERV for the web archive interface MUST NOT be stored in the notebook directories (or vice versa). You MUST make a separate directory tree where the HTML files and index files for the 'wa' interface are kept. Our best recommendation is to place this directory tree under your web server's document root directory, so that the HTML files for the web archive interface are reached by using a URL such as http://yourserver/archives/. The location of this directory naturally varies from platform to platform and web server to web server; the guidelines in 5.4.5, above, will give you a start on finding this location.

5.9. DBMS and Mail Merge Functions

For information on installing and using these functions (which were introduced in LISTSERV 1.8d), please refer to the Developer's Guide for LISTSERV, available separately.

5.10. Synonymous host name registration via ALIASES NAMES

LISTSERV has supported hostname aliases since BITNET added support for this function in 1990. You could define that BITNET node (say) VTVM1 was the same as VPIVM1 and VPIVM2 (old names) and was also known as VTVM1.CC.VT.EDU. Since this was designed into the first major rewrite of LISTSERV, it is very efficient and there is almost no performance penalty. It also works globally, i.e., once the equivalence is defined, it works for all lists and all users.

However, the Internet did not have a similar mechanism for registering aliases, so this function was only useful to BITNET sites, although the underlying code would also have worked with Internet aliases if there had been a way to register them.

LISTSERV 1.8d introduces support for a centralized list (called ALIASES NAMES) of synonymous Internet hostnames. The main purpose is to address problems with ISPs where the "From:" line is rewritten from (say) "joe@isp.net", which is what Joe wanted, to "joe@alpha.isp.net", "joe@beta.isp.net", "joe@gamma.isp.net" and so forth, where "alpha", "beta" and so on are known machine names (with the understanding that they may add machines from time to time) and "joe" is the same in all cases. In this way it is possible for LISTSERV to match joe@alpha.isp.net with his actual subscribed address of joe@isp.net or any of the other cluster hosts in his domain.

This can also handle a situation where an ISP changed name and for instance "joe@oldname.net" is rewritten to "joe@newname.net". However this does not handle "joe@isp.net" -> "J.Doe@isp.net" and the like.

Eventually registrations for ALIASES NAMES will be handled by a web form (and please check the L-Soft site before just sending them along), but for the time being requests by ISPs to be added to the master list should be sent to support@lsoft.com . Note that while it is possible to add entries to your local copy for your local host, you should NOT do this as they will not be propagated through the network and will simply be overwritten by the next update.


6. LISTSERV Commands

(For a quick reference card of LISTSERV commands, see Appendix A of this document.)

This chapter is divided into five parts. The first three correspond to those commands available for use by the general user, list owners and file owners, and the LISTSERV maintainer. The last two describe how to send commands to LISTSERV and how to register LISTSERV passwords. Non-privileged users can send commands by mail or by interactive commands. (Note that interactive commands can only be sent if a two-way NJE or MSGD connection exists.) Privileged users can send commands by mail, interactive commands (subject to the same restriction previously noted) or via the console (VM) or the LCMD utility (non-VM).

Unless otherwise noted, commands are listed in alphabetical order, with the minimum acceptable abbreviation in capital letters. Angle brackets are used to indicate optional parameters. All commands which return a file accept an optional 'F=fformat' keyword (without the quotes) that lets you select the format in which you want the file sent; the default format is normally appropriate in all cases. Some esoteric, historical or seldom-used commands and options have been omitted.

Note that some commands are not available on all platforms; these commands are marked appropriately.

Continuation cards (see Chapter 2 in the Developer's Guide for LISTSERV regarding LISTSERV’s Command Jobs Language) can be used to split long commands (for instance, ADD commands for users with long X.500 addresses) into two or more 80-character cards. In that case you must insert a "// " string before the command text and a comma at the end of each line of the command so that CJLI considers it as a control card and performs the required concatenation. For instance,

// QUIET ADD MYLIST someone.with.a.real.long.userid.that.wraps@hishost.com ,
His Name

or, for instance, for a large GETPOST job,

// GETPOST MYLIST 10769-10770 10772 11079 11086 11095 11099-11100 11104 ,
11111 11115 11118 11121 11124 11131 11144 11147 11153 11158 11166 11168

Be sure to put a space before the comma at the end of the first line, as LISTSERV will not add the space for you.

6.1. General Commands

6.1.1. List subscription commands (from most to least important)

SUBscribe listname [full_name | ANONYMOUS] [WITH options]

The SUBscribe command is LISTSERV's basic command, issued by users to join mailing lists. This command can also be used to change one's "full_name" field in LISTSERV's SIGNUP database (simply reissue the command with the changed name). Note that the full_name is not required if the user has previously signed up to lists on the same LISTSERV server, or if the user has previously registered in LISTSERV's SIGNUP database by using the REGISTER (q.q.v.) command.

LISTSERV 1.8c and later supports the following syntax:

SUBSCRIBE listname ANONYMOUS

This indicates that the user wishes to join the list anonymously, that is, without specifying a name. The CONCEAL subscription option is automatically set, granting the subscriber the maximal level of protection available.

LISTSERV 1.8d and later supports the following additional syntax:

SUBSCRIBE listname full_name WITH option1 option2 ...

This syntax allows you to "preset" subscription options at subscribe time. For instance, you might want to subscribe to MYLIST-L in order to be able to search its archives, but don't want to receive postings. You would use the command

SUBSCRIBE MYLIST-L Joe User WITH NOMAIL

Or you might want to receive individual postings with the SUBJecthdr option and receive copies of your own postings instead of the standard acknowledgement that your message was distributed to the list:

SUBSCRIBE MYLIST-L Joe User WITH SUBJecthdr REPRO NOACK

JOIN listname [full_name | ANONYMOUS]

JOIN is a synonym for SUBscribe.

SIGNOFF listname|*|* [(NETWIDE]

The SIGNOFF command allows the user to cancel his or her subscription to lists. SIGNOFF requires a qualifying parameter, as follows:

listname Sign off of the specified list

* Sign off of all lists on that server

* (NETWIDESign off of all lists in the LISTSERV network

The "* (NETWIDE parameter causes the LISTSERV server to forward a copy of the signoff request to all other registered LISTSERV servers. This is a good option for a user who is changing service providers or otherwise losing a specific address that will not be forwarded. Please note that this parameter will not remove the user from non-LISTSERV lists or from LISTSERV lists running on non-registered sites.

LISTSERV will attempt to sign off the address it finds in the RFC822 "From:" line and will not "fuzzy match" for "similar" addresses.

UNSUBscribe listname|*|* [(NETWIDE]

UNSUBscribe is a synonym for SIGNOFF.

CHANGE listname|* newaddr

This form of the CHANGE command can be used by any subscriber and results in a cookie being sent to the new address. This cookie MUST be confirmed by the new address, exactly as it was entered, or the command will fail. This is the only case where a 1.8d cookie must be confirmed by a specific address. Note that this assumes that the user still has login access to both addresses, or at least the ability to send mail from the old address.

SET listname option1 [option2 ...]

Allows the user to change his or her subscription options without administrative intervention. The options available to be changed are as follows:

ACK A mail message acknowledging the receipt and distribution of the user's posting is sent back to the user.

NOACK No posting acknowledgement is sent. In general, this setting should only be used if the user has also set himself to REPRO, as it is desirable in most cases that some indication of whether or not the posting was received by LISTSERV be sent.

MSGack An interactive message is sent to acknowledge receipt and distribution. Note that this works only if both the machine running LISTSERV and the user's machine have NJE connectivity (e.g., BITNET). If NJE connectivity is not available on both ends, this option is effectively the same as NOACK.

CONCEAL Allows the user to be concealed from the REVIEW command. Note that the list owner or LISTSERV maintainer can always get the complete list of subscribers, regardless of this setting.

NOCONCEAL "Unhides" the user

Files/NOFiles These options toggle the receipt of non-mail files from the list. Note that this is NJE-specific, and thus obsolete for systems without NJE connectivity, but retained for compatibility.

Mail/NOMail These options toggle the receipt of mail from the list. Users who will be away from their mail for an extended period of time may prefer to simply turn the mail off rather than to unsubscribe, particularly if subscription to the list is restricted in some way.

Note that for backward compatibility, the command SET listname MAIL sent by a user who is set to DIGEST but not also set to NOMAIL will cause the user to be set to NODIGEST (the behaviour is identical for users set to INDEX but not to NOMAIL). SET listname MAIL sent by users set to DIGEST/NOMAIL or INDEX/NOMAIL will simply remove the NOMAIL setting and leave the user set to DIGEST or INDEX as the case may be.

DIGests/INDex/NODIGests/NOINDex
These options change the format in which list mail is received by the subscriber. DIGEST turns on digest mode, in which the subscriber receives a digest of postings at set times dependent on how the "Digest=" keyword of the list is set. INDEX turns on index mode, in which the subscriber receives a daily listing of subjects posted to the list, from which he or she may order postings of interest. NODIGEST and NOINDEX toggle the mode back to individual postings sent as received by LISTSERV. Note that these options are interrelated; setting one will negate another.

REPro/NOREPro Causes LISTSERV to send you a copy of your own postings as they are distributed. Some users may prefer this behavior to the ACK option (see above).

MIME/NOMIME Toggles MIME options on and off. Currently only digests are available in MIME format. If DIGEST mode is set, the user will receive a MIME digest instead of the regular plain-text digest. Note that you must have a mail client that supports MIME digests (Pegasus is one that does) or this setting will do you little good. This option is automatically set at subscribe time for users who send their subscription command using a MIME-compliant agent, unless "Default-Options= NOMIME" is specified for the list.

HTML/NOHTML Toggle the HTML function for digests and indexes on and off. New in 1.8d.

TOPICS: ALL | [+/-]topicname
For lists with topics enabled (see the Topics= list header keyword), subscribe or unsubscribe to topics. For instance, if a list has topics SUPPORT and CHAT, a user could subscribe to CHAT by sending SET TOPICS +CHAT . Or the user could unsubscribe to SUPPORT by sending SET TOPICS -SUPPORT . Finally, the user can subscribe to all available topics by sending SET TOPICS ALL .

Options for mail headers of incoming postings (choose one):

FULLhdr "Full" mail headers, (default) containing all of the routing information.

IETFhdr Internet-style headers.

SHORThdr Short headers (no routing information).

DUALhdr Dual headers, useful with PC or Mac mail programs which do not preserve the RFC822 return email address.

SUBJecthdr "Full" mail headers (like the default) except that setting this option tells LISTSERV to add the list's default subject tag to the subject line of mail coming from the list. (See the listing in Appendix B for "Subject-Tag=" for more information.) Note that if the user is set to SHORThdr (or any other header option other than FULLhdr), LISTSERV will automatically switch the user to FULLhdr, as subject tags require full headers. Under 1.8c subject tags are not generated for messages sent without an RFC822 "Subject:" header; starting with 1.8d a subject tag is generated (for subscribers with the SUBJecthdr option set) even if the original message had no "Subject:" header. To turn the subject tagging off, the user simply sends a new SET command with any of the other header options (e.g., SET listname FULLhdr) and the SUBJecthdr option is reset.

FULL822 Essentially the same as "full" mail headers, but with the important difference that the recipient's email address is specified in the "To:" line rather than the address of the list. "FULL822" headers should be used with extreme caution, as they cause LISTSERV to create a separate mail envelope with a single RFC821 RCPT TO: for each address so set. This behavior can significantly affect the performance of both LISTSERV and of your external mail system.

SHORT822 Essentially the same as "short" mail headers, with the same caveats as noted for FULL822.

Note that FULL822 and SHORT822 headers should only be used if a specific problem indicates that they might solve the problem. One possible use would be to determine which subscriber from a specific site is causing the site to throw back delivery errors if that site does not specify which RCPT TO: is generating the error. These headers should never be used by default.

CONFIRM listname1 [listname2 ]...]]

The CONFIRM command should be issued when LISTSERV requests it. A request for CONFIRM should not be confused with a "command confirmation request" which requires an "OK" response. The CONFIRM command is used in two cases:

6.1.2. Other list-related commands

GETPost listname post_number [post_number [...]]

GETPost is used after receiving the output of a SEARch command to retrieve the postings you want from the SEARch output. For instance, if you want postings numbered 1730, 1731, 1732, and 1840 from the MYLIST list, send the command

GETPost MYLIST 1730-1732 1840

GETPost is analogous to the VM database command PRINT .
INDex [listname]

The INDEX command sent to LISTSERV without further qualification sends back the contents of the "root" level archive filelist on VM systems (LISTSERV FILELIST) or archive catalog on non-VM systems (SITE.CATALOG plus the contents of SYSTEM.CATALOG).

If the INDEX command is sent with the name of a list (e.g., INDEX MYLIST) or the name of a special filelist or catalog file (e.g., INDEX TOOLS , if TOOLS FILELIST on VM or TOOLS.CATALOG on non-VM exists), LISTSERV sends back the contents of the specified filelist or catalog. Several possibilities exist:

Under VM, instead of the size in bytes, three separate VM-specific columns are used. Please note the following definitions for them:

rec -fm Indicates whether the file is in a fixed or variable record format

lrecl Logical record length. For a file with fixed record format (F), this is the length of each record. For a file with variable record format (V), this is the maximum record length.

nrecs Number of records (lines) in the file

Lists [option]

Access the global list of lists maintained by LISTSERV. If no options are specified, then LISTSERV returns only local lists, one line per list. The available options are:

Detailed All local lists, complete with full header information.

Global xyz Only those whose name or title contains 'xyz'

SUMmary [host] Membership summary for all lists on specified host, or the host to which the command is sent if no host is specified

SUMmary ALL Membership summary for all hosts (long output, send request via mail!)

SUMmary TOTAL Membership totals only

"Lists Global" without a search string, which returns the entire list of lists, may no longer be issued by general users. If you are asked about this, you should advise users to use the "Lists Global /xyz" format to search the list of lists, or use L-Soft's CataList service at http://www.lsoft.com/catalist.html.

"Lists SUMmary", when issued to an unregistered host or to a host running in STANDALONE mode will generate the response "No information available yet - please try again later." because the file required for this function does not exist.

Query listname

Query your subscription options for a particular list (use the SET command to change them). Using the "*" wildcard in place of the name of a single list queries subscription options on all lists on the server.

REGister full_name | OFF

Register's the user's full name field in LISTSERV's SIGNUP files, or changes the current value of that field. When a user's name is registered, he or she can omit the full name field from subsequent SUBscribe requests to that server. Sending "REGISTER OFF" to LISTSERV deletes the user's entry from the SIGNUP file.

REView listname [(options]

Get information about a list, assuming the list header keyword "Review=" is set appropriately. REVIEW does not return address information about subscribers who are set to CONCEAL. The options are:

BY sort_field Sort list in a certain order:

Country by country of origin (ISO country codes)

Date by subscription date (newest to oldest)

Name by user name (last, then first)

NODEid by hostname/nodeid

Userid by userid

BY (sort_field1 sort_field2)

You can specify more than one sort field if enclosed in parentheses. For instance: BY (NODE NAME)

Countries Synonym of BY COUNTRY

Topics (New for 1.8d) Adds a breakdown of subscribers per topic (if Topics= is defined in the list header) at the end of the subscriber list. If you just want the breakdown, use REVIEW listname SHORT TOPICS . This does not show topics by individual subscribers (see the QUERY command instead). If Topics= is not enabled for a given list then this option is ignored.

LOCalDon't forward request to peers. This is only useful if the list is peered; normally it should not be necessary to issue this option.

MsgSend reply via interactive messages (BITNET users only)

NOHeaderDon't send list header, just send the subscriber list

ShortDon't list subscribers, just send the header and the membership summary for the list.

Note that you can get a quick read of the number of subscribers on the list by sending the command REVIEW listname SHORT NOHEADER.

SCAN listname text

Scan a list's membership for a name or address. Helpful if a user attempts to send a SET command or an UNSUB command and is informed that their address is not subscribed to the list. At the non-privileged level, this command will show all non-concealed entries that match the search text, assuming that the list is set to "Review= Public".

The following command is available on VM servers only:

Stats listname [(options]

Get statistics about a list. NOT AVAILABLE ON NON-VM SERVERS. This command is VM-specific, and was originally intended to return BITNET data. The single option is:

LOCal Don't forward to peers

6.1.3. Informational commands

Help

Obtain a list of commonly-used LISTSERV commands. Also explains how to get the comprehensive reference card and tells who the (non-hidden) server manager(s) are.

Info [topic|listname]

Order a LISTSERV manual, or get a list of available ones (if no topic was specified); or get information about a list. For Info listname, the text in the INFO template form of listname.MAILTPL is used; however, if listname.MAILTPL does not exist or does not contain an INFO template form, the INFO template form of DEFAULT.MAILTPL is used.

Query File fn ft [filelist] [(options]

(Available only on VM) Get date/time of last update of a file, and GET/PUT file access code. The single option is:

Flags Get additional technical data (useful when reporting problems to experts)

RELEASE

Find out who maintains the server and the version of the software and network data files.

SHOW [function]

Display information as follows:

ALIAS node1 [node2 [...]] BITNET nodeid to Internet hostname mapping

DISTribute Statistics about DISTRIBUTE

HARDWare or HW Hardware information; what kind of machine is LISTSERV running on?

LICense License/capacity information and software build date

LINKs [node1 [node2 [...]] Network links at the BITNET node(s) in question

NADs [node1 [node2 [...]] Addresses LISTSERV recognizes as node administrators for the specified site(s)

NODEntry [node1 [node2 [...]] BITEARN NODES entry for the specified node(s)

NODEntry node1 /abc*/xyz
Just the ':xyz.' tag and all tags whose name starts with 'abc'

POINTs [ALL | list1 [list2...]] Graduated (LISTSERV Classic) license point information. This information can help you plan orderly expansion of your site if you are running with a graduated LISTSERV Classic license. Under Lite this command shows Classic point usage.

STATs Usage statistics for the server (this is the default option)

VERSion Same output as RELEASE command

If no function is specified, the output is per SHOW STATS.

The following options are available for VM servers only:

BITEARN Statistics about the BITEARN NODES file

DPATHs host1 [host2 [...]] DISTRIBUTE path from that server to specified host(s)

DPATHs * Full DISTRIBUTE path tree

FIXes List of fixes installed on the server (non-VM see SHOW LICENSE)

NETwork Statistics about the NJE network

PATHs snode node1 [node2 [...]] BITNET path between 'snode' and the specified node(s)

6.1.4. Commands related to file server and web functions

GET fn ft [filelist] [(options] [F=fformat] [SPLIT=integer]

Order the specified file or package from LISTSERV. The single option is VM-specific and is:

PROLOGtext xxxx Specify a 'prolog text' to be inserted on top of the file

To control the format in which LISTSERV returns the file(s) to you, you can specify the F=fformat parameter. Supported formats are Netdata, Card, Disk, Punch, LPunch, UUencode, XXencode, VMSdump, MIME/text, MIME/Appl, Mail

To split very large files into manageable chunks, you can specify the SPLIT=integer parameter. The integer value is the size you want the chunks to be generated, in kilobytes. For instance if you were ordering a 2MB notebook log and wanted to break it into 100KB chunks, you would specify SPLIT=100. This is handy for people whose mail systems place a limit on the size of an individual mail message that may be received by a given user.

GIVE VM Syntax:
GIVE fn ft [filelist] [TO] userid@host
Non-VM Syntax:
GIVE fn.ft [TO] userid@host
GIVE fn ft catalogname [TO] userid@host

(Note: Prior to 1.8d this command is not available on non-VM servers.)

Sends a file stored in a LISTSERV file archive to someone else. For instance, you may want to send LISTSERV REFCARD to a new user. Rather than retrieving LISTSERV REFCARD and then forwarding it to the user, you simply issue a GIVE command to tell LISTSERV to send it directly. Note that the token "TO" is optional. Examples:

For LISTSERV running under VM:

GIVE LISTSERV REFCARD joenewuser@hishost.com
GIVE LISTSERV REFCARD TO joenewuser@hishost.com

GIVE README TEXT MYLIST-L joenewuser@hishost.com
GIVE README TEXT MYLIST-L TO joenewuser@hishost.com

For LISTSERV running on non-VM hosts there are two syntaxes, depending on whether or not you need to specify a catalog name for the file in question. Note that the only real difference is whether or not you are required to specify a dot between the filename and the extension. Examples are:

GIVE LISTSERV.REFCARD joenewuser@hishost.com
GIVE LISTSERV.REFCARD TO joenewuser@hishost.com

GIVE README TXT MYLIST-L joenewuser@hishost.com
GIVE README TXT MYLIST-L TO joenewuser@hishost.com

INDex [filelist|catalog] Same as GET xxxx FILELIST. If no filelist is specified, the default is LISTSERV FILELIST (on non-VM, SITE CATALOG is returned as LISTSERV FILELIST in this case).

PW function

Define/change a "personal password" for protecting AFD/FUI subcriptions, authenticating PUT commands, and so on.

ADD firstpw Define a password for the first time, or after a PW RESET. Requires confirmation via the "OK" confirmation method.

CHange newpw [PW=oldpw] Change your existing password. If you do not include your old password for authentication, LISTSERV will require confirmation via the "OK" confirmation method.

REP password Starting with 1.8d, this function is a hybrid of "ADD" and "CHange". If a password does not exist for the user, one will be added. If a password does exist for the user, it will be changed (with confirmation required via the "OK" confirmation method). "REP" was added primarily for use by the web archive and administration interface but can be used in e-mailed PW commands as well.

RESET Reset (delete) your password. This function always requires confirmation via the "OK" confirmation method.

SENDme Same as GET

The following commands are available on VM servers only:

AFD Automatic File Distribution. The functions are as follows:

ADD fn ft [filelist [prolog]] Add file or generic entry to your AFD list

DELete fn ft [filelist] Delete file(s) from your AFD list (wildcards are supported)

List Displays your AFD list

For node administrators:

FOR user ADD/DEL/LIST etc Perform requested function on behalf of a user you have control over (wildcards are supported for DEL and LIST)

FUI

File Update Information: same syntax as AFD, except that FUI ADD accepts no 'prolog text'

6.1.5. Other (advanced) commands

DISTribute type source dest [options]

Note: Starting with 1.8d, the ability to send DISTRIBUTE jobs is limited to LISTSERV Maintainers by default, and requires a password. This section is retained for compatibility with 1.8c and earlier, and for 1.8d and later servers which have the DISTRIBUTE security feature turned off.

Distribute a file or a mail message to a list of users (see the Developer's Guide for LISTSERV for more details on the syntax). The various parameters are, briefly:

Type:

MAIL Data is a mail message, and recipients are defined by '<dest>'

FILE Data is not mail, recipients are defined by '<dest>'

RFC822 Data is mail and recipients are defined by the RFC822 'To:'/'cc:' fields

Source:

DD=ddname Name of DD holding the data to distribute (default: 'DD=DATA')

Dest:

<TO> user1 <user2 <...>> List of recipients

<TO> DD=ddname Use a DD called ddname for the destination addresses, one recipient per line

Options for the general user:

ACK=NOne/MAIL/MSG Acknowledgement level (default: ACK=NONE)

CANON=YES 'TO' list in 'canonical' form (uid1 host1 uid2 host2...)

DEBUG=YES Do not actually perform the distribution; returns debug path information

INFORM=MAIL Send file delivery message to recipients via mail

TRACE=YES Same as DEBUG=YES, but file is actually distributed

Options requiring privileges:

FROM=user File originator

FROM=DD=ddname One line: 'address name'

FOR user command

Execute a command on behalf of another user (for LISTSERV maintainers). Note that generally this command should not be used for normal production purposes.

Search

For lists running on VM servers, see also below at DATABASE.

The Search command syntax is similar to that of the SEARCH/SELECT commands in the "old" database functions. A very basic Search command for list MYLIST would look like this:

Search search_string IN MYLIST

You can also restrict your search by date, sender, or other criteria, e.g.,

Search search_string IN MYLIST SINCE 96/01/01
Search search_string IN MYLIST WHERE SENDER CONTAINS ERIC

etc. The specific syntax is outlined in LISTDB MEMO (available from LISTSERV with the command "INFO DATABASE") and in the Developer's Guide for LISTSERV. Note that the new Search command does not require a CJLI job framework to operate; simply send the Search command in the body of an email message to the appropriate server. LISTSERV will respond with an index of the postings matching your criteria and instructions on how to use the GETPost command to retrieve the posts you want.

SERVE user

Restore service to a user whose access to LISTSERV has been disabled. This generally occurs when a user has sent 51 incorrect commands (raised from 21 in 1.8b) in a row to LISTSERV, which LISTSERV interprets as a possible mail loop. (Note also that certain mail packages that send "Read:/Not Read:" notifications back to LISTSERV will trigger this scenario after 51 iterations. The best solution would be for the user to disable receipt notifications.) The user in question cannot restore his or her own service; this command must be issued from another userid. Note that if the user has been manually served out by privileged user (a LISTSERV maintainer), the SERVE command must be issued by a similarly-privileged user (who must also be a LISTSERV maintainer, although naturally the same user who issued the SERVE OFF command can issue the SERVE command). For 1.8d please note that the THANKs command will not reset the serve-off counter (so vacation messages or auto-replies that contain a sentence starting with something like "Thanks for writing" will not defeat the system and users sending them will eventually be served off instead of continuing to loop ad infinitum).

THANKs

You can send this command to check to see if the server is alive. If it is, the server politely responds, "You're welcome!".

The following commands are available only on VM servers:

DATAbase function

Access LISTSERV database(s). The functions are explained in detail in the version of LISTDB MEMO available from VM servers, but the basic syntax is:

Search DD=ddname <ECHO=NO> Perform database search (see the VM version of LISTDB MEMO for more information on this)

List Get a list of databases available from that server

REFRESH dbname Refresh database index, if suitably privileged

Dbase

Same as DATABASE

6.2. List Owner and File Owner Commands

6.2.1. File management commands (for file owners only)

PUT fn ft <filelist <NODIST>>

Update a file you own. Options are:

<PW=password> Supply your password for command authentication

The following options are VM-specific and will not work on the non-VM servers.

The "NODIST" option prevents AFD and FUI distributions when the file is updated. Other available VM only options include:

<CKDATE=NO> Accept request even if the current version of the file is more recent than the version you sent

<DATE=yymmddhhmmss> Set file date/time

<RECFM=F <LRECL=nnn>> Select fixed-format file (not to be used for text files).

<REPLY-TO=userid> Send reply to another user

<REPLY-TO=NONE> Don't send any reply

<REPLY-VIA=MSG> Request reply via interactive messages, not mail (Requires NJE connectivity)

<"parameters"> Special parameters passed to FAVE routine, if any

Standard parameters supported for all files:

TITLE=file title Change file "title" in filelist entry

The following commands are available on VM servers only:

AFD/FUI

Automatic File Distribution privileged commands. In addition to the AFD/FUI functions listed above, a file owner may use the following function:

GET fn ft <filelist> Get a list of people subscribed to a file you own

GET fn FILELIST <(options>

Special options for filelists:

CTL Return filelist in a format suitable for editing and storing back

NOLock Don't lock filelist (use in conjunction with CTL)

REFRESH filelist <(options>

Refresh a filelist you own. The single option is:

NOFLAG Don't flag files which have changed since last time as updated (for AFD/FUI)

UNLOCK fn FILELIST

Unlock filelist after a GET with the CTL option if you decide not to update it after all

Lists [option]

An additional option available for list owners is

OWNed Returns a list of local lists owned by the invoker.

6.2.2. List management functions

Commands that support the QUIET keyword are marked (*)

ADD(*) listname user [full_name]
ADD(*) listname DD=ddname [IMPORT [PRELOAD]]

The first syntax is used to add an individual user to one of your lists, or update his name field. Note that you can substitute an asterisk ("*") for full_name and LISTSERV will substitute "<No name available>" in the list.

The second syntax is used for bulk ADD operations where a dataset (DD=ddname) is used add multiple users, one address/name pair per line. For bulk operations you may also use the IMPORT option, which implies a QUIET ADD (in other words you do not need to specify QUIET if you use IMPORT) and otherwise vastly speeds up the ADD process by loosening syntax checking and omitting success messages. The IMPORT PRELOAD option appeared in 1.8d and is used to direct LISTSERV to preload the existing e-mail keys in memory before starting the transaction, which speeds the operation up considerably. This option is used primarily with DBMS lists to speed up bulk adds. PRELOAD is not necessary for traditional LISTSERV lists and does not normally lead to a significant performance improvement. However, when importing a new list (no existing subscribers), it does reduce CPU usage somewhat.

For a bulk ADD operation, the users are defined in a separate dataset beginning on the line following the ADD command. For instance,

ADD listname DD=ddname IMPORT
//ddname DD *
userid@host.com User Name
userid2@host.com User2 Name
... more address/name pairs, one per line ...
/*

Please see chapter 4.4 of the List Owner's Manual for specific instructions for bulk ADD operations.

ADDHere(*)

Same as ADD, but means "add the user on this peer, do not forward this request to a (possibly) closer peer". For non-peered lists, is functionally identical to ADD.

CHANGE(*) listname|* newaddr
CHANGE(*) listname|* oldaddr|pattern newaddr|*@newhost

The first form can be used by any subscriber and results in a cookie being sent to the new address. This cookie MUST be confirmed by the new address, exactly as it was entered, or the command will fail. This is the only case where a 1.8d cookie must be confirmed by a specific address.

The list owner form does not use cookies but simply applies the standard "Validate=" rules (as for a DELETE command). You can specify a wildcard pattern for the old address and *@newhost for the new address to rename certain addresses to a new hostname. The CHANGE1 template is sent unless you specify QUIET.

Change log entries are made (CHANGE oldaddr newaddr) and there is a new CHG_REQ exit point which allows you to reject the operation.
DELete(*) listname user [(options]
DELete(*) listname DD=ddname [BRIEF]

The first syntax is used to remove a single user from one of your lists, or from all local lists if listname is '*' The available options are:

Global Forward request to all peers

LOCal Don't try to forward request to closest peer if not found locally

TEST Do not actually perform any deletion (useful to test wildcard patterns)

The second syntax is used for bulk DELETE operations (similar to a bulk ADD operation). See chapter 4.5 of the List Owner's Manual for details. The single available option is:

BRIEF Good for deleting wildcard patterns (such as *@*) when you don't want a "userid@host has been deleted from list xxxx" for each user deleted. Returns instead only a count of the users that were deleted.

FREE listname <(options>

Release a held list. The single option is:

Global Forward request to all peers

GET listname <(options>

Get a copy of a list in a form suitable for editing and storing the list and lock it so that other list owners can't modify it until you store it back (or until you or they issue an UNLOCK command). The options are:

Global Forward request to all peers

HEADer Send just the header; on the way back, only the header will be updated. This is the recommended way to modify your list header.

NOLock Do not lock the list

OLD Recover the "old" copy of the list (before the last PUT)

HOLD listname <(options>

Hold a list, preventing new postings from being processed until a FREE command is sent. The single option is:

Global Forward request to all peers

MOVE(*) listname user <TO> node

Move a subscriber to another peer. Do NOT use this command to move users from one list host site to another during migration. It is strictly for moving subscribers from one peer to another peer.

listname DD=ddname Move several subscribers to various peers

PUT listname LIST

Update a list from the file returned by a GET command. This is the standard "PUT command" or "list PUT" referred to throughout this document.

Starting with LISTSERV 1.8d, use of the PUT command to store a list header with new subscriber data at the bottom (e.g., an attempt to add subscribers "on the fly") will result in only the header of the list being stored, and in the generation of the following warning:

WARNING: new  subscriber data was found  in the replacement list  you sent,
possibly due to the use of a signature file with an unusual separator line.
If  you really  meant to  update the  subscriber data,  please resend  your
request with the word "PUT" replaced  with "PUTALL". For now, only the list
header will be updated.

PUTALL listname LIST

Starting with 1.8d, this command allows you to PUT an entire list file, that is, the list header followed by the list of subscribers.

Query listname <WITH options> FOR user

Query the subscription options of another user (wildcards are supported).

* <WITH options> FOR user Searches all the lists you own for the specified user(s) with the specified option(s).

SET(*) listname options <FOR user>

Alter the subscription options for other users (wildcards are supported when setting options for another user or set of users).

Additional options for list owners:

NORENEW/RENEW Waive subscription confirmation for this user

NOPOST/POST Prevent user from posting to list

EDITor/NOEDITor User may post without going through moderator

REView/NOREView Postings from user go to list owner or moderator even if user is otherwise allowed to post

UNLOCK listname

Unlock a list after a GET, if you decide not to update it after all, or unlock a list if it has been locked by another list owner or by the LISTSERV maintainer. Note that if you are not the person who originally locked the list, it is considered good practice to ask the person who originally locked the list whether or not they are done with the list before you unlock it.

The following commands are available only on VM servers:

EXPLODE listname <(options>

Examine list and suggest better placement of recipients, returning a ready-to-submit MOVE job.

BESTpeers n Suggest the N best possible peers to add

Detailed More detailed analysis

FOR node Perform analysis as though local node were 'node'

PREFer node Preferred peer in case of tie (equidistant peers)

SERVice Check to see that service areas are respected

With(node1 <node2 <...>>>) Perform analysis as though specified nodes ran a peer

WITHOut(node1 <node2 <...>>>) Opposite effect

Stats listname (RESET

Resets (BITNET) statistics for the list.

6.3. LISTSERV Maintainer Commands

All LISTSERV maintainer commands require a password for validation when issued by email. Commands issued by TELL or SEND from the local host or via the LCMD utility do not require password validation.

Lists Global

All known lists, one line per list, sent as a (large!) file. Only LISTSERV maintainers may request this list, as it has become a favorite pastime of Internet mailbombers to issue LIST GLOBAL commands on behalf of users whose mailboxes they wish to bomb. You should direct users who request "the whole list of lists" to L-Soft's CataList service at the WWW URL http://www.lsoft.com/catalist.html.

NODESGEN <WTONLY>

Regenerate all LISTSERV network tables, or just compile the links weight file (debugging command). This happens automatically when LISTSERV is rebooted if a new BITEARN NODES file is found. Otherwise you should issue a NODESGEN whenever you update BITEARN NODES.

PUT listname LIST

Create a new list. Requires the CREATEPW for validation when issued from a remote node. You may specify initial subscribers, one per line, following the list header when creating a list. See also the PUTALL command at 6.2.2.

PWC function

Password file management:

ADD user newpw Define a password for the specified user

DELete user Delete password for that user

Query user Query the password of the specified user

REGister name|OFF FOR user

Set or delete a user's SIGNUP FILE entry

SERVE user OFF

Permanently suspend access from an abusive user or gateway (restore with 'SERVE user')

SHUTDOWN

Stop the server. Under VM and OpenVMS only, REBOOT or REIPL are also allowed as options to the SHUTDOWN command. Under unix and Windows, the REBOOT or REIPL feature is not available and these options, if issued, are ignored and the server is simply shut down, requiring a manual restart.

STOP

Same as SHUTDOWN

The following commands are available only on VM servers:

CMS command_text

Issue a CMS command and get the last 20 lines of response sent back to you, the rest being available from the console log

CP command_text

Issue a CP command and get up to 8k of response data sent to you (the rest is lost)

DATAbase function

Control operation of databases:

DISAble Disable interactive database access, without shutting down existing sessions

ENAble Re-enable interactive access

SHUTDOWN Shut down all interactive database sessions, and disable interactive access

INSTALL function

Software update procedure (LISTSERV-NJE only):

CLEANUP shipment Remove an installed shipment from the log

CLEANUP BEFORE dd mmm yy Remove all shipments installed before that date

PASSWORD shipment PW=instpw Confirm installation of a shipment, when requested by LISTSERV

RELOAD shipment Attempt to reload a shipment which failed due to a disk full condition

STATus Get a list of installed "shipments"

OFFLINE

Suspend processing of reader files and disable the GET command

ONLINE

Cancel OFFLINE condition

PUTC fn ft <fm|cuu|dirid> <RECFM=F LRECL=nnn>

Update a CMS file on one of LISTSERV's R/W minidisks; note that this is similar to SENDFILE + RECEIVE or LINK + COPYFILE and should NOT be used to update file-server files

SENDFile fn ft <fm|cuu|dirid>

Request the server to send you a file from one of its disks

SF

Same as SENDFILE

SHOW <function>

In addition to the standard SHOW functions available on other servers, VM servers support the following functions:

BENCHmarks CPU/disk/paging benchmarks

EXECLoad Statistics about EXECLOADed REXX files

LSVFILER Statistics about LSVFILER file cache

PREXX Statistics about PREXX functions usage

STORage Information about available disk space and virtual storage

SHUTDOWN <REBOOT|REIPL>

Stop or reboot the server (the two options are synonyms meaning to restart the server after shutting it down). REBOOT or REIPL are also allowed as options to the SHUTDOWN command under OpenVMS, but are not available under unix or Windows.

Note: some debugging commands and options have been omitted.

6.4. Sending commands to LISTSERV

You will see numerous references to "sending commands to LISTSERV" in this and other L-Soft manuals. All LISTSERV commands are sent to the server either by email or (in LISTSERV 1.8d and following) via the web administration interface described in Chapter 11. For mailed commands, this means that you must create a new mail message using whatever command this requires for your mail client (click on "New message" or its equivalent for most mail clients) addressed to the LISTSERV address. Let’s say for the sake of argument that the list you are managing is running on a server called LISTSERV.MYCORP.COM In order to send a command to that server, you would create a new message and address it to LISTSERV@LISTSERV.MYCORP.COM, and place the command(s) in the body (not the subject) of the message.

Depending on how you have security set up for your lists, some or all commands may require that you validate them with a personal LISTSERV password.

6.5. Defining Personal Passwords

The passwords recognized by LISTSERV for various operations (assuming that the NOPW parameter is not used with the "Validate=" keyword) are of two distinct types:

To add a personal password, send mail to LISTSERV with the command

PW ADD newpassword

in the body of the message. LISTSERV will request a confirmation via the "OK" mechanism (see above) before it adds the password.

If you want to remove your password altogether, send the command

PW RESET

This command will also require confirmation.

And finally, if you simply want to change your personal password, send the command

PW CHANGE newpassword [PW=oldpassword]

If you do not include the old password in the command (e.g., you’ve forgotten it), LISTSERV will request an "OK" confirmation. Otherwise, it will act on the command without need for further confirmation (unless, of course, the oldpassword provided is incorrect).

Personal passwords may also be defined via the web administration interface at login time.


7. Creating and Maintaining Lists

You can create and maintain lists from any userid listed in the POSTMASTER keyword of LISTSERV’s site configuration file. Note that a LISTSERV maintainer has the authority to GET and PUT any list, filelist, catalog, or archive file on the server (although for any list not set to "Send= Public", the LISTSERV maintainer must be subscribed to the list in order to post to it, and must additionally be a list Editor if the list is set to "Send= Editor...").

7.1. Basic list creation

At its simplest, creating a list is a matter of setting certain keywords to desired values in a file (called the "list header file") and storing the file in a place where LISTSERV can find it. The format of a typical list header file is relatively free-form, with only a few basic rules:

  1. All header lines (including those inserted for "white space") must begin with the character "*" (ASCII 0x2A).

  2. Header lines can be up to 100 characters long (including the initial "*" character). However in practice you will probably want to limit them to no more than 80.

  3. All words ending with the character "=" (ASCII 0x3D) are evaluated as keywords.

  4. The first non-"white space" line of the header file is evaluated as the descriptive name of the mailing list, and will be displayed as such by the LIST command.

Additionally, for PUT operations, you must add a line of the format

PUT listname.LIST PW=password

to the top of the file before mailing it. This PUT line does not begin with an asterisk. (Note that the filename for the list can be either in the format listname LIST or listname.list . The "." character is not necessary, but the word LIST is always necessary.)

Here is a sample of a basic list header with its PUT command at the top:


PUT SAMPLE LIST PW=CCCCCCCC * * Title of sample LISTSERV list * * Review= Public Subscription= Open Send= Public * Notify= Yes Reply-to= List,Respect Validate= No * Notebook= Yes,A,Monthly,Public * * Owner= someone@somewhere.com *
Figure 7.1. A sample list header.

The preferred method of creating a new list is as follows:

1. Using a text editor, prepare a "list header", for instance using the sample in figure 7.1. You can also get the header of an existing (L-Soft) LISTSERV list and use it as a sample.

2. The first line of the list header MUST be as follows:

PUT LISTNAME.LIST PW=CCCCCCCC

Replace "LISTNAME" with the name of your list, e.g.,

PUT MYLIST-L.LIST PW=CCCCCCCC

Then replace "CCCCCCCC" after "PW=" with the value of "CREATEPW=" in your site configuration file. If your CREATEPW is FIATLUX, then your complete PUT line for a list called MYLIST-L would be as follows:

PUT MYLIST-L.LIST PW=FIATLUX

Note that one of the most common errors made by new LISTSERV users is to leave out the ".LIST" part of the PUT command. If you leave this part out, LISTSERV will bounce the header back to you with the comment that it does not have any file by the name "MYLIST-L PW=FIATLUX".

3. Following the PUT line, you insert as many "list header" lines as you need (see the sample). Each of these lines MUST begin with an asterisk in column 1, e.g.,

* Notebook= Yes,C:\LISTS\PUBLIC,Monthly,Public

If your mail software indents paragraphs by default, you must turn off paragraph indentation, or an attempt to store the list will be returned to you with a message that there did not appear to be any list header lines.

Each "list header" line contains information needed by LISTSERV to operate your list. Most of this information is provided by you in the form of values for standard keywords. You can use the sample header provided above as an example; a complete list of keywords recognized by LISTSERV along with descriptions of their functions can be found in Appendix B of of this manual.

4. Mail the resulting file to the LISTSERV address.

The "LISTSERV address" is the address formed by "LISTSERV@" + the value you defined in the site configuration file for NODE=. For instance, if you defined NODE=XYZ.COM, the LISTSERV address would be LISTSERV@XYZ.COM.

This mail must be sent as Internet mail from a username defined as a "postmaster" in the LISTSERV configuration. For instance, from a VMS™ system, you would save your list file (say, in a file called 'newlist.create'), and then do:

$ mail
MAIL> send newlist.create
To: in%"listserv@xyz.com"
Subj:

MAIL>

Or, from a unix® system:

$ mail listserv@xyz.com < newlist.create

On a PC, you would use your POP client or other GUI-based mail program. Make sure to cut+paste the file via the Clipboard and not send it as an "attachment" or use drag and drop. "Attachment" mechanisms are often proprietary or PC-specific and cannot be guaranteed to work. Sending plain text pasted from the Clipboard always works.

The above is the preferred method for creating and editing list headers. LISTSERV will respond with a report that either the list has been successfully created or that various problems (fatal and/or non-fatal) have been detected. If only non-fatal problems are detected, the list will be stored anyway (non-fatal problems include no list password having been defined). Any fatal problem detected will abort the storage operation.

A less-desirable method of creating lists is to copy the list header file into LISTSERV’s main directory and restart LISTSERV. LISTSERV will log a message to the effect that the list is not formatted properly and will then reformat the list. This assumes that the list header has been constructed properly and that there are no errors in the file that will cause LISTSERV to crash or to reject the list file. This method is useful only for creating lists; never attempt to edit a production list file in place and restart the server. The GET and PUT operations are the only supported methods for editing list files. Particularly under unix and Windows, LISTSERV will not always accept the edited list file because some editors will insert control characters or CR-LF combinations that LISTSERV cannot parse. Under VM or VMS, it is always possible that hand-editing the list will introduce some sequence that will cause an operational error. L-Soft suggests that this method be used sparingly, if at all, and does not support it. The first method is always preferable to the second.

BITNET users may also use the LSVPUT utility to store lists on BITNET-connected servers. However, LSVPUT is not documented here as the number of sites with BITNET connectivity is dropping rapidly and fewer and fewer users will be using LSVPUT.

7.2. Architecture-Specific Steps for List Creation

7.2.1. Unix: Creating required Sendmail aliases

This section is for use only by Unix sites running Sendmail.

Please note that the file you need to edit in this step, and the commands you need to issue will require root privileges. Also, while the procedure for manually modifying the sendmail aliases file is described below, you can also enter "make list name=listname" (where listname is the name of the list) to have the installation program complete this step automatically. The automated procedure assumes that your sendmail stores aliases in the file /etc/aliases, that the "newaliases" command will rebuild the aliases database, and finally that "kill -HUP `cat /etc/sendmail.pid`" will cause Sendmail to read in the updated alias list.

LISTSERV accepts and responds to several e-mail addresses. Even before you setup mailing lists, mail sent to listserv and owner-listserv should be handed to LISTSERV (see the installation guide for details). The link between LISTSERV and your mail system is the lsv_amin program. If you are running Sendmail, the best way to route incoming mail to lsv_amin is by adding entries to your "aliases" file. Refer to the manual pages for sendmail on your system if you are not sure where the alias file is stored. On many systems the file will be called /etc/aliases.

Once you have constructed a list header file, and sent it to your Unix LISTSERV server, you need to instruct your mail system to route mail for that new list to the LISTSERV mail interface. That involves adding entries to your aliases file, much as you did when installing the server itself. For each new list, you'll need to add eight entries to the aliases file. The format of those lines is as follows,

NAME: "|/BBB/lsv_amin /SSS NAME"
owner-NAME: "|/BBB/lsv_amin /SSS owner-NAME"
NAME-request: "|/BBB/lsv_amin /SSS NAME-request"
NAME-search-request: "|/BBB/lsv_amin /SSS NAME-search-request"
NAME-server: "|/BBB/lsv_amin /SSS NAME-server"
NAME-signoff-request: "|/BBB/lsv_amin /SSS NAME-signoff-request"
NAME-subscribe-request: "|/BBB/lsv_amin /SSS NAME-subscribe-request"
NAME-unsubscribe-request: "|/BBB/lsv_amin /SSS NAME-unsubscribe-request"
where "NAME" is the name of the mailing list, "/BBB" in the directory where the mail interface was installed (BINDIR in the Makefile), and "/SSS" is the LISTSERV spool directory (LSVSPOOL in the Makefile). Note that "/SSS" can be either:

Note: If you use the precompiled copy of lsv_amin from the distribution kit rather than compiling your own from the source at install time, you cannot use the -t switch because the LSVSPOOL value is not compiled into the precompiled program.

For example, assuming the default values were chosen for BINDIR and LSVSPOOL, the aliases for a new list called "mylist" (using the -t option) would be,

mylist: "|/usr/local/bin/lsv_amin -t mylist"
owner-mylist: "|/usr/local/bin/lsv_amin -t owner-mylist"
mylist-request: "|/usr/local/bin/lsv_amin -t mylist-request"
mylist-search-request: "|/usr/local/bin/lsv_amin -t mylist-search-request"
mylist-server: "|/usr/local/bin/lsv_amin -t mylist-server"
mylist-signoff-request: "|/usr/local/bin/lsv_amin -t mylist-signoff-request"
mylist-subscribe-request: "|/usr/local/bin/lsv_amin -t mylist-subscribe-request"
mylist-unsubscribe-request: "|/usr/local/bin/lsv_amin -t mylist-unsubscribe-request"
(note that the aliases may not wrap to the next line in /etc/aliases)

If you should decide to use the explicit definition for the LSVSPOOL parameter, the aliases would look like this instead:

mylist: "|/usr/local/bin/lsv_amin /var/spool/listserv mylist"

and so forth. Once you've added the new aliases to the file, you need to issue the "newaliases" command and (on some systems) send your Sendmail daemon a hangup (HUP) signal before they will take effect.

7.2.2. VMS: Creating required PMDF aliases

This section is for use only by VMS sites running Innosoft International, Inc.'s PMDF® product, version 4.2 or later.

Please note that you will require system level privileges to edit the file in this step .

If PMDF is installed, in addition to the listserv and owner-listserv aliases which you've created in PMDF_ROOT:[TABLE]ALIASES at install time, you will need to add the following eight aliases for each new mailing list you create, where listname is the name of the list:

listname:                      listname@LISTSERV
owner-listname:                owner-listname@LISTSERV
listname-request:              listname-request@LISTSERV
listname-search-request:       listname-search-request@LISTSERV
listname-server:               listname-server@LISTSERV
listname-signoff-request:      listname-signoff-request@LISTSERV
listname-subscribe-request:    listname-subscribe-request@LISTSERV
listname-unsubscribe-request:  listname-unsubscribe-request@LISTSERV
Note: You can get around this bit of tediousness (and also solve a problem with address probing under VMS with PMDF as documented in 13.5.3, below) by simply creating a dedicated domain for LISTSERV (eg, LISTSERV.XYZ.COM) and adding a rewrite rule to redirect all traffic for that host to the LSV channel. This also simplifies the creation of new lists since it is no longer necessary to make all of the PMDF aliases shown above every time you make a new list.

7.3. A sample checklist for creating lists

  1. Check to see that the list name is legal and not duplicated elsewhere. You can use the CataList (http://www.lsoft.com/catalist.html) as one resource for the latter.

  2. If Notebook= Yes, then make the appropriate directory and make sure that LISTSERV has appropriate r/w permissions in it.

  3. If Notebook= No but Digest= Yes, then make the appropriate directory and make sure that LISTSERV has appropriate r/w permissions in it.

  4. Optionally, add the list to the quota file (ISP scope licenses only; see chapter 19 for details)

  5. VM: Optionally, make a listname.FILELIST for this list (see chapter 8 for details)
    Non-VM: Optionally, make an entry in SITE.CATALOG for a sub-catalog belonging to this list (see chapter 8 for details) and create a dummy listname.CATALOG in the specified directory.

  6. Non-VM: Optionally, assuming that Notebook= Yes and you have installed the web archive interface as described in chapter 5, create the listname directory under the base 'archives' directory. If you do this now, you won't have to GET/PUT the list header later to initialize things.

  7. Create and store the list header with the list owner and you as the only subscribers.

  8. Architecture-specific steps:

  9. Send a boilerplate "your list has been created" message to the list as the final test that the list works--if it doesn't, go back and find out why, then return here. See Appendix D for a sample boilerplate message for this step, or use your own.

  10. Delete yourself from the list (assuming you don't want to be subscribed)

At this point the list should be ready for use.

7.4. Naming Conventions

When naming a list, there are a few conventions and restrictions that you should keep in mind.

The "-L" convention

The "-L" convention isn't required, but it can help people to realize that the mail is coming from a mailing list rather than from a real person. The people we are referring to here are people who run Internet mail systems, who may see a great deal of mail coming from a single host and begin to wonder why. If it comes from a userid that ends in a "-L", they will be more likely to recognize it as list mail.

Reserved characters

Generally you want to avoid "special" characters such as the ones above the number keys on your keyboard. For example, don't use:

! which can be confused for "bang-path" addressing, e.g., UUCP

@ which is a reserved character

# which can cause problems with some mail software which uses it for addressing

$ which may have a special meaning to the unix shell

% another addressing character that could cause problems

& is sometimes reserved by non-unix systems (specifically on NT it has a special meaning to the shell). However, please note that use of this character in the name of a list or in a sendmail alias for a list will cause LISTSERV on unix to choke. Note that it is possible under unix to create a list with a "&" character in the name quite easily, and it is also possible to create a sendmail alias with a "&" character in the alias. That does not mean it will work.

* is, of course, the wildcard character.

() Parenthesis are generally reserved and can't be used in file names.

+ The plus character should be avoided because recent versions of sendmail deliver mail addressed to "user+whatever@somedomain" to "user@somedomain." Whether or not this is an intelligent thing to do on sendmail's part is left as an exercise for the user, but it can affect mail being sent to a list with a "+" character in the listname.

/ The slash character is reserved and can't be used in file names.

. Although on some systems it is physically possible to create lists with a dot character in the name, in general LISTSERV will not accept this nomenclature. The only place a dot can or should be used is before the word "LIST" in the PUT command; e.g., PUT MYLIST-L.LIST is equivalent to PUT MYLIST-L LIST.

" Double-quote characters are not allowed.

It is best if you avoid the use of special characters altogether and stick exclusively to the letters A-Z, numbers 0-9, and the underscore and hyphen characters when naming lists. Note that the "_" (underscore) character may cause problems with some non-compliant receiving systems. Also note that the space character (ASCII 0x20) is illegal in a list name, and L-Soft recommends that, although apostrophes (aka "single-quotes", ASCII 0x27) are valid in an RFC822 username, they not be used in list names since some mail programs may not accept them. (Prior to 1.8d, not all LISTSERV commands will work for lists whose names contain an apostrophe.)

If you have any question about the validity of a particular name, you can of course refer to RFC822 ( http://www.ietf.org/rfc/rfc822.txt) for the Internet standards for e-mail addressing.

Maximum length of the list name

The length of the list name (that is, the name of the list file and thus the "official" name of the list) is restricted as follows:

VM:       8 characters
Non-VM: unlimited (starting with 1.8c; but see below)

If you need a longer list name for a list running on a VM server, you should use the List-ID= keyword (see Appendix B).

PLEASE NOTE CAREFULLY that L-Soft recommends using names of 32 characters or less whenever possible as they provide for correct alignment of the results returned by certain commands. Very long (program generated) list names are likely to conflict with mail system limits and L-Soft recommends other solutions to the problem of dynamically generated lists. As a rule, list names in excess of 70 characters are likely to result in mail delivery problems.

Make it easy on your users

While you can (within limits) name a LISTSERV mailing list just about anything you want, you will probably want to follow a couple of simple guidelines:

1. Keep the name simple.

2. Keep the name as short as possible without causing confusion.

No doubt you could name a list MY-LIST-FOR-MATH-STUDIES, but who wants to type that? Conversely, MLFMS-L wouldn't mean much to Joe Random User. Somewhere in the middle is a reasonable compromise, e.g., MATH-STUDIES (or even just MATH-S).

7.5. List Header Keywords and what they do

How a LISTSERV mailing list performs its tasks is defined by its header keywords. There are several different categories of keywords, each of which is discussed below in general terms. We will discuss these keywords in detail in subsequent chapters, and a complete alphabetical listing of list header keywords, including default settings and all options available, is provided in Appendix B.

Access Control Keywords. These keywords designate the level of "openness" for a list. They determine who can post to the list, who can review the list of subscribers, and whether or not the list is open to general subscription.

Distribution Keywords. This group has to do with how LISTSERV distributes postings to subscribers, including whether or not acknowledgments are sent back to posters, how many postings may go through the list daily, whether or not the list is available in digest form and whether it is available to USENET through a gateway. These keywords also determine whether or not list topics are enabled, and how LISTSERV will configure outgoing postings for replies.

Error Handling Keywords. Included under this group are the keywords controlling automatic deletion, loop-checking, and to whom error messages are sent for disposition when received by LISTSERV.

List Maintenance and Moderation Keywords. A fairly large group of keywords having to do with how the list is operated, including definitions for the list owner, list editor, and the list archive notebook; whether or not (and who) to notify when users subscribe and sign off; how often subscriptions must be renewed, and so forth. These are perhaps the most basic keywords that can be set for a given list, and one of them ("Owner=") must be set for a list to operate.

Security Keywords. These keywords control who can "see" the list (that is, whether or not the list appears in the List of Lists for a given user, based on the user's host site), whether or not the list is protected by a password, and the level of security necessary for changes to the list itself. The "Exit=" keyword is also contained in this group.

Subscription Keywords. These control whether or not the list is open to general subscriptions, whether or not a mailing path confirmation is required, and what user options are set by default upon subscription.

Other Keywords. These control other aspects of list management that are not generally changed from their defaults, and which do not fit readily into the categories listed above.

7.6. Retrieving and editing the list - some considerations

Never attempt to hand-edit a production list file in place and restart the server. The GET and PUT operations are the only supported methods. Particularly under unix and Windows, LISTSERV will not always accept the hand-edited list file because some editors will insert control characters or CR-LF combinations that LISTSERV cannot parse. Under VM or VMS, it is always possible that hand-editing the list will introduce some sequence that will cause an operational error. L-Soft suggests that this method be used sparingly, if at all, and does not support it.

Once the list has been created, you can have a copy of the list sent to you for editing purposes. Simply issue the GET listname command to LISTSERV. This will cause the server to mail you a copy of the entire list (header and subscriber list).

If you want to change header keyword settings only, it is probably advisable to issue the GET command with the (HEADER switch:

GET listname (HEADER

The GET command automatically locks the list so that no changes can be made to the operating copy on the server until you do one of two things:

Leaving the list locked also prevents new subscribers from signing up. It is therefore not advisable to leave the list locked for long periods of time. This necessitates remembering to issue the UNLOCK command if you decide not to make any changes.

It is possible to request that LISTSERV not lock the list when it is sent to you. This is accomplished by adding the (NOLOCK switch to the GET command. You can use (NOLOCK and (HEADER together as in the following example:

GET listname (HEADER NOLOCK

(Note that the "(" switch character is used only once.)

CAUTION: It is not advisable to use the (NOLOCK switch in at least two cases:

Another caution (1.8c and earlier): If you GET the header with the (HEADER switch, do not add new subscribers "on the fly" to the bottom of the header. If you do, your subsequent PUT will replace the entire list online with what you have sent, canceling the subscriptions of every user on the list (except for the ones you added to the header).

Under 1.8d and following the above problem has been alleviated by the new PUTALL command and a modification to PUT. A PUT command containing new subscribers added "on the fly" will result in only the header of the list being updated and a warning being generated that says if you really wanted to PUT the entire list, subscribers and all, that you should use the PUTALL command.

LISTSERV maintainers should note one further caution: It is considered extremely inadvisable to "hand-edit" subscriber lists, as columns at the far right of each subscriber's entry contain list control codes corresponding to the subscriber's personal option settings. The only case in which it might be appropriate to "hand-edit" would be to delete a user entirely, and then only if all attempts to delete the user via the DELETE command fail. For instance, X.400 or X.500 addresses can cause DELETE to fail because of their use of the "/" character. You can use wildcards to delete these subscriptions:

DELETE XYZ-L *ADMD=ABC*PRMD=DEF*@X400.SOMEHOST.COM

You can also enclose the address in double quotes:

DELETE XYZ-L "/ADMD=ABC/PRMD=DEF/...../@X400.SOMEHOST.COM"

7.7. Adding a list password (obsolete since 1.8c)

This section is retained for compatibility with those sites still running 1.8b or earlier.

When creating the list, the LISTSERV maintainer should assign a password for the list. However, note that in 1.8c and later, if the LISTSERV maintainer does not assign a password at the time of the list's creation, LISTSERV will generate a random password for the list. This random password can be changed later, but until and unless it is changed, administrators must provide their personal LISTSERV password (created with the "PW ADD password" command) when updating the list.

Compatibility note: When upgrading to LISTSERV 1.8d from 1.8b or earlier, lists without passwords will not be altered during the upgrade. However, the first PUT operation for such lists after the upgrade will cause LISTSERV to add the random password to the list. List owners should be encouraged prior to the upgrade to create personal passwords for themselves with the "PW ADD password" command (if they have not done so already) and plan to use those passwords after the upgrade.

The list owner can change this password when storing the list (with the "PW=" keyword), but the first time the list owner stores the list, the original password or the list owner's personal password must be used. Note that not all LISTSERV maintainers assign list passwords by default; the new random password feature addresses that. However, for pre-1.8c servers it is highly recommended that one be assigned by adding a "PW=" header line as follows:

* PW=MYPASSWD

Replace "MYPASSWD" with the word chosen. Note that there should not be a space between "PW=" and the password. The list password is never changed unless specified explicitly in the list header when it is stored on the server. For additional security, the list password will not appear in the list header on subsequent GETs; to all intents and purposes it is invisible once it is assigned.

L-Soft’s position on list passwords is that they have become obsolete with version 1.8c (they were actually obsolete as far back as 1987), and that personal passwords should be used instead to validate commands (such as the PUT command).

7.8. Storing a modified list on the host machine

(If you are creating a list, see 7.1. These instructions are for storing a list once it already exists on the server, for instance, if changes have been made to the list header after a GET operation.)

When you are ready to store your list on the host, include the list file in a mail message to LISTSERV. Ensure that the PW=XXXXXXXX command is in the first line of the mail body. Then send the message.

If LISTSERV has trouble processing the edited list file, it will return a discrepancy report to you with each error noted. If the errors are categorized as "warnings only", LISTSERV will go ahead and store the list. However, if any one error is categorized as a serious error that could actually affect the correct operation of the list, the list will not be stored and the old version will be retained. (For instance, creating a list with no list password defined in the header will generate a "soft" error under 1.8b and before, and the list will be stored. On the other hand, setting a list to "Send= Editor" and not defining an editor with "Editor=" is considered a "hard" error, and you will have to fix the error before LISTSERV will accept the list for storage.)

Caution: If you are using a mailer such as Eudora, Pegasus, Pine or Microsoft Mail that allows "attachments" to mail, do not "attach" the list file to your mail message. It must be in plain text with the PUT line at the top. LISTSERV will not translate encoded attachments.

If your mail software inserts page formatting (margins) or quoting characters (such as ">") in forwarded mail, you need to either turn these features off or you must cut and paste the header into a new mail message. The PUT line MUST be on the first line of the message, and all header lines including the PUT MUST start in column 1. Specific problems have been noted with cc:Mail (where top and left margins get inserted) and with certain POP clients including Eudora and Microsoft Exchange (where forwarded mail is quoted with ">" by default).

Also, be sure to turn off your signature file (if you use one) before sending a PUT command to LISTSERV. If you don't, LISTSERV will attempt to parse the data in your signature file as RFC822 addresses to be added to the list, and you will receive either an error to the effect that the file includes invalid RFC822 addresses and it has therefore not been stored, or a warning that your PUT operation contains new subscriber information and only the list header has been stored (see 7.6 for information on the PUTALL command).

7.9. Fixing mistakes

LISTSERV always backs up the current list file before it stores a new copy. Should you discover that you have made a mistake (for instance, you have deleted all users by storing a header and adding users "on the fly"), it is possible to retrieve the previous copy of the list by issuing a GET listname (OLD command to the host server. You must then add the PUT listname LIST PW=XXXXXXXX command to the top of the file and store it. (In LISTSERV 1.8d and later you should use the PUTALL command for this purpose since you will be storing the entire list, not just the header.)

It is also possible for the LISTSERV maintainer to restore the list by deleting or moving the listname.LIST file from LISTSERV's A directory and renaming the listname.OLDLIST file to listname.LIST. Naturally this method requires that the LISTSERV maintainer in question have appropriate access to LISTSERV's files and directories or be able to log in as the 'listserv' user.

7.10. A sample list header file

A basic list header file for a list to be created might look like this (CREATEPW must be replaced with the appropriate password):


PUT MYLIST.LIST PW=CREATEPW * The Descriptive Title of My List * * Owner= NATHAN@LSOFT.COM (Nathan Brindle) * Notebook= Yes,E:\LISTS\MYLIST,Monthly,Public * Errors-To= Owner * Subscription= Open,Confirm * Ack= Yes Confidential= No * Validate= No * Reply-to= List,Respect Review= Public * Send= Public * Default-Options= NoRepro,NoMIME *

* This list installed on 96/06/02, running under L-Soft's LISTSERV-TCP/IP * for Windows NT. * * Comment lines... *
Figure 7.2. A sample list header file for a list called MYLIST.

A list owner might take the created list and modify it as shown below. Note that the PUT command has been modified to include the password you've assigned with the PW ADD command.


PUT MYLIST.LIST PW=MYPASSWD * The Descriptive Title of My List * * Owner= NATHAN@LSOFT.COM (Nathan Brindle) * Owner= Quiet: * Owner= nathan@linus.dc.lsoft.com * Owner= ncbnet@linus.dc.lsoft.com * Notebook= Yes,E:\LISTS\MYLIST,Monthly,Public * AutoDelete= Yes,Full-Auto * Errors-To= ncbnet@linus.dc.lsoft.com * Subscription= Open,Confirm * Ack= Yes Confidential= No Notify= No * Mail-Via= Distribute Validate= No Send= Public * Reply-to= List,Respect Review= Public X-Tags= Yes * Default-Options= NoRepro,NoMIME *

* This list installed on 96/06/02, running under L-Soft's LISTSERV-TCP/IP * for Windows NT. * * Comment lines... *
Figure 7.3. The edited list header file ready to be sent back to the server.

7.11. Deleting a list

For security reasons, LISTSERV does not have an explicit command for deleting lists. The LISTSERV administrator simply deletes the list file from the system command prompt with the appropriate file system command (CMS ERASE for VM, DEL for VMS, ERASE for Windows, rm for Unix). A suggested procedure for deleting an established list (one with archives and so forth) follows:

  1. Back up any files you wish to keep, such as notebook archives

  2. For a digested list, you may want to send a QUIET SET listname NODIGEST FOR *@* command. This will cause LISTSERV to send out its accumulated digest to those who were set to DIGEST mode. If the list hasn't been active or if it's not digestified, you don't need to take this step.

  3. Delete the listname.LIST file with the appropriate file system command.

  4. If the list has web archives, delete the /archives/listname.html file and the /archives/listname/listname.ind* files. You can also remove the /archives/listname directory at this time.

  5. Although it is not absolutely necessary, stopping and restarting LISTSERV will complete the procedure. If you do not stop and restart LISTSERV, LISTSERV will fairly quickly notice that the list is gone, and will take care of this on its own.

7.12. Adding HTML to a list header for the CataList

L-Soft's CataList service allows users to search the global list of LISTSERV lists via the World Wide Web. Adding an HTML description to a list is easy, and can do a lot to enhance the appearance of a list in the database. All the list owner or LISTSERV maintainer has to do is update the list header and add the text of your choice. Here is an example:

* The coffee lovers' list
*
* Review= Public    Subscription= Open         Send= Public
* Notify= Yes       Reply-to= List,Respect
* Notebook= Yes,L,Monthly,Public
*
* Owner=  claudia@espresso.xyz.it (Claudia Serafino)
*
* <HTML>
* COFFEE-LOVERS is an open list for, well, coffee lovers! Our
* motto is: <cite>"Instant -- just say no!"</cite>
* That's pretty much our whole charter, although there are a
* few other <a href="http://www.coffee.org/charter.html">
* rules</a> that you may want to read before joining. For
* instance, we don't allow flame wars about decaf: if you like it,
* well, it's your body after all.
*
* <p>The list is maintained by
* <a href="http://www.coffee.org/claudia.html">Claudia
* Serafino</a> (that's me!) and you will find all sorts of
* useful info about coffee on my home page.
* </HTML>
*

In other words, you just insert your HTML text in the list header and bracket it with <HTML> and </HTML> tags (these tags tell the web interface where the HTML text begins and ends -- they are not actually sent to the web browser). There are three simple rules that you must follow when inserting your HTML data:

  1. The <HTML> and </HTML> tags must appear on a separate line, as shown in the example above. You cannot have anything else on that line and, in particular, you cannot mix keyword definitions with HTML data.

  2. The HTML data you are providing is embedded into the document shown by the web interface when users query your list. Because you are given some space between two horizontal rules on an existing page, rather than a whole new page. you should not include tags that affect the whole document, like for instance <TITLE>.

  3. While this procedure is compatible with all versions of LISTSERV, there are a few restrictions on the placement of equal signs within your HTML text with versions that do not have any specific support for the <HTML> and </HTML> markers. In practice, you can ignore this rule unless you get an error message while storing your list.

When reformatting your list header description for HTML, bear in mind that the text will not always be viewed using a web browser. It is best to keep the formatting as clear as possible and minimize the usage of HTML tags, since there are still many people without WWW access. For instance, do not hesitate to use white space between paragraphs for clarity.

7.12.1. Update latency

Barring network outages, a list header update takes a maximum of 24h to be reflected in the distributed LISTS database. Database updates are usually scheduled to be broadcast at night, so the changes take place overnight. Once the LISTS database has been updated, it can take a maximum of 24h for the frozen copy of the database used by the web interface to be updated. In most cases, both the LISTS database and its frozen copy on the web server will be updated overnight. However, if the site hosting your lists is several time zones west of the site hosting the web server, and if that server only updates itself once a day, you may have to wait two days for your update to be reflected.

7.12.2. Inserting a pointer to another list

Sometimes it may be useful to link a number of related lists together so that the viewer can quickly examine all the lists without having to go back to the search screen and retyping the names you are providing. You can do this using the special HTML sequence:

<!--#listref listname@hostname-->

This sequence is internally translated to an <a> tag with a URL that will bring up information about the list you indicated. You must then provide a suitable caption and a closing </a> tag. Example:

Don't forget to take a look at
<!--#listref COFFEE-L@COFFEE.ORG-->
the coffee list!</a>

7.12.3. Restrictions on the placement of equal signs

While all versions of LISTSERV are supported, servers which have no specific support for the <HTML> and </HTML> tags will process your HTML data as an ordinary list header line and attempt to determine whether it contains a list header keyword or descriptive text. The exact algorithms vary from one version to another, but in general the parser looks for a single word followed by an equal sign. With HTML text, it is possible (if unlikely) to generate such patterns. Here is an example:

*
* Sample list with problem pattern
*
* <HTML>
* For more information on the list, just check <a
* href="http://www.xyz.edu/mypage.html">my home page.</a>
* </HTML>
*

In that case, you can just reorder the HTML data so that the equal sign does not appear in this position. Alternatively, if the equal sign was meant to be actually displayed as an equal sign (as opposed to being part of some HTML tag), you can use the HTML escape sequence &#61; instead.

7.13. How to set up lists for specific purposes

Under LISTSERV 1.8d and later, you can create certain types of lists from standard templates via the web. See chapter 11.9, below, for information on how to access the web-based server administration interface.

7.13.1. Public discussion lists

Public discussion lists have always been the "classic" type of LISTSERV mailing list. Such lists are available to discuss just about everything imaginable. In the last few years it has become desirable to secure mailing lists against random spamming and mailbombing, but no discussion of different types of lists would really be complete without talking about this kind of list.

Typically, a public discussion list is wide-open (although some things, like the ability to review the subscribership, may be restricted). Anyone can subscribe (with a confirmation to verify the mailing path), anyone can post, anyone can read the messages in the archives, and security is set fairly low. Very large lists (hundreds or even thousands of users with hundreds of postings every week) may likely be set up this way as it is a "low-maintenance" way to run a list (and most spams tend to be caught by LISTSERV's anti-spamming filters anyway). For instance you might have

* My public discussion list (MYLIST-L)
* Subscription= Open,Confirm
* Ack= Yes
* Confidential= No
* Validate= No
* Reply-to= List,Respect
* Review= Owners        Send= Public      Errors-To= Owner
* Owner= joe@example.com
* Notebook= Yes,E:\LISTS\MYLIST-L,Weekly,Public
For more security, you might want to code

* Validate= Yes,Confirm

and if you want to cut down on the amount of "me-too"ism on the list, you could set

* Reply-to= Sender,Respect

to force the default Reply-To: header to point back to the original poster instead of to the list.

There is one major caveat with regard to the use of the Reply-To= list header keyword. You should note carefully that not all subscriber-side mail clients either recognize or properly handle an RFC822 "Reply-To:" header. This may result in users posting replies to your list even though LISTSERV put the correct Reply-To: header on the mail. There is absolutely nothing that L-Soft can do to correct this problem since it exists on the subscriber's end in non-compliant mail software that L-Soft does not and cannot support.

7.13.2. Private discussion lists

Private discussion lists are similar to public discussion lists, but with varying restrictions on who may subscribe, who may post and who may view the archives. Such lists are relatively safe from random spamming since typically only a subscriber can post (but note that a spammer spoofing mail from a subscriber's address will probably be successful unless first caught by the anti-spamming filters). For instance:

* My private discussion list (PRIVATE-L)
* Subscription= By Owner
* Ack= Yes
* Confidential= Service
* Validate= No
* Reply-to= List,Respect
* Review= Owners
* Send= Private
* Errors-To= Owner
* Owner= joe@example.com
* Notebook= Yes,E:\LISTS\PRIVATE-L,Weekly,Public

is a low-security private discussion list where subscriptions requests are passed on to the list owner(s) for review, only subscribers may post, and only subscribers may view the list archives. Here again, for more security you might want to set "Validate= Yes,Confirm", and of course you can have replies go to the original poster rather than to the list with " Reply-To= Sender,Respect" (with the same caveats as noted above in 7.13.1).

7.13.3. Edited lists

An edited list is one which requires a human editor to approve messages sent to the list. Some list software and most USENET newsgroups refer to this as "moderation", but to avoid confusion between two types of moderated LISTSERV lists, the present example will be referred to as an "edited" list.

Examples of edited lists range from refereed electronic journals to lists where the list owner simply wishes to exercise control over which postings are allowed to go to the list.

To set up a basic edited list, simply add

* Send= Editor
* Editor= someuser@somehost.com

to the basic list header. Note that the primary Editor= specification (that is, the first editor defined by an Editor= keyword for the list) must be a human person who will be able to act on postings sent to him or her for approval. You may not use an access-level specification (such as "Owner") when defining the primary editor for a list.

Please note that L-Soft recommends setting "Send= Editor,Confirm" so as to add a level of security against malicious users forging mail from an "Editor=" address to get around your moderation settings, or against badly-configured "vacation" programs that simply reflect the message back to the list in a manner that makes it appear that the mail is coming from the editor’s address. The "Confirm" option causes LISTSERV to request an "OK" confirmation from an editor when it receives mail claiming to be from that editor.

You can define multiple editors, but only the first editor will receive postings for approval. Anyone defined as an editor may post directly to the list without further intervention. Multiple editors can be defined on separate Editor= lines or can be grouped several on a line, e.g.,

* Editor= someuser@somehost.com,anotheruser@anotherhost.com
* Editor= yetanotheruser@his.host.com

To approve postings with the above configuration, the editor simply forwards (or "resends", or "bounces"--the terminology is unclear between various mail programs) the posting back to the list address after making any desired changes to the content. This should be done with a mail program that supports "Resent-" fields; if "Resent-" fields are not found by LISTSERV in the headers of the approved posting, the posting will appear as coming from the editor's address rather than from the original poster. If your mail program does not support "Resent-" fields, you should use the "Send= Editor,Hold" option and approve messages with the "OK" mechanism described below.

If you do not need to physically edit the content of your users' posts (for instance, to remove anything considered "off-topic" or to remove included mail headers and so forth), you can code

* Send= Editor,Hold

The "Hold" parameter causes LISTSERV to send you a copy of the posting along with a "command confirmation request". To approve the posting, you simply reply to the confirmation request with "ok".

For security purposes, you can code

* Send= Editor,Confirm

which will cause LISTSERV to request a command confirmation ("ok") from the editor sending the approved posting back to the list. This makes it impossible for an outside user to "spoof" mail from an Editor address.

Naturally, you can also code

* Send= Editor,Hold,Confirm

Finally, please note that the NOPOST subscriber option will take precedence over Editor=, if set for someone defined as an editor. This means that if you have "Default-Options= NOPOST" for your list and you add an editor as a subscriber, you will have to manually reset the editor to POST (with "SET listname POST FOR userid@host") before things will work properly. You will know that this is necessary if your editor can successfully approve postings but is then told that he or she cannot post to the list.

7.13.4. Moderated lists

Note: The Moderator= keyword is disabled in LISTSERV Lite.

A moderated list is similar to an edited list, but for LISTSERV's purposes it refers to a list that uses the Moderator= list header keyword to "load-share" posting approvals among several editors. It is set up similarly to an edited list, as follows:

* Send= Editor,Confirm
* Editor= someuser@somehost.com
* Moderator= someuser@somehost.com,anotheruser@anotherhost.com
* Moderator= yetanotheruser@his.host.com

This list will "load-share" the approval process between the three moderators, who will each receive one-third of the postings for approval. Note that a primary editor should still be defined.

If it is desired to have one editor handle more than a single share of the approvals, you simply define the editor more than once in Moderator=. For instance,

* Send= Editor,Confirm
* Editor= someuser@somehost.com
* Moderator= someuser@somehost.com,anotheruser@anotherhost.com
* Moderator= someuser@somehost.com,yetanotheruser@his.host.com

would cause every other posting to be forwarded to someuser@somehost.com for approval.

Beginning with 1.8c, if the parameter "All" is coded at the beginning of the list of moderators, LISTSERV will send copies of all postings to all moderators, any of whom may approve the message. An example of this would be

* Moderator= All,kent@net.police.net,joe@bar.edu

Please note that something like

* Moderator= kent@net.police.net,All,joe@bar.edu,alex@reges.com

is not valid. "All" must appear at the beginning of the list of moderators.

Assuming "Send= Editor, Hold", once a message is approved by one of the moderators, any other moderator attempting to approve the same message will be told that the message cannot be found and has probably expired (since the cookie for that message will be gone).

If the message body is edited in any way before it is approved (i.e., by forwarding an edited copy back to the list), and more than one moderator is involved, duplicates are possible. Thus it is important that the moderators of any list set up this way pay close attention to whether or not the posting has already been approved by another moderator. Note carefully that this means if the "All" parameter is used in "Moderator=" with "Send= Editor" (that is, without the "Hold" parameter), again a separate synchronization method will have to be used to prevent duplicates, as two moderators are unlikely to make exactly the same edits to the message. Even if LISTSERV were able to identify the two submissions as being the same message, it would not know which to choose over the other.

The "Hold" and "Confirm" options for "Send=" can also be used with these examples, if desired. L-Soft recommends that "Confirm" be used by default.

Finally, please note that the NOPOST subscriber option will take precedence over both Editor= and Moderator=, if set for someone so defined. This means that if you have "Default-Options= NOPOST" for your list and you add an editor or a moderator as a subscriber, you will have to manually reset the editor to POST (with "SET listname POST FOR userid@host") before things will work properly. You will know that this is necessary if your editor or moderator can successfully approve postings but is then told that he or she cannot post to the list.

7.13.5. Semi-moderated lists

"Semi-moderation" was developed some years ago after a great debate on whether or not an "urgent" message should be allowed to be posted to an edited list without having to go through the approval process. Although this option is still available, it can be misused by anyone who knows about it, and is therefore not generally recommended for use. However, should this feature be deemed necessary, it is activated by setting

* Send= Editor,Semi-Moderated

Then anyone needing to send an "urgent" message to the list simply types "Urgent:" in the subject line of their mail, followed by the subject of the message. Messages that do not have the "Urgent:" subject are forwarded to the list editor for approval as usual.

7.13.6. Self-moderated lists

So-called "self-moderated" lists were invented in 1993 or 1994 when the current epidemic of spamming was beginning to get cranked up and before the "spam filter" was developed by L-Soft. With the spam filter in operation, self-moderation is not as much of an issue anymore, but some lists still run this way.

Self-moderation takes advantage of the ability to make an access-level a secondary list editor, and is implemented as follows:

* Send= Editor,Confirm
* Editor= someone@someplace.com,(listname)

(The "Hold" and "Confirm" parameters for "Send=" may naturally be used if required. L-Soft recommends that "Confirm" be used by default.)

Usually, one of the list owners is the primary editor (here "someone@someplace.com") and the specification of (listname) makes all of the subscribers of the listname list editors, and thus eligible to send messages directly to the list without editor intervention. Postings from non-subscribers (e.g., spammers) are deflected to the primary owner for his or her disposition.

There is one caveat to this kind of list. If a user subscribes to the list, and later his mail address changes (for instance, the hostname changes slightly but mail sent to the old address is automatically forwarded to the new address), any postings from him to the list from the new address will be forwarded to the editor because the new address is not subscribed to the list. Thus there is a certain amount of list-owner overhead on this kind of list in keeping track of users whose addresses have changed and modifying the subscriber list to reflect those changes. The "CHANGE" command added in 1.8d can be of help in this regard.

7.13.7. Auto-responders

Since LISTSERV Lite does not support list-level mail templates, this functionality is effectively not available in LISTSERV Lite.

An "auto-responder" is a type of list that simply responds with a set message whenever it receives mail from someone. This kind of list can be useful for things like service messages or upgrade availability, or even to simply send back a standardized message to a user who has sent mail to a "support" address.

A simple auto-responder header might look like this:

* Auto-responder for service messages
* Owner= someone@someplace.com
* Send= Public     Notebook= No     Subscription= Closed
In other words, it can be very simple, since you probably don't want notebook archives for this kind of auto-responder, you don't want people to subscribe to the list as it isn't really a mailing list, and so forth. To make the auto-response message for this list, you'd then create a listname.MAILTPL file (see chapter 10 for details) that includes a POSTACK1 template, like the following:

>>> POSTACK1 Service Message for &MYNAMES
&MYNAMES will be down Sunday from 0200 EST until 0500 EST for backups 
and upgrades. For more information contact LSTMAINT@&MYHOST.

This particular template would inform the user that LISTSERV would be down (&MYNAMES translates to LISTSERV@NODE where NODE is the value of NODE= in the system configuration file) and to send questions to LSTMAINT@ the local host. In order to change the service message, it would be necessary only to change the POSTACK1 template.

7.13.8. Announce-only lists

An "announce-only" list would be used to distribute a newsletter or other timely information where responses to the list are neither expected nor desired. A typical announce-only list header might look like this:

* The FOO Product Announcment List
* Owner= foo@myhost.com
* Owner= Quiet:
* Owner= anotheruser@myhost.com
* Owner= yetanotheruser@myhost.com
* Editor= foo@myhost.com
* Editor= anotheruser@myhost.com
* Editor= yetanotheruser@myhost.com
* Notebook= No
* Errors-To= Owner
* Subscription= Open,Confirm
* Validate= No
* Review= Owners
* Send= Editor,Confirm
* Reply-To= foo@myhost.com,Ignore
* Sender= None

This list is set up so that generally any response to postings will go back to foo@myhost.com, which might be a special account set up specifically to handle such things, or a mail alias pointing to another account. The newsletter can be posted by foo, or anotheruser, or yetanotheruser, all of whom are editors, but the likelihood is that it would be posted from the foo userid so that the From: line would read "From: foo@myhost.com".

L-Soft strongly recommends that all announce-only lists use the "Send= Editor,Confirm" or "Send=Editor,Hold,Confirm " setting. The ",Confirm" parameter tells LISTSERV to require a confirmation for any posting sent by a user defined as an Editor=. This is important for two reasons:

  1. Security. This setting tells LISTSERV to request confirmation from the Editor for all postings it receives that purport to be from that Editor. This prevents hackers from forging mail under an Editor's address, because any forgeries will require that the Editor in question approve them before they go to the list.

  2. Loop protection. Certain broken mailers can and will bounce mail back to your list in a "reflected" manner, that is, the bounce will appear to be a legitimate posting from the Editor to the list instead of looking like an error. This is different from a forgery attempt because (it is assumed) the mailer on the other end is not doing this with malicious intent. Requiring the editor confirmation will stop these potential loop-generating messages from getting through to the list.

To stop a posting from going to the list under this scenario, simply don't OK it and delete the confirmation request message.

7.13.9. Restricted subscription lists with automatically-generated questionnaire

Since LISTSERV Lite does not support list-level mail templates, this functionality is effectively not available in LISTSERV Lite.

Sometimes it is desired to send out a little questionnaire before approving a subscription to a list with a very narrowly-defined topic or to lists created for members of specific organizations. By setting "Subscription= By Owner", you can of course force all potential subscriptions to require list owner approval. In the "old days", if you wanted more information before you approved the subscription request, you had to manually send a questionnaire out to the user and wait for him or her to return it to you.

By setting "Subscription= By Owner" and adding two simple template forms to your listname.MAILTPL (as explained in chapter 9), you can now have LISTSERV send your questionnaire out automatically, as soon as the subscription request is received.

The first template form you need to add to listname.MAILTPL is called SUB_OWNER, and in this case it would typically look like this:

>>> SUB_OWNER &LISTNAME: &WHOM requested to join
.TO &WHOM
A copy of the &LISTNAME membership questionnaire has been sent
to you.  Please read it carefully and follow the instructions
to complete it and return it to the list owners.

The .TO &WHOM directive is required so that the message is sent to the subscriber rather than to the list owner. If you want the non-quiet list owners to receive a copy of this message (which is admittedly unlikely), you can simply add CC: &OWNERS to the end of the .TO line, e.g.,

.TO &WHOM CC: &OWNERS

Or, if you want to cc: a specific user such as joe@unix1.example.com, use

.TO &WHOM CC: joe@unix1.example.com

Note that you cannot format the SUB_OWNER template; it all comes out as one long paragraph without formatting no matter what you do, because it is a "linear" template. But you should modify it from the default to let people know that they will receive a questionnaire to be filled out and returned.

The second template form you need to add to listname.MAILTPL is called ADDREQ1 and it can be as simple or as detailed as you want. All of the available template formatting commands can be used in ADDREQ1. For instance:

>>> ADDREQ1 &LISTNAME Membership Survey
.RE OWNERS
.TO &WHOM
.CE &LISTNAME Membership Survey
NOTE:  Please make sure when you send this back that it goes to
the address &LISTNAME-Request@&MYHOST.  Thanks.

This is a standard questionnaire required for all prospective
subscribers to &LISTNAME. Blah blah blah...

In this case you want the message to go to the subscriber, with a Reply-To: header pointing back to the (non-quiet) list owners. The first line indicating the return address is added for those users with mail clients that don't recognize Reply-To: headers.

You can also put a pre-formatted ADD job into the questionnaire to simplify your job when the questionnaire comes back. For instance,

.fo off
----------------------------------------------------------------
For List Owner's Use Only --  Be sure to include with your Reply
----------------------------------------------------------------
// JOB
  ADD &LISTNAME &WHOM &USERNAME
// EOJ
----------------------------------------------------------------
.fo on

For more detailed information on mail templates, see chapter 9.

7.13.10. Peered lists

This functionality is not available in LISTSERV Lite.

Occasionally the need to split a very large list may arise. This was more common when LISTSERV ran only on BITNET, whereas the TCP/IP version of LISTSERV is not limited by BITNET constraints. However, because of the fact that subscribers may be scattered all over the world, in rare cases it can make sense to split (or "peer") a list and share the mail load among two or more LISTSERV servers. Peering also makes it possible to have list archives located in more than one place; for example, a list might be peered between a European host and a North American host, making it possible for subscribers on each continent to retrieve archives from the nearer host.

Although there is no problem about peering to another L-Soft LISTSERV list, linking to a non-L-Soft mailing list manager is not supported and can and will cause serious problems (including mailing loops) for which L-Soft international, Inc. could not be held responsible.

After the link operation has been completed, it is recommended that you define "Peers=" keywords on lists you just linked. For lists running on LISTSERV for VM, this makes it possible to EXPLODE them for better network efficiency. (Because peering is not widely used today, it is unlikely that the EXPLODE command will be ported to other platforms.)

Note also that the peer lists MUST have the same list password (PW= list header keyword setting) or messages approved on one peer will not be accepted by the other peer and an error message will be generated, i.e.,

The approval request code received together  with your posting for the MYLIST-L
list is  incorrect. For  a peered  list, this  may be  a normal  condition. The
approval protocol  is not  guaranteed to  work among  peer chains with pre-1.8b
servers, and  will also  fail if  the peers  have a  different password.  For a
non-peered list, the only likely explanation is a failure in the mail system or
a recent change in mail  system version or  configuration. At any  rate, please
resubmit your message and go through  the approval procedure a second time, and
contact the LISTSERV administrator if the problem persists.

------------------------ Rejected message (73 lines) --------------------------

This means that under LISTSERV 1.8c and later you must explicitly set the PW= list header keyword for each peer and not use the password LISTSERV generates automatically at list creation time.

Moving users from one (peer) server to another:

You should be aware of the fact that a MOVE operation is not just an ADD to the new server and a DELete to the current one. This would effectively transfer the person from the old server to the new one but his distribution options would be lost in the process. Besides, you should make sure that the user does not lose any mail in the process. The proper course of action to be taken when people are moved from one list to the other is the following:

1. Send mail to the list telling people that a new peer server is being linked to the list, and that some subscribers will be moved to it.

2a. If the prerequisites for using the MOVE command are met, you should use either individual MOVE commands (in the case that there are very few users to move) or a batch-MOVE command with associated DDname (see the LISTJOB MEMO guide for more information on commands-jobs) to move the users. You may want to use the QUIET option to suppress notification if there are a lot of users to move.

Warning: the MOVE command should not be used to move peer list servers. See the MOVE command description for more details.

If you cannot use the MOVE command, you should try one of the following two methods:

2b. For each user to be moved, issue the following commands in the following order:

2c. If there are a lot of users to move, the following method is preferred:

Special commands for peered lists only

ADDHere listname userid@host <full_name> <PW=list_password>

The ADDHERE command is strictly identical to ADD, with the exception that the placement of the user is not checked against the list of peer servers, i.e. the specified user is added to the local list without any further verification. (By comparison, the ADD command causes LISTSERV to check automatically to see if there is no better-suited peer list for the specified user.)

EXPLODE listname <F=fformat> [VM only]

The EXPLODE command provides a means whereby a list can be automatically analyzed by LISTSERV to optimize the placement of its recipients over the various peer servers hosting the list. It requires a "Peers=" keyword to be defined in the list header (see Appendix B). Non-BITNET userids will be exploded according to the network address of the corresponding gateway (as per the SERVICE NAMES file), or ignored if the gateway could not be identified. LISTSERV will create a commands-job file containing the necessary MOVE command to transfer all the users which were found to be (possibly) mis-allocated to the peer server which is nearest to them. This file will then be sent to you so that you can review it before sending it back to the server for execution.

MOVE listname userid@host <TO> newhost <PW=list_password>
     DD=ddname listid@newhost [VM only]

The MOVE command allows list owners to easily move users from one peer server to another. It will move the complete user entry from the source server to the destination one, including full name as it appears in the specified list and all list distribution options. The MOVE operation will be done in such a way that no mail can possibly be lost by the target while the MOVE operation is in progress (duplicate mail might be received for a short duration, however). Notification will be sent to the target user unless the QUIET option was used.

If the source and destination list names are identical, only the destination node ('newhost') needs be specified. Otherwise, the full network address ('listid@newhost') must be specified.

The MOVE command requires both source and destination lists to have the same password. Since each server will have to send a password to the other to validate the (special) ADD/DELETE commands it is sending to the other, it has potentially a way to trap the password specified by the server, thus thwarting any attempt at inventing a protocol to allow use of this command on lists which have a different password. Besides, no MOVE operation will be accepted on lists which do not have a password at all, because for technical reasons it would allow unauthorized users to easily add someone to a list (since there would be no password validation).

The MOVE command is the proper way to effect a move operation. You should not use any other command/set of commands unless you cannot use MOVE. THE MOVE COMMAND SHOULD NOT BE USED TO MOVE DISTRIBUTION LISTS!!! Since a MOVE is basically an ADD + DELETE , with the latter being done only AFTER the ADD is completed, moving a distribution list address with the MOVE command can cause a duplicate link to be defined for a short period of time. This could result in a transient mailing loop, which could become permanent if the size of the looping mailfiles is less than the size of the inter-servers "DELETE" command jobfile, and the RSCS priority of the latter has been altered.

7.13.11. "Super-lists" and "sub-lists"

This functionality is not available in LISTSERV Lite.

In LISTSERV Classic 1.8c and later it is possible to define a "super-list" (as in opposite of sub-list), that is, a "container" list that includes all the subscribers in a predefined set of sub-lists. This can be done recursively to any depth. Only the LISTSERV maintainer can create a super-list, for security reasons. Concretely, the "Sub-lists=" keyword is protected from owner tampering in the same fashion as "Notebook=". The value is a comma separated list of all the sub-lists, which must all be on the same (local) machine. For instance:

* Sub-lists= MYLIST-L,MYOTHERLIST-L

The default value for this keyword is null, e.g., to have no sublists. Please note that the super-list and all of its sublists must reside on the same LISTSERV server.

The only difference between a normal list and a super-list is what happens when you post to it. With the super-list, the membership of all the sub-lists is added (recursively) and duplicates are suppressed. Other than that, the super-list is a normal list with its own archives, access control, etc. You can even subscribe to it, and this is actually an important aspect of the operation of super-lists. If you are subscribed to the super-list itself, the subscription options used to deliver super-messages to you are taken from your subscription to the super-list, just like with any other list. All combinations are allowed, and in particular NOMAIL is allowed, meaning you don't want to get messages posted to the super-list. When you are subscribed to multiple sub-lists, on the other hand, things work differently:

  1. NOMAIL subscriptions are ignored. You will get the super-message if you have an active (not NOMAIL) subscription to at least one sub-list. The idea is that the super-message must be equivalent to posting to all the sub-lists, without the duplicates. Since all it takes to get a message posted to all the sub-lists is a single non-NOMAIL subscription, this is how the super-list works. The only way not to get the super-messages is to subscribe to the super-list directly and set yourself to NOMAIL.

  2. The DIGEST and INDEX options are ignored and internally converted to MAIL. The first reason is that, since in most cases the user will be on multiple sub-lists (otherwise you don't need a super-list in the first place), the only safe method to set subscription options for super-messages is by subscribing to the super-list so that there is no ambiguity. The second reason is that, in most cases, super-lists will be used for out of band administrative messages rather than for large volume discussions, so it is actually preferable to have the message sent directly. The third reason is that the super-list and sub-lists may not necessarily offer the same options (DIGEST and INDEX). In particular it is expected that many super-lists will not have archives. If you want a DIGEST or INDEX for the super-messages, you must subscribe to the super-list directly.

Topics, if defined, are evaluated on a per-list basis. That is, for every sub-list (and for the super-list), LISTSERV determines whether the topic of the message is one that you want to see. If not, it acts as if you were not subscribed to this particular list. Roughly speaking, this works very well if all the sub-lists have the same set of topics (or a well-defined set of common topics), and doesn't work well at all if every list has its own set of topics.

Postings to a super-list are always archived in the super-list's notebooks (if enabled), and never in the notebooks of the sub-lists. This is because by its nature a posting to the super-list is not equivalent to cross-posting a message to all of the sub-lists. Rather, LISTSERV recurses into the sub-lists and generates an "on the fly" listing of all of the users on the super-list and the sub-lists (this is how it avoids duplicates, among other things) and then treats this "on the fly" listing as if it were the subscriber list of the super-list itself. You will note that a super-list posting is always identified as coming from the super-list, regardless of whether a given user is subscribed to the super-list or to one or more of the sub-lists.

Note carefully that a REVIEW command sent for the super-list will not recurse into the sub-lists pointed to by the super-list. If you have a super-list called SUPER and you send a REVIEW SUPER command, LISTSERV will respond with only the people who are subscribed directly to SUPER.

Similarly, access to the super-list's notebook archives is not automatically recursive. If you want sub-list subscribers to be able to access the archives of the super-list (but don't want the sub-list subscribers to have to subscribe to the super-list), then you must configure the Notebook= keyword for the super-list so that it contains references to each of the sublists. For example, say we have a super-list called SUPER and two sub-lists called SUB-A and SUB-B. We want the subscribers of both SUB-A and SUB-B to be able to read the archives of SUPER (since postings to SUPER won't be archived in SUB-A or SUB-B), but we don't want people who aren't susbcribed to any of the three lists to be able to access the archives. So we set

* Notebook= Yes,C:\LISTS\SUPER,Monthly,Private,(SUB-A),(SUB-B)

and anyone subscribed to the SUPER list or to the SUB-A or SUB-B lists can access the SUPER archives.

If you have many sub-lists, you can specify multiple Notebook= lines, e.g.,

* Notebook= Yes,C:\LISTS\SUPER,Monthly,Private,(SUB-A),(SUB-B)
* Notebook= (SUB-C),(SUB-D),(SUB-E),(SUB-F)

LISTSERV will read these two (or more) Notebook= lines and concatenate the values.

7.13.12. "Cloning" lists

Some sites may have a need for many lists that are essentially identical. For instance, a series of class section lists for a university department may have the same owner, allow the same class of users to subscribe, and so forth. LISTSERV makes it possible to maintain large collections of lists by "including" keywords from an external file.

For instance, consider a mathematics course with ten sections. Each section should have its own list (for instance, called M101-001, M101-002, and so forth), but the lists will otherwise be identical. The LISTSERV maintainer simply creates a text file (in this case called M101 KEYWORDS) containing the keyword definitions that will be shared by the lists, as follows:

PUT M101 KEYWORDS PW=createpw
* Owner= mathwhiz@someuni.edu (Professor J. Random User)
* Owner= Quiet:
* Owner= gradasst@someuni.edu (Joe Doakes, Graduate Assistant)
* Notebook= Yes,/home/listserv/archives/m101,Monthly,Private
* Auto-Delete= No
* Errors-To= gradasst@someuni.edu
* Subscription= Closed
* Notify= Yes               Confidential= Yes        Validate= Yes,Confirm,NoPW
* Reply-to= List,Ignore     Review= Owners           Send= Private
* Default-Options= Repro

Next, the LISTSERV maintainer stores this file in the usual way, by first making a filelist or catalog entry for it (as outlined in chapter 8) and then storing it with a PUT operation. Generally the GET and PUT FACs for this file should specify that the list owner(s) should be able to retrieve and store it. The file must be stored in LISTSERV’s A directory (the same directory that contains the *.LIST files).

Note that it is also possible to create this file directly in LISTSERV’s A directory with a text editor; if you do so, make sure that you do not include the PUT command shown above. You should still make the filelist or catalog entry for the file so that the list owners can retrieve and store it.

Next, the LISTSERV maintainer creates and stores a skeleton list header for each of the section lists. The first section list (M101-001) is illustrated below:

PUT M101-001 LIST PW=createpw
* Math 101 Section 001 Mailing List
* .IK M101

The .IK command tells LISTSERV that whenever it uses this list, it should read the keyword definitions from the file M101 KEYWORDS (note carefully that the syntax is ".IK M101", not ".IK M101 KEYWORDS"). Now, whenever the professor in charge of the class wants to make a change to all of the M101 lists (for instance, he has a new graduate assistant), he simply GETs the file M101 KEYWORDS, makes the changes, and PUTs the file back, instead of having to GET separate headers for each list and make the changes to all of them individually.

Note: On some servers it may be necessary to stop and restart LISTSERV (or do a GET+PUT of all of the list headers involved) to make changes to the KEYWORDS file appear. This is because LISTSERV may have the KEYWORDS file and/or the list headers that use it cached at the time you modify it.

In order to see the complete list header, send a REVIEW listname command. The response to a GET will be only the skeleton header with the .IK command.

Special note: The sample KEYWORDS file above includes a Notebook= keyword. This will cause the notelogs for all of the lists that use this KEYWORDS file to be written in the same directory, per the example, /home/listserv/archives/m101 . This means that in that directory you would have notelogs for the M101-001 list, the M101-002 list, and so forth (depending of course on what lists use the example M101 KEYWORDS file). If this behavior is not desired, simply don't put a Notebook= keyword in the KEYWORDS file, and define it in the list header for the cloned list instead, either before or after the .IK directive.

For the web archive interface, note carefully that if you do use the same directory for all of the cloned lists' notelogs, you will still have to make separate web archive directories for each list under your WWW_ARCHIVE_DIR directory if you intend to serve the archives via the web interface. In other words, the web interface doesn't care where you keep a list's notelogs as long as it has a directory specified under WWW_ARCHIVE_DIR for it to write the list's web archive indexes into. So while all of your notelogs may go into /home/listserv/archives/m101 , regardless of the name of the cloned list, you still need to make (for example) /usr/local/etc/httpd/htfiles/archives/m101-001 and so forth in order to serve the notelogs on the web.

7.14. Merging existing LISTSERV lists

It is sometimes desirable (or necessary) to merge two or more existing lists. There are a couple of different ways to do this.

7.14.1. Merging list A into list B; list A user options not preserved

This is perhaps the simplest merge operation and requires only that you get the list of subscribers from list A and add them to list B, probably with a bulk operation as explained in section 7.17, below. User options are not preserved across the move and the users from list A will be subscribed to list B with whatever default options are set for list B.

7.14.2. Merging list A into list B; list A user options preserved

In this case you need to GET both lists A and B, header and all (so you do not use the (HEADER switch in this case). LISTSERV will return copies of the entire list files to you including all of the subscribers along with an encoded option string for each subscriber. Usually this will look something like this:

* My test list
* (remaining header lines removed for clarity)
*
xxxxx@APK.NET Pxxxx Axxxxx
2AAARAA4HAAA
xxxxxxxxxx@AOL.COM Rxxxxx Axxxx
2AAARAA2bAAA
xxxxxx@LSOFT.COM Nxxxxx Bxxxxxx
2AAARAA2bAAA
xxxxxxxx@CS.ROSE-HULMAN.EDU Mxxx Dxxxxxx
2AAARAA3nAAA

Depending on how your mail client handles long lines, the subscriber lines will be either:

  1. Kept as one single long line in which the option string starts in column 81 of the line; or

  2. Split into two separate lines, the subscriber address and real name on one line followed by the option string on the next line.

If case 1, you should have no problem with the following operations. If case 2, you must either

In any case a correctly-formatted subscriber line looks like this (you may have to widen your browser window to see the whole line):

nxxxxx@LSOFT.COM Nxxxxx Bxxxxxx                                                 2AAARAA2bAAA

Next, assuming that the subscriber lines are correctly formatted, cut and paste list B into a new mail message addressed to LISTSERV. Make sure that your mail client has all formatting options turned off; for instance, make sure line wrap and any automatic "rich text" or HTML mail formatting is turned off. If you do not do this there is no guarantee that the list file will reach LISTSERV properly formatted.

At the bottom of this new message, you can cut and paste the subscribers from list A. Note that you don't want the header of list A, just the subscriber lines. Make sure that there is no blank line between the subscribers you pasted from list B and the subscribers you have just pasted from list A.

Finally, you can now PUT your new merged copy of list B. 2

7.14.3. Merging list A and list B into list C

In this case (where you may be starting a completely new list and want to merge two old lists into it), follow the directions above depending on whether or not you want to preserve user options across the merge or not. The only difference is that you will be combining the subscribers from two lists into another list instead of combining subscribers from one list into a second list. In this case you do need to be careful not to add duplicate addresses, as LISTSERV will not catch them when you PUT the new list file. In fact it is probably more sensible to set appropriate defaults to the new list and store the header by itself, then add the users with a bulk operation (not preserving their old options) so that LISTSERV can catch any duplicates you might add.

7.15. Migrating lists from one site to another

In migrating lists to LISTSERV, there are three typical possibilities:

  1. You are migrating lists from an existing LISTSERV site (e.g., moving from VM to unix)

  2. You are migrating lists from a non-LISTSERV site to LISTSERV

  3. You are creating a LISTSERV list from a Sendmail alias or other database of e-mail addresses

7.15.1. Migrating lists from one LISTSERV site to another LISTSERV site

Naturally, this is the simplest migration, but it still requires a few important steps. The preferred method (and the one that generally works the best) is to GET the list from the old server, make any changes necessary to the header (e.g., location of Notebook archives) and PUT the resulting list file on the new server. This method (assuming no corruption or reformatting of the list file by intervening mail systems) is preferred because it involves LISTSERV's internal syntax checking and other error-handling functions, LISTSERV knows exactly where to put the files, and the migration isn't restricted by possible architecture-specific problems.

The drawback to the preferred method is that you have to migrate one list at a time, which may not be acceptable if you need to migrate many lists in a short period of time. In general, you can simply FTP your list files from the old server to the new server, but note the following:

Note that the first digest sent from the new site will say "First ever".

7.15.2. Migrating lists from non-LISTSERV sites

Non-LISTSERV list files (notably from Majordomo and ListProc, but from other MLM software as well) are not directly compatible with LISTSERV. While it is probably possible to write a script or batch file for the purpose of converting one format to the other, it is outside the scope of this manual to describe this process.

Majordomo users will note that LISTSERV does not require two separate lists for those who want individual messages and those who want digested summaries. LISTSERV handles digesting internally for those who have set the personal option DIGEST for the list. Thus those sites migrating to LISTSERV from Majordomo will probably want to merge the digested and non-digested subscribers into one single list and let all subscribers know that they can set themselves to DIGEST mode with the SET listname DIGEST command. (It would also be possible to send commands to LISTSERV to set all of the old digest subscribers to DIGEST before releasing the list to the public.)

Under most conditions, the method recommended by L-Soft for migrating a non-LISTSERV list into LISTSERV format is the following:

Note that you can also create the list, header and subscriber list together, using a text editor. Simply start adding subscribers right after the last header line, save the file with the extension ".list", and restart LISTSERV as noted above in 7.15.1 to reformat the list. Do not, however, attempt to edit the list with a text editor once it has been created--use only LISTSERV commands sent via mail, the VM console, or the LCMD utility to make changes. Subscribers added in this fashion (i.e., without a pre-existing user options string) will inherit any default options set in the header.

List archive notebooks from non-LISTSERV sites can be copied into a file archive area for the list and registered in the listname FILELIST (VM) or listname.CATALOG (non-VM), but it is not recommended that non-LISTSERV notebooks be renamed with LISTSERV naming conventions, as this may cause problems with LISTSERV's database functions. For instance, if you have ListProc or Majordomo notebook archives that were kept monthly, L-Soft does not recommend renaming them with the listname.logyymm format.

For information about how to convert non-LISTSERV archives to LISTSERV format, please see 8.10.3, below.

7.15.3. Migrating lists from Sendmail alias files, databases, etc.

In general, you will follow the same procedure outlined in 7.15.2 to migrate from these types of lists. You may wish to write an executable script of some sort to pull the addresses and names (if you have them) from your database and surround them with the appropriate CJLI commands, particularly if your database is made from a web site and you need to run a periodic job to add users to your lists.

7.16. Changing the name of an existing list

Changing the name of an existing list on the same server as opposed to migrating a list from another server is somewhat different. Here is a checklist of the basic steps involved in renaming an existing list. For the purpose of this example we will assume that the list is named MYLIST-L and we want to rename it to JOESLIST-L. Note that operations that call for using OS-level commands are not performed by issuing commands to LISTSERV, but rather by opening a console session and typing the commands at your system's command prompt.

1. Stop LISTSERV.

2. Find the mylist-l.list file. LIST files are kept on LISTSERV's A disk (VM) or in its A directory (non-VM). The A directory for non-VM servers is normally ~listserv/home for unix servers, LISTSERV_ROOT:[MAIN] for VMS servers, and LISTSERV\MAIN for Windows servers.

3. Copy (using your OS's command for copying files) mylist-l.list to joeslist-l.list. Note carefully that under unix you must name the file in lower case. Copying the list file will preserve all subscribers and all subscriber options.

4. If necessary, create the directory for joeslist-l's archives. If you had mylist-l's archives in ~listserv/lists/mylist-l, for instance, you should create the directory ~listserv/lists/joeslist-l. Once this directory is created, you can copy the mylist-l archive notebooks over to it, then rename any mylist-l.* file to joeslist-l.*. Note that you will want to copy the current notebook over again later, to make sure you get all of the postings up to the time of the switch. Note further that it is not necessary (and probably not desirable in any case) to copy the DBNAMES, DBINDEX, DBRINDEX, or -RAC files as they will be rebuilt automatically by LISTSERV. Also, you don't need to copy the DIGEST or SUBJECTS files as we're going to take care of them later.

5. Again, if necessary, you should also copy over any files referenced by the list's catalog or filelist and make a new catalog or filelist for joeslist-l. You will also need to make an entry in site.catalog (non-VM) or listserv.filelist (VM) for the new joeslist-l catalog or filelist.

6. If the list was available through the web archive interface, make a joeslist-l directory for the web archive indexes (see chapter 5 for details).

7. Restart LISTSERV.

8. Issue a GET JOESLIST-L (HEADER NOLOCK command to get the header. Make any changes you feel necessary, for instance, in the list's description or in the comments which may or may not contain the old list's name. You will also need to make changes to any keyword that contains a directory reference, for instance the Notebook= and Digest= keywords, so that they point to the right place. PUT the list header back on the server. (Note that this PUT will cause LISTSERV to build web archive indexes for the list.)

9. Issue a HOLD JOESLIST-L command to keep the list from processing any postings from earlybird users :).

At this point you are finished copying the old list to the new list. Now you need to do some housekeeping before notifying the users of the change.

10. Issue a QUIET SET MYLIST-L NODIGEST NOINDEX FOR *@* command to LISTSERV. This will force LISTSERV to send out the accumulated MYLIST-L digest and index issues to all users who had those options set.

11. Issue a HOLD MYLIST-L command to LISTSERV.

12. Copy the final MYLIST-L notebook archive file over to the JOESLIST-L directory so that you have all of the postings up to the time you issued the HOLD.

13. Get the header of the MYLIST-L list. You can now add a "New-List=" keyword to the header to let people know that the name of the list has been changed. This requires that you remove all other keywords from the header except "Owner=" and "Confidential=". You can set

* New-List= JOESLIST-L@LISTSERV.MYHOST.COM
* Confidential= Yes

in the list header so that a) the list no longer appears in the global List of Lists and in the CataList and b) so that all mail and inquiries sent to the old list address will be forwarded on to the new one. When you've made the changes to the header, PUT it back on the server.

14. Issue a FREE JOESLIST-L command to LISTSERV. (You should not need to issue a FREE MYLIST-L command.)

Congratulations, you've finished renaming the list. At this point you should probably announce the change and let people know where to find the archives, etc.

7.17. Bulk operations (ADD and DELETE)

It is possible to use "bulk" operations to "front-load" or otherwise simplify the job of adding and/or deleting users from lists. This will typically be used on very large announce-type lists but the functionality is naturally available for all lists.

7.17.1. Bulk ADD operations

To front-load or just to add a large number of users to an existing list, you construct a LISTSERV JOB framework as follows and then send it to LISTSERV. The QUIET and IMPORT command words are optional; omit the square brackets if you use them. The "full name" field is optional as long as you use the IMPORT option; otherwise you must either specify "*" (for an anonymous subscription) or a full name consisting of at least two separate words.

[QUIET] ADD listname DD=ddname [IMPORT] PW=yourpassword
//ddname DD *
userid1@host1.com [full name]
userid2@host2.com [full name]
...
useridn@hostn.com [full name]
/*

The IMPORT option implies a QUIET ADD (in other words you do not need to specify QUIET if you use IMPORT) and otherwise vastly speeds up the ADD process by loosening syntax checking and omitting success messages. If you do not use the IMPORT option and do not specify QUIET, the users you bulk add will receive the normal SIGNUP message and/or WELCOME file as usual.

It is also possible to do bulk operations through the Web Administration Interface; see chapter 11 for details.

7.17.2. Bulk DELETE operations

If you have a large number of users to delete at one time, you can use a bulk delete syntax that is similar to the bulk ADD documented above. However please note that there is no "IMPORT"-type option for this feature, and as usual for the DELETE command you specify only the user's address in the data DD.

There is, however, a BRIEF option that can be specified, which is useful when you don't want a long list of "userid@host has been deleted from list xxxx" messages, one for each user deleted. Use of the BRIEF option tells LISTSERV to return only a count of the users that were deleted.

Once again you construct a LISTSERV JOB framework as follows and then send it to LISTSERV:

[QUIET] DELete listname DD=ddname PW=yourpassword
//ddname DD *
userid1@host1.com
userid2@host2.com
...
useridn@hostn.com
/*

You will probably want to use the QUIET modifier when doing a bulk delete, in order to suppress the notification message to the users being deleted.

It is also possible to do bulk operations through the Web Administration Interface; see chapter 11 for details.


8. File and Notebook Archives

There are three file server systems currently in use by various versions of LISTSERV:

In general, the three systems are compatible, with the understanding that the temporary system does not include all the possible options. However, the mechanism for registering files (defining them to the file server system) is different.

Since the first and third systems will eventually be replaced by the second system, rather than providing an exhaustive chapter detailing all filelist aspects from the management side, we have provided only a basic overview of the two systems currently in the field with 1.8d, with pointers to where further information may be obtained.

8.1. What is the file archive?

The file archive consists of all files other than notebook logs that have been stored on the LISTSERV host for your list. Users can find out what files are available for a specific list by sending the command INDex listname to the appropriate LISTSERV host.

8.2. Starting a file archive for your list

On VM Systems ONLY

With the traditional system (running on the VM servers), the LISTSERV maintainer creates files called "xxxx FILELIST", which contain definitions for all the files belonging to a particular archive. These FILELIST files must be created by the LISTSERV maintainer at the site before they can be edited by the list owner.3

On Workstation and PC Systems

The LISTSERV maintainer stores "root-level" file definitions in a file called SITE.CATALOG, which should be placed in the same directory with the SYSTEM.CATALOG file.4 Beginning with 1.8c, the LISTSERV maintainer can also define "sub-catalogs" which in turn can define further files. You should be aware of the differences between VM and workstation file server functions as many people are using and will continue to use the VM file server with different conventions, and may give you incorrect advice. Non-VM sites should skip section 8.3, and use the information below in section 8.4 to maintain their file archives.

8.3. Filelist maintenance (VM systems only)

If you are running LISTSERV under unix, Windows, or VMS, please skip this section as it does not pertain in any way to your implementation of LISTSERV.

Maintaining the filelist for your archive is not difficult. It requires only that you have a working knowledge of VM XEDIT (or your local system's editor) and understand how to send files via e-mail.

8.3.1. Creating a filelist

Please see FSV GUIDE (available at ftp://ftp.lsoft.com/documents/fsv.guide) for details.

8.3.2. Adding FAC codes

Please see FSV GUIDE (available at ftp://ftp.lsoft.com/documents/fsv.guide) for details.

8.3.3. Retrieving the filelist

To retrieve your filelist in an editable format, send the command

GET listname FILELIST PW=XXXXXXXX (CTL

to the LISTSERV host where the filelist is stored. The (CTL switch causes LISTSERV to lock the filelist until you store it again or explicitly unlock it with an UNLOCK listname FILELIST command. (If you don't want to lock the filelist, use (CTL NOLOCK instead.) If your mail account is not located on the same host as LISTSERV, you will need to provide your personal password (same as your password for getting and putting your lists).

A filelist retrieved with the (CTL option does not look like the filelist you get with an INDEX command. A sample (CTL option filelist appears below:


* Files associated with MYLIST and available to subscribers: * rec last - change * filename filetype GET PUT -fm lrecl nrecs date time Remarks * -------- -------- --- --- --- ----- ----- -------- -------- -------- MYLIST POLICY ALL OWN V 79 45 94/03/16 12:04:23 Mission Statement MYLIST BOOKLIST ALL OWN V 79 177 94/04/19 16:24:57 Books of interest MYLIST QUARTER ALL OWN V 73 113 95/03/11 08:57:04 Quarterly posting * Listowner's files (not public) MYLIST FAREWELL OWN OWN V 78 9 95/03/11 08:53:41 Goodbye memo MYLIST WELCOME OWN OWN V 73 105 95/03/11 09:14:38 Hello memo
Figure 8.1. Sample filelist retrieved with (CTL option.

Note that the filelist does not include the comment lines you would normally see at the top of an INDEX filelist; nor does it include any notebook archives. LISTSERV creates these lines dynamically at the time the INDEX command is received from a user. If the filelist you have retrieved has any of this kind of material in it, either a) you have not retrieved the filelist correctly, or b) you or someone else has stored the filelist previously with this material included. If you did a GET with (CTL, you should be able to remove these extraneous lines by simply deleting them.

If you do an INDEX of your archive and it has (for instance) two sets of comment lines or duplicate notebook archive listings, then you should GET the filelist with (CTL and edit out the offending lines. While the extra lines will not affect the operation of the file server, they are a source of potential confusion for your users.

8.3.4. Adding file descriptors to the filelist

"Adding a file to a filelist" is not exactly accurate terminology, although it is a widely-used phrase. Adding files to file archives is a two-step process: First, add a file descriptor to the appropriate filelist and store the filelist on the server. Second, store the file itself on the server.

To add a file descriptor, start a line with a space and then type in your file's name, access codes, five dots (periods) and a short description, each separated by a space. For example:

 MYLIST FAQ ALL OWN . . . . . Frequently-Asked Questions for MYLIST

Note that the line must begin with a space. Also, you must place five dots separated by spaces between the PUT file access code (here it is OWN) and the short description. These dots are place holders for the record format (recfm), logical record length (lrecl), number of records (nrecs), and the date and time of the last update. If these dots are not present, LISTSERV will return an error message when you try to store the filelist.

You will note that the line you have just added does not look like the other lines in the filelist. Ignore the "pretty" formatting. LISTSERV will reformat the information for you. After adding the line, your filelist should look like this:


* Files associated with MYLIST and available to subscribers: * rec last - change * filename filetype GET PUT -fm lrecl nrecs date time Remarks * -------- -------- --- --- --- ----- ----- -------- -------- -------- MYLIST POLICY ALL OWN V 79 45 94/03/16 12:04:23 Mission Statement MYLIST BOOKLIST ALL OWN V 79 177 94/04/19 16:24:57 Books of interest MYLIST QUARTER ALL OWN V 73 113 95/03/11 08:57:04 Quarterly posting MYLIST FAQ ALL OWN . . . . . Frequently-Asked Questions for MYLIST * Listowner's files (not public) MYLIST FAREWELL OWN OWN V 78 9 95/03/11 08:53:41 Goodbye memo MYLIST WELCOME OWN OWN V 73 105 95/03/11 09:14:38 Hello memo
Figure 8.2. Adding a file descriptor to the filelist

Note that you can add comment lines to the filelist by placing an asterisk in the left-most column instead of a space. Comment lines can act as indexes, descriptions, or pointers to other resources.

Once you are finished adding file descriptors, save the filelist to disk.

8.3.5. File Access Codes (FAC) for user access

FACs define which users have access to files in the file archive. The FAC for GET indicates who may retrieve the files, and the FAC for PUT indicates who may store the files on the server. (Note that some special FACs exist for "superusers" such as the LISTSERV maintainer(s) and the LISTSERV Master Coordinator, who may GET and PUT any file regardless of its GET/PUT permissions.)

The basic FAC codes that are always available for VM servers are:

ALL universal access.

PRV only members of the associated mailing list have access.

OWN only the owners of the associated mailing list have access.

(The FAC codes PRV and OWN work only on the VM filelist system. They do not work on the non-VM catalog system. See section 8.4 if you are configuring the non-VM systems.)

(Note that this assumes the name of the filelist is identical to the name of the associated mailing list -- for instance, MYLIST@FOO.BAR.EDU would have a MYLIST LIST file and a MYLIST FILELIST file. Ask your LISTSERV maintainer for assistance if this is not the case or if you need special FACs added for special user access to files.)

8.3.6. Deleting file descriptors from the filelist

Before you delete file descriptors from the filelist, you should delete the files themselves from LISTSERV's archive disk. See section 8.6, below, for instructions.

If this step is not followed, LISTSERV may not be able to find the file you want to delete after you edit the filelist and store it.

8.3.7. Storing the filelist

1. Create a mail message to LISTSERV at the appropriate host. (Sending a filelist to LISTSERV@LISTSERV.NET will not work. The filelist must be sent to the host it resides on.)

2. Include the filelist file as plain text in the body of the mail message. Do not attach it with MIME or another encoding scheme, as LISTSERV does not translate encoded messages.

3. Make sure that your mail client does not automatically add a signature file to the bottom of your mail. If it does, your signature file will be treated as part of the filelist and will be stored along with it.

4. At the top of the filelist, add a single line as follows:

PUT filename FILELIST PW=XXXXXXXX

where XXXXXXXX is your personal password for LISTSERV on that host. Note that this is similar to the PUT command used when storing the list file.

5. Send the filelist to LISTSERV.

Once LISTSERV acknowledges the receipt and storage of the filelist, you can send the files that correspond to the file descriptors in your filelist. See section 8.5, below, for instructions.

8.4. The listname.CATALOG system on non-VM systems

NOTE: If you are running LISTSERV 1.8a or 1.8b, please refer to your Installation Guide or to the List Owner's Manual for LISTSERV 1.8b for information on maintaining your file server.

LISTSERV version 1.8c and later uses a file archive registration system similar to (but differing in important respects from) the old VM FILELIST system. This system is available on the VMS, unix, and Windows ports only. VM sites will continue to use the old FILELIST system indefinitely as it still offers more functionality than the new system.

Files to be made generally available to users (e.g., not specific to any one list on your server) should still be registered in the site.catalog file as before.

Prior to 1.8c, entries in site.catalog were written like this:

MY.FILE        my.file./home/lists/xyz      ALL JOE@XYZ.COM

In 1.8c a new "native" format for these entries was introduced, and the new format is used in all of the examples below. The old format remains supported for compatibility. However, note that you MUST use the old format if any of the directories in the path contains a period.

Documented restriction: All files manipulated by LISTSERV must be accessible through LISTSERV's OS-independent file access methods. This means that files whose name contains spaces or control characters (or, under unix, upper case characters) cannot be accessed. Similarly, files whose name does not contain a period cannot be manipulated by LISTSERV. There is no limit on the length of the file name, only on its contents. Note that these "system filenames" are not visible to the end users, who refer to the files by the names assigned in the catalog.

8.4.1. Adding files to the SITE.CATALOG

This is the most basic way to add files to LISTSERV's file archive system so they can be made available to users via the GET command.

To register a new file to the server on workstation systems, the LISTSERV maintainer adds a line to the SITE.CATALOG file. If SITE.CATALOG does not already exist (it is not shipped with the installation kits), simply open a new ASCII text file named site.catalog in the same directory as system.catalog and add entries to it as shown below. (Do not just add entries to system.catalog as this file will always be overwritten during a software update.)

Here is what a typical SITE.CATALOG entry looks like under Windows NT:

MY.FILE C:\FILES\XYZ\MY.FILE XXX YYY

And the same entry under Unix would look like this:

MY.FILE /files/xyz/my.file XXX YYY

(Note that under Unix, LISTSERV does not observe case-sensitivity internally. Therefore you cannot define two different files with the same non-case-sensitive filename. In other words, LISTSERV will not differentiate between MY.FILE and my.file, or even My.File. But note carefully that the physical files you store must be named in lower-case; in other words, the output of an 'ls' command must show my.file, not MY.FILE or My.File. LISTSERV will handle this issue automatically when you PUT the files, but be forewarned if you store the files on the server via ftp or the Unix file system.)

Finally, here is a VMS example:

MY.FILE XYZ:[FILES]MY.FILE XXX YYY

The first item, MY.FILE, is the name by which the file is known to LISTSERV. That is, the users will use GET MY.FILE to order a copy of that file. The name should contain only one period.

The second item, for instance C:\FILES\XYZ\MY.FILE, is the name LISTSERV will use for the actual disk file, in native OS format. Note that the directory must be created before you register the file. For security reasons, LISTSERV will not create the directory (or set the protections) for you. Note that LISTSERV will normally need full access to these files.

The third and fourth items are "File Access Codes" (FACs). The first is for read accesses, and the second for writing. The following file access codes are available for non-VM servers (for VM FAC codes, see 8.3.5, above):

ALL universal access.

CTL only the LISTSERV maintainers have access.

PRIVATE(xxx) only members of the xxx list have access.

OWNER(xxx) only the owners of the xxx list have access.

SERVICE(xxx) only users in the service area of the xxx list have access.

NOTEBOOK(xxx) same access as the archives of the xxx list.

user@host the user in question is granted access.

Except for ALL, which must occur on its own, multiple file access code entries can be specified, separated by a comma with no intervening space. For instance:

MY.FILE C:\FILES\XYZ\MY.FILE JOE@XYZ.EDU,JACK@XYZ.EDU,PRIVATE(XYZ-L) CTL

defines a file that Joe, Jack and the subscribers of the XYZ-L list can order via the GET command, but that only the LISTSERV administrator can update.


IMPORTANT: These "file access codes" apply to LISTSERV commands (GET, PUT, INDEX) only, and not to the workstation or PC's file security system. It is your responsibility to protect the actual disk file by setting the file protections for the directory in which they are created.

8.4.2. Delegating file management authority

The sub-catalog enhancement allows the LISTSERV administrator to delegate file management authority in a controlled and secure manner. Multiple list owners can be given the authority to maintain their own sub-catalog in a predefined directory. With the LISTSERV-ISP add on (under development), a quota can be imposed on the directory in question.

The procedure works as follows:

  1. The LISTSERV administrator creates the sub-catalog and identifies the directory where the files will be stored, and the person(s) who will be in charge of managing it ("catalog owners").

  2. The catalog owners use the GET and PUT commands to update their catalog and register new files in their directory. Each file has the usual GET and PUT file access codes, allowing the catalog owners to further delegate the management of individual files to third parties ("file owners").

  3. The file owners manage the files in question using the GET and PUT commands. Authorized users can retrieve the files using the GET command.

Note that this functionality is available in the VM version, using a different syntax. See Chapter 8.3, above, for information on managing the VM file archive system.

If you are migrating from VM to one of the non-VM versions of LISTSERV, please note that it is not necessary to create a subcatalog file for WELCOME, FAREWELL and MAILTPL files. If a subcatalog for these files is not created, they do not appear in the output of an INDEX command. However, there are two ways to force them to appear:

  1. As the result of an INDEX command without qualifier: simply define the file in SITE.CATALOG.

  2. As the result of an INDEX listname command: simply define the file in the listname.CATALOG.

8.4.3. Creating a sub-catalog

To create a sub-catalog, the LISTSERV administrator edits the file called SITE.CATALOG (or site.catalog under unix) in LISTSERV's main directory (the directory where SYSTEM.CATALOG/system.catalog is located). A sub-catalog is defined as follows:

MY.CATALOG     /home/lists/xyz/my.catalog   ALL JOE@XYZ.COM

(1)            (2)             (3)          (4) (5)                       

Notes:

(1) The name must end in '.CATALOG', but otherwise it can be anything. In particular, there does not need to be a list by that name.

(2) The directory specification indicated for the catalog file (e.g., /home/lists/xyz) is where ALL the files defined in the sub-catalog will be stored. DO NOT USE LISTSERV'S MAIN DIRECTORY FOR THIS PURPOSE! The catalog owner will be given FULL ACCESS to all the files in this directory, so make sure to create a new, empty directory. If the sub-catalog is being set up for a list owner, it may be a good idea to put the list archives and the sub-catalog in the same directory.

(3) A file name must be provided for the sub-catalog file itself. This name, however, does not need to match (1).

(4) This file access code controls the authority to INDEX the sub-catalog. This will also be the default GET access code for all the files registered in the sub-catalog.

(5) This file access code defines the catalog owner(s) and default file owner(s) for all the files in the sub-catalog.

Note that there is no need to reboot LISTSERV after updating the SITE.CATALOG file. Also, bear in mind that you are responsible for the OS-level security of the directory you create for the catalog. The file access codes in SITE.CATALOG only affect operations that go through LISTSERV; it is your responsibility to make sure that other users of the computer are given the appropriate access level to any directory you create for LISTSERV's purposes.

8.4.4. Updating the sub-catalog

Once the sub-catalog is created, the catalog owner(s) can register new files using the following procedure (in this example, it will be assumed that the sub-catalog is called MY.CATALOG):

1. Send a GET MY.CATALOG command to LISTSERV (or, if the catalog is brand new, start from an empty file).

2. Register new file(s) in the catalog (see below).

3. Use the PUT MY.CATALOG PW=XXXXX command to store the updated catalog.

Alternatively, if the catalog owner has an account on the LISTSERV host system and write access to the directory associated with the sub-catalog, the file can be edited directly. Note however that, in that case, the LISTSERV-ISP quota system will be inoperative as it has no control over disk accesses which do not go through LISTSERV itself.

The format of sub-catalogs is similar to that of SITE.CATALOG:

MY.FILE        my.file                      ALL JOE@XYZ.COM
(1)            (2)                          (3) (4)

Notes:

(1) This defines the name of the file as seen by LISTSERV users. That is, the command to retrieve the file will be GET MY.FILE.

(2) This defines the name of the actual disk file where the contents of MY.FILE will be stored. Normally, you should specify the same as (1), or just an equal sign (LISTSERV will then substitute the name you provided for (1)). However, in some cases you may want to make a particular file available under multiple names. This can be done by registering multiple files (ie multiple values for (1)), and using the same (2) value every time.

(3) This file access code determines who can order the file through a GET command. See section 8.4.1, above, for more information on FAC codes.

(4) This file access code determines who can update the file with the PUT command. See section 8.4.1, above, for more information on FAC codes.

Note: (2) defaults to the value of (1), and (3) and (4) default to the GET and PUT access codes of the sub-catalog itself, respectively. So, in most cases a sub-catalog entry will be as simple as:

MY.FILE

Additionally, comment lines (starting with an asterisk) or blank lines can be interspersed with file definitions. These comments will be echoed when the sub-catalog is indexed (see below), in sequence with the file definitions. For instance, your catalog could read:

*
* Files for the XYZ sub-project
*
XYZ.AGENDA
XYZ.BUDGET
XYZ.PROPOSAL-1
XYZ.PROPOSAL-2

8.4.5. Indexing the sub-catalog

If MY.CATALOG is defined as:

MY.CATALOG     /home/lists/xyz/my.catalog   xxx JOE@XYZ.COM

then any user who matches the 'xxx' file access code is authorized to issue an INDEX MY command to get a formatted version of the catalog. For compatibility with older versions of LISTSERV, GET MY.FILELIST will produce the same results. If there is a mailing list called MY, a list of the archive files will be appended automatically.

8.5. Storing files on the host machine

Please note that LISTSERV does not currently recognize "attachments" created by many popular mail clients as files to be stored with the PUT command. Such files must be part of the body of the message that contains the PUT command. This means that binary files must be stored either in 7-bit format (uuencoded, etc.) or ftp’d to the server and placed in the appropriate directory by the LISTSERV maintainer or other privileged user.

If you store binary-format files on the server, you should be careful to note in the file catalog or filelist that users who want to GET the files will need to use an F= modifier (e.g., GET BINARY.FILE F=MIME/APPL) when ordering them by e-mail.

To store a file on any LISTSERV host, first ensure that it has been registered with an entry in a filelist or the site catalog. Then mail the file to LISTSERV with a single line at the top of the document:

  1. Edit your file and save it. Add a single line at the top of the file as follows (square brackets indicate optional parameters):

    PUT filename extension [filelist|catalogname] PW=XXXXXXXX

    (This line will not appear to people who GET the file from LISTSERV.) Replace XXXXXXXX with your personal password. If you specify the filelist or catalog name, do not put the square brackets around the name.

    There are a couple of issues that need to be noted here:

  2. Be sure that the file has been registered with an entry in a filelist or the site catalog.

  3. Be sure that you have defined a "personal password" to LISTSERV with the PW ADD command before you PUT the new or edited file. If you have done this but can't remember the password, send a PW RESET command to LISTSERV, then a new PW ADD command.

  4. Send the mail message to LISTSERV.

8.6. Deleting files from the host machine

To delete a registered file on any LISTSERV host:

  1. Create a new mail message addressed to LISTSERV. Add a single line at the top of the message as follows:

    PUT filename extension [filelist|catalogname] PW=XXXXXXXX

    (Replace XXXXXXXX with your personal password.) The same issues noted in 8.5 regarding the filelist/catalog name are operative here.

  2. Be sure that you have defined a "personal password" to LISTSERV with the PW ADD command before you PUT the delete job. If you have done this but can't remember the password, send a PW RESET command to LISTSERV, then a new PW ADD command.

  3. Send the mail message to LISTSERV.

  4. LISTSERV will tell you that the file has been successfully deleted.

  5. For VM Systems ONLY: GET the listname FILELIST for your list and delete the line for the file you’ve just deleted. PUT the listname FILELIST back on the server.

  6. For Workstation and PC Systems ONLY: Get the listname.CATALOG for your list and delete the line for the file you've just deleted. PUT the listname.CATALOG back on the server. Note that this is not necessarily required since under non-VM, if the physical file does not exist, LISTSERV will not include it in the output of an INDEX command. This is primarily a housekeeping measure.

8.7. Automatic File Distribution (AFD) and File Update Information (FUI)

AFD and FUI have not yet been ported to the workstation and PC environments. However, this feature is supported on VM and will be supported in the near future on the other platforms.

If you are running LISTSERV under unix, Windows, or VMS, please skip the rest of this section as it does not pertain in any way to your implementation of LISTSERV.

These two features are similar in their command syntax, but do different things. AFD provides a method whereby users may subscribe to specific files, which will be sent to them any time the files are updated. For instance, if you have a FAQ file that is updated monthly, a user could send an AFD subscription to that FAQ file and LISTSERV would send it to the user every time you updated and stored the FAQ.

FUI, on the other hand, is a method whereby a user subscribes to a file but receives only a notification that the file has been updated. The user can then GET the file at his own discretion.

AFD and FUI can be password-protected to protect users from network hackers who might forge mail from the user subscribing him to large or frequently-updated files. If a password is not provided in an AFD ADD or FUI ADD command, LISTSERV warns the user that it would be a good idea to password protect the subscription.

8.8. File "Packages"

This feature is available for VM (all versions) and non-VM (beginning with 1.8d).

You can define a group of files as a "package" that can be retrieved by users with a single GET command. First, ensure that all the files in the package are defined in the appropriate filelist and stored on the server as detailed above.

Next, create a file descriptor in the appropriate filelist or catalog for a file called filename $PACKAGE (or filename.$PACKAGE for non-VM), where filename is the name you have chosen for the group of files. Be sure that the filetype or extension is $PACKAGE, with a leading $ sign, and store your filelist.

Now create the actual filename $PACKAGE file. At the top of the file you can insert comment lines beginning with asterisks, e.g.:

* MYLIST $PACKAGE
* Packing list for MYLIST PACKAGE
*
* You can make other comments here, such as
* the contact email address.
*
* filename filetype filelist

*==========================

Following these comment lines, you insert lines for each of the files contained in the package. There are two ways to format entries in your $PACKAGE file:

Note that anything that is not the name of a file in the package must be commented out with an asterisk in the leftmost column of the line. It is possible to create a package file without any comment lines at all, but this is not preferable in practice. Often users will get the package file itself just to see what is in it. You should include a reference to the package file itself so that the user will get a copy of the "packing list" to check against the files he receives from LISTSERV.

The final step is to send the package file to LISTSERV like any other file.

Now users can do one of two things:

  1. They may get the entire package of files sent to them by sending LISTSERV the command GET filename PACKAGE (without the $ sign); or

  2. They may request that LISTSERV send only the package file itself by sending LISTSERV the command GET filename $PACKAGE (with the $ sign).

Packages may be subscribed to with the AFD and FUI commands (VM only).

8.9. Where to find more information on File Archives

Other guides that refer to File Archive setup and maintenance are referenced in Appendix E, Related Documentation and Support.

8.10. Notebook Archives

Notebook archives are files in which postings to the list are stored (assuming that notebooks are enabled for the particular list). In general, they are managed automatically by LISTSERV, with certain functions left to the list owner(s). For instance, there is no need to register notebook archives in the listname.FILELIST or listname.CATALOG; this is taken care of automatically.

8.10.1. Setting up notebook archives for a list

Setting up notebook archives requires only a few steps:

  1. Make sure that you have disk space for the notebook archives and that the directory in which they will reside has been created with appropriate security privileges. LISTSERV needs read and write access to any directory it uses for notebooks. Note that, for security reasons, LISTSERV will not create the directory if it does not exist.

  2. Add the Notebook= keyword to the list header with appropriate settings. (If you are not the LISTSERV maintainer, you will have to ask the LISTSERV maintainer to do this for you.)

  3. Store the list header back on the server.

For instance, let's assume you have a list called MYLIST running on a unix server and you wish to store its archives in a directory called /usr/listserv/home/mylist-archive. Notebooks are to be kept on a monthly basis and are to be available to anyone. Your Notebook= keyword would look like this:

* Notebook= Yes,/usr/listserv/home/mylist-archive,Monthly,Public

Note that only the LISTSERV maintainer may change the location of Notebook archives (or change Notebook= No to Notebook= Yes). Anyone else attempting to PUT the list header after changing these values will result in the following message being sent in response:


The following problems have been detected in the list header: * Notebook= ... Error: The first two parameters of the "Notebook=" keyword may only be updated by the LISTSERV administrator. Please refer to the list keyword documentation (available via the "INFO KEYWORDS" command) for more information about keyword syntax. PUT operation rejected, old list remains unchanged.

Figure 8.3. This output will appear either if an attempt is made to change "Notebook= No" to "Notebook= Yes", or if an attempt is made to change the location where notebook archives are stored on the server, by anyone who is not a LISTSERV maintainer.

Similar restrictions also apply to the Digest= keyword. See Appendix B for details.

8.10.2. Migrating old notebook archives to a new site (LISTSERV to LISTSERV)

If migrating old notebook archives from one LISTSERV site to another, you can simply ftp (in TEXT mode) the notebooks from the old host to the new host, put them in the directory reference in the Notebook= keyword settings, and LISTSERV will immediately recognize their presence. You can also migrate the notebooks with GET and PUT.

8.10.3. Migrating old notebook archives (non-LISTSERV to LISTSERV)

LISTSERV notebooks follow a modified VM MailBook format, which is as follows:

A line of 73 "=" signs (ASCII 0x3D)
RFC822 headers
Blank line (actually part of RFC822 headers)
Message body

For instance

=========================================================================
Date:         Fri, 6 Mar 1998 17:05:01 -0500
Sender:       Test list <TEST@XXXXXX.NET>
From:         Nathan Brindle <nathan@XXXXXX.NET>
Mime-Version: 1.0
Content-Type: text/plain; charset="us-ascii"

This is a test.
=========================================================================
Date:         Thu, 12 Mar 1998 13:23:07 -0500
Sender:       Test list <TEST@XXXXXX.NET>
From:         Nathan Brindle <nathan@XXXXXX.NET>
Subject:      Test

This is another test
=========================================================================
Date:         Thu, 12 Mar 1998 13:24:58 -0500
Sender:       Test list <TEST@XXXXXX.NET>
From:         Nathan Brindle <nathan@XXXXXX.NET>
Subject:      Test 3
Mime-Version: 1.0
Content-Type: text/plain; charset="us-ascii"

Yet another test.

The last message in the archive is not followed by a separator line (in other words, the separator line is found at the beginning of each message, not at the end of each message).

If you can reformat your non-LISTSERV archives this way then you can rename them using standard LISTSERV filenames:

For monthly archives: listname.logyymm For weekly archives: listname.logyymmw For yearly archives: listname.logyy

(where yy = 2 digit year, mm = 2 digit month, w = letter A-F denoting the week of the month), place them in the directory pointed to by the Notebook= keyword for the list, and LISTSERV will index them and make them available via the web archive interface and so on.5 Note that in order for the web archive interface to notice new notebook files you must either GET and PUT the list header or restart LISTSERV.

If a list owner is planning to store archive files via the PUT method, the LISTSERV maintainer must first make dummy files with the same filenames in the list's notebook directory so that LISTSERV will not say that the file does not exist and reject the PUT operation. However please note that you should not make entries for the notebooks in listname.catalog (if one exists). LISTSERV makes its list of notebooks "on the fly" every time an INDEX command is issued for the list.

If your old archives have lines at the beginning of each message like this:

From userid@host.com Thu Feb 2 15:27:02 1995

you should delete them; this is the message separator used by sendmail. LISTSERV does not use it and it may in fact cause problems with indexing if left in.

8.10.4. Deleting old notebook archives

The LISTSERV maintainer may delete old notebook archives that are no longer needed in one of two ways:

8.10.5. Indexing existing notebook archives

LISTSERV creates the notebook archive index "on the fly" as required. If there is an existing listname.FILELIST or listname.CATALOG, it appends the index of notebook archives to the end of the index of other files. Otherwise, the index of notebooks is generated and sent by itself. The user simply issues the command INDEX listname to receive the index of available files and notebooks.


9. Creating and Editing LISTSERV's Mail and Web Templates

9.1. What LISTSERV uses templates for

Templates are used to generate some of the mail LISTSERV sends to users in response to commands it receives. Among these are the "You are now subscribed . . ." message, the message sent to users when LISTSERV cannot find a subscription for them in a specified list, and others. Note that certain administrative mail (for instance, the response to the STATS and RELEASE commands) is hard-coded into LISTSERV and cannot be changed.

Other templates are used to generate the HTML code used by the web archive and administration interfaces.

A word about nomenclature: When we talk about "templates" we are talking about "files that contain one or more template forms", in other words, files like DEFAULT MAILTPL or DEFAULT WWWTPL. A "template form" is an individual section of a template which begins with a title line (three ">" symbols followed by a space, the name of the template form, and (optionally) a short description of the template, which for some template forms is also used as the subject of the mail LISTSERV constructs with the template form), followed by one or more lines of copy and/or imbedded commands, and ends at the next title line or the end of the file, whichever is reached first. A template may contain one or more template forms.

9.2. The default template files and how to get copies

LISTSERV stores its default mail template information in a file called DEFAULT MAILTPL, which can be requested by list owners and LISTSERV maintainers from LISTSERV with the GET command, just like any other file. The LISTSERV maintainer will find this file in LISTSERV's "A" directory (usually ~listserv/home/default.mailtpl on unix, LISTSERV\MAIN\DEFAULT.MAILTPL on Windows systems, and LISTSERV_ROOT:[MAIN]DEFAULT.MAILTPL under VMS). Note that DEFAULT MAILTPL contains some (but not all) of the web interface template forms.

LISTSERV stores the rest of its default web interface template forms in a file called DEFAULT WWWTPL, which can be retrieved in a manner identical to that for DEFAULT MAILTPL.

Note that it is considered unwise (and it is not supported) to modify the contents of DEFAULT MAILTPL or DEFAULT WWWTPL themselves, as these files will be overwritten by upgrades. It is possible to make sitewide changes that will not be overwritten without disturbing either of these files.

Under 1.8d and following, all template forms may be edited using the web administration interface described in chapter 11. Edited template forms are placed in template files that will not be overwritten by software upgrades.

9.3. Mail template format and embedded formatting commands

Each individual template form starts with a form name and subject line, such as:

>>> EXAMPLE1 This is the subject line

Please note carefully the following instructions for the form name and subject line:

A template form contains text and, optionally, formatting/editing commands, which start with a period in column 1. All other lines are treated as normal text: sequences starting with an & sign are substituted, then lines are joined together to form a paragraph, which is finally formatted like with any non-WYSIWYG text processor. You can suspend formatting with .FO OFF and resume it with .FO ON; when formatting is suspended, LISTSERV no longer joins lines to form a paragraph, but simply writes one line of text to the message for each line read from the template form. This makes it possible to include tables or a text-mode logo, but can create seriously imbalanced text if substitutions are used. For instance, a typical &WHOM substitution can range from a dozen characters to 60 or more, even though it only takes up 5 characters on your screen when you enter it.

The following substitutions are always available:

&DATE Long-style date (04 Jan 1998)
&TIME hh:mm:ss
&WEEKDAY Three-letter day of the week, in English
 
&MYNAMES The substitution you will use most of the time when you need to refer to LISTSERV. For Internet-only or BITNET-only servers, this will display LISTSERV's only e-mail address. For servers with both Internet and BITNET connectivity, it will say "LISTSERV@hostname (or LISTSERV@nodeid.BITNET)".
 
&MYSELF LISTSERV's address, in the form LISTSERV@XYZ.EDU or, if no Internet hostname is available, LISTSERV@XYZVM1.BITNET.
 
&MYNODE LISTSERV's BITNET nodeid, without the '.BITNET', or its Internet hostname if no NJE address is available.
 
&MYHOST LISTSERV's Internet hostname or, if none is available, its NJE address (with '.BITNET').
 
&MBX(addr) Looks up the specified address in LISTSERV's signup file and displays "name <addr>" if a name is available, or just the original address otherwise. This is typically used to give the name of the command originator or target, along with his e-mail address: &MBX(&WHOM) or &MBX(&INVOKER). Please note however that &WHOM and &INVOKER are not always available in every template.
   
&RELEASE LISTSERV’s release number (e.g., "1.8d").
   
&OSTYPE The operating system under which LISTSERV is running, e.g., VM/VMS/unix/Windows.
   
&OSNAME The full operating system name including the version number, e.g., "VM/ESA 1.2.3", "Windows NT 3.51", "Linux 2.0.27", "SunOS 5.4", etc.
   
&HARDWARE The type of machine LISTSERV is running on, e.g., "Pentium (128M)".

The following substitutions are also available for templates related to mailing lists:

&LISTNAME Either the short or long name of the list based on the value of "List-Address=" and/or its system default. By default the long ("List-ID=") name is used if present.
 
&TITLE Title of the list, or empty string.
 
&KWD(kwd) Value of the specified keyword for the list. You do not need to specify the name of the list - it is implicit. You need not put quotes around the keyword names either, although quotes will be accepted if present. Optionally, you can specify a second numeric argument to extract just one of the terms of a list header keyword; for instance, if the list header contains "Notebook= Yes,L1,Monthly,Private", &KWD(NOTEBOOK,4) has the value "Private". A third argument, also optional, specifies the default value for the keyword in case it was not initialized. It is meant to be used for conditional formatting in the default templates and list owners should not worry about it.
   
&LITE (1.8c and following) Has the value 1 when running the LISTSERV Lite product, and 0 otherwise. This variable can be used to write generic templates that account for the differences between the two products.
   
&ISODATE (1.8c and following) Returns today’s date in ISO format, i.e., yyyy-mm-dd.
   
&DAYSEQ(n) (1.8c and following) Used to create FAQ templates with rotating topics. May also be used to create bottom banners with rotating text (e.g., for lists with multiple commercial sponsors who get "ad space" in the banner on a rotating basis).

In addition, many template forms have their own specific substitutions, meaningful only in their specific context. For instance, a message informing a user that he was added to a mailing list may have an &INVOKER substitution for the address of the person who issued the ADD command. This is not meaningful for a template form intended to inform a user that he must confirm his subscription to a list within 10 days, so it is not generally available. If you attempt to use a substitution which is not available, the template processor writes an error message to the mail message it is generating, but sends it anyway, in the hope that the recipient will be able to figure out the meaning of the message in spite of the error. If you need to include a sentence with an ampersand character, you will have to double it to bypass the substitution process, as in "XYZ &&co."

The mail template processor also supports HTML-like variable closure, in addition to the traditional LISTSERV closure (both methods are supported concurrently; there is no need to select one over the other). For example:

Traditional: For more information, please send mail to &EMAIL or call &PHONE.
   
HTML: For more information, please send mail to &EMAIL; or call &PHONE;.

Previously, HTML writers who used HTML closure conventions would not get the expected results. This change makes it easier for webmasters to get the desired results the first time.

Any line starting with a period in column 1 is processed as a formatting command. Note that neither substitutions nor formatting commands are case sensitive. Here is a list of the formatting commands list owners may need to use:

.* Comment: anything on this line is simply ignored. This is useful for recording changes to template files when there are multiple owners. Just add a comment line with the date and your initials every time you make a change, for the benefit of the other owners.
 
.FO OFF Turns off formatting: one template line = one line in the final message. You can resume formatting with .FO ON.
 
.CE text Centers the text you specify (just the text you typed on the same line as the .CE command). This can be useful to highlight the syntax of a command.
 
.RE OWNERS Adds a 'Reply-To:' field pointing to the list owners in the header of the generated message. Use this command when you think users are likely to want to reply with a question. You can also use .RE POSTMASTER to direct replies to the LISTSERV administrator, if this is more appropriate.
 
.CC OFF Removes all "cc:" message recipients, if any. You can also add message recipients by specifying a series of e-mail addresses after the .CC statement, as in .CC JOE@XYZ.EDU. PC mail users should note that in this context "cc:" is a RFC822 term that stands for "carbon copy". RFC822 messages may have "cc:" recipients in addition to their "primary" recipients. There is no real technical difference between the two, the "cc:" indicator just denotes a message that is being sent for your information. Some administrative messages sent to list owners are copied to the user for their information, and vice-versa; this behavior can be disabled by adding a .CC OFF statement to the template.
 
.TO Replaces the default recipients of a message with the value specified. For instance, if you use the ADDREQ1 template form to send new subscribers a questionnaire, application form or similar material, you will need to add a '.TO &WHOM' instruction to your modified template form, as by default the user will not receive a copy.
   
.QQ Cancels the message. LISTSERV stops reading the template form and does not send anything. This is useful if you want to completely remove a particular message; note however that this can be confusing with certain commands, as LISTSERV may say "Notification is being sent to the list owners" when in fact nothing will be sent because of the .QQ command in the template form.

A number of more advanced commands are available to list owners with more sophisticated needs and some programming experience. If you encounter one of these commands in a template, you will probably want to leave it alone.

.IM name Imbeds (inserts) another template form at this point in the message. This is used to avoid duplicating large pieces of text which are mostly identical, such as the templates for "you have been added to list X by Y" and "your subscription to list X has been accepted".

As noted below, LISTSERV will not pick up an "imbedded" template form from $SITE$.MAILTPL. If you wish to include an "imbedded" template form (e.g., $SIGNUP) in $SITE$.MAILTPL, you must also include the template form that calls it with the .im command.
 
.DD ddname Copies the contents of the specified DD into the message. This is meaningful only if a DD has been set up by LISTSERV for this purpose. As a rule of thumb, you should either leave these statements unchanged or remove them.
 
.BB cond Begin conditional block. The boolean expression following the keyword is evaluated and, if false, all the text between the .BB and .EB delimiters is skipped. Conditional blocks nest to an arbitrary depth. The expression evaluator is recursive but not very sophisticated; the restriction you are most likely to encounter is that all sub-expressions have to be enclosed in parentheses if you are using boolean operators. That is, ".BB &X = 3" is valid but ".BB &X = 3 and &Y = 4" is not. String literals do not require quoting unless they contain blanks, but quotes are accepted if supplied. Comparison operators are = <> ^= IN and NOT IN (the last two look for a word in a blank-separated list of options, such as a keyword value). These operators are not case-sensitive; == and ^== are available when case must be respected. Boolean operators are AND and OR. Note that a conditional block must be contained on one physical line and may not wrap, so be careful when sending MAILTPL files back to LISTSERV that you do not accidentally wrap long .BB lines.

Starting with LISTSERV 1.8d the operators =* and ^=* are available to perform wildcard matches in conditional blocks. For instance JOHN_DOE@UNIX.EXAMPLE.COM =* J*DOE@*EXAMPLE.COM is a true statement. The wildcard specification is on the right-hand side whereas the actual text (or variable) you are evaluating is on the left.
   
.EB End conditional block (see .BB).
   
.SE var text Defines or redefines a substitution variable. This is convenient for storing temporary (text) expression results which need to be used several times. Even standard variables such as &LISTNAME can be redefined - at your own risk. You must enclose the text expression in single quotes if you want leading or trailing blanks.
 
.CS text Define a (non standard) character set for the template in question, i.e.,

.CS ISO-8559-7

This setting is ignored if the template does not actually contain special characters (for instance, if the template is written in 7-bit ASCII). Otherwise the appropriate headers are created for the message in question when it is sent out.
   
.TY text Types one line of text on the LISTSERV console log. This can be useful to the LISTSERV maintainer for debugging, and also to record information in the console log.
 
.ASIS text Tells LISTSERV to leave the text immediately following the .ASIS directive alone, ie, don't convert "<" and ">" characters into HTML < and > when creating pages. This is specifically for use in HTML templates where it is important not to convert parts of a URL reference. For instance,

.ASIS Click <a href="http://some.host.com/some-doc.html">here</a>.

As with the .CE directive, the text you intend to affect with the .ASIS directive must not wrap. The .ASIS directive will only work on text it finds on the same physical line into which it is coded.

9.3.1. 8-bit characters in templates

Starting with 1.8d, if you include 8-bit characters (e.g., accented or national language characters) in templates, LISTSERV will automatically encode the templates on-the-fly using MIME quoted-printable encoding. While there is no guarantee that every mail program will be able to properly display 8-bit characters, those mail programs that do understand MIME quoted-printable encoding should have no trouble doing so.

9.4. Creating and editing a <listname>.MAILTPL file for a list

Please note that list-level mail templates are not available in LISTSERV Lite.

Make a copy of DEFAULT.MAILTPL on your local machine and name it listname.MAILTPL.6 Keep the original DEFAULT.MAILTPL around in case you make a mistake and need to start over.

At this point, you could theoretically store the listname.MAILTPL back on the LISTSERV host. However, without making any changes that would be somewhat pointless. At the very least you should edit the INFO template form before storing the template. Note also that you need only store the sections of the template that you have changed. For instance, if you edit the INFO template form but leave the rest of the template untouched, you can delete the rest of the template and store the INFO template form alone as listname.MAILTPL. The benefit to this approach is that any administrative changes to the rest of the default template are automatically applicable to your list as soon as they are made, rather than requiring that you edit your mail template individually to reflect such changes. L-Soft recommends that this approach be followed as the default.

Under LISTSERV 1.8d and following it is not necessary to do the GET and PUT; you can edit individual template forms by using the web administration interface (described in chapter 11) instead.

9.4.1. The INFO template form

The first section of DEFAULT.MAILTPL is called the INFO template form, and it is LISTSERV's response to the command INFO listname. By default, it contains the following:


>>> INFO Information about the &LISTNAME list There is no information file for the &LISTNAME list. Here is a copy of the list "header", which usually contains a short description of the purpose of the list, although its main purpose is to define various list configuration options, also called "keywords". If you have any question about the &LISTNAME list, write to the list owners at the generic address: .ce &LISTNAME-Request@&MYHOST .dd &LISTHDR
Figure 9.1. The default contents of the INFO template form of DEFAULT.MAILTPL.

Note the replaceable parameters &LISTNAME and &MYHOST. Don't change &MYHOST; LISTSERV replaces it with the correct value for the name of the host site. &LISTNAME automatically inserts the name of the list. It's probably best to use &LISTNAME to refer to the list throughout the document rather than to replace it with something like "MYLIST-L". This ensures that the template form will be consistent with the default and will be simpler to debug should a problem arise. Also, in the event the name of the list changes, it will be unnecessary to edit the template form (although it would have to be renamed to match the new name of the list, of course).

Should it be desirable to replace the default INFO template form with information about the list, it is probably best to remove the .dd &LISTHDR line. This line instructs LISTSERV to read in the header of the list and add it to the response in lieu of any other data about the list. Many list owners add descriptive comment lines to their list headers, thus this default.

Here is a minimally-edited sample INFO template form for a list called MONKEYS: 7


>>> INFO Information about the &LISTNAME list &LISTNAME is an open, unmoderated discussion list featuring monkeys. Things such as how to care for a pet monkey, monkey diseases, monkey lore, endangered species of monkeys, and monkey psychology are likely to be discussed. The list is NOT intended for discussion of Darwinism and/or theories of evolution. If you have any question about the &LISTNAME list, write to the list owners at the generic address: .ce &LISTNAME-Request@&MYHOST

Figure 9.2. Sample edited INFO template form.


9.4.2. Other available template forms

Traditionally, message templates have contained the text of "long" administrative messages, such as messages informing subscribers that they have been removed from a mailing list. These notices were sent unconditionally, as a separate message. Since 1.8b, the template processor has supported "linear" messages, which are sent as a normal command reply and allow the list owner to modify the replies from selected commands, and "optional" messages, which are only sent if a template for this action has been specifically provided by the list owner.

In a linear message, most special instructions are ignored. This is because the contents of the template form are just a few lines out of a larger message that is being prepared by LISTSERV to contain the reply to the user's command(s). For instance, you do not have any control over the "Reply-To:" field of the message, because the message in question is shared with other commands and, in fact, may not be a mail message at all but an interactive message to the user's terminal, a GUI request, etc. Generally speaking, with a linear message you are providing the TEXT of the reply to be shown to the user, but you do not have any control over the methods used for delivering this information.

Here is a list of all of the template forms (other than INFO, described above) available in DEFAULT.MAILTPL, in the order in which they appear and with a short description for each. Linear and optional template forms are noted where applicable.

MOVE1: Usually active only for peered lists. This message is sent to the subscriber when the list owner or LISTSERV maintainer changes which peer the subscriber receives his or her mail from.

SIGNOFF1: a notification to the list owner that someone has unsubscribed from the list. Whether or not the list owner receives this notification is controlled by the "Notify=" list header keyword.

SIGNOFF2: this message is sent to any user who attempts to unsubscribe from a list to which he or she is not subscribed under the userid from which the unsubscribe command has been sent. For instance, joe@unix1.somehost.com may be subscribed to list MYLIST-L. If his Pine client is set so that his mail comes from his root domain (e.g., joe@somehost.com), he will get this message if he tries to unsubscribe from MYLIST-L.

DELETE1: the message sent when a list owner or the LISTSERV maintainer deletes a user from a list. You can suppress the sending of this message by prepending "QUIET" to your "DELETE" command.

AUTODEL1: this is the message that is sent to users who are deleted by the delivery error monitor. You can customize it to fit your needs, or suppress it for your list by simply redefining it in the 'listname.MAILTPL' and using the .QQ instruction:

>>> AUTODEL1 This message is not wanted for our list
.QQ

Note that L-Soft does not generally recommend suppressing this message, as it may indicate a serious problem for the deleted subscriber.

ADD1: the message sent when a list owner or a LISTSERV maintainer manually adds a subscriber to a list.

ADD2: the message sent to the list owner(s) when someone subscribes to their list. As with SIGNOFF1, whether or not the list owner(s) receive this message is controlled by the "Notify=" list header keyword.

ADDREQ1: this message is sent to the list owner when a user requests to join a list with "Subscription= By owner". Only the list owner is sent a copy of the ADDREQ1 message. If you use this template form to send new subscribers a questionnaire, application form or similar material, you will need to add a '.TO &WHOM‘ instruction to your modified template form, as by default the user does not receive a copy.

SETINFO: the message sent to the subscriber when the list owner or LISTSERV maintainer changes their personal subscription options. Can be suppressed by the invoker with the use of the "QUIET" command modifier.

CHANGE1: the message sent when a list owner or LISTSERV maintainer uses the CHANGE command to change a subcriber's address. ADDMOD2: the message sent to the subscriber when the list owner or LISTSERV maintainer changes the subscriber's "real name" field in the SIGNUP database.

ADDPW1: the message sent to the user when a LISTSERV maintainer adds a personal password for that user.

ADDPW2: an informational message sent to the LISTSERV maintainer when a user adds or changes his password, but only if an LSV$PW exit has been enabled to do so. Most installations will never use this template form, but it should not be deleted from DEFAULT.MAILTPL in any case.

ADDPW3: an information message sent to the LISTSERV maintainer when a user tries to add or change his password, but only if an LSV$PW exit has been enabled to do so. Most installations will never use this template form, but it should not be deleted from DEFAULT.MAILTPL in any case.

DELPW: the message sent to the user when a LISTSERV maintainer deletes that user's personal password.

RENEW1: this message is sent to subscribers whose subscriptions are due for renewal (see the Renewal= list header keyword for more information).

RENEW2: this message is sent to subscribers who did not renew their subscriptions within the grace period after being notified that their subscription was due for renewal.

SIGNUP1: the basic "Your subscription request has been accepted" message.

$SIGNUP: a template form included with SIGNUP1 and ADD1 (assuming that SIGNUP1 and ADD1 template forms include an ".im $SIGNUP" line, which by default they do) which gives the subscriber a basic outline of how to use the list, how various options are set, and where to get more information on using LISTSERV. This template can be used in lieu of a WELCOME file for a list if the list owner doesn’t want two messages to go to the user at subscription time.

SUB_CLOSED (linear): this is the message that is sent to a subscriber attempting to join a list with "Subscription= Closed". The default is "Sorry, the &LISTNAME list is closed. Contact the list owner (&OWNER) for more information."

SUB_NEWNAME (linear): this message is sent to a current list subscriber who has issued a new SUB command in order to change his "real name" field in the SIGNUP files.

SUB_OWNER (linear): this message is sent to a subscriber attempting to join a list with "Subscription= By owner". The default is "Your request to join the &LISTNAME list has been forwarded to the list owner for approval. If you have any question about the list, you can reach the list owner at &OWNER." Because this is a linear template form (see above), it is not the best place to put long questionnaires, application forms, terms and conditions, or other material that the subscriber should be required to review prior to joining the list. See the "Tips" section below.

POST_EDITOR (linear): this is the message LISTSERV sends to people attempting to post to the list, if it is moderated. The default is "Your &MESSAGE has been submitted to the moderator of the &LISTNAME list: &MBX(&MODERATOR)."

REQACK1: this message is sent automatically in reply to any message sent to the xxx-request address. The message acknowledges receipt, explains the difference between the LISTSERV and xxx-request addresses, and contains instructions for joining and leaving the list. To suppress this message for your list, simply redefine it in the 'listname.MAILTPL' and use the .QQ instruction:

>>> REQACK1 This message is not wanted for our list
.QQ 

CONFIRM1: The message sent whenever an "OK" confirmation is required.

WWW_INDEX: this template form is used by sites which have implemented LISTSERV’s WWW archive interface. It includes the HTML code for the main archive access screen for the list. List owners should probably should leave this alone unless they know exactly what they are doing.

WWW_REBUILD_ALL: This template is used internally by LISTSERV and should NEVER be edited by end users.

PROBE1: this template form is sent as part of LISTSERV's new bounce processing feature if this feature is activated for your list. The desired response from the user is to discard the message and do nothing. See chapter 4.6.2 of the List Owner’s Manual or chapter 13.5 of the Site Manager's Operations Manual for details on the "Probe" option.

PROBE2: If the mail containing the PROBE1 message bounces, this template form is sent along with a copy of the bouncing mail. See chapter 4.6.2 of the List Owner’s Manual or chapter 13.5 of the Site Manager's Operations Manual for details on the "Probe" option. (If you have Auto-Delete= ...,Delay(0), PROBE2 is not sent, rather the bouncing user is deleted immediately.)

Several template forms for the WWW archive interface follow PROBE1. For more information on these template forms, see section 9.7, below.

HTML_DIGEST: Preamble for HTML digests (for users who have set the personal subscription option HTML )

HTML_INDEX: Preamble for HTML indexes (for users who have set the personal subscription option HTML )

BAD_ATTACHMENT (linear): If a posting to a list contains an attachment of a type not allowed by the "Attachments=" setting for the list, this template form is sent back to the poster.

The following are template forms that can be defined, but which are not present in DEFAULT.MAILTPL.

POSTACK1 (optional): when present, this message is sent in reply to any message posted to the list. This is very useful for creating "infobots", or just for returning a standard acknowledgement to contributors. The &SUBJECT variable contains the subject of the original message, and naturally the usual substitutions (&LISTNAME, &DATE, &TIME) are available.

TOP_BANNER, BOTTOM_BANNER (optional): when these template forms are present, their contents are automatically inserted at the top (respectively bottom) of each and every message posted to the list. Typically, the top banner would be used for a copyright or short legal warning which absolutely has to be seen by each and every reader. The bottom banner could contain instructions for signing off the list, a disclaimer, an acknowledgement of a sponsor's contribution, a "tip of the week", etc.


Documented Restriction: The use in banners of substitutions which do not yield a constant result (e.g., &TIME) will defeat the duplicate mail detection part of LISTSERV's loop-checking heuristics in any case where a subscriber is forwarding all mail back to the list. L-Soft advises that such substitutions never be used in a TOP_BANNER or BOTTOM_BANNER.

For digests, note that the BOTTOM_BANNER is printed only once, at the top of the digest, directly following the table of contents. This avoids having the banner repeat after every message in the digest. The default behavior can be overridden if preferred by adding the "BOTTOM_BANNER" parameter to the Digest= list header keyword.

9.4.3. Tips for using templates

Many list owners require prospective subscribers to fill in a little questionnaire before being added to the list, or to explicitly state that they have read the list charter and agree to follow all rules or be removed from the list. The most convenient method, for both list owner and subscriber, is to have the SUBSCRIBE command return a copy of the questionnaire (or list charter, etc), and not forward the request to the owner. The user answers the questions and returns them directly to the list owner, who then adds the subscriber manually. Naturally, it is more convenient for the user if this information arrives in a separate message, with a 'Reply-To:' field pointing to the list owner's address. Thus, you should not use the SUB_OWNER template form for this purpose, because it is a linear template form and does not give you any control over the 'Reply-To:' field. The SUB_OWNER template form could be modified to read "A copy of the list charter is being sent to you, please read it carefully and follow the instructions to confirm your acceptance of our terms and conditions." The list charter would then be sent separately, through the ADDREQ1 template form. You would use the .RE OWNERS command to instruct LISTSERV to point the 'Reply-To:' field to the list owners, and .TO &WHOM to change the destination from list owner to subscriber. If you want to receive a copy of the message, you can use .TO &WHOM cc: xxx@yyy.

When writing template forms, it is a good idea to use substitutions (&XXXX) for information which may change in the future. In particular, it is not uncommon for lists to have to be moved from one host to another, and this will be a lot easier if the template forms use substitutions for the list address and list host. The &LISTADDR substitution translates the full address of the list (XYZ-L@XYZ.COM), whereas &LISTNAME is just the name (XYZ-L). For references to the server and host, use &MYHOST for the Internet hostname, &MYSELF for the server address (normally LISTSERV@&MYHOST), and &OWNER for the xxx-request mailbox address. These substitutions are "universal" and can be used in all template forms. For instance, if you decide to make a bottom banner with instructions for leaving the list, the text could read: "To leave the list, send a SIGNOFF &LISTNAME command to &MYSELF or, if you experience difficulties, write to &OWNER."

9.5. Storing the <listname>.MAILTPL file on the host machine

The procedure differs slightly on VM systems, but the following will work for unix, VMS and Windows systems:

  1. Get a copy of DEFAULT.MAILTPL and edit it.

  2. Be sure that you have defined a "personal password" to LISTSERV with the PW ADD command before you PUT the template file. If you have done this but can't remember the password, send a PW RESET command to LISTSERV, then a new PW ADD command.

  3. Send the file to LISTSERV with a PUT listname MAILTPL PW=XXXXXXXX command at the top of the file, just as if you were storing the list itself. Replace XXXXXXXX with your personal password.

The variation for VM systems is that the LISTSERV maintainer will have to create a fileid for the file before it can be PUT on the server and seen by LISTSERV.

Note also that the LISTSERV maintainer can create and edit these files in place with any standard text editor. Changes made to template files in this way are available to LISTSERV immediately after they are saved.

9.6. Other template files: DIGEST-H and INDEX-H

Two other template files that are available pertain to the automatic digestification feature. You may create and store files called listname DIGEST-H and listname INDEX-H. These files define custom digest headers and custom index headers, respectively. The DIGEST-H and INDEX-H files are plain text files, like the WELCOME and FAREWELL files, and the instructions for storing them on the server are identical. Note that, as with the WELCOME and FAREWELL files, you cannot use the template formatting commands and replaceable parameters discussed above.

A typical DIGEST-H or INDEX-H file for a list called MYLIST might contain:


The MYLIST list is sponsored by ABig Corporation. See http://www.abig.com for information on ABig Corporation's products.
Figure 9.3. Typical contents of a DIGEST-H or INDEX-H file.

The contents of DIGEST-H and INDEX-H are appended to the digest or index, respectively, immediately following the list of topics. For instance,


Date: Tue, 11 Jun 1996 11:52:41 -0500 From: Automatic digest processor <LISTSERV@MYHOST.COM> Reply-To: My test list <MYLIST@MYHOST.COM> To: Recipients of MYLIST digests <MYLIST@MYHOST.COM> Subject: MYLIST Digest - 10 Jun 1996 to 11 Jun 1996 There is one message totalling 10 lines in this issue. Topics in this issue: 1. Testing 125...3 sir! The MYLIST list is sponsored by ABig Corporation. See http://www.abig.com for information on ABig Corporation's products.

Figure 9.4. Sample DIGEST output for a list with a DIGEST-H file. The INDEX-H output would be similar, following the list of postings.


(Note that you can't add a digest or index "footer" because according to the standard anything after the end of the digest text is supposed to be discarded.)

9.7. Templates and template forms for the WWW interface

The following describes the available template files and their respective template forms for the WWW archive and administration interface. L-Soft does not advise modifying these templates unless you know exactly what you are doing. If you modify the templates it is strongly recommended that you keep copies of the originals in a safe location for fall-back.

9.7.1. Forms contained in DEFAULT MAILTPL

Note that, although these template forms are available in DEFAULT MAILTPL (and thus theoretically available for list owners to modify), individual list owners cannot tamper with them. If the LISTSERV maintainer desires to change the "look" of the site, it is preferable to create a file called www_archive.mailtpl (per chapter 5.4.5 and below) rather than to edit the forms in DEFAULT MAILTPL.

WWW_ARCHIVE_INDEX: The basic INDEX.HTML page for the WWW archive interface. While this template form is available in DEFAULT MAILTPL, it cannot be changed by list owners.

WWW_ARCHIVE_USER_FORMS: Tells LISTSERV which additional "user" forms to format for the list.

WWW_ARCHIVE_TRAILER: The page trailer file included by the WWW interface's CGI script.

WWW_ARCHIVE_HEADER: The page header file included by the WWW interface's CGI script.

$WWW_IMAGES_URLDEF: Default URLs for standard images, do not change

$WWW_IMAGES_URL: URLs for standard images. If these images are stored in non-standard locations you put the URLs for those locations here. Otherwise LISTSERV uses the defaults in $WWW_IMAGES_URLDEF .

$WWW_ARCHIVE_HEADER: Contains the header text for the WWW archive interface, e.g., what prints at the top of the page.

$WWW_ARCHIVE_TRAILER: Contains trailer text for the WWW archive interface, e.g., what prints at the bottom of the page.

XHTML_LISTSERV_REPLY_TRAILER: Contains a trailer used for HTML digests (technically a mail template rather than an HTML template)

DIRECTORY: Template directory for X-GETTPL (overrides only). You probably should not change this template form unless advised to do so by L-Soft.

WWW_ARCHIVE_DIRECTORY: Template directory for X-GETTPL (WWW_ARCHIVE only). You probably should not change this template form unless advised to do so by L-Soft.

9.7.2. The www_archive.mailtpl file (optional)

Rather than changing DEFAULT MAILTPL to customize your site's "look", it is recommended that you place modified templates from DEFAULT MAILTPL in a file called www_archive.mailtpl , which must be located in the same directory as DEFAULT MAILTPL and which will not be overwritten by a software update.

9.7.3. The default.wwwtpl file

The DEFAULT WWWPTL file contains the default templates for the parts of the WWW archive interface that are not defined in DEFAULT MAILTPL. Unless you have specific issues that need to be resolved (such as a national language preference or a need to point certain links to non-standard locations), you should probably leave this file alone. DEFAULT WWWTPL will be overwritten by a software update so you should be sure to keep a copy of your production file in a safe place.

When editing these templates please note two fundamental differences between them and the templates in DEFAULT MAILTPL:

  1. Any substitution variable that you use (for instance, &LISTNAME) must be escaped with a "+" symbol between the ampersand and the name of the variable, thus: &+LISTNAME . (Note that, as with the regular mail template forms, not all substitution variables are available in every HTML template form.)

  2. Any dot-formatting command you use (for instance, .CC , .BB , etc.) must have a "+" symbol rather than the dot, thus: +CC +BB

The templates currently included in DEFAULT WWWTPL are:

Style-sheet: Style sheet for dynamic web templates. You will find this template form imbedded in most other web template forms; it makes it easier to change the overall "look" of the pages.

A1-main: Second-level archive page (one month/week)

A1-def: Special options for second-level archive page (see A1-MAIN)

A2-main: Archive browsing (one message)

S1-main: Main search page

S2-main: Search results

S2-missing: Search function, missing argument

OPEN-error: Error message, can't access files (generic, returns error code)

OPEN-bad-index: Error message, invalid index file

LOGIN-main: Login screen

LOGIN-cookie: Login confirmation after password saved in cookie

LOGIN-cookie-reset: Confirmation after resetting login cookie

CHPW-main: Change password screen

NEWPW-main: Main password registration screen

LOGIN-CHECK-COOKIE: Offer to reset cookie if authentication failed (imbedded template)

LOGIN-BROWSE-NOTAUTH: Error screen, not authorized to browse

LOGIN-SEARCH-NOTAUTH: Error screen, not authorized to search

LOGIN-ADMIN-NOTAUTH: Error screen, not a LISTSERV administrator

LOGIN-MANAGE-NOTAUTH: Error screen, not a list owner

LOGIN-MANAGE-NOPW: Error screen, list cannot be managed via WWW

POST-NOTAUTH: Error screen, not authorized to post

MM-DBMS-NOTAUTH: Error screen, not authorized for DBMS mail-merge jobs

MM-LIST-NOTAUTH: Error screen, not authorized for list mail-merge jobs

LITE-NOTSUPP: Error screen, not supported in Lite.

NEWPW-mailed: Awaiting mailed confirmation of new password screen.

ACTMGR-main: Account management functions, main screen

ACTMGR-usersel: Account management functions, user selection screen

ACTMGR-subopt: Account management functions, view/update subscription options

ACTMGR-subopt-msglib: Account management functions, text for subscription options

HDREDIT-main: Edit list header, main screen

TPLMGR-formsel: Template management, form selection screen

TPLMGR-formedit: Template management, form edit screen

LMGT-main: List management, main page

P1-QUOTE: Reply function, text to prepend when including original message

P1-main: Post/reply function

SUBEDIT-main: Authenticated subscribe/leave, main page

BULKOP-main: Bulk operations, main page

LAYOUT-data: Layout customization, data page

LAYOUT-SYSTEM-data: Layout customization, mandatory data (DO NOT EDIT!)

LAYOUT-data-wrapper: Wrapper for layout data, sets useful variables

LAYOUT-main: Layout customization, main page

LCMD-main: Execute an arbitrary LISTSERV command (invoke "wa" with the parameter "?LCMD1")

MM1-main: Mail-merge (DBMS based)

MM2-main: Mail-merge (list based)

NEWLIST-main: List creation, main page

LIST-LIBRARY: Library of list header templates

LIST-LIBRARY-INIT: Initialization sequence for library of list header templates

SEARCH-HELP: Help page for the WWW archive interface's search functions

SETTINGS-HELP: Help page for subscription settings

LIST-select: Form to access archives of confidential (unlisted) list. Reached by invoking "wa" with the parameter "?LIST" (or by clicking on the link on the first-level archive page).

LOGIN-MSGLIB: Miscellaneous error messages (for translation purposes)

9.7.4. The site.wwwtpl file (optional)

If desired, you can override the default.wwwtpl file by providing a customized site.wwwtpl file in the same directory. This will prevent your site-wide definitions being overwritten in an upgrade (i.e., when default.wwwtpl will normally be overwritten). The site.wwwtpl file takes precedence over default.wwwtpl (so you don't have to duplicate every template form in default.wwwtpl, just the ones you don't want overwritten by an upgrade) but (for list-level templates only) will itself be overridden by definitions in any listname.wwwtpl files you have installed.

You can also manage site.wwwtpl via the web administration interface (see chapter 11).

9.7.5. National language template files (idiom.mailtpl) (optional)

National language templates can be written and used with LISTSERV (L-Soft does not provide them). The use of such templates is governed by two settings:

To create a national language template, you simply copy DEFAULT MAILTPL to idiom MAILTPL , where idiom is the name of the language, and translate it as desired. You also use idiom to specify the value for DEFAULT_LANGUAGE= and/or Language=. For a given language you can specify anything you want for idiom; in other words LISTSERV does not care if you call the file FRANCAIS MAILTPL or FRENCH MAILTPL, but if you do call it FRENCH MAILTPL you must specify FRENCH as the idiom, and likewise, if you call it FRANCAIS MAILTPL you must specify FRANCAIS as the idiom. LISTSERV has no information about what a given language is called, it simply looks for a MAILTPL file for the idiom data supplied.

If you are going to translate the web interface template forms into idiom as well, you will need to copy DEFAULT WWWTPL to idiom MAILTPL and again, translate as desired. Note carefully however that this requires that you add a special template form to WWW_ARCHIVE MAILTPL, so that the 'wa' CGI script will know what to look for, as follows:

>>> LANGUAGE
idiom

where idiom is, of course, the same value we've been talking about above. For instance for a FRANCAIS idiom you'd use

>>> LANGUAGE
FRANCAIS

See also 9.3.1, above, regarding the use of 8-bit characters in template forms.

9.7.6. Template precedence

For template forms found in DEFAULT MAILTPL, the following precedence is used when LISTSERV searches for a given template form:

listname MAILTPL
idiom MAILTPL
WWW_ARCHIVE MAILTPL8
DEFAULT MAILTPL

That is to say, if LISTSERV needs a copy of the ADD1 mail template form, it will look first in the listname.mailtpl file for the list in question. If no such file exists, or if ADD1 is not present in listname.mailtpl, LISTSERV will look in idiom.MAILTPL (if Language= or DEFAULT_LANGUAGE= is set to idiom). Again, if the ADD1 form is not present in idiom.mailtpl, or if idiom.mailtpl does not exist, LISTSERV will then look in default.mailtpl (www_archive.mailtpl is skipped because ADD1 is not a web template form) and pull out the default ADD1 template form.

For template forms found in DEFAULT WWWTPL the precedence is:

listname WWWTPL
idiom WWWTPL
SITE WWWTPL
DEFAULT WWWTPL

The same sequence of events applies as for the MAILTPL files, except that SITE WWWTPL is never skipped (all template forms in the WWWTPL files are web forms).

9.8. Using the DAYSEQ(n) function

The DAYSEQ(n) function is quite powerful. This function allows the list owner to code template forms (such as the PROBE1 or BOTTOM_BANNER messages) that change or "rotate" automatically.

The DAYSEQ(n) function is invoked in a .BB - .EB conditional block, and n corresponds to the number of days in the rotation period, i.e., to the number of variations that you want to make to the text of the message. &DAYSEQ(n) returns a number from 1 to n which increases by 1 every day, with no special regard for weekends. That is, if the rotation period is to last for a week, you code DAYSEQ(7). If the rotation period is 15 days, you code DAYSEQ(15). Two examples follow:

9.8.1. Rotating bottom banner

To create a rotating bottom banner, follow this example. A list has three commercial sponsors, each of whom are provided with an advertisement every three days. (Note that this doesn’t take weekends into account; in this example, if company A is featured in the banner on Monday, it will be featured again on Thursday and then again on Sunday. However, in the following week it will be featured on Wednesday, Saturday, and Tuesday, so it will actually get rather good coverage.) Our BOTTOM_BANNER template form would look like this:

>>> BOTTOM_BANNER
.BB &DAYSEQ(3) = 1
Today’s copy of the &LISTNAME newsletter has been brought to you
by Company A.
.EB
.BB &DAYSEQ(3) = 2
Today’s copy of the &LISTNAME newsletter has been brought to you by Company B.
.EB
.BB &DAYSEQ(3) = 3
Today’s copy of the &LISTNAME newsletter has been brought to you by Company C.
.EB

(Naturally you can feel free to be more florid with your prose :)

If a company needs to get a higher percentage of "air" time than another, you can simply assign it more than one of the possible n values of &DAYSEQ(n). For instance, if you have two companies but one should get twice as many days of "air" time, you might code something like this:

>>> BOTTOM_BANNER
.BB (&DAYSEQ(3) = 1) OR (&DAYSEQ(3) = 3)
Today’s copy of the &LISTNAME newsletter has been brought to you
by Company A.
.EB
.BB &DAYSEQ(3) = 2
Today’s copy of the &LISTNAME newsletter has been brought to you by Company B.

.EB

This would cause Company A’s message to appear on days 1 and 3 of the rotation period and Company B’s message to appear on day 2 only.

9.8.2. Rotating FAQ via the PROBE1 template and "Renewal= xx-Daily"

Subscription renewal can be coded with daily granularity (however, please note that it is and remains inadvisable to use renewal intervals of less than a week). If you further code subscription probing into the "Renewal=" keyword with the ",Probe" parameter, you open up the possibility of turning the standard PROBE1 template form into a periodic FAQ. Here’s how:

We’ll assume to start that you will code "Renewal= 15-Daily,Probe" in your list header. (You can experiment with other numbers, but since we have two messages and will be using &DAYSEQ(2), we need an odd renewal period.) We’ll also assume that you want to send two versions of your FAQ each month; the first, a complete FAQ document, and the second, an abbreviated "reminder" version that just contains information about how to sign off, how to post to the list, and so forth. The basic algorithm is therefore:

When &DAYSEQ(2) = 1, send the full FAQ.
When &DAYSEQ(2) = 2, as it will 15 days later, send the abbreviated FAQ.

Your PROBE1 template form would thus look like this:

>>> PROBE1 Periodic FAQ posting for &LISTNAME
&WEEKDAY, &DATE &TIME
.BB &DAYSEQ(2) = 1 

This is the complete FAQ for &LISTNAME. Please read it and keep a copy 
for future reference. A FAQ document for &LISTNAME is distributed every
15 days, the full FAQ alternating with a shorter "reminder" FAQ.

<body of the full FAQ document>
.EB
.BB &DAYSEQ(2) = 2
This is the abbreviated FAQ for &LISTNAME. Please read it and keep a 
copy for future reference. A FAQ document for &LISTNAME is distributed 
every 15 days, the full FAQ alternating with a shorter "reminder" FAQ.

<body of the abbreviated FAQ document>
.EB

9.8.3. Calculating the value for DAYSEQ()

When you first start using a rotating banner with the &DAYSEQ variable, the &DAYSEQ(n)= 1 period begins based on the number of days elapsed since a baseline. On VM (and in REXX generally) you can calculate today's value easily with:

/* */ 
say Date('B') + 1

If you do not have access to a REXX interpreter, Date('B') is described as "the number of complete days (that is, not including the current day) since and including the base date, 1 Jan 0001, in the format 'dddddd' (no leading zeros or blanks)."

For example, for Friday 21 May 1999, the value of Date('B') is 729895. This value increases by one every day at midnight.

9.9. Modifying the output of LISTSERV's HELP command (non-VM)

LISTSERV's HELP command output is designed primarily to show the basic syntax of certain commonly used commands, and point users to other documents that explain how to use LISTSERV. Some sites may wish to amplify the message, and this can be done by creating a file called 'localcmd.helpfile' in the same directory where LISTSERV keeps permvars.file, default.mailtpl, and so forth.

Note carefully L-Soft does not recommend removal or alteration of the LSVHELP.FILE that ships with the software (and which contains the default text for the HELP command response) as LISTSERV expects it to be present and it will be overwritten in an upgrade.

LOCALCMD HELPFILE was originally intended to allow non-VM sites to document local commands constructed by using list exits (see chapter 5 of the Developer's Guide for LISTSERV for details regarding list exits and local commands). As such, when LISTSERV sees a LOCALCMD HELPFILE, it appends the contents of LOCALCMD HELPFILE after a line that says "The following local commands are also available:". For instance, if you have a local command called /XYZ, you could have a LOCALCMD HELPFILE containing something like:

/XYZ      <options>              (One line description of /XYZ)

and the output of HELP would then be

> help

LISTSERV(R) version 1.8d - most commonly used commands

Info      <topic|listname>       Order documentation
Lists     <Detail|Short|Global>  Get a description of all lists
SUBscribe listname <full name>   Subscribe to a list
SIGNOFF   listname               Sign off from a list
SIGNOFF   * (NETWIDE             - from all lists on all servers
REView    listname <options>     Review a list
Query     listname               Query your subscription options
SET       listname  options      Update your subscription options
INDex     <filelist_name>        Order a list of LISTSERV files
GET       filename filetype      Order a file from LISTSERV
REGister  full_name|OFF          Tell LISTSERV about your name

There are more commands (AFD, FUI, PW, etc). Send an INFO REFCARD for a
comprehensive  reference card,  or just  INFO for  a list  of available
documentation files.

The following local commands are available at this installation:

/XYZ      <options>              (One line description of /XYZ)

This server is managed by:
 LSTMAINT@LISTSERV.EXAMPLE.COM
For most sites, however, locally-added commands probably won't be available. If you use the LOCALCMD HELPFILE functionality at all, it will likely be to enhance the output in order to make it more understandable for users. So you probably would not want to see the line "The following local commands are available at this installation:" followed by text that doesn't document commands. You can turn off this line by simply adding

.NH

as the first line of LOCALCMD HELPFILE. Note that .NH is the only formatting command available in LOCALCMD HELPFILE; it is otherwise a flat ASCII file that outputs exactly as you type it.

Let's say that you are having a problem where the LISTSERV postmasters are fielding a lot of questions that really ought to be sent to list owners (get me off this list, my address changed, etc.) and a little investigation indicates that these people are getting the postmaster address from the HELP command. It's not reasonable to remove the postmaster's address from the output since it should always be possible to find out who is running the server (in case loops develop, etc.), but you could create a LOCALCMD HELPFILE like the following to indicate to users where various kinds of questions should be sent:

.NH
For help with a  specific list, please write to the  list owner(s) at the
generic list owner's address.  This address takes the form

                  listname-REQUEST@LISTSERV.EXAMPLE.COM

For  instance, if  you  are subscribed  to a  list  called DOGLIST-L,  to
contact the list owners you would write to

                  DOGLIST-L-REQUEST@LISTSERV.EXAMPLE.COM

PLEASE  DO NOT  ACTUALLY  WRITE  TO DOGLIST-L-REQUEST.  This  is just  an
example, you  must substitute the name  of the mailing list  in question.
There  is no  DOGLIST-L mailing  list  on this  server and  mail sent  to
DOGLIST-L-REQUEST is discarded unread.

Please  do not  write to  the  server manager  unless  you do  not get  a
response from the list owner.  Thank you!

9.10. The $SITE$.MAILTPL file

This feature is not available in LISTSERV Lite.

In some cases, it may be necessary for the LISTSERV maintainer to ensure that all subscribers receive certain information or warnings (typically legal notices required by government regulations) when they leave or join a list. The list owner should not be able to disable these warnings, accidentally or otherwise. The $SITE$.MAILTPL file provides this functionality. However please note that this functionality should be used only if you have a specific need for it as it will increase the number of administrative messages received by users and may cause confusion.

If a $SITE$.MAILTPL file is present in LISTSERV's main directory (the one with DEFAULT.MAILTPL), LISTSERV will look it up every time it needs to deliver an administrative message. If the message is not found in the site template, LISTSERV will process the request normally, looking up the list template file, then the language template file and finally the system template file. If the message is listed in the site template, LISTSERV will deliver both the copy in the site template and the copy in the list/language/system template.

Note that L-Soft does not ship a $SITE$.MAILTPL file in the LISTSERV distributions. If needed, you must create this template file yourself. $SITE$.MAILTPL will not be overwritten during an upgrade.

Also note that LISTSERV will not pick up an "imbedded" template from $SITE$.MAILTPL. If you wish to include an "imbedded" template (e.g., $SIGNUP) in $SITE$.MAILTPL, you must also include the template(s) that calls it with the .im command. For instance, if you include $SIGNUP in $SITE$.MAILTPL, by default you would need to include the SIGNUP1 and ADD1 templates in $SITE$.MAILTPL as well if you expected $SIGNUP to be sent from $SITE$.MAILTPL.

Web templates from DEFAULT MAILTPL must be placed in WWW_ARCHIVE MAILTPL if you wish to override the defaults. The web interface ignores $SITE$ MAILTPL .


10. Interpreting and Managing LISTSERV's log files

10.1. Logs kept by LISTSERV

LISTSERV keeps logs of all of its activity. On VM systems, this information is kept in the LISTSERV console log. On unix systems, it is kept in $LSVROOT/listserv.log by default. Note that unix systems create the log by redirection of standard output to a file; see the 'go' script if you are interested in this process.

On VMS and Windows systems, there may be several different logs depending on the configuration of the system. For instance, in addition to the LISTSERV log itself, there will be logs for the SMTP "workers" if this feature is enabled. On Windows systems, there will also be a log for the SMTP "listener" if it is in service. (Windows systems running L-Soft's LSMTP product will not use the SMTP "listener" service, and thus will not keep logs for it.) By default, logs under VMS are kept in LISTSERV_ROOT:[LOG] and logs under NT are kept in \LISTSERV\LOG .

10.2. Managing the logs

Making daily logs

While LISTSERV for VM (via WAKEPARM FILE) and Windows "turns" the log at midnight each day, automatically creating daily logs, LISTSERV for VMS and unix does not.

LISTSERV for VMS can "turn" the log via the revision control system if you simply stop and restart LISTSERV once a day (note that you must stop LISTSERV completely and restart it in a new process). This will create files like LSV_machinename.LOG;1 and LSV_machinename.LOG;2 in LISTSERV_ROOT:[LOG] (by default).

LISTSERV for unix creates a single file in the $LSVROOT directory called listserv.log. As this file can get quite long, it will probably be most productive to create a shell script called by a cron job to stop LISTSERV, rename the existing listserv.log and move it to another location (e.g., $LSVROOT/oldlogs), and then restart LISTSERV. L-Soft does not provide shell scripts for this purpose.

"Cleaning" your log files periodically

On all systems, you will probably want to clean out your old logs on a regular basis. To do this, you will want to write a script that executes automatically (e.g., via WAKEPARM on VM, as a cron job on unix, or as an AT job on Windows). A sample REXXette for use with Windows NT or 95 that keeps the last 5 days' worth of compressed logs and deletes anything older than that follows:


/**/ logdir = 'E:\LISTSERV\LOG' tempfile = logdir'\CLEANLOG.TMP' keep = 5 /* First zip all the logs, except today's */ 'DIR/B' logdir'\*.LOG >' tempfile If rc ^== 0 Then Exit today = Date('S') Do forever line = Translate(Linein(tempfile)) If line == '' Then Leave Parse var line '-'date'.' If date = today Then Iterate Parse var line fn'.' Say 'ZIPping' line'...' 'ZIP -j -m -q' logdir'\'fn logdir'\'line End Call Lineout tempfile /* Now delete ZIP files older than 'keep' days */ 'DIR/B/O-N' logdir'\*.ZIP >' tempfile If rc ^== 0 Then Exit n. = 0 Do forever line = Translate(Linein(tempfile)) If line == '' Then Leave Parse upper var line pfx'-'date'.' n.pfx = n.pfx + 1 If n.pfx <= keep Then Iterate Say 'Deleting' line'...' 'DEL' logdir'\'line End Call Lineout tempfile 'DEL' tempfile
Figure 10.1. Sample CLEANLOG.REXX script for managing LISTSERV's log files. This particular script runs under Regina REXX on Windows NT or 95.

Please note that while it is of course possible to simply delete the log file on a daily basis, for the purpose of debugging potential problems this is not recommended.

10.3. Interpreting the LISTSERV log

This file, LISTSERV’s main logging file, has different names under different ports of the product.

VM: LISTSERV logs events to the LISTSERV user’s console log.
VMS: LISTSERV_ROOT:[LOG]LSV_machine.LOG;x
Unix: ~$LSVROOT/listserv.log
Windows: LISTSERV\LOG\LISTSERV-yyyymmdd.LOG

Under VM, the console log can be "turned" by placing the appropriate command in the WAKEPARM file. Under Windows NT and 95, LISTSERV automatically "turns" the log at midnight. For VMS, if you reboot daily as explained in 10.2, the logs are numbered using the VMS revision tracking system, e,g, LSV_PEAR.LOG;1, LSV_PEAR.LOG;2, etc. (if you don't do the daily reboot, LISTSERV just keeps a single log file). For Windows, "yyyymmdd" is the year, month and day of the log, e.g., LISTSERV-19980104.LOG is the log for 4 January 1998. Unix logs are simply the output of the program written to standard output and shell scripts (not provided by L-Soft) can be written to "turn" the logs daily via cron.

10.3.1. Expiring cookies
25 May 1996 00:00:00 Expiring cookie from xxxxx@ICOM.CA:
> SIGNOFF TECHLINK
25 May 1996 00:00:00 Sent information mail to xxxxx@ICOM.CA
25 May 1996 00:00:00 Expiring cookie from xxxxxxxx@LIGHTSIDE.COM:
> SUBSCRIBE WINNT-L Sxxxx Bxxxxx
25 May 1996 00:00:00 Sent information mail to xxxxxxxx@LIGHTSIDE.COM

These entries refer to expiring "OK" confirmation cookies.

10.3.2. Releasing and reallocating a disk slot

25 May 1996 00:00:00 Virtual disk slot E(E:\LISTSERV\ARCHIVES\NISTEP-L) released
.
25 May 1996 00:00:00 Directory E:\EASE\PEACH\LISTS\IATN accessed as virtual disk
 slot E.

LISTSERV uses "disk slots" in rotation to minimize the overhead involved in opening a file, performing an operation, closing the file, and then possibly having to reopen the file immediately to perform another operation. A given "disk slot" stays open until it is needed for another file.

10.3.3. Reindexing a list

25 May 1996 00:00:01 Reindexing IATN LOG9605D...

LISTSERV rebuilds the index for the current notebook archive file of a given list immediately prior to sending the DIGEST and INDEX versions of the list.

10.3.4. Distributing a digest

Here is a typical log sequence for the distribution of a daily digest:

25 May 1996 00:00:35 Virtual disk slot E(E:\LISTSERV\ARCHIVES\HONYAKU) released.
25 May 1996 00:00:35 Directory E:\LISTSERV\ARCHIVES\SPAM-L accessed as virtual d
isk slot E.
25 May 1996 00:00:37 Reindexing SPAM-L LOG9605...
25 May 1996 00:00:37 SPAM-L digest is being distributed...
25 May 1996 00:00:37 Distributing mail ("SPAM-L") from owner-SPAM-L@PEACH.EASE.L
SOFT.COM...
25 May 1996 00:00:38 Mail forwarded to H-NET.MSU.EDU     for   2 recipients.
25 May 1996 00:00:38 Mail forwarded to UAFSYSB.UARK.EDU  for   2 recipients.
25 May 1996 00:00:38 Mail forwarded to LISTMAIL.SUNET.SE for   2 recipients.

The preceding 3 jobs were forwarded to LISTSERV servers on the DISTRIBUTE backbone. The following mail is posted to 45 users who are not served by the DISTRIBUTE backbone in a single BSMTP "envelope".

25 May 1996 00:00:38 Mail posted via SMTP to xxx@AMERICAN.EDU.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxxxx@AOL.COM.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxxx@AOL.COM.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxx@BCVMS.BC.EDU.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxx@BMACADM.BITNET.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxx@CLEMSON.EDU.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxxxxxxx@COMPUSERVE.COM.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxxxx@EMAIL.GC.CUNY.EDU.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxxx@ERE.UMONTREAL.CA.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxx@ETERNA.COM.AU.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxx@GOL.COM.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxxxx@GPU.SRV.UALBERTA.CA.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxxx@HAWAII.EDU.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxx@IBM.NET.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxxxx@IDIR.NET.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxxx@INET.UNI-C.DK.
25 May 1996 00:00:38 Mail posted via SMTP to xxx@KSUVM.KSU.EDU.
25 May 1996 00:00:38 Mail posted via SMTP to xxxx@LOC.GOV.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxx@LOONY-TOONS.TAMU.EDU.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxx@LTRR.ARIZONA.EDU.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxxx@MAILBOX.SYR.EDU.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxxxx@MO.NET.
25 May 1996 00:00:38 Mail posted via SMTP to xxxx@MUSICA.MCGILL.CA.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxxx@NANDO.NET.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxxx@NETCOM.COM.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxxx@NYIQ.NET.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxx@PAMELA.INT.MED.UNIPI.IT.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxx@PIONEER.STATE.ND.US.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxx@PSC.LSA.UMICH.EDU.
25 May 1996 00:00:38 Mail posted via SMTP to xxxx@PSUVM.PSU.EDU.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxx@PUCC.PRINCETON.EDU.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxx@SCS.UNR.EDU.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxx@SILVERPLATTER.COM.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxx@SJUVM.STJOHNS.EDU.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxx@SPCVXA.SPC.EDU.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxx@TELERAMA.LM.COM.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxx@UA1VM.UA.EDU.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxxx@UABDPO.DPO.UAB.EDU.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxxxx@UCONNVM.UCONN.EDU.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxxx@UTARLVM1.UTA.EDU.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxxx@UVVM.UVIC.CA.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxxx@VM1.HQADMIN.DOE.GOV.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxx@VM1.MCGILL.CA.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxx@VM3090.EGE.EDU.TR.
25 May 1996 00:00:38 Mail posted via SMTP to xxxxxx@WATSON.IBM.COM.

LISTSERV always summarizes and tells you what it's done:

25 May 1996 00:00:38 Done - 3 jobs (6 rcpts), 1 outbound file (45 rcpts).

10.3.5. Daily error monitoring reports

25 May 1996 00:00:43 Generating daily nondelivery monitoring reports...

Here LISTSERV deletes a subscriber who has gone over the Auto-Delete= limits:

25 May 1996 00:00:44 -> Deleted xxxxxxxx@CARIARI.UCR.AC.CR from ACCESS-L.

LISTSERV now sends out the daily error monitoring reports to the appropriate people (defined in "Errors-To=" for each list).

25 May 1996 00:00:44 Sent information mail to xxxxxxxx@CARIARI.UCR.AC.CR 25 May 1996 00:00:45 Sent information mail to xxxxxx@LINUS.DC.LSOFT.COM 25 May 1996 00:00:46 Sent information mail to xxxxx@AF.PENTAGON.MIL 25 May 1996 00:00:46 Sent information mail to xxxxx@ESA.MHS.COMPUSERVE.COM

As LISTSERV continues to run and process errors for the various lists, it will update the listname.AUTODEL file whenever it receives an error that it understands:

25 May 1996 00:05:43 Automatic nondelivery report processing for WIN95-L: 25 May 1996 00:05:43 -> All errors temporary, no action taken. 25 May 1996 00:07:34 Automatic nondelivery report processing for EXCEL-G: 25 May 1996 00:07:34 -> 1 monitoring entry updated.

10.3.6. Processing mail for local lists

25 May 1996 00:39:23 Processing file 8209289 from MAILER@PEACH.EASE.LSOFT.COM
25 May 1996 00:39:25 Processing mail from xxxxxx@PRIMENET.COM for ACCESS-L
25 May 1996 00:39:25 Virtual disk slot E(E:\EASE\PEACH\FTP\EXCEL-L) released.
25 May 1996 00:39:25 Directory E:\EASE\PEACH\FTP\ACCESS-L accessed as virtual di
sk slot E.
25 May 1996 00:39:26 Distributing mail ("ACCESS-L") from owner-access-l@PEACH.EA
SE.LSOFT.COM...
25 May 1996 00:39:26 Mail posted via SMTP to xxxxxxxxxxxxxx@NR-COMMS.RADIO.BBC.C
O.UK.
25 May 1996 00:39:26 Mail posted via SMTP to xxxxxxxx@OHS.ORG.
25 May 1996 00:39:26 Mail posted via SMTP to xxxxx@POBOX.COM.
25 May 1996 00:39:26 Done - 1 outbound file (3 rcpts).
25 May 1996 00:39:26 Distributing mail ("ACCESS-L") from owner-access-l@PEACH.EA
SE.LSOFT.COM...
25 May 1996 00:39:26 Mail forwarded to LISTSERV@HEARN    for   4 recipients.
25 May 1996 00:39:27 Mail forwarded to LISTMAIL.SUNET.SE for  11 recipients.
25 May 1996 00:39:27 Mail forwarded to LISTSERV@ICINECA  for   4 recipients.
25 May 1996 00:39:27 Mail forwarded to LISTSERV.GMD.DE   for   3 recipients.
25 May 1996 00:39:27 Mail forwarded to LISTSERV@AEARN    for   2 recipients.
25 May 1996 00:39:27 Processed     192 recipients...
25 May 1996 00:39:27 Done - 5 jobs (24 rcpts), 1 outbound file (192 rcpts).
25 May 1996 00:39:27 Distributing mail ("ACCESS-L") from owner-access-l@PEACH.EA
SE.LSOFT.COM...
25 May 1996 00:39:27 Mail posted via SMTP to xxxxx@ADC.COM.
25 May 1996 00:39:27 Mail posted via SMTP to xxxxxxx@MSMEL.PRAXA.COM.AU.
25 May 1996 00:39:27 Mail posted via SMTP to xxxxxxx@SPRYNET.COM.
25 May 1996 00:39:27 Done - 1 outbound file (3 rcpts).
25 May 1996 00:39:27 Message DISTRIBUTEd to 222 recipients.
25 May 1996 00:39:28 Sent information mail to xxxxxx@PRIMENET.COM

10.3.7. Administrative mail (X-ADMMAIL)

This particular type of mail, sent to the OWNER-listname address, is a delivery error being returned to the RFC 821 MAIL FROM: address.

25 May 1996 00:01:16 From MAILER@PEACH.EASE.LSOFT.COM: X-ADMMAIL OWNER-AFNS 25 May 1996 00:01:16 Processing file 8206153 from MAILER@PEACH.EASE.LSOFT.COM

10.3.8. DISTRIBUTE jobs from remote hosts

Just as our LISTSERV sends out DISTRIBUTE jobs to the backbone, it also receives them for distribution from remote backbone hosts.

25 May 1996 00:01:16 Processing file 8206155 from MAILER@PEACH.EASE.LSOFT.COM
25 May 1996 00:01:16 From LISTSERV@PSUVM.PSU.EDU: X-B64 ID=PAN-L.MAILDIST CLASS=
A
25 May 1996 00:01:16 Rescheduled as: 8206156
25 May 1996 00:01:16 Processing file 8206156 from LISTSERV@PEACH.EASE.LSOFT.COM
25 May 1996 00:01:16 From LISTSERV@PSUVM: DIST2 MAIL I=Y FROM=owner-pan-l@BINGVM
B.CC.BINGHAMTON.EDU FORW(CRC) HOST(626 626 (...)
25 May 1996 00:01:17 Distributing mail ("PAN-L") from owner-pan-l@BINGVMB.CC.BIN
GHAMTON.EDU...
25 May 1996 00:01:17 Mail posted via SMTP to xxxxxxxx@ACS.RYERSON.CA.
25 May 1996 00:01:17 Mail posted via SMTP to xxxxx@AMAIL.AMDAHL.COM.
25 May 1996 00:01:17 Mail posted via SMTP to xxxxxxx@AOL.COM.

and so forth.

10.3.9. Requesting "OK" confirmation for commands

25 May 1996 00:01:17 Processing file 8206160 from MAILER@PEACH.EASE.LSOFT.COM
25 May 1996 00:01:17 From xxxxxxx@AUSCONSULT.COM.AU: UNSUB EXCEL-L
25 May 1996 00:01:17 Requesting confirmation, cookie=3EB4F2
25 May 1996 00:01:17 Sent information mail to xxxxxxx@AUSCONSULT.COM.AU

10.3.10. Subscription summary updates (SUPD jobs)

X-SUPD jobs update the file used by "LIST SUMMARY". LISTSERV receives the file from another LISTSERV host and distributes it down the line:

25 May 1996 00:04:54 Processing file 8206401 from MAILER@PEACH.EASE.LSOFT.COM
25 May 1996 00:04:54 From LISTSERV@INTERNET.COM: X-B64 ID=X-SUPD.JOB ASCII CLASS
=J
25 May 1996 00:04:54 Rescheduled as: 8206402
25 May 1996 00:04:54 Processing file 8206402 from LISTSERV@PEACH.EASE.LSOFT.COM
25 May 1996 00:04:54 From LISTSERV@INTERNET.COM: DIST2 I=Y FROM=LISTSERV@INTERNE
T.COM FORW(CRC) HOST(626 626 626 626 626 691 686  (...)
25 May 1996 00:04:54 Distributing file "X-SUPD JOB" from LISTSERV@INTERNET.COM..
.
25 May 1996 00:04:54 File forwarded to LIME.EASE.LSOFT.COM for   1 recipient.
25 May 1996 00:04:54 File forwarded to WIN95.DC.LSOFT.COM for   1 recipient.
25 May 1996 00:04:54 File forwarded to SPIDER.EASE.LSOFT.COM for   1 recipient.
25 May 1996 00:04:54 File forwarded to HOME.EASE.LSOFT.COM for   1 recipient.
25 May 1996 00:04:54 File forwarded to LISTSERV.GEORGETOWN.EDU for   1 recipient
.
25 May 1996 00:04:54 File forwarded to CC1.KULEUVEN.AC.BE for   1 recipient.
25 May 1996 00:04:54 File forwarded to LISTSERV.USHMM.ORG for   1 recipient.
25 May 1996 00:04:54 File forwarded to LISTSERV.CLARK.NET for   1 recipient.
25 May 1996 00:04:54 File "X-SUPD JOB" distributed to LISTSERV@PEACH.EASE.LSOFT.
COM.
25 May 1996 00:04:54 Done - 8 jobs (8 rcpts), 1 outbound file (1 rcpt).
25 May 1996 00:04:54 Processing file 8206411 from LISTSERV@PEACH.EASE.LSOFT.COM
25 May 1996 00:04:54 From LISTSERV@INTERNET.COM: X-SUPD FWD=NO DATE=1996052500:0
0:04 DATA=5 56 PHOTOPRO 465 PHOTOTECH 268 PHOTOAS (...)

10.3.11. Global list of lists updates (LUPD jobs)

X-LUPD jobs update the list of lists. LISTSERV receives the file from another LISTSERV host and distributes it down the line:

25 May 1996 00:04:08 Processing file 8206361 from MAILER@PEACH.EASE.LSOFT.COM
25 May 1996 00:04:08 From LISTSERV@LISTSERV.UIC.EDU: X-B64 ID=X-LUPD.JOB ASCII C
LASS=J
25 May 1996 00:04:08 Rescheduled as: 8206362
25 May 1996 00:04:08 Processing file 8206362 from LISTSERV@PEACH.EASE.LSOFT.COM
25 May 1996 00:04:08 From LISTSERV@LISTSERV.UIC.EDU: DIST2 I=Y FROM=LISTSERV@LIS
TSERV.UIC.EDU FORW(CRC) HOST(626 626 626 626 626 691  (...)
25 May 1996 00:04:08 Distributing file "X-LUPD JOB" from LISTSERV@LISTSERV.UIC.E
DU...
25 May 1996 00:04:08 File forwarded to LIME.EASE.LSOFT.COM for   1 recipient.
25 May 1996 00:04:08 File forwarded to WIN95.DC.LSOFT.COM for   1 recipient.
25 May 1996 00:04:08 File forwarded to SPIDER.EASE.LSOFT.COM for   1 recipient.
25 May 1996 00:04:08 File forwarded to HOME.EASE.LSOFT.COM for   1 recipient.
25 May 1996 00:04:08 File forwarded to LISTSERV.GEORGETOWN.EDU for   1 recipient
.
25 May 1996 00:04:08 File forwarded to CC1.KULEUVEN.AC.BE for   1 recipient.
25 May 1996 00:04:08 File forwarded to LISTSERV.USHMM.ORG for   1 recipient.
25 May 1996 00:04:08 File forwarded to LISTSERV.CLARK.NET for   1 recipient.

LISTSERV also sends itself a copy:

25 May 1996 00:04:08 File "X-LUPD JOB" distributed to LISTSERV@PEACH.EASE.LSOFT.
COM.
25 May 1996 00:04:08 Done - 8 jobs (8 rcpts), 1 outbound file (1 rcpt).
25 May 1996 00:04:08 Processing file 8206371 from LISTSERV@PEACH.EASE.LSOFT.COM
25 May 1996 00:04:08 From LISTSERV@LISTSERV.UIC.EDU: X-LUPD FWD=NO DATE=19960524

23:00:02 HDR=YES

The following entry tells LISTSERV to replace the information it has for NEWIO-L in its global list of lists:

> REP NEWIO-L NEWIO-L /Info about replacing ILLINET Online hardware and software
/2616677089
> CKS 3881006631
25 May 1996 00:04:10 GLOBLIST FILE has been successfully updated.

Note that entries for deleted lists also are updated (deleted from GLOBLIST FILE):

25 May 1996 00:24:11 Processing file 8207550 from LISTSERV@PEACH.EASE.LSOFT.COM
25 May 1996 00:24:11 From LISTSERV@VM1.NODAK.EDU: X-LUPD FWD=NO DATE=1996052423:
00:04 HDR=YES

> DEL WLREHAB > DEL WDAMAGE > DEL POWER-L > DEL QUEST > DEL RS1-L > DEL SANGEET > DEL SPRINT-L > DEL STAFFGOV > DEL TAG-L > DEL TELUGU > DEL THEORY-A > DEL THEORY-B > DEL THEORY-C > DEL THEORYNT > DEL TOW > DEL TWSGIS-L > DEL UND-SEMI > CKS 3794276653 25 May 1996 00:24:13 GLOBLIST FILE has been successfully updated.

Note that if the "CKS" checksum does not check out, the job is discarded without being processed.

10.3.12. Valid "OK" confirmation received

Here is a set of typical log entries for the receipt of a valid "OK" confirmation. Notice that LISTSERV accepts the OK and then issues itself the command that required confirmation. Other than the "OK", this behavior (at least in the log) is identical to how LISTSERV handles commands that do not require confirmation.

225 May 1996 00:04:58 Processing file 8206418 from MAILER@PEACH.EASE.LSOFT.COM
25 May 1996 00:04:58 From xxxxxxxxx@SOL.KISS.DE: OK
25 May 1996 00:04:58 From xxxxxxxxx@SOL.KISS.DE: SIGNOFF AFWEEKLY
25 May 1996 00:04:58 To   xxxxxxxxx@SOL.KISS.DE: You have been removed from the
AFWEEKLY list.
25 May 1996 00:04:58 Sending FAREWELL message to xxxxxxxxx@SOL.KISS.DE
25 May 1996 00:04:58 Sent information mail to xxxxxxxxx@SOL.KISS.DE
25 May 1996 00:04:58 Sent information mail to:
                     > xxxxxxx@AFSYNC.HQ.AF.MIL xxxxxxx@AFSYNC.HQ.AF.MIL
                     > xxxxx@AFNEWS.PA.AF.MIL xxxxxx@MASTER.PA.AF.MIL
25 May 1996 00:04:58 Sent information mail to xxxxxxxxx@SOL.KISS.DE

Note that the "OK" may contain the return cookie:

25 May 1996 00:08:50 Processing file 8206772 from MAILER@PEACH.EASE.LSOFT.COM
25 May 1996 00:08:50 From xxxxxxxxxx@GENIE.COM: OK 71365E
25 May 1996 00:08:50 From xxxxxxxxxx@GENIE.COM: SUBSCRIBE AFNS Mxxxx Exxx Kxxxxx
er
25 May 1996 00:08:51 To   xxxxxxxxxx@GENIE.COM: You have been added to the AFNS
list.
25 May 1996 00:08:51 Sent information mail to xxxxxxxxxx@GENIE.COM
25 May 1996 00:08:51 Sending WELCOME message to xxxxxxxxxx@GENIE.COM
25 May 1996 00:08:51 Sent information mail to xxxxxxxxxx@GENIE.COM
25 May 1996 00:08:51 Sent information mail to:
                     > xxxxxxx@AFSYNC.HQ.AF.MIL xxxxxxx@AFSYNC.HQ.AF.MIL
                     > xxxxx@AFNEWS.PA.AF.MIL xxxxxx@MASTER.PA.AF.MIL
25 May 1996 00:08:51 Sent information mail to xxxxxxxxxx@GENIE.COM

10.3.13. Invalid "OK" confirmation received

"OK" confirmation codes relate to specific userids. For instance, if you try to execute a command as "someuser@someplace.com" and reply to the "OK" from "someuser@unix1.someplace.com", LISTSERV will not perform so-called "fuzzy matching" or do a DNS lookup to determine whether or not "unix1.someplace.com" maps to "someplace.com". Therefore, since the code and the userid don't match, LISTSERV will respond that the confirmation code does not match any pending job.

This message is also sent if the "OK" comes after the "cookie" expires, since of course there is no longer any pending job matching it.

25 May 1996 01:16:28 Processing file 8211043 from MAILER@PEACH.EASE.LSOFT.COM
25 May 1996 01:16:29 From xxxxxx@MSN.COM: ok
25 May 1996 01:16:29 To   xxxxxx@MSN.COM: The confirmation code you gave (78B484)  does not correspond to any pending (...)

10.3.14. User is already subscribed to a given list

Note that the user may be trying to change his "real name" field in the list. In any case, if the "real name" field matches the one in the SUBSCRIBE command, the following is logged:

25 May 1996 00:11:42 Processing file 8206935 from MAILER@PEACH.EASE.LSOFT.COM
25 May 1996 00:11:42 From xxxxxxxx@NS.NET: SUBSCRIBE IN-TOUCH Txxxxx Hxxxxxx
25 May 1996 00:11:42 To   xxxxxxxx@NS.NET: You are already subscribed to the IN-
TOUCH list as "Txxxxx Hxxxxxx.
25 May 1996 00:11:42 Sent information mail to therrera@NS.NET

If the "real name" field is different, the following is logged:

25 May 1996 00:16:18 Processing file 8207278 from MAILER@PEACH.EASE.LSOFT.COM
25 May 1996 00:16:18 From xxxxxxx@EROLS.COM: SUBSCRIBE IN-TOUCH Rxxxxxx Sxxx
25 May 1996 00:16:18 To   xxxxxxx@EROLS.COM: The name associated with your xxxxx
xx@EROLS.COM subscription has been (...)
25 May 1996 00:16:18 Sent information mail to xxxxxxx@EROLS.COM

10.3.15. User has included non-command text (e.g., a .sig file) in his mail to LISTSERV

25 May 1996 00:32:07 Processing file 8207703 from MAILER@PEACH.EASE.LSOFT.COM
25 May 1996 00:32:07 From MAILER@PEACH.EASE.LSOFT.COM: X-ADMMAIL OWNER-EXCEL-L M
ailer-Daemon@inf.com
25 May 1996 00:32:15 Processing file 8207705 from MAILER@PEACH.EASE.LSOFT.COM
25 May 1996 00:32:15 From xxxxxxxx@IX.NETCOM.COM: ok
25 May 1996 00:32:15 From xxxxxxxx@IX.NETCOM.COM: sub WINNT-L Txxxx D. Sxxxx
25 May 1996 00:32:15 To   xxxxxxxx@IX.NETCOM.COM: You have been added to the WIN
NT-L list.
25 May 1996 00:32:15 Sent information mail to xxxxxxxx@IX.NETCOM.COM
25 May 1996 00:32:15 From xxxxxxxx@IX.NETCOM.COM: Txxxx Sxxxx
25 May 1996 00:32:15 To   xxxxxxxx@IX.NETCOM.COM: Unknown command - "TXXXX". Try
 HELP.
25 May 1996 00:32:15 From xxxxxxxx@IX.NETCOM.COM: xxxxxxxx@ix.netcom.com
25 May 1996 00:32:15 To   xxxxxxxx@IX.NETCOM.COM: Unknown command - "XXXXXXXX@IX
.NETCOM.COM". Try HELP.
25 May 1996 00:32:15 From xxxxxxxx@IX.NETCOM.COM: http://www.netcom.com/~xxxxxxx
x/
25 May 1996 00:32:15 To   xxxxxxxx@IX.NETCOM.COM: Unknown command - "HTTP:". Try
 HELP.
25 May 1996 00:32:15 Sent information mail to xxxxxxxx@IX.NETCOM.COM

10.3.16. Response to list owner or LISTSERV maintainer commands

25 May 1996 00:36:08 From xxxxxxx@WEBCOM.COM: quiet delete iatn xxxxxx@po.pacifi
c.net.sq pw=xxxxx
25 May 1996 00:36:08 To   xxxxxxx@WEBCOM.COM: xxxxxx@PO.PACIFIC.NET.SQ is not su
bscribed to the IATN list.
25 May 1996 00:36:08 Sent information mail to xxxxxx@WEBCOM.COM

10.3.17. Response to a user who tries to post to a held list (or one for which PRIMETIME is in effect)

25 May 1996 00:36:42 Processing file 8208564 from MAILER@PEACH.EASE.LSOFT.COM
25 May 1996 00:36:43 To   xxxxx@IQUEST.NET: The distribution of your message da
ted  Fri, 24 May 1996 23:32:59 -0500 with (...)
25 May 1996 00:36:43 Sent information mail to xxxxx@IQUEST.NET

10.3.18. Command forwarded via GLX from another host

25 May 1996 00:48:56 Processing file 8210093 from MAILER@PEACH.EASE.LSOFT.COM
25 May 1996 00:48:57 From LISTSERV@SEARN.SUNET.SE: X-B64 ID=X-FOR.JOB CLASS=M
25 May 1996 00:48:57 Rescheduled as: 8210094
25 May 1996 00:48:57 Processing file 8210094 from LISTSERV@PEACH.EASE.LSOFT.COM
25 May 1996 00:48:57 From LISTSERV@SEARN: X-FOR FWDED=2 xxxxxxxx@CS.SFU.CA SUBSC
RIBE WINNT-L Pxxxxxxxxx Pxxxxxxxx
25 May 1996 00:48:57 Requesting confirmation, cookie=4E79B8
25 May 1996 00:48:57 Sent information mail to xxxxxxxx@CS.SFU.CA
25 May 1996 00:48:57 Sent information mail to xxxxxxxx@CS.SFU.CA

10.3.19. Netwide DELETE (X-DEL jobs)

25 May 1996 01:13:25 Processing file 8210957 from MAILER@PEACH.EASE.LSOFT.COM
25 May 1996 01:13:25 From LISTSERV@PSUVM.PSU.EDU: X-B64 ID=X-DEL.JOB CLASS=A
25 May 1996 01:13:25 Rescheduled as: 8210958
25 May 1996 01:13:25 Processing file 8210958 from LISTSERV@PEACH.EASE.LSOFT.COM
25 May 1996 01:13:25 From LISTSERV@PSUVM: DIST2 I=Y FROM=LISTSERV@VM1.NODAK.EDU
FORW(CRC) HOST(626 626 626 626 626 626 691 (...)
25 May 1996 01:13:25 Distributing file "X-DEL JOB" from LISTSERV@VM1.NODAK.EDU..
.
25 May 1996 01:13:25 File forwarded to HOME.EASE.LSOFT.COM for   1 recipient.
25 May 1996 01:13:25 File forwarded to SPIDER.EASE.LSOFT.COM for   1 recipient.
25 May 1996 01:13:25 File forwarded to WIN95.DC.LSOFT.COM for   1 recipient.
25 May 1996 01:13:25 File forwarded to INDIAN.DC.LSOFT.COM for   1 recipient.
25 May 1996 01:13:25 File forwarded to LIME.EASE.LSOFT.COM for   1 recipient.
25 May 1996 01:13:25 File forwarded to LISTSERV.GEORGETOWN.EDU for   1 recipient
.
25 May 1996 01:13:25 File forwarded to CC1.KULEUVEN.AC.BE for   1 recipient.
25 May 1996 01:13:26 File forwarded to LISTSERV.USHMM.ORG for   1 recipient.
25 May 1996 01:13:26 File forwarded to LISTSERV.CLARK.NET for   1 recipient.
25 May 1996 01:13:26 File "X-DEL JOB" distributed to LISTSERV@PEACH.EASE.LSOFT.C
OM.
25 May 1996 01:13:26 Done - 9 jobs (9 rcpts), 1 outbound file (1 rcpt).
25 May 1996 01:13:26 Processing file 8210968 from LISTSERV@PEACH.EASE.LSOFT.COM
25 May 1996 01:13:26 From LISTSERV@VM1.NODAK.EDU: X-FOR xxxx@SDSUMUS.SDSTATE.EDU
 SIGNOFF * FWDED=2 (NETWIDE

10.3.20. FIOC cache notifications

LISTSERV caches files that it uses for efficiency. Occasionally, you may see a warning that the FIO cache has reached a preset limit (FIOC_WARNING in the site configuration file). See the FIOC_CACHE, FIOC_TRIM, and FIOC_WARNING site configuration variables in Appendix C for more information. If you get a lot of these warnings, you may want to consider adjusting the cache values.

25 May 1996 01:24:06 Virtual disk slot E(E:\EASE\PEACH\FTP\VBDATA-L) released.
25 May 1996 01:24:06 Directory E:\LISTSERV\ARCHIVES\SPAM-L accessed as virtual 
disk slot E.

*** FIO file cache now totals 20659k. A list of cached files follows. ***

File size  Usage  Flags  File name
---------  -----  -----  ---------
    5071k      1   U     E:\LISTSERV\ARCHIVES\SPAM-L\SPAM-L.LOG9605
       2k      1         E:\listserv\TMP\LISTSERV.CMSUT1
     242k      1         E:\listserv\main\PERMVARS.FILE
       4k      1         E:\listserv\main\VBDATA-L.DIGEST
     378k      1         E:\EASE\PEACH\FTP\VBDATA-L\VBDATA-L.LOG9605D
     121k      1         E:\listserv\main\POSTNOTE.LIST
     282k      1         E:\listserv\main\FUTURESUPERSTOCK.LIST
     115k      1         E:\listserv\main\AUTOTECHNET.LIST
       6k      1         E:\LISTSERV\ARCHIVES\HONYAKU\HONYAKU.DIGEST
       1k      3         E:\listserv\main\DIGESTS.FILE
      11k      3         E:\listserv\TMP\TEMP.FILELIST

(Many more lines were deleted)

10.3.21. Web archive/administration interface logging (starting with 1.8d)

When LISTSERV receives a request from the 'wa' interface, it logs the activity as below. Note that LISTSERV receives an X-LOGIN command from 'wa' and issues a validation code if the password and the user's e-mail address match. Note also that LISTSERV logs the IP address of the machine making the request via 'wa'.

5 Aug 1997 10:51:08 From IUSR_XXX@PEACH.EASE.LSOFT.COM: X-LOGIN xxxxxx@lsoft.com
 206.241.13.58 PW=YYYYYYYY
5 Aug 1997 10:51:08 To   IUSR_XXX@PEACH.EASE.LSOFT.COM: ***OK*** 6093C01B81CF68D
42B
5 Aug 1997 10:51:09 From IUSR_XXX@PEACH.EASE.LSOFT.COM: X-LOGCK 6093C01B81CF68D4
2B AUTHINFO(206.241.13.58) WM: LIST OWNED
5 Aug 1997 10:51:21 From IUSR_XXX@PEACH.EASE.LSOFT.COM: X-LOGCK 6093C01B81CF68D4
2B AUTHINFO(206.241.13.58) OWNER(TEST) WM: GET TEST (HDR NOL (...)

The following indicates a timeout after 60 seconds of inactivity:

4 Feb 1998 10:26:53 From IUSR_XXX@PEACH.EASE.LSOFT.COM: X-LOGCK 37BA2700
C7AA3AE9EE AUTHINFO(208.141.38.1) TIMEKILL(60)

This indicates a web archive search and the response:

4 Feb 1998 10:26:53 From IUSR_XXX@PEACH.EASE.LSOFT.COM: X-LOGCK 3EA2D501
187014BB04 AUTHINFO(204.149.110.125) NOTEBOOK(spam-l) DBS: SEARC (...)
4 Feb 1998 10:26:56 Reindexing SPAM-L LOG9802A...
4 Feb 1998 10:27:08 To   IUSR_PEACH@LSOFT.COM: -> 23 matches.

This indicates a subscrption via the web interface:

4 Feb 1998 10:27:08 From IUSR_PEACH@LSOFT.COM: X-LOGCK 37BA2700C7AA3AE9E
E AUTHINFO(208.141.38.1) WM: SUBSCRIBE WINNT-L Kevin Mc (...)
4 Feb 1998 10:27:08 Requesting confirmation, cookie=1723C284

10.3.22. X-SPAM jobs

From time to time a server receives X-SPAM jobs from other LISTSERV hosts. These jobs are "spam alerts" which tell the server that spam has been detected at another site and a user has been put under 48 hour quarantine.

14 Jun 1999 06:48:52 Processing file 41256617 from MAILER@PEACH.EASE.LSOFT.COM
14 Jun 1999 06:48:52 From LISTSERV@PLUM.EASE.LSOFT.COM: X-B64 ID=X-SPAM.JOB ASCII CLASS=J
14 Jun 1999 06:48:52 Rescheduled as: 41256618
14 Jun 1999 06:48:52 Processing file 41256618 from LISTSERV@PEACH.EASE.LSOFT.COM
14 Jun 1999 06:48:52 From LISTSERV@PLUM.EASE.LSOFT.COM: DIST2 I=Y FROM=LISTSERV@LISTSERV.AOL.COM FORW(CRC) HOST(626)
14 Jun 1999 06:48:52 Distributing file "X-SPAM JOB" from LISTSERV@LISTSERV.AOL.COM...
14 Jun 1999 06:48:52 File "X-SPAM JOB" distributed to LISTSERV@PEACH.EASE.LSOFT.COM.
14 Jun 1999 06:48:52 Done - 1 outbound file (1 rcpt).
14 Jun 1999 06:48:52 Processing file 41256619 from LISTSERV@PEACH.EASE.LSOFT.COM
14 Jun 1999 06:48:52 From LISTSERV@LISTSERV.AOL.COM: X-SPAM exxxx_xxxxxxxxx@YAHOO.COM 4214CE9E
14 Jun 1999 06:48:52 -> Registered.

At the end of this, the address exxxx_xxxxxxxxx@YAHOO.COM has been registered as a spammer and will be quarantined for 48 hours.

10.3.23. X-TBREG jobs

X-TBREG jobs are sent out by all LISTSERV Lite Free Edition servers and any other servers that are set to TABLELESS runmode (see "RUNMODE" in Appendix C). These jobs register your server with a central L-Soft server, and are important for two reasons: first, so that your server and lists can show up in the L-Soft-maintained CataList service; and second, so that your server can participate correctly in the LISTSERV distributed server model without needing to update LISTSERV's networking tables on a regular basis.

Non-Free Edition servers set to NETWORKED or STANDALONE runmode do not generate X-TBREG jobs, although they may receive them from remote hosts to be cached for DISTRIBUTE purposes.

For more information about server registration, see chapter 5.6. Note that LISTSERV Lite Free Edition servers cannot change their runmode and therefore will always self-register this way.

10.3.24. Responses to LVMON@VM.SE.LSOFT.COM

If you are running in Networked or Tableless mode you may see these from time to time:

13 Mar 2000 16:45:13 From LVMON@VM.SE.LSOFT.COM: RELEASE                        
13 Mar 2000 16:45:13 To   LVMON@VM.SE.LSOFT.COM: LISTSERV(R) High Performance fo
r Windows NT version 1.8d, managed by:                                          
13 Mar 2000 16:45:13 From LVMON@VM.SE.LSOFT.COM: SHOW                           
13 Mar 2000 16:45:13 From LVMON@VM.SE.LSOFT.COM: SHOW WWW_ARCHIVE_URL           
13 Mar 2000 16:45:13 To   LVMON@VM.SE.LSOFT.COM: WWW_ARCHIVE_URL = http://peach.
ease.lsoft.com/scripts/wa.exe                                                   
13 Mar 2000 16:45:13 From LVMON@VM.SE.LSOFT.COM: SHOW CTR 200003                
13 Mar 2000 16:45:13 From LVMON@VM.SE.LSOFT.COM: SHOW CTR 200002                
13 Mar 2000 16:45:13 Sent information mail to LVMON@VM.SE.LSOFT.COM

VM.SE.LSOFT.COM is a central L-Soft server that collects publicly-available statistics and other information for the CataList service and for L-Soft's use in developing usage metrics. All of the commands sent by LVMON are documented and can be issued by any user. See also 5.7 of this manual for more information on inter-server information sharing.

10.4. Interpreting the SMTP logs (Windows servers only)

Note that if you are running L-Soft’s LSMTP™ product and do not have the SMTPL.EXE "listener" running, these logs will not be generated.

These logs are for the SMTPL.EXE "listener" service, and are called SMTP-yyyymmdd.LOG. They are found in the /LISTSERV/LOG directory with the other LISTSERV system logs. A typical "listener" log looks like this:


13 Mar 1998 14:13:31 LISTSERV SMTP listener, version 1.0c 13 Mar 1998 14:13:31 Copyright L-Soft international, 1994-97 13 Mar 1998 14:13:31 Initialization complete. 13 Mar 1998 14:15:59 New connection (1) from 128.118.56.2 13 Mar 1998 14:18:50 New connection (2) from 199.3.65.5 13 Mar 1998 14:18:59 >>>(1) Connection closed by remote host. 13 Mar 1998 14:19:05 Closing connection (2) from 199.3.65.5. 13 Mar 1998 14:19:08 New connection (3) from 205.186.43.7 13 Mar 1998 14:20:08 Closing connection (3) from 205.186.43.7.

Figure 10.2 Typical SMTP log for the SMTPL.EXE "listener"


This log simply keeps track of incoming SMTP connections to your server. It adds an entry for each new connection as it opens and closes. Additionally, if a connection is closed abnormally (e.g., by the remote host before any data is sent), the condition is logged. The SMTP log is generally useful only for debugging the SMTP listener, although it may also be of use in debugging problems with specific remote hosts.

10.5. Interpreting the SMTP "worker" log entries (non-VM only)

If you have SMTP "workers" activated on a Windows or VMS server, each "worker" creates a separate log for itself. These logs are found in:

VMS: LISTSERV_ROOT:[LOG]SMTPSn-yyyymmdd.LOG
Windows: LISTSERV\LOG\SMTPSn-yyyymmdd.LOG

If you are using SMTP "workers" under unix, no smtps*.log files are generated. Rather, the lsv "worker" sub-processes log information to the main listserv.log file.

(LISTSERV automatically "turns" the VMS and Windows SMTPS logs at midnight. "yyyymmdd" is the year, month and day of the log, e.g., LISTSERV-19980104.LOG is the log for 4 January 1998. "n" refers to the worker that is generating the log. Each worker generates a log, so if you have 10 workers running, you will have logs for SMTPS1 through SMTPS10.)

A typical SMTP "worker" log looks like this:


03 Jun 1996 13:49:21 *** LSMTP extensions activated *** 03 Jun 1996 13:49:03 500 error reading data line 03 Jun 1996 13:49:04 Renaming 8891738.MAIL to 8891738.MAIL-ERR1. 03 Jun 1996 14:06:54 Error opening '8894361.MAIL': Permission denied 03 Jun 1996 14:09:55 Error opening '8894695.MAIL': Permission denied 03 Jun 1996 14:40:45 Error opening '8897761.MAIL': Permission denied

Figure 10.3 Typical SMTPS log for the SMTPW.EXE SMTP "workers"


The SMTP worker logs keep track of events that occur while the SMTP workers are delivering mail to the external mail host(s) defined in the SMTP_FORWARD_n variables in the site configuration file. In general, the events logged will be errors of one kind or another. For instance, the first error in the example above indicates an SMTP error, and the second indicates that a file that caused an error has been renamed so that it can be examined for debugging.

The last three errors are normal and can generally be ignored. They refer to the fact that two workers have noticed a .MAIL file that exists in the queue, and that one of them grabbed it before the other one did. The first worker locks the file and the second worker is denied permission to open it. Sometimes the first worker may process the mail so quickly that the error will read "File not found" rather than "Permission denied"; either way, this should not be considered alarming unless mail is actually not being delivered.

The first line in the example simply indicates that special extensions for use with LSMTP have been activated. This message will appear only if you are licensed for LISTSERV-HPO.

10.6. Change logs

This feature and keyword are not available in LISTSERV Lite. Starting with version 1.8d, this feature is available to track certain operations on lists with "Change-Log= Yes" coded into their headers. As noted elsewhere in this manual, setting the keyword to "Yes" causes LISTSERV to write a file called listname.CHANGELOG (or listname CHANGELG for VM) into LISTSERV's A directory or A disk. CHANGELOG files are automatically available for list owners and site maintainers to GET and PUT (PUT normally being used to delete them) like any other file. It is not necessary to make catalog entries for CHANGELOG files.

The operations monitored are ADD, AUTODEL, BOUNCE, CHANGE, DELETE, POST, RESUBSCRIBE, SET, SIGNOFF, and SUBSCRIBE. All abbreviations and synonyms are translated to their "official" forms, i.e., SUB, JOIN, and SIGNON are all translated to SUBSCRIBE for the purposes of the changelog. This makes it easy to write scripts to come up with statistics for a given list--you don't have to take variations of the commands into account.

Sample changelog entries are:

19980324100330 ADD xxxxxxx@JPS.NET Lxxxx Pxxxxxxxx
19980329120049 AUTODEL xxxxxxxx@EISA.NET.AU
19980329131221 BOUNCE xxxxxxxx@NONEXIST.COM
19980331214433 CHANGE xxxx@MCS.COM txxx@MCS.NET
19980331214434 DELETE xxxxx@SINGNET.COM.SG
19980331232441 POST xxxxxxxx@M4.SPRYNET.COM Printer Drivers
19980401000400 RESUBSCRIBE xxxx@MAIL.MECHWART.MUMSZKI.HU Mxxxxx Zxxxxx
19980426113947 SET xxxxxx.xxxxxxx@WDC.COM REPRO
19980511082712 SIGNOFF xxxxxxxx@STARNET.NET.AR
19980511085642 SUBSCRIBE xxxxxxxx@LYCOSMAIL.COM Kxx Wxxxxxx
As you see, the SET entry tells you what options were set, and the POST entry tells you what the subject of the posting was. RESUBSCRIBE is a SUBSCRIBE operation that takes place when the user is already subscribed to the list, e.g., to change the real name field in the user's subscription. BOUNCE is a special operation that takes place when using the "no-list" bounce-processing mechanism (described in the Developer's Guide to LISTSERV). Otherwise these entries are fairly self-explanatory.

One caveat: CHANGELOG files can get fairly large. It may be necessary to monitor the size of the changelogs on your server and delete them as disk space fills up. If a list owner wants the changelog information for his list, he should be instructed that it is his responsibility to GET the changelog file regularly and delete it himself each time.

10.7. Using LISTSERV logs and SHOW CTR to extract server statistics

While LISTSERV does not provide a native method to display statistics, it is entirely possible to use scripts to post-process the LISTSERV console logs and changelogs to provide a wide range of statistics. Additionally, the native SHOW CTR command provides a breakdown of current and past LISTSERV traffic.

10.7.1. Sample log-processing scripts

There are two unsupported REXX scripts available from L-Soft which can be used to extract various statistics from the LISTSERV console log and from changelogs. See

ftp://ftp.lsoft.com/listserv/windows/contrib/cntpost.rexx
ftp://ftp.lsoft.com/listserv/windows/contrib/stats.rexx

Both of these scripts were written for Regina REXX and are (in their current incarnations) Windows-specific, but they could probably be ported to the unix version of Regina with a little work.

Be sure to read the internal documentation before attempting to use either of these scripts.

The first script is used to compile posting data from all lists on the server and issues a weekly report that looks like this:

LISTSERV posting statistics for LISTSERV.EXAMPLE.COM since 8 Feb 1999
------------------------------------------------------------------------------
                                Indiv.    Digests    Indexes    Total
List Name                       Postings  Generated  Generated  Recipients
=========                       ========  =========  =========  ==========
LIST1                                223          7          0       14574
LIST2                                  0          0          0           0
LIST3                                 12          7          7         825
------------------------------------------------------------------------------
Totals:                              235         14          7       15399

DISTRIBUTE and MAIL-MERGE jobs sent by individuals:

  Start Date/Time      End Time Rcpts    Job Name Invoker
= ==================== ======== ======== ======== =======
D  8 Feb 1999 14:07:08 14:07:09       29 DISTJOB1 USER@EXAMPLE.COM
M 12 Feb 1999 10:31:23 10:31:25    10334 MMDISTJO USER@EXAMPLE.COM
   >>> Full job name:  MMDISTJOB25
   * FROM=mmdistjob25-nolist@listserv.example.com

This report was generated by cntpost.rexx version 1.8-fix11c 1999/02/19

The second script is designed to be run against a listname.CHANGELOG file and produces a report similar to the old VM STATS command output (addresses have been changed to protect the innocent). There are two options--TOP (which produces posting information for only the top x number of posters--by default this is 20, the value can be raised or lowered by changing the variable setting in the code), and NOP (which suppresses the individual posting data altogether). If neither the TOP or NOP options are specified, individual posting data are produced for each and every address that posted to the list during the period represented by the changelog, which has the potential to produce very long reports. It is probably best to run this script with redirection to a file.

Sample output from the STATS.REXX script is shown below:

C:\rexx>rexx stats.rexx access-l top
Statistics for ACCESS-L from 08 Jan 1999 through 13 Jan 1999 (6 days)
Total lines processed: 421

                         Total units       Units/day
                         ===========       =========
ADD operations:                    0          0.0000
AUTODEL operations:                8          1.3333
BOUNCE operations:                 0          0.0000
CHANGE operations:                 4          0.6667
DELETE operations:                 3          0.5000
POST operations:                 261         43.5000
RESUBSCRIBE operations:            0          0.0000
SET operations (total):           39          6.5000
  ACK:                             0          0.0000
  NOACK:                           4          0.6667
  MSGACK:                          0          0.0000
  CONCEAL:                         1          0.1667
  NOCONCEAL:                       0          0.0000
  FILES:                           0          0.0000
  NOFILES:                         0          0.0000
  MAIL:                            5          0.8333
  NOMAIL:                         13          2.1667
  DIGESTS:                         7          1.1667
  NODIGESTS:                      10          1.6667
  INDEX:                           1          0.1667
  NOINDEX:                         0          0.0000
  REPRO:                           1          0.1667
  NOREPRO:                         2          0.3333
  MIME:                            1          0.1667
  NOMIME:                          0          0.0000
  HTML:                            2          0.3333
  NOHTML:                          2          0.3333
  TOPICS:                          0          0.0000
  FULLHDR:                         0          0.0000
  SHORTHDR:                        0          0.0000
  DUALHDR:                         0          0.0000
  IETFHDR:                         0          0.0000
  SUBJECTHDR:                      1          0.1667
  FULL822:                         0          0.0000
  SHORT822:                        0          0.0000
SIGNOFF operations:               31          5.1667
SUBSCRIBE operations:             75         12.5000

Ratio of SIGNOFF operations to SUBSCRIBE operations:  0.4133:1

                                                 Total
Top 20 posters                                   Units Units/day Units/mon(*)
================================================ ===== ========= =========
Gxxxxx.Wxxxxx@xxxxxxxxxxx.xx.xx                     19    3.1667    0.6333
dxxxxxx@xxx.xxx.xx                                  18    3.0000    0.6000
dxx.exxxxxx@xx.xxxxxxx.xx.xx                        11    1.8333    0.3667
fxxxxxxx@xx.xxx                                     11    1.8333    0.3667
mxxxxx@xxxxxxxxx.xxx                                 8    1.3333    0.2667
cxxxxxxx@xxxxxx.xxx                                  8    1.3333    0.2667
Hxxxxxxx@xxxxxx.xxx                                  7    1.1667    0.2333
mxx@xxxxxxxxxxxxxx.xxx                               7    1.1667    0.2333
dxxxxx.xxxxxxx@xxx-xxx.xx                            7    1.1667    0.2333
dxxxxxx@xxxxxxxxxxxx.xxx                             7    1.1667    0.2333
jxxxx@xxxxxxxxx.xxx                                  7    1.1667    0.2333
kxxxxxxxx@xxxxx.xxx                                  6    1.0000    0.2000
nxxxx_x@xxx.xxx                                      6    1.0000    0.2000
Pxxxxxx@xxxx.xxx                                     5    0.8333    0.1667
G.F.G.Wxxxxxxxx@xx.xxxxxxxx.xx                       4    0.6667    0.1333
Nxxxxxxx.Vxx@xxx.xxxxx.xx.xx                         4    0.6667    0.1333
axxxxxxx@xxxxxxxx.xxx.xxx                            4    0.6667    0.1333
kxxxxxx@xxxxxxx.xx.xx                                4    0.6667    0.1333
txxxx.x.x@xx.xxx                                     4    0.6667    0.1333
xxxxxx@xxxxxxx.xxx.xx                                3    0.5000    0.1000

----------
(*) Units per month is total units / 30 days.

Top 20 posters                                   Last posted
================================================ ===========
Gxxxxx.Wxxxxx@xxxxxxxxxxx.xx.xx                  13-Jan-1999
dxxxxxx@xxx.xxx.xx                               12-Jan-1999
dxx.exxxxxx@xx.xxxxxxx.xx.xx                     12-Jan-1999
fxxxxxxx@xx.xxx                                  13-Jan-1999
mxxxxx@xxxxxxxxx.xxx                             09-Jan-1999
cxxxxxxx@xxxxxx.xxx                              13-Jan-1999
Hxxxxxxx@xxxxxx.xxx                              13-Jan-1999
mxx@xxxxxxxxxxxxxx.xxx                           12-Jan-1999
dxxxxx.xxxxxxx@xxx-xxx.xx                        13-Jan-1999
dxxxxxx@xxxxxxxxxxxx.xxx                         13-Jan-1999
jxxxx@xxxxxxxxx.xxx                              13-Jan-1999
kxxxxxxxx@xxxxx.xxx                              12-Jan-1999
nxxxx_x@xxx.xxx                                  09-Jan-1999
Pxxxxxx@xxxx.xxx                                 11-Jan-1999
G.F.G.Wxxxxxxxx@xx.xxxxxxxx.xx                   13-Jan-1999
Nxxxxxxx.Vxx@xxx.xxxxx.xx.xx                     13-Jan-1999
axxxxxxx@xxxxxxxx.xxx.xxx                        10-Jan-1999
kxxxxxx@xxxxxxx.xx.xx                            13-Jan-1999
txxxx.x.x@xx.xxx                                 13-Jan-1999
xxxxxx@xxxxxxx.xxx.xx                            11-Jan-1999

This report was prepared by STATS.REXX 0.4 1998/08/21

Please note carefully that these scripts are not supported in any way by L-Soft, and your use of them is strictly at your own risk.

10.7.2. Interpreting the output of SHOW CTR

LISTSERV provides certain raw statistics in response to the command SHOW CTR yyyymm (where "yyyymm" is the year and month for which you are requesting statistics). For instance, SHOW CTR 199901 sent to LISTSERV@PEACH.EASE.LSOFT.COM produces the following:

>SHOW CTR 199901
199901 1 0 34769 28012983 4671 1444858 1939 13724 144131 115889 113714 21162
172559 124323 258387 0 73741 80953 178700227 731465 339375 114770 93409 END
EOD

Unfortunately this is fairly obscure (it was originally intended to be used only by LISTSERV to compile network-wide statistics) and requires a certain amount of interpretation. The fields signify, in order:

Month of report
Version number
Missing days
Postings to mailing lists
Number of recipients
Digests issued
Number of digest recipients
Indexes issued
Number of index recipients
DISTRIBUTE jobs processed
DISTRIBUTE jobs internally generated
Outbound DISTRIBUTE jobs
Outbound NJE files
Outbound files to MAILER
Outbound files to MAILER in non-BSMTP format
Number of recipients in the outbound files to MAILER
GLX requests
Bandwidth usage register #1
Bandwidth usage register #2
CPU usage in microseconds
Number of bounces received
Number of bounces received in non-standard format
Number of bounces detected by heuristics
Probes
END (tells LISTSERV that this is the end of the regular data)
EOD (tells LISTSERV that this is the end of the report)

The two bandwidth registers are used as follows:

Bandwidth used in MB = (first_register/10) + (second_register/10000000)

If you send a SHOW CTR command for the current month, LISTSERV inserts the following between the END and EOD markers:

XPOL
integer_value
integer_value

For instance, in the month this was written (199902), the output on 19 February at approximately 12:43 was

>SHOW CTR 199902
199902 1 0 22347 18983312 2939 932534 1200 10728 89783 71642 74311 13017
129368 97498 194743 0 47087 71848 107529422 386957 180617 23707 17063 END
XPOL 672 444 EOD

The XPOL numbers are used by L-Soft to extrapolate data for the current month and can generally be ignored.


11. Using the Web Adminstration Interface

LISTSERV 1.8d introduces a powerful web-based interface for the management of existing mailing lists. Virtually all list management operations can be accomplished via this interface, which is tied into LISTSERV's own password manager for security. Site managers have a special interface that can be used (among other things) to create lists--see 11.12 for details.

Please note carefully that this interface cannot be used to manage lists that are coded Validate= Yes,Confirm,NoPW or Validate= All,Confirm,NoPW , because passwords are not accepted for validation in those cases.

11.1. Default LISTSERV Home Page

Starting with LISTSERV 1.8d the interface includes a default home page for LISTSERV. Typically this is reached by using the URL:

On unix: http://yourhost.domain/cgi-bin/wa
On VMS: http://yourhost.domain/htbin/wa
On Windows: http://yourhost.domain/scripts/wa.exe
         or http://yourhost.domain/cgi-bin/wa.exe

Of course this is not standardized; the location of the 'wa' script is determined by the value of WWW_ARCHIVE_CGI in LISTSERV's site configuration file. In any case, invoking 'wa' without any parameters returns the default home page, which looks like this:

(NOTE: The links shown on these pages will not work from the manual. For a working demonstration site, see http://demo.lsoft.com or see the appropriate pages on your own site.)