RFC 1429

Listserv Distribute Protocol

๐Ÿ“… published February 1993, from ietf

RFC 1429: Listserv Distribute Protocol ๐Ÿ’Œ

Hiii bestie ๐Ÿ’– okay so this is RFC 1429, all about the Listserv Distribute Protocol. It's from the Network Working Group (the crew that writes the Internet's protocol docs ๐Ÿงš) and it's a Request for Comments by E. Thomas of the Swedish University Network, dated February 1993.

It's Informational, because it literally says it "provides information for the Internet community" and does not specify an Internet standard. The title block doesn't list anything it obsoletes or updates, so no drama there ๐Ÿ™ˆ

Status of this Memo ๐ŸŽ€

Vibe check: this memo is here to provide information for the Internet community. It does not specify an Internet standard. Distribution is unlimited, so share it with everyone ๐Ÿฆ‹

Abstract ๐ŸŒธ

This memo specifies a subset of the distribution protocol that the BITNET LISTSERV uses to deliver mail to huge crowds of recipients ๐Ÿซถ. The protocol is called DISTRIBUTE and it's giving efficiency: it sends a single copy of the message over heavily loaded links, using whatever topological info is available to guide those choices, and it cuts the average turnaround for large mailing lists to 5-15 minutes on the average. This memo also describes a simple interface so non-BITNET mailing list exploders (or other bulk-delivery scripts) can use this service and let the BITNET distribution network handle the delivery ๐Ÿ’…

Introduction ๐Ÿงš

Running a mailing list with 1,000 subscribers or more on plain "sendmail" while keeping turnaround time reasonable is NOT an easy task ๐Ÿ˜ญ. Due mostly to limited bandwidth in the mid-80's, BITNET built an efficient bulk delivery protocol for its mailing lists. It was introduced in 1986, got refined little by little, and now it carries 2-6 million mail messages a day. Literally iconic. This distribution mechanism is a general-purpose delivery service, so any user of BITNET or the Internet can use it. The simple fix for the "sendmail" turnaround problem? Wrap your message and recipient list in a DISTRIBUTE envelope and hand it to a BITNET server for delivery. This may not be the best possible solution, bestie, but it's easy to implement ๐Ÿ’–

In this doc, "production" means the normal operation of the mailing list (or bulk delivery app) you want to pipe through DISTRIBUTE. So the "production" options are the ones you SHOULD specify once everything is tested and you're confident the setup works to your satisfaction โœจ. The "test" and "debug" options are for playing around with the protocol, but they SHOULD NOT be used for normal operation, because they cost extra bandwidth and CPU time to generate the various informational reports ๐Ÿ™ˆ

Last but not least, it's lowkey worth noting that DISTRIBUTE was built to tackle a bunch of issues, some of which only matter for BITNET, and it has evolved since 1986 while keeping a compatible syntax. For the sake of brevity, this RFC only covers a small subset of the available options and syntax, so the syntax may appear unnecessarily complicated or even illogical. Not your fault, bestie ๐Ÿซถ


1. Selecting an entry point into the DISTRIBUTE backbone ๐ŸŽ€

Step one: find a suitable site to submit your distributions to. For testing, and for testing ONLY, you can use:

LISTSERV@SEARN.SUNET.SE

For production use, however, you SHOULD select a DISTRIBUTE site in your topological vicinity ๐Ÿ—บ๏ธ. It would make no sense to send your distributions from California to a server in Sweden if most of your recipients are in the US ๐Ÿ’€. If your organization is connected to BITNET and your BITNET system is part of the DISTRIBUTE backbone, this ought to be your best bet. Otherwise, you'll want to contact someone who really knows BITNET (or the author of this RFC if you have no BITNET users). Make sure to run through the following checklist before sending any production traffic to the site in question:

a. Do you have good connectivity to the host in question? Does the host, in general, have decent BITNET connectivity? There are still a few sites that insist on using 9.6k leased lines for BITNET even though they have T1 IP access. You'll want to avoid them ๐Ÿ™…

