|
|
1.1 ! root 1: .\" ! 2: .\" Copyright (c) 1983 Eric P. Allman ! 3: .\" Copyright (c) 1988 The Regents of the University of California. ! 4: .\" All rights reserved. ! 5: .\" ! 6: .\" Redistribution and use in source and binary forms are permitted ! 7: .\" provided that the above copyright notice and this paragraph are ! 8: .\" duplicated in all such forms and that any documentation, ! 9: .\" advertising materials, and other materials related to such ! 10: .\" distribution and use acknowledge that the software was developed ! 11: .\" by the University of California, Berkeley. The name of the ! 12: .\" University may not be used to endorse or promote products derived ! 13: .\" from this software without specific prior written permission. ! 14: .\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 15: .\" IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 16: .\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 17: .\" ! 18: .\" @(#)intro.me 6.4 (Berkeley) 4/23/90 ! 19: .\" ! 20: .\" pic -Pxx intro.me | ditroff -me -Pxx ! 21: .eh 'SMM:16-%''SENDMAIL \*- An Internetwork Mail Router' ! 22: .oh 'SENDMAIL \*- An Internetwork Mail Router''SMM:16-%' ! 23: .nr si 3n ! 24: .if n .ls 2 ! 25: .+c ! 26: .(l C ! 27: .sz 14 ! 28: SENDMAIL \*- An Internetwork Mail Router ! 29: .sz ! 30: .sp ! 31: Eric Allman\(dg ! 32: .sp 0.5 ! 33: .i ! 34: University of California, Berkeley ! 35: Mammoth Project ! 36: .)l ! 37: .sp ! 38: .(l F ! 39: .ce ! 40: ABSTRACT ! 41: .sp \n(psu ! 42: Routing mail through a heterogenous internet presents many new ! 43: problems. Among the worst of these is that of address mapping. ! 44: Historically, this has been handled on an ! 45: .i "ad hoc" ! 46: basis. However, ! 47: this approach has become unmanageable as internets grow. ! 48: .sp \n(psu ! 49: Sendmail acts a unified "post office" to which all mail can be ! 50: submitted. Address interpretation is controlled by a production ! 51: system, which can parse both domain-based addressing and old-style ! 52: .i "ad hoc" ! 53: addresses. ! 54: The production system is powerful ! 55: enough to rewrite addresses in the message header to conform to the ! 56: standards of a number of common target networks, including old ! 57: (NCP/RFC733) Arpanet, new (TCP/RFC822) Arpanet, UUCP, and Phonenet. ! 58: Sendmail also implements an SMTP server, message ! 59: queueing, and aliasing. ! 60: .)l ! 61: .sp 2 ! 62: .(f ! 63: \(dgA considerable part of this work ! 64: was done while under the employ ! 65: of the INGRES Project ! 66: at the University of California at Berkeley ! 67: and at Britton Lee. ! 68: .)f ! 69: .pp ! 70: .i Sendmail ! 71: implements a general internetwork mail routing facility, ! 72: featuring aliasing and forwarding, ! 73: automatic routing to network gateways, ! 74: and flexible configuration. ! 75: .pp ! 76: In a simple network, ! 77: each node has an address, ! 78: and resources can be identified ! 79: with a host-resource pair; ! 80: in particular, ! 81: the mail system can refer to users ! 82: using a host-username pair. ! 83: Host names and numbers have to be administered by a central authority, ! 84: but usernames can be assigned locally to each host. ! 85: .pp ! 86: In an internet, ! 87: multiple networks with different characterstics ! 88: and managements ! 89: must communicate. ! 90: In particular, ! 91: the syntax and semantics of resource identification change. ! 92: Certain special cases can be handled trivially ! 93: by ! 94: .i "ad hoc" ! 95: techniques, ! 96: such as ! 97: providing network names that appear local to hosts ! 98: on other networks, ! 99: as with the Ethernet at Xerox PARC. ! 100: However, the general case is extremely complex. ! 101: For example, ! 102: some networks require point-to-point routing, ! 103: which simplifies the database update problem ! 104: since only adjacent hosts must be entered ! 105: into the system tables, ! 106: while others use end-to-end addressing. ! 107: Some networks use a left-associative syntax ! 108: and others use a right-associative syntax, ! 109: causing ambiguity in mixed addresses. ! 110: .pp ! 111: Internet standards seek to eliminate these problems. ! 112: Initially, these proposed expanding the address pairs ! 113: to address triples, ! 114: consisting of ! 115: {network, host, resource} ! 116: triples. ! 117: Network numbers must be universally agreed upon, ! 118: and hosts can be assigned locally ! 119: on each network. ! 120: The user-level presentation was quickly expanded ! 121: to address domains, ! 122: comprised of a local resource identification ! 123: and a hierarchical domain specification ! 124: with a common static root. ! 125: The domain technique ! 126: separates the issue of physical versus logical addressing. ! 127: For example, ! 128: an address of the form ! 129: .q "[email protected]" ! 130: describes only the logical ! 131: organization of the address space. ! 132: .pp ! 133: .i Sendmail ! 134: is intended to help bridge the gap ! 135: between the totally ! 136: .i "ad hoc" ! 137: world ! 138: of networks that know nothing of each other ! 139: and the clean, tightly-coupled world ! 140: of unique network numbers. ! 141: It can accept old arbitrary address syntaxes, ! 142: resolving ambiguities using heuristics ! 143: specified by the system administrator, ! 144: as well as domain-based addressing. ! 145: It helps guide the conversion of message formats ! 146: between disparate networks. ! 147: In short, ! 148: .i sendmail ! 149: is designed to assist a graceful transition ! 150: to consistent internetwork addressing schemes. ! 151: .sp ! 152: .pp ! 153: Section 1 discusses the design goals for ! 154: .i sendmail . ! 155: Section 2 gives an overview of the basic functions of the system. ! 156: In section 3, ! 157: details of usage are discussed. ! 158: Section 4 compares ! 159: .i sendmail ! 160: to other internet mail routers, ! 161: and an evaluation of ! 162: .i sendmail ! 163: is given in section 5, ! 164: including future plans. ! 165: .sh 1 "DESIGN GOALS" ! 166: .pp ! 167: Design goals for ! 168: .i sendmail ! 169: include: ! 170: .np ! 171: Compatibility with the existing mail programs, ! 172: including Bell version 6 mail, ! 173: Bell version 7 mail ! 174: [UNIX83], ! 175: Berkeley ! 176: .i Mail ! 177: [Shoens79], ! 178: BerkNet mail ! 179: [Schmidt79], ! 180: and hopefully UUCP mail ! 181: [Nowitz78a, Nowitz78b]. ! 182: ARPANET mail ! 183: [Crocker77a, Postel77] ! 184: was also required. ! 185: .np ! 186: Reliability, in the sense of guaranteeing ! 187: that every message is correctly delivered ! 188: or at least brought to the attention of a human ! 189: for correct disposal; ! 190: no message should ever be completely lost. ! 191: This goal was considered essential ! 192: because of the emphasis on mail in our environment. ! 193: It has turned out to be one of the hardest goals to satisfy, ! 194: especially in the face of the many anomalous message formats ! 195: produced by various ARPANET sites. ! 196: For example, ! 197: certain sites generate improperly formated addresses, ! 198: occasionally ! 199: causing error-message loops. ! 200: Some hosts use blanks in names, ! 201: causing problems with ! 202: UNIX mail programs that assume that an address ! 203: is one word. ! 204: The semantics of some fields ! 205: are interpreted slightly differently ! 206: by different sites. ! 207: In summary, ! 208: the obscure features of the ARPANET mail protocol ! 209: really ! 210: .i are ! 211: used and ! 212: are difficult to support, ! 213: but must be supported. ! 214: .np ! 215: Existing software to do actual delivery ! 216: should be used whenever possible. ! 217: This goal derives as much from political and practical considerations ! 218: as technical. ! 219: .np ! 220: Easy expansion to ! 221: fairly complex environments, ! 222: including multiple ! 223: connections to a single network type ! 224: (such as with multiple UUCP or Ether nets ! 225: [Metcalfe76]). ! 226: This goal requires consideration of the contents of an address ! 227: as well as its syntax ! 228: in order to determine which gateway to use. ! 229: For example, ! 230: the ARPANET is bringing up the ! 231: TCP protocol to replace the old NCP protocol. ! 232: No host at Berkeley runs both TCP and NCP, ! 233: so it is necessary to look at the ARPANET host name ! 234: to determine whether to route mail to an NCP gateway ! 235: or a TCP gateway. ! 236: .np ! 237: Configuration should not be compiled into the code. ! 238: A single compiled program should be able to run as is at any site ! 239: (barring such basic changes as the CPU type or the operating system). ! 240: We have found this seemingly unimportant goal ! 241: to be critical in real life. ! 242: Besides the simple problems that occur when any program gets recompiled ! 243: in a different environment, ! 244: many sites like to ! 245: .q fiddle ! 246: with anything that they will be recompiling anyway. ! 247: .np ! 248: .i Sendmail ! 249: must be able to let various groups maintain their own mailing lists, ! 250: and let individuals specify their own forwarding, ! 251: without modifying the system alias file. ! 252: .np ! 253: Each user should be able to specify which mailer to execute ! 254: to process mail being delivered for him. ! 255: This feature allows users who are using specialized mailers ! 256: that use a different format to build their environment ! 257: without changing the system, ! 258: and facilitates specialized functions ! 259: (such as returning an ! 260: .q "I am on vacation" ! 261: message). ! 262: .np ! 263: Network traffic should be minimized ! 264: by batching addresses to a single host where possible, ! 265: without assistance from the user. ! 266: .pp ! 267: These goals motivated the architecture illustrated in figure 1. ! 268: .(z ! 269: .hl ! 270: .ie t \ ! 271: \{\ ! 272: .ie !"\*(.T"" \ ! 273: \{\ ! 274: .PS ! 275: boxht = 0.5i ! 276: boxwid = 1.0i ! 277: ! 278: down ! 279: S: [ ! 280: right ! 281: S1: box "sender1" ! 282: move ! 283: box "sender2" ! 284: move ! 285: S3: box "sender3" ! 286: ] ! 287: arrow ! 288: SM: box "sendmail" wid 2i ht boxht ! 289: arrow ! 290: M: [ ! 291: right ! 292: M1: box "mailer1" ! 293: move ! 294: box "mailer2" ! 295: move ! 296: M3: box "mailer3" ! 297: ] ! 298: ! 299: arrow from S.S1.s to 1/2 between SM.nw and SM.n ! 300: arrow from S.S3.s to 1/2 between SM.n and SM.ne ! 301: ! 302: arrow from 1/2 between SM.sw and SM.s to M.M1.n ! 303: arrow from 1/2 between SM.s and SM.se to M.M3.n ! 304: .PE ! 305: .\} ! 306: .el \ ! 307: . sp 18 ! 308: .\} ! 309: .el \{\ ! 310: .(c ! 311: +---------+ +---------+ +---------+ ! 312: | sender1 | | sender2 | | sender3 | ! 313: +---------+ +---------+ +---------+ ! 314: | | | ! 315: +----------+ + +----------+ ! 316: | | | ! 317: v v v ! 318: +-------------+ ! 319: | sendmail | ! 320: +-------------+ ! 321: | | | ! 322: +----------+ + +----------+ ! 323: | | | ! 324: v v v ! 325: +---------+ +---------+ +---------+ ! 326: | mailer1 | | mailer2 | | mailer3 | ! 327: +---------+ +---------+ +---------+ ! 328: .)c ! 329: .\} ! 330: ! 331: .ce ! 332: Figure 1 \*- Sendmail System Structure. ! 333: .hl ! 334: .)z ! 335: The user interacts with a mail generating and sending program. ! 336: When the mail is created, ! 337: the generator calls ! 338: .i sendmail , ! 339: which routes the message to the correct mailer(s). ! 340: Since some of the senders may be network servers ! 341: and some of the mailers may be network clients, ! 342: .i sendmail ! 343: may be used as an internet mail gateway. ! 344: .sh 1 "OVERVIEW" ! 345: .sh 2 "System Organization" ! 346: .pp ! 347: .i Sendmail ! 348: neither interfaces with the user ! 349: nor does actual mail delivery. ! 350: Rather, ! 351: it collects a message ! 352: generated by a user interface program (UIP) ! 353: such as Berkeley ! 354: .i Mail , ! 355: MS ! 356: [Crocker77b], ! 357: or MH ! 358: [Borden79], ! 359: edits the message as required by the destination network, ! 360: and calls appropriate mailers ! 361: to do mail delivery or queueing for network transmission\**. ! 362: .(f ! 363: \**except when mailing to a file, ! 364: when ! 365: .i sendmail ! 366: does the delivery directly. ! 367: .)f ! 368: This discipline allows the insertion of new mailers ! 369: at minimum cost. ! 370: In this sense ! 371: .i sendmail ! 372: resembles the Message Processing Module (MPM) ! 373: of [Postel79b]. ! 374: .sh 2 "Interfaces to the Outside World" ! 375: .pp ! 376: There are three ways ! 377: .i sendmail ! 378: can communicate with the outside world, ! 379: both in receiving and in sending mail. ! 380: These are using the conventional UNIX ! 381: argument vector/return status, ! 382: speaking SMTP over a pair of UNIX pipes, ! 383: and speaking SMTP over an interprocess(or) channel. ! 384: .sh 3 "Argument vector/exit status" ! 385: .pp ! 386: This technique is the standard UNIX method ! 387: for communicating with the process. ! 388: A list of recipients is sent in the argument vector, ! 389: and the message body is sent on the standard input. ! 390: Anything that the mailer prints ! 391: is simply collected and sent back to the sender ! 392: if there were any problems. ! 393: The exit status from the mailer is collected ! 394: after the message is sent, ! 395: and a diagnostic is printed if appropriate. ! 396: .sh 3 "SMTP over pipes" ! 397: .pp ! 398: The SMTP protocol ! 399: [Postel82] ! 400: can be used to run an interactive lock-step interface ! 401: with the mailer. ! 402: A subprocess is still created, ! 403: but no recipient addresses are passed to the mailer ! 404: via the argument list. ! 405: Instead, they are passed one at a time ! 406: in commands sent to the processes standard input. ! 407: Anything appearing on the standard output ! 408: must be a reply code ! 409: in a special format. ! 410: .sh 3 "SMTP over an IPC connection" ! 411: .pp ! 412: This technique is similar to the previous technique, ! 413: except that it uses a 4.2bsd IPC channel ! 414: [UNIX83]. ! 415: This method is exceptionally flexible ! 416: in that the mailer need not reside ! 417: on the same machine. ! 418: It is normally used to connect to a sendmail process ! 419: on another machine. ! 420: .sh 2 "Operational Description" ! 421: .pp ! 422: When a sender wants to send a message, ! 423: it issues a request to ! 424: .i sendmail ! 425: using one of the three methods described above. ! 426: .i Sendmail ! 427: operates in two distinct phases. ! 428: In the first phase, ! 429: it collects and stores the message. ! 430: In the second phase, ! 431: message delivery occurs. ! 432: If there were errors during processing ! 433: during the second phase, ! 434: .i sendmail ! 435: creates and returns a new message describing the error ! 436: and/or returns an status code ! 437: telling what went wrong. ! 438: .sh 3 "Argument processing and address parsing" ! 439: .pp ! 440: If ! 441: .i sendmail ! 442: is called using one of the two subprocess techniques, ! 443: the arguments ! 444: are first scanned ! 445: and option specifications are processed. ! 446: Recipient addresses are then collected, ! 447: either from the command line ! 448: or from the SMTP ! 449: RCPT command, ! 450: and a list of recipients is created. ! 451: Aliases are expanded at this step, ! 452: including mailing lists. ! 453: As much validation as possible of the addresses ! 454: is done at this step: ! 455: syntax is checked, and local addresses are verified, ! 456: but detailed checking of host names and addresses ! 457: is deferred until delivery. ! 458: Forwarding is also performed ! 459: as the local addresses are verified. ! 460: .pp ! 461: .i Sendmail ! 462: appends each address ! 463: to the recipient list after parsing. ! 464: When a name is aliased or forwarded, ! 465: the old name is retained in the list, ! 466: and a flag is set that tells the delivery phase ! 467: to ignore this recipient. ! 468: This list is kept free from duplicates, ! 469: preventing alias loops ! 470: and duplicate messages deliverd to the same recipient, ! 471: as might occur if a person is in two groups. ! 472: .sh 3 "Message collection" ! 473: .pp ! 474: .i Sendmail ! 475: then collects the message. ! 476: The message should have a header at the beginning. ! 477: No formatting requirements are imposed on the message ! 478: except that they must be lines of text ! 479: (i.e., binary data is not allowed). ! 480: The header is parsed and stored in memory, ! 481: and the body of the message is saved ! 482: in a temporary file. ! 483: .pp ! 484: To simplify the program interface, ! 485: the message is collected even if no addresses were valid. ! 486: The message will be returned with an error. ! 487: .sh 3 "Message delivery" ! 488: .pp ! 489: For each unique mailer and host in the recipient list, ! 490: .i sendmail ! 491: calls the appropriate mailer. ! 492: Each mailer invocation sends to all users receiving the message on one host. ! 493: Mailers that only accept one recipient at a time ! 494: are handled properly. ! 495: .pp ! 496: The message is sent to the mailer ! 497: using one of the same three interfaces ! 498: used to submit a message to sendmail. ! 499: Each copy of the message is ! 500: prepended by a customized header. ! 501: The mailer status code is caught and checked, ! 502: and a suitable error message given as appropriate. ! 503: The exit code must conform to a system standard ! 504: or a generic message ! 505: (\c ! 506: .q "Service unavailable" ) ! 507: is given. ! 508: .sh 3 "Queueing for retransmission" ! 509: .pp ! 510: If the mailer returned an status that ! 511: indicated that it might be able to handle the mail later, ! 512: .i sendmail ! 513: will queue the mail and try again later. ! 514: .sh 3 "Return to sender" ! 515: .pp ! 516: If errors occur during processing, ! 517: .i sendmail ! 518: returns the message to the sender for retransmission. ! 519: The letter can be mailed back ! 520: or written in the file ! 521: .q dead.letter ! 522: in the sender's home directory\**. ! 523: .(f ! 524: \**Obviously, if the site giving the error is not the originating ! 525: site, the only reasonable option is to mail back to the sender. ! 526: Also, there are many more error disposition options, ! 527: but they only effect the error message \*- the ! 528: .q "return to sender" ! 529: function is always handled in one of these two ways. ! 530: .)f ! 531: .sh 2 "Message Header Editing" ! 532: .pp ! 533: Certain editing of the message header ! 534: occurs automatically. ! 535: Header lines can be inserted ! 536: under control of the configuration file. ! 537: Some lines can be merged; ! 538: for example, ! 539: a ! 540: .q From: ! 541: line and a ! 542: .q Full-name: ! 543: line can be merged under certain circumstances. ! 544: .sh 2 "Configuration File" ! 545: .pp ! 546: Almost all configuration information is read at runtime ! 547: from an ASCII file, ! 548: encoding ! 549: macro definitions ! 550: (defining the value of macros used internally), ! 551: header declarations ! 552: (telling sendmail the format of header lines that it will process specially, ! 553: i.e., lines that it will add or reformat), ! 554: mailer definitions ! 555: (giving information such as the location and characteristics ! 556: of each mailer), ! 557: and address rewriting rules ! 558: (a limited production system to rewrite addresses ! 559: which is used to parse and rewrite the addresses). ! 560: .pp ! 561: To improve performance when reading the configuration file, ! 562: a memory image can be provided. ! 563: This provides a ! 564: .q compiled ! 565: form of the configuration file. ! 566: .sh 1 "USAGE AND IMPLEMENTATION" ! 567: .sh 2 "Arguments" ! 568: .pp ! 569: Arguments may be flags and addresses. ! 570: Flags set various processing options. ! 571: Following flag arguments, ! 572: address arguments may be given, ! 573: unless we are running in SMTP mode. ! 574: Addresses follow the syntax in RFC822 ! 575: [Crocker82] ! 576: for ARPANET ! 577: address formats. ! 578: In brief, the format is: ! 579: .np ! 580: Anything in parentheses is thrown away ! 581: (as a comment). ! 582: .np ! 583: Anything in angle brackets (\c ! 584: .q "<\|>" ) ! 585: is preferred ! 586: over anything else. ! 587: This rule implements the ARPANET standard that addresses of the form ! 588: .(b ! 589: user name <machine-address> ! 590: .)b ! 591: will send to the electronic ! 592: .q machine-address ! 593: rather than the human ! 594: .q "user name." ! 595: .np ! 596: Double quotes ! 597: (\ "\ ) ! 598: quote phrases; ! 599: backslashes quote characters. ! 600: Backslashes are more powerful ! 601: in that they will cause otherwise equivalent phrases ! 602: to compare differently \*- for example, ! 603: .i user ! 604: and ! 605: .i ! 606: "user" ! 607: .r ! 608: are equivalent, ! 609: but ! 610: .i \euser ! 611: is different from either of them. ! 612: .pp ! 613: Parentheses, angle brackets, and double quotes ! 614: must be properly balanced and nested. ! 615: The rewriting rules control remaining parsing\**. ! 616: .(f ! 617: \**Disclaimer: Some special processing is done ! 618: after rewriting local names; see below. ! 619: .)f ! 620: .sh 2 "Mail to Files and Programs" ! 621: .pp ! 622: Files and programs are legitimate message recipients. ! 623: Files provide archival storage of messages, ! 624: useful for project administration and history. ! 625: Programs are useful as recipients in a variety of situations, ! 626: for example, ! 627: to maintain a public repository of systems messages ! 628: (such as the Berkeley ! 629: .i msgs ! 630: program, ! 631: or the MARS system ! 632: [Sattley78]). ! 633: .pp ! 634: Any address passing through the initial parsing algorithm ! 635: as a local address ! 636: (i.e, not appearing to be a valid address for another mailer) ! 637: is scanned for two special cases. ! 638: If prefixed by a vertical bar (\c ! 639: .q \^|\^ ) ! 640: the rest of the address is processed as a shell command. ! 641: If the user name begins with a slash mark (\c ! 642: .q /\^ ) ! 643: the name is used as a file name, ! 644: instead of a login name. ! 645: .pp ! 646: Files that have setuid or setgid bits set ! 647: but no execute bits set ! 648: have those bits honored if ! 649: .i sendmail ! 650: is running as root. ! 651: .sh 2 "Aliasing, Forwarding, Inclusion" ! 652: .pp ! 653: .i Sendmail ! 654: reroutes mail three ways. ! 655: Aliasing applies system wide. ! 656: Forwarding allows each user to reroute incoming mail ! 657: destined for that account. ! 658: Inclusion directs ! 659: .i sendmail ! 660: to read a file for a list of addresses, ! 661: and is normally used ! 662: in conjunction with aliasing. ! 663: .sh 3 "Aliasing" ! 664: .pp ! 665: Aliasing maps names to address lists using a system-wide file. ! 666: This file is indexed to speed access. ! 667: Only names that parse as local ! 668: are allowed as aliases; ! 669: this guarantees a unique key ! 670: (since there are no nicknames for the local host). ! 671: .sh 3 "Forwarding" ! 672: .pp ! 673: After aliasing, ! 674: recipients that are local and valid ! 675: are checked for the existence of a ! 676: .q .forward ! 677: file in their home directory. ! 678: If it exists, ! 679: the message is ! 680: .i not ! 681: sent to that user, ! 682: but rather to the list of users in that file. ! 683: Often ! 684: this list will contain only one address, ! 685: and the feature will be used for network mail forwarding. ! 686: .pp ! 687: Forwarding also permits a user to specify a private incoming mailer. ! 688: For example, ! 689: forwarding to: ! 690: .(b ! 691: "\^|\|/usr/local/newmail myname" ! 692: .)b ! 693: will use a different incoming mailer. ! 694: .sh 3 "Inclusion" ! 695: .pp ! 696: Inclusion is specified in RFC 733 [Crocker77a] syntax: ! 697: .(b ! 698: :Include: pathname ! 699: .)b ! 700: An address of this form reads the file specified by ! 701: .i pathname ! 702: and sends to all users listed in that file. ! 703: .pp ! 704: The intent is ! 705: .i not ! 706: to support direct use of this feature, ! 707: but rather to use this as a subset of aliasing. ! 708: For example, ! 709: an alias of the form: ! 710: .(b ! 711: project: :include:/usr/project/userlist ! 712: .)b ! 713: is a method of letting a project maintain a mailing list ! 714: without interaction with the system administration, ! 715: even if the alias file is protected. ! 716: .pp ! 717: It is not necessary to rebuild the index on the alias database ! 718: when a :include: list is changed. ! 719: .sh 2 "Message Collection" ! 720: .pp ! 721: Once all recipient addresses are parsed and verified, ! 722: the message is collected. ! 723: The message comes in two parts: ! 724: a message header and a message body, ! 725: separated by a blank line. ! 726: .pp ! 727: The header is formatted as a series of lines ! 728: of the form ! 729: .(b ! 730: field-name: field-value ! 731: .)b ! 732: Field-value can be split across lines by starting the following ! 733: lines with a space or a tab. ! 734: Some header fields have special internal meaning, ! 735: and have appropriate special processing. ! 736: Other headers are simply passed through. ! 737: Some header fields may be added automatically, ! 738: such as time stamps. ! 739: .pp ! 740: The body is a series of text lines. ! 741: It is completely uninterpreted and untouched, ! 742: except that lines beginning with a dot ! 743: have the dot doubled ! 744: when transmitted over an SMTP channel. ! 745: This extra dot is stripped by the receiver. ! 746: .sh 2 "Message Delivery" ! 747: .pp ! 748: The send queue is ordered by receiving host ! 749: before transmission ! 750: to implement message batching. ! 751: Each address is marked as it is sent ! 752: so rescanning the list is safe. ! 753: An argument list is built as the scan proceeds. ! 754: Mail to files is detected during the scan of the send list. ! 755: The interface to the mailer ! 756: is performed using one of the techniques ! 757: described in section 2.2. ! 758: .pp ! 759: After a connection is established, ! 760: .i sendmail ! 761: makes the per-mailer changes to the header ! 762: and sends the result to the mailer. ! 763: If any mail is rejected by the mailer, ! 764: a flag is set to invoke the return-to-sender function ! 765: after all delivery completes. ! 766: .sh 2 "Queued Messages" ! 767: .pp ! 768: If the mailer returns a ! 769: .q "temporary failure" ! 770: exit status, ! 771: the message is queued. ! 772: A control file is used to describe the recipients to be sent to ! 773: and various other parameters. ! 774: This control file is formatted as a series of lines, ! 775: each describing a sender, ! 776: a recipient, ! 777: the time of submission, ! 778: or some other salient parameter of the message. ! 779: The header of the message is stored ! 780: in the control file, ! 781: so that the associated data file in the queue ! 782: is just the temporary file that was originally collected. ! 783: .sh 2 "Configuration" ! 784: .pp ! 785: Configuration is controlled primarily by a configuration file ! 786: read at startup. ! 787: .i Sendmail ! 788: should not need to be recomplied except ! 789: .np ! 790: To change operating systems ! 791: (V6, V7/32V, 4BSD). ! 792: .np ! 793: To remove or insert the DBM ! 794: (UNIX database) ! 795: library. ! 796: .np ! 797: To change ARPANET reply codes. ! 798: .np ! 799: To add headers fields requiring special processing. ! 800: .lp ! 801: Adding mailers or changing parsing ! 802: (i.e., rewriting) ! 803: or routing information ! 804: does not require recompilation. ! 805: .pp ! 806: If the mail is being sent by a local user, ! 807: and the file ! 808: .q .mailcf ! 809: exists in the sender's home directory, ! 810: that file is read as a configuration file ! 811: after the system configuration file. ! 812: The primary use of this feature is to add header lines. ! 813: .pp ! 814: The configuration file encodes macro definitions, ! 815: header definitions, ! 816: mailer definitions, ! 817: rewriting rules, ! 818: and options. ! 819: .sh 3 Macros ! 820: .pp ! 821: Macros can be used in three ways. ! 822: Certain macros transmit ! 823: unstructured textual information ! 824: into the mail system, ! 825: such as the name ! 826: .i sendmail ! 827: will use to identify itself in error messages. ! 828: Other macros transmit information from ! 829: .i sendmail ! 830: to the configuration file ! 831: for use in creating other fields ! 832: (such as argument vectors to mailers); ! 833: e.g., the name of the sender, ! 834: and the host and user ! 835: of the recipient. ! 836: Other macros are unused internally, ! 837: and can be used as shorthand in the configuration file. ! 838: .sh 3 "Header declarations" ! 839: .pp ! 840: Header declarations inform ! 841: .i sendmail ! 842: of the format of known header lines. ! 843: Knowledge of a few header lines ! 844: is built into ! 845: .i sendmail , ! 846: such as the ! 847: .q From: ! 848: and ! 849: .q Date: ! 850: lines. ! 851: .pp ! 852: Most configured headers ! 853: will be automatically inserted ! 854: in the outgoing message ! 855: if they don't exist in the incoming message. ! 856: Certain headers are suppressed by some mailers. ! 857: .sh 3 "Mailer declarations" ! 858: .pp ! 859: Mailer declarations tell ! 860: .i sendmail ! 861: of the various mailers available to it. ! 862: The definition specifies the internal name of the mailer, ! 863: the pathname of the program to call, ! 864: some flags associated with the mailer, ! 865: and an argument vector to be used on the call; ! 866: this vector is macro-expanded before use. ! 867: .sh 3 "Address rewriting rules" ! 868: .pp ! 869: The heart of address parsing in ! 870: .i sendmail ! 871: is a set of rewriting rules. ! 872: These are an ordered list of pattern-replacement rules, ! 873: (somewhat like a production system, ! 874: except that order is critical), ! 875: which are applied to each address. ! 876: The address is rewritten textually until it is either rewritten ! 877: into a special canonical form ! 878: (i.e., ! 879: a (mailer, host, user) ! 880: 3-tuple, ! 881: such as {arpanet, usc-isif, postel} ! 882: representing the address ! 883: .q "postel@usc-isif" ), ! 884: or it falls off the end. ! 885: When a pattern matches, ! 886: the rule is reapplied until it fails. ! 887: .pp ! 888: The configuration file also supports the editing of addresses ! 889: into different formats. ! 890: For example, ! 891: an address of the form: ! 892: .(b ! 893: ucsfcgl!tef ! 894: .)b ! 895: might be mapped into: ! 896: .(b ! 897: [email protected] ! 898: .)b ! 899: to conform to the domain syntax. ! 900: Translations can also be done in the other direction. ! 901: .sh 3 "Option setting" ! 902: .pp ! 903: There are several options that can be set ! 904: from the configuration file. ! 905: These include the pathnames of various support files, ! 906: timeouts, ! 907: default modes, ! 908: etc. ! 909: .sh 1 "COMPARISON WITH OTHER MAILERS" ! 910: .sh 2 "Delivermail" ! 911: .pp ! 912: .i Sendmail ! 913: is an outgrowth of ! 914: .i delivermail . ! 915: The primary differences are: ! 916: .np ! 917: Configuration information is not compiled in. ! 918: This change simplifies many of the problems ! 919: of moving to other machines. ! 920: It also allows easy debugging of new mailers. ! 921: .np ! 922: Address parsing is more flexible. ! 923: For example, ! 924: .i delivermail ! 925: only supported one gateway to any network, ! 926: whereas ! 927: .i sendmail ! 928: can be sensitive to host names ! 929: and reroute to different gateways. ! 930: .np ! 931: Forwarding and ! 932: :include: ! 933: features eliminate the requirement that the system alias file ! 934: be writable by any user ! 935: (or that an update program be written, ! 936: or that the system administration make all changes). ! 937: .np ! 938: .i Sendmail ! 939: supports message batching across networks ! 940: when a message is being sent to multiple recipients. ! 941: .np ! 942: A mail queue is provided in ! 943: .i sendmail. ! 944: Mail that cannot be delivered immediately ! 945: but can potentially be delivered later ! 946: is stored in this queue for a later retry. ! 947: The queue also provides a buffer against system crashes; ! 948: after the message has been collected ! 949: it may be reliably redelivered ! 950: even if the system crashes during the initial delivery. ! 951: .np ! 952: .i Sendmail ! 953: uses the networking support provided by 4.2BSD ! 954: to provide a direct interface networks such as the ARPANET ! 955: and/or Ethernet ! 956: using SMTP (the Simple Mail Transfer Protocol) ! 957: over a TCP/IP connection. ! 958: .sh 2 "MMDF" ! 959: .pp ! 960: MMDF ! 961: [Crocker79] ! 962: spans a wider problem set than ! 963: .i sendmail . ! 964: For example, ! 965: the domain of ! 966: MMDF includes a ! 967: .q "phone network" ! 968: mailer, whereas ! 969: .i sendmail ! 970: calls on preexisting mailers in most cases. ! 971: .pp ! 972: MMDF and ! 973: .i sendmail ! 974: both support aliasing, ! 975: customized mailers, ! 976: message batching, ! 977: automatic forwarding to gateways, ! 978: queueing, ! 979: and retransmission. ! 980: MMDF supports two-stage timeout, ! 981: which ! 982: .i sendmail ! 983: does not support. ! 984: .pp ! 985: The configuration for MMDF ! 986: is compiled into the code\**. ! 987: .(f ! 988: \**Dynamic configuration tables are currently being considered ! 989: for MMDF; ! 990: allowing the installer to select either compiled ! 991: or dynamic tables. ! 992: .)f ! 993: .pp ! 994: Since MMDF does not consider backwards compatibility ! 995: as a design goal, ! 996: the address parsing is simpler but much less flexible. ! 997: .pp ! 998: It is somewhat harder to integrate a new channel\** ! 999: .(f ! 1000: \**The MMDF equivalent of a ! 1001: .i sendmail ! 1002: .q mailer. ! 1003: .)f ! 1004: into MMDF. ! 1005: In particular, ! 1006: MMDF must know the location and format ! 1007: of host tables for all channels, ! 1008: and the channel must speak a special protocol. ! 1009: This allows MMDF to do additional verification ! 1010: (such as verifying host names) ! 1011: at submission time. ! 1012: .pp ! 1013: MMDF strictly separates the submission and delivery phases. ! 1014: Although ! 1015: .i sendmail ! 1016: has the concept of each of these stages, ! 1017: they are integrated into one program, ! 1018: whereas in MMDF they are split into two programs. ! 1019: .sh 2 "Message Processing Module" ! 1020: .pp ! 1021: The Message Processing Module (MPM) ! 1022: discussed by Postel [Postel79b] ! 1023: matches ! 1024: .i sendmail ! 1025: closely in terms of its basic architecture. ! 1026: However, ! 1027: like MMDF, ! 1028: the MPM includes the network interface software ! 1029: as part of its domain. ! 1030: .pp ! 1031: MPM also postulates a duplex channel to the receiver, ! 1032: as does MMDF, ! 1033: thus allowing simpler handling of errors ! 1034: by the mailer ! 1035: than is possible in ! 1036: .i sendmail . ! 1037: When a message queued by ! 1038: .i sendmail ! 1039: is sent, ! 1040: any errors must be returned to the sender ! 1041: by the mailer itself. ! 1042: Both MPM and MMDF mailers ! 1043: can return an immediate error response, ! 1044: and a single error processor can create an appropriate response. ! 1045: .pp ! 1046: MPM prefers passing the message as a structured object, ! 1047: with type-length-value tuples\**. ! 1048: .(f ! 1049: \**This is similar to the NBS standard. ! 1050: .)f ! 1051: Such a convention requires a much higher degree of cooperation ! 1052: between mailers than is required by ! 1053: .i sendmail . ! 1054: MPM also assumes a universally agreed upon internet name space ! 1055: (with each address in the form of a net-host-user tuple), ! 1056: which ! 1057: .i sendmail ! 1058: does not. ! 1059: .sh 1 "EVALUATIONS AND FUTURE PLANS" ! 1060: .pp ! 1061: .i Sendmail ! 1062: is designed to work in a nonhomogeneous environment. ! 1063: Every attempt is made to avoid imposing unnecessary constraints ! 1064: on the underlying mailers. ! 1065: This goal has driven much of the design. ! 1066: One of the major problems ! 1067: has been the lack of a uniform address space, ! 1068: as postulated in [Postel79a] ! 1069: and [Postel79b]. ! 1070: .pp ! 1071: A nonuniform address space implies that a path will be specified ! 1072: in all addresses, ! 1073: either explicitly (as part of the address) ! 1074: or implicitly ! 1075: (as with implied forwarding to gateways). ! 1076: This restriction has the unpleasant effect of making replying to messages ! 1077: exceedingly difficult, ! 1078: since there is no one ! 1079: .q address ! 1080: for any person, ! 1081: but only a way to get there from wherever you are. ! 1082: .pp ! 1083: Interfacing to mail programs ! 1084: that were not initially intended to be applied ! 1085: in an internet environment ! 1086: has been amazingly successful, ! 1087: and has reduced the job to a manageable task. ! 1088: .pp ! 1089: .i Sendmail ! 1090: has knowledge of a few difficult environments ! 1091: built in. ! 1092: It generates ARPANET FTP/SMTP compatible error messages ! 1093: (prepended with three-digit numbers ! 1094: [Neigus73, Postel74, Postel82]) ! 1095: as necessary, ! 1096: optionally generates UNIX-style ! 1097: .q From ! 1098: lines on the front of messages for some mailers, ! 1099: and knows how to parse the same lines on input. ! 1100: Also, ! 1101: error handling has an option customized for BerkNet. ! 1102: .pp ! 1103: The decision to avoid doing any type of delivery where possible ! 1104: (even, or perhaps especially, local delivery) ! 1105: has turned out to be a good idea. ! 1106: Even with local delivery, ! 1107: there are issues of the location of the mailbox, ! 1108: the format of the mailbox, ! 1109: the locking protocol used, ! 1110: etc., ! 1111: that are best decided by other programs. ! 1112: One surprisingly major annoyance in many internet mailers ! 1113: is that the location and format of local mail is built in. ! 1114: The feeling seems to be that local mail is so common ! 1115: that it should be efficient. ! 1116: This feeling is not born out by ! 1117: our experience; ! 1118: on the contrary, ! 1119: the location and format of mailboxes seems to vary widely ! 1120: from system to system. ! 1121: .pp ! 1122: The ability to automatically generate a response to incoming mail ! 1123: (by forwarding mail to a program) ! 1124: seems useful ! 1125: (\c ! 1126: .q "I am on vacation until late August...." ) ! 1127: but can create problems ! 1128: such as forwarding loops ! 1129: (two people on vacation whose programs send notes back and forth, ! 1130: for instance) ! 1131: if these programs are not well written. ! 1132: A program could be written to do standard tasks correctly, ! 1133: but this would solve the general case. ! 1134: .pp ! 1135: It might be desirable to implement some form of load limiting. ! 1136: I am unaware of any mail system that addresses this problem, ! 1137: nor am I aware of any reasonable solution at this time. ! 1138: .pp ! 1139: The configuration file is currently practically inscrutable; ! 1140: considerable convenience could be realized ! 1141: with a higher-level format. ! 1142: .pp ! 1143: It seems clear that common protocols will be changing soon ! 1144: to accommodate changing requirements and environments. ! 1145: These changes will include modifications to the message header ! 1146: (e.g., [NBS80]) ! 1147: or to the body of the message itself ! 1148: (such as for multimedia messages ! 1149: [Postel80]). ! 1150: Experience indicates that ! 1151: these changes should be relatively trivial to integrate ! 1152: into the existing system. ! 1153: .pp ! 1154: In tightly coupled environments, ! 1155: it would be nice to have a name server ! 1156: such as Grapvine ! 1157: [Birrell82] ! 1158: integrated into the mail system. ! 1159: This would allow a site such as ! 1160: .q Berkeley ! 1161: to appear as a single host, ! 1162: rather than as a collection of hosts, ! 1163: and would allow people to move transparently among machines ! 1164: without having to change their addresses. ! 1165: Such a facility ! 1166: would require an automatically updated database ! 1167: and some method of resolving conflicts. ! 1168: Ideally this would be effective even without ! 1169: all hosts being under ! 1170: a single management. ! 1171: However, ! 1172: it is not clear whether this feature ! 1173: should be integrated into the ! 1174: aliasing facility ! 1175: or should be considered a ! 1176: .q "value added" ! 1177: feature outside ! 1178: .i sendmail ! 1179: itself. ! 1180: .pp ! 1181: As a more interesting case, ! 1182: the CSNET name server ! 1183: [Solomon81] ! 1184: provides an facility that goes beyond a single ! 1185: tightly-coupled environment. ! 1186: Such a facility would normally exist outside of ! 1187: .i sendmail ! 1188: however. ! 1189: .sh 0 "ACKNOWLEDGEMENTS" ! 1190: .pp ! 1191: Thanks are due to Kurt Shoens for his continual cheerful ! 1192: assistance and good advice, ! 1193: Bill Joy for pointing me in the correct direction ! 1194: (over and over), ! 1195: and Mark Horton for more advice, ! 1196: prodding, ! 1197: and many of the good ideas. ! 1198: Kurt and Eric Schmidt are to be credited ! 1199: for using ! 1200: .i delivermail ! 1201: as a server for their programs ! 1202: (\c ! 1203: .i Mail ! 1204: and BerkNet respectively) ! 1205: before any sane person should have, ! 1206: and making the necessary modifications ! 1207: promptly and happily. ! 1208: Eric gave me considerable advice about the perils ! 1209: of network software which saved me an unknown ! 1210: amount of work and grief. ! 1211: Mark did the original implementation of the DBM version ! 1212: of aliasing, installed the VFORK code, ! 1213: wrote the current version of ! 1214: .i rmail , ! 1215: and was the person who really convinced me ! 1216: to put the work into ! 1217: .i delivermail ! 1218: to turn it into ! 1219: .i sendmail . ! 1220: Kurt deserves accolades for using ! 1221: .i sendmail ! 1222: when I was myself afraid to take the risk; ! 1223: how a person can continue to be so enthusiastic ! 1224: in the face of so much bitter reality is beyond me. ! 1225: .pp ! 1226: Kurt, ! 1227: Mark, ! 1228: Kirk McKusick, ! 1229: Marvin Solomon, ! 1230: and many others have reviewed this paper, ! 1231: giving considerable useful advice. ! 1232: .pp ! 1233: Special thanks are reserved for Mike Stonebraker at Berkeley ! 1234: and Bob Epstein at Britton-Lee, ! 1235: who both knowingly allowed me to put so much work into this ! 1236: project ! 1237: when there were so many other things I really should ! 1238: have been working on. ! 1239: .+c ! 1240: .ce ! 1241: REFERENCES ! 1242: .nr ii 1.5i ! 1243: .ip [Birrell82] ! 1244: Birrell, A. D., ! 1245: Levin, R., ! 1246: Needham, R. M., ! 1247: and ! 1248: Schroeder, M. D., ! 1249: .q "Grapevine: An Exercise in Distributed Computing." ! 1250: In ! 1251: .ul ! 1252: Comm. A.C.M. 25, ! 1253: 4, ! 1254: April 82. ! 1255: .ip [Borden79] ! 1256: Borden, S., ! 1257: Gaines, R. S., ! 1258: and ! 1259: Shapiro, N. Z., ! 1260: .ul ! 1261: The MH Message Handling System: Users' Manual. ! 1262: R-2367-PAF. ! 1263: Rand Corporation. ! 1264: October 1979. ! 1265: .ip [Crocker77a] ! 1266: Crocker, D. H., ! 1267: Vittal, J. J., ! 1268: Pogran, K. T., ! 1269: and ! 1270: Henderson, D. A. Jr., ! 1271: .ul ! 1272: Standard for the Format of ARPA Network Text Messages. ! 1273: RFC 733, ! 1274: NIC 41952. ! 1275: In [Feinler78]. ! 1276: November 1977. ! 1277: .ip [Crocker77b] ! 1278: Crocker, D. H., ! 1279: .ul ! 1280: Framework and Functions of the MS Personal Message System. ! 1281: R-2134-ARPA, ! 1282: Rand Corporation, ! 1283: Santa Monica, California. ! 1284: 1977. ! 1285: .ip [Crocker79] ! 1286: Crocker, D. H., ! 1287: Szurkowski, E. S., ! 1288: and ! 1289: Farber, D. J., ! 1290: .ul ! 1291: An Internetwork Memo Distribution Facility \*- MMDF. ! 1292: 6th Data Communication Symposium, ! 1293: Asilomar. ! 1294: November 1979. ! 1295: .ip [Crocker82] ! 1296: Crocker, D. H., ! 1297: .ul ! 1298: Standard for the Format of Arpa Internet Text Messages. ! 1299: RFC 822. ! 1300: Network Information Center, ! 1301: SRI International, ! 1302: Menlo Park, California. ! 1303: August 1982. ! 1304: .ip [Metcalfe76] ! 1305: Metcalfe, R., ! 1306: and ! 1307: Boggs, D., ! 1308: .q "Ethernet: Distributed Packet Switching for Local Computer Networks" , ! 1309: .ul ! 1310: Communications of the ACM 19, ! 1311: 7. ! 1312: July 1976. ! 1313: .ip [Feinler78] ! 1314: Feinler, E., ! 1315: and ! 1316: Postel, J. ! 1317: (eds.), ! 1318: .ul ! 1319: ARPANET Protocol Handbook. ! 1320: NIC 7104, ! 1321: Network Information Center, ! 1322: SRI International, ! 1323: Menlo Park, California. ! 1324: 1978. ! 1325: .ip [NBS80] ! 1326: National Bureau of Standards, ! 1327: .ul ! 1328: Specification of a Draft Message Format Standard. ! 1329: Report No. ICST/CBOS 80-2. ! 1330: October 1980. ! 1331: .ip [Neigus73] ! 1332: Neigus, N., ! 1333: .ul ! 1334: File Transfer Protocol for the ARPA Network. ! 1335: RFC 542, NIC 17759. ! 1336: In [Feinler78]. ! 1337: August, 1973. ! 1338: .ip [Nowitz78a] ! 1339: Nowitz, D. A., ! 1340: and ! 1341: Lesk, M. E., ! 1342: .ul ! 1343: A Dial-Up Network of UNIX Systems. ! 1344: Bell Laboratories. ! 1345: In ! 1346: UNIX Programmer's Manual, Seventh Edition, ! 1347: Volume 2. ! 1348: August, 1978. ! 1349: .ip [Nowitz78b] ! 1350: Nowitz, D. A., ! 1351: .ul ! 1352: Uucp Implementation Description. ! 1353: Bell Laboratories. ! 1354: In ! 1355: UNIX Programmer's Manual, Seventh Edition, ! 1356: Volume 2. ! 1357: October, 1978. ! 1358: .ip [Postel74] ! 1359: Postel, J., ! 1360: and ! 1361: Neigus, N., ! 1362: Revised FTP Reply Codes. ! 1363: RFC 640, NIC 30843. ! 1364: In [Feinler78]. ! 1365: June, 1974. ! 1366: .ip [Postel77] ! 1367: Postel, J., ! 1368: .ul ! 1369: Mail Protocol. ! 1370: NIC 29588. ! 1371: In [Feinler78]. ! 1372: November 1977. ! 1373: .ip [Postel79a] ! 1374: Postel, J., ! 1375: .ul ! 1376: Internet Message Protocol. ! 1377: RFC 753, ! 1378: IEN 85. ! 1379: Network Information Center, ! 1380: SRI International, ! 1381: Menlo Park, California. ! 1382: March 1979. ! 1383: .ip [Postel79b] ! 1384: Postel, J. B., ! 1385: .ul ! 1386: An Internetwork Message Structure. ! 1387: In ! 1388: .ul ! 1389: Proceedings of the Sixth Data Communications Symposium, ! 1390: IEEE. ! 1391: New York. ! 1392: November 1979. ! 1393: .ip [Postel80] ! 1394: Postel, J. B., ! 1395: .ul ! 1396: A Structured Format for Transmission of Multi-Media Documents. ! 1397: RFC 767. ! 1398: Network Information Center, ! 1399: SRI International, ! 1400: Menlo Park, California. ! 1401: August 1980. ! 1402: .ip [Postel82] ! 1403: Postel, J. B., ! 1404: .ul ! 1405: Simple Mail Transfer Protocol. ! 1406: RFC821 ! 1407: (obsoleting RFC788). ! 1408: Network Information Center, ! 1409: SRI International, ! 1410: Menlo Park, California. ! 1411: August 1982. ! 1412: .ip [Schmidt79] ! 1413: Schmidt, E., ! 1414: .ul ! 1415: An Introduction to the Berkeley Network. ! 1416: University of California, Berkeley California. ! 1417: 1979. ! 1418: .ip [Shoens79] ! 1419: Shoens, K., ! 1420: .ul ! 1421: Mail Reference Manual. ! 1422: University of California, Berkeley. ! 1423: In UNIX Programmer's Manual, ! 1424: Seventh Edition, ! 1425: Volume 2C. ! 1426: December 1979. ! 1427: .ip [Sluizer81] ! 1428: Sluizer, S., ! 1429: and ! 1430: Postel, J. B., ! 1431: .ul ! 1432: Mail Transfer Protocol. ! 1433: RFC 780. ! 1434: Network Information Center, ! 1435: SRI International, ! 1436: Menlo Park, California. ! 1437: May 1981. ! 1438: .ip [Solomon81] ! 1439: Solomon, M., Landweber, L., and Neuhengen, D., ! 1440: .q "The Design of the CSNET Name Server." ! 1441: CS-DN-2, ! 1442: University of Wisconsin, Madison. ! 1443: November 1981. ! 1444: .ip [Su82] ! 1445: Su, Zaw-Sing, ! 1446: and ! 1447: Postel, Jon, ! 1448: .ul ! 1449: The Domain Naming Convention for Internet User Applications. ! 1450: RFC819. ! 1451: Network Information Center, ! 1452: SRI International, ! 1453: Menlo Park, California. ! 1454: August 1982. ! 1455: .ip [UNIX83] ! 1456: .ul ! 1457: The UNIX Programmer's Manual, Seventh Edition, ! 1458: Virtual VAX-11 Version, ! 1459: Volume 1. ! 1460: Bell Laboratories, ! 1461: modified by the University of California, ! 1462: Berkeley, California. ! 1463: March, 1983.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.