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