b. Send mail to the server with "show version" in the message body (not in the subject field, which gets ignored). Is the server running version 1.7f or higher? If so, it SHOULD NOT have given you the following warning:

>>> This server is configured to use PUNCH format for mail <<<

That warning means messages with lines longer than 80 characters cannot be handled properly. If the software version is below 1.7f, the warning won't show up. Instead, check the first (bottom) "Received:" field. If it doesn't say "LMail", don't use this server, since it probably can't handle messages with long lines ๐Ÿ™ˆ

Finally, make sure that the "Master nodes file" isn't older than 2 months. There are a handful of sites that never update their tables because of staffing problems. They can't be prevented from running LISTSERV, but you'll definitely want to avoid them ๐Ÿ’…

c. How big is your workload? If you're planning to use the service for more than 10,000 daily recipients, you SHOULD get permission from the LISTSERV administrator ๐Ÿ™‹, both as a matter of courtesy and to hear about any restrictions or regularly scheduled downtime they might have. For instance, some universities might not allow large distributions during prime time, or they may have several DISTRIBUTE machines and will want to make sure you use the "right" one. Send mail to "owner-listserv" at the host in question and give an estimate of how many daily messages and recipients you'd like to submit. If your message bounces back with "No such local user" or something like it, the server didn't pass test (b) above, and you don't want to use it anyway ๐Ÿ™ƒ

An index of sites/hosts that have the REQUIRED configuration and good connectivity, keep their tables up to date, and have generally agreed to provide this service to anyone in their topological area will be published separately in the future ๐Ÿ“šโœจ


2. Physical delivery of the DISTRIBUTE request ๐Ÿ“ฎ

The request gets delivered via SMTP to the e-mail address from step 1 (for instance, LISTSERV@SEARN.SUNET.SE). Honestly, as long as you can somehow get mail to the server's host, you can use the service. SMTP is just the most convenient way to do it ๐Ÿ’Œ

2.1. Contents of MAIL FROM: field ๐Ÿ’…

You SHOULD set the MAIL FROM: field to the address of the person who maintains your mailing list or, generally speaking, to the address of a human who can take action if the message fails to reach the DISTRIBUTE server's host. Thankfully this is super rare ๐Ÿซถ

2.2. Contents of RCPT TO: field ๐ŸŽฏ

The RCPT TO: field points to the server's address (for instance, LISTSERV@SEARN.SUNET.SE).

2.3. Contents of the RFC822 header ๐Ÿงพ

After the DATA instruction, you MUST supply a valid RFC822 header with a "From:" field pointing to the mailbox that SHOULD receive notifications of delivery problems, bounced mail, and so on. That can be the same as the MAIL FROM: field, or an address like owner-xxxx@yourhost, etc. DO NOT PUT THE LIST SUBMISSION ADDRESS THERE, or you'll get mailing loops ๐Ÿ”

For testing, the "From:" field SHOULD point to your own mailbox, so that you get the responses from the server ๐Ÿ“ฌ

As long as RFC822 syntax is respected, the only field that matters is the "From:" field (or "Sender:", "Resent-From:", etc.). In practice, this means you can just pipe the distribution request into mail listserv@whatever and let your mail program build all the headers ๐Ÿงš


3. Format of the DISTRIBUTE request ๐ŸŒˆ

The body of the message delivered to LISTSERV defines the recipients of the distribution and the text (header + body) of the RFC822 message you want delivered. The request starts with a "job card," followed by a DISTRIBUTE command, a list of recipients, and finally the message header and body ๐Ÿ’œ

3.1. Syntax of the JOB card ๐Ÿชช

The whole point of the JOB card is to make sure any spurious text inserted by mail gateways or the like gets flushed and isn't accidentally interpreted as a command. It can optionally be used to attach a "job name" to the request, in case you want tools to help you process the notifications you get from DISTRIBUTE servers when running in test mode. The syntax goes like this:

//jobname JOB ECHO=NO

jobname can be anything as long as it has no blanks, and it can be omitted. LISTSERV generally ignores case when parsing commands, so job or Job are both fine if you prefer ๐Ÿ’–. The ECHO=NO keyword is REQUIRED for production use, to suppress the "resource usage summary" you'd otherwise get when your delivery finishes. You MAY want to omit it when testing โœจ

3.2. Syntax of the DISTRIBUTE command โšก

Below the JOB card, you MUST supply this line:

DISTRIBUTE MAIL

For production mode, don't specify anything else on that line. When testing, you SHOULD add ACK=MAIL to get an acknowledgement confirming the delivery. There are two other useful options. DEBUG=YES tells the server to produce a report showing how the various recipients will be routed, without actually delivering the message. TRACE=YES does the same thing but does deliver the message. Before making a "live" test with your actual recipients list, you SHOULD slap DEBUG=YES on once to make sure you got all the parameters and syntax right, and to get a rough idea of the efficiency of the distribution (see the section on performance) ๐Ÿ”

3.3. Giving the list of recipients ๐Ÿ“

The list of recipients follows the DISTRIBUTE line and is specified like this:

//To DD *
user1@host1 BSMTP
user2@host2 BSMTP
/*

The two lines starting with a / have to be copied as-is. Each line in between holds one recipient's address, followed by a blank and the word "BSMTP", which tells the server you don't want the header rewritten. There are four restrictions ๐Ÿšง

a. The address MUST be a plain local-part@hostname: no name string, no angle brackets, no source route, etc. Bear in mind that the DISTRIBUTE server is not in the same domain as you, so all the addresses SHOULD be fully qualified ๐ŸŒ

b. If the local-part is quoted, it MUST be quoted from the first word on. Technically, RFC822 allows: Joe."Now@Home".Smith@xyz.edu, but for performance reasons this form isn't supported. Just quote the first word to tell LISTSERV to run the address through the full parser. You'd write "Joe"."Now@Home".Smith@xyz.edu instead ๐Ÿ™Œ

c. The local-part of the address may not start with an (unquoted) asterisk. You can get around this restriction by quoting the local part and using a %-hack through the server's host: "***JACK***%jack-ws.xyz.edu"@server-host.

d. Blanks are not allowed anywhere in the address ๐Ÿšซ

You can use the pseudo-domain .BITNET for BITNET recipients. It's always supported within DISTRIBUTE requests ๐Ÿ’œ

3.4. Specifying the message text โœจ

Okay so, after your last recipient and that closing /*, you're gonna add this line ๐Ÿ’…

//Data DD *,EOF

Then drop in the RFC822 message (header + body) you want delivered ๐Ÿ’Œ The EOF option is giving "keep going until the very end" energy. It means the header and body run all the way to the end of the message you're sending to the DISTRIBUTE server ๐Ÿซถ

Now, if you're lowkey worried about extra data getting tacked on by a gateway ๐Ÿ‘€, you can remove the EOF option, add a closing /* line after the end of the message, and finish with a // EOJ card to flush out any leftover text โœจ

Heads up, this one is a little sus ๐Ÿ™ˆ It'll fail if the message itself has a /* line in it. To fix that, you'd have to insert a space before any such line.

4. Examples ๐ŸŽ€

Here's an (intentionally short) example to make the syntax click ๐Ÿงš

----- cut here -----
//Test JOB
Distribute mail Ack=mail Debug=yes
//To DD *
joe@ws-4.xyz.edu BSMTP
jack@abc.com BSMTP
jim@tamvm1.bitnet BSMTP
jill@alpha.cc.buffalo.edu BSMTP
james@library.rice.edu BSMTP
/*
//Data DD *,EOF
Date:         Tue, 19 Jan 1993 10:57:29 -0500
From:         Robert H. Smith <RHS@eta.abc.com>
Subject:      Re: Problem with V5.41
To:           somelist@some.host.edu

I agree with Jack, V5.41 is not a stable release. I had to fall back
to V5.40 within 5 minutes of installation...

                                        Bob Smith
----- cut here -----

Note: some of the hostnames are genuine, but the usernames are all fictitious ๐ŸŒธ

You'd get this reply:

--------------------------------------------------------------------
Job "Test" started on 20 Feb 1993 01:09:40

> Distribute mail ack=mail debug=yes
Debug trace information:

ABC.COM                   goes to SEARN    (213) - single recipient
ALPHA.CC.BUFFALO.EDU      goes to UBVM     (027) - single recipient
LIBRARY.RICE.EDU          goes to RICEVM1  (022) - single recipient
TAMVM1                    goes to TAIVM1   (247) - single recipient
WS-4.XYZ.EDU              goes to SEARN    (213) - single recipient

Path information:

 TAIVM1  : UGA      RICEVM1  TAIVM1
 UBVM    : UGA      UBVM
 RICEVM1 : UGA      RICEVM1

(Debug) Mail forwarded to LISTSERV@UGA      for   3 recipients.
(Debug) Mail posted via BSMTP to jack@ABC.COM.
(Debug) Mail posted via BSMTP to joe@WS-4.XYZ.EDU.

Job "Test" ended   on 20 Feb 1993 01:09:40

Summary of resource utilization
-------------------------------
 CPU time:        0.086 sec                Device I/O:     6
 Overhead CPU:    0.045 sec                Paging I/O:     5
 CPU model:        9221                    DASD model:  3380
--------------------------------------------------------------------

To actually perform the distribution and get an acknowledgement, you'd change the first two lines like so ๐Ÿ’–

----- cut here -----
//Test JOB Echo=NO
Distribute mail Ack=mail
--------------------

And you'd get this reply ๐Ÿฆ‹

--------------------------------------------------------------------
Mail forwarded to LISTSERV@UGA      for   3 recipients.
Mail posted via BSMTP to jack@ABC.COM.
Mail posted via BSMTP to joe@WS-4.XYZ.EDU.
--------------------------------------------------------------------

Finally, if you drop the Ack=mail keyword, you'd get a "silent" distribution with no acknowledgement, which is the move for production mode ๐Ÿ‘‘


5. Performance โฐ

Okay, so the efficiency of the distribution mostly comes down to how good and accurate the topological information the DISTRIBUTE server has is (and in some extreme cases, system load too ๐Ÿ’€). For BITNET recipients, the typical turnaround time for reasonably well connected systems is 5-15 minutes. Internet recipients fall into two categories: those that can be routed to a machine within or close to the recipient's organization (average turnaround time 5-20 minutes ๐Ÿฆ‹), and those where no topological information is available at all. For that second group, delivery can take way longer, but it usually still beats a vanilla sendmail setup ๐Ÿš€

Right now, topological info exists for most top-level domains outside the US and for lots of sub-domains of EDU and GOV ๐ŸŒˆ

You can measure the efficiency using the DEBUG=YES option, as explained above ๐Ÿ” Recipients that get forwarded to another server usually get delivered within 5-20 minutes (except to poorly connected sites or countries, where not much can be done ๐Ÿ˜ญ). Recipients handled locally get passed to a local SMTP agent, and its efficiency depends a lot on how many "burst" queries the local name server can handle in quick succession ๐Ÿ“

A number of projects are currently underway to investigate the feasibility of improving the quality of the topological information available to the DISTRIBUTE servers for the Internet ๐Ÿซถโœจ


Security Considerations ๐Ÿ™ˆ

Okay real talk, this memo doesn't discuss security issues at all, so there's no security content in here ๐Ÿ™ˆ


Author's Address ๐Ÿ’Œ

Eric Thomas Swedish University Network Dr.Kristinas vaeg 37B 100 44 Stockholm, Sweden

E-mail: ERIC@SEARN.SUNET.SE

๐Ÿ“ฆ where this page comes from