Cover V02, I01
Article
Figure 1
Figure 2
Table 1

jan93.tar


Mail and Sendmail Administration: Part 1

Bruce H. Hunter

Mail has two sides -- the obvious front ends like the mail commands and the mysterious mechanisms that get mail delivered. Much of what goes on in UNIX is a mystery to the users, but in the case of mail, and particularly sendmail, the mystery may even extend to the systems staff. Let's see if we can shed a little light on what makes mail work.

From the user perspective, mail starts with the mail front-end commands, which are programs in their own right. The first, and most familiar, of the mail commands is /usr/ucb/mail (most users just use mail, but in fact they are using the Berkeley version). The AT&T version, /bin/mail, is still extant, but because it lacks some of the features we have all come to love in the Berkeley versions, relatively few people use it. Both of these programs accept mail and (seem to) deliver mail, though actual delivery agent(s) are separate, I will explain later.

Mail at its simplest is intended for mail collection and delivery on a local system. The need for a more sophisticated delivery agent arose when UUCP appeared. With UUCP the issue of address resolution had to be taken care of. There were now addresses like

% mail jaeger!bhunter

With the form system!user, the "!" or bang character separated the system name from the user name (in that order).

But UUCP is a switched network, which means that it uses the telephone lines. Very soon users were using mail hops, sending mail by way of other systems to keep down the cost of transmission. One system would send to another and that one to another until the message would either be delivered or time out and get erased. Now the form could be:

apex!acme!stalker!jaeger!bhunter

Berkeley added new dimensions and problems to mail. Berkeley programs are readily customizable, both for the user and at system level. The customizing is usually done with special files, and mail is no exception.

~/.mailrc

A user's mail command gets customized in the users $HOME/.mailrc. rc stands for run command, and mailrc is the run command that tells mail how to behave. It is here that aliases are set up and features are defined. Options that can be specified include the use of vi as the editor within mail, mail notification (biff), and a dozen or so others like cc and subject lines. Here is a very simple .mailrc file.

17% cat .mailrc
set append dot autoprint
set folder=/usr/system/bhunter/mcdmail
alias george gsmith@flsm1
alias dave dhill@flsm1
alias chad chad@linus.mitre.ORG
alias thegroup chad,dave,george

The set commands set such attributes as append, which appends new mail to end of the user's mail file; dot, which indicates that a period on a line (by itself) is the EOF; and autoprint, which prints each file to the screen as fast as the last is erased.

~/.forward

Another innovative Berkeley file, the ~/.forward file, forwards user mail. The file only need contain the next name-address pair in standard UNIX uname@host.org_name.org_ext format.

The Constituents of a Mail Message

Mail comes and goes in two parts, the message and the envelope, just like surface mail. The message is what the user types in, the envelope is what we see as header information, plus a little more. If you are fast enough, you can occasionally catch an undelivered piece of mail in /var/spool/mqueue. In the mqueue directory are two files for a given message: in the df* file is the message itself (data), while in the qf* file is the queue information or envelope. The following is a sample of the contents of an mqueue directory:

mfg# file dfAA07738  qfAA07738
dfAA07738:      English text
qfAA07738:      ascii text

Figure 1 shows a sample qf file. Notice the prefixes to the header lines:

D	the data file name
M	message (printed by mailq command)
S	sender address
H 	header definition
R	recipient(s)
E 	error address

And here's the sample:

mfg# cat dfAA07738
WARNING WARNING WARNING
AUSSIE File  Server svr05 down 5-6PM Monday
downtime 60 minutes to add DISK SPACE

And surprise of surprises there is no magic -- just the message. The two make up the mail message with some or all of the header information prepending the message when it winds up in [var | usr]/spool/mail/user_name.

Mail Agents

The mail agent has two functions: it collects mail and makes the final delivery. Some mail agents in current use include /usr/ucb/mail (the most familiar, BSD mail); /bin/mail (AT&T mail, the original); mailx; mailtool; elm; and mh.

If a mail agent can deliver mail locally, it will, but today's networked computing paradigm almost always involves the Internet and/or UUCP. To get mail the through the network requires a mail routing agent such as sendmail, mmdf, or smail. The most well-known, of course, is sendmail, which originated at UCB and was written by Eric Allman.

Once past the mail agent, the message still needs media and protocols in order to be delivered. Mail delivery agents at this level include Ethernet-TCP/IP (SMTP); UUCP (circuit switched lines or hardwire); and /bin/mail (for local delivery).

Basic Mail Files

Mail, like most facilities in UNIX, has several files and directories. The repository for delivered mail is /var/spool/mail/*. This directory includes a file for each user (by the user's name) that contains the header information followed by the message. Each new message is appended to the file, and each starts with the string "From." As noted earlier, a queuing place for mail is /var/spool/mqueue. The error message file is usually here as well.

The Basic sendmail System

All systems but one in a mail "domain" have a very simple sendmail (configuration) file. Each will try, without overexerting itself, to deliver the mail to a known host. If sendmail can clearly see that it must use the network for delivery or if it can't figure out how to make the delivery, it sends the mail on to the one different system, the mail master. The mail master has a very complex sendmail.cf file capable of performing the address translation required for getting mail to a relay host if need be.

Relay Hosts

Relay hosts have direct connections to the Internet. Messages needing the Internet for deliverey are routed to the relay host, and the relay host sends it on its way. The relay host works in the other direction, also, receiving and forwarding incoming mail from the Internet or UUNET.

Mail Working with DNS

Maintaining organization-wide host tables became a nightmare a long time ago, so most sites have begun to use DNS. With DNS each local domain takes care of its own host files and the DNS mechanism effectively merges all the local host files to maintain a virtual single host table that is accurate and up-to-date. sendmail has kept up with the times and can take advantage of DNS to effect timely mail delivery.

An Introduction to sendmail.cf

The key to sendmail is the configuration file(s) sendmail.cf, which routes mail by analyzing mail addresses and rewriting them for final delivery. Given the universe of possible addressing conventions used now and in the past, this is no small task. Most of us have gotten used to seeing the format

user@host.domain.domain_type

as in

schultz@peanuts.determined.com

but how about those UUCP addresses like

determined!peanuts!schultz

The ordering is different and so are the delimiters.

Mail Delimiters

It's the mail delimiters like "@" and "!" and "." and "::" that make it difficult to go from one addressing scheme to another. sendmail manages this through the definitions section typically found at the beginning of sendmail.cf files. The delimiters definition is one of the first and serves to show how definitions work. The single-character mnemonic operator D is a define. What is defined is called a macro and the macro for delimiters is o. Therefore in sendmail.cf the definition of the o delimiter macro is:

Do.:%@!^/[]

Note the lack of white space -- there is nothing to make this easy to read; parsing is done by having only one character for each mnemonic.

Addressing Translations

To reiterate, mail is sent in two parts, the message and the envelope. The header information must deal with addressing schemes and sendmail must do the address transformations. Table 1 shows a few of the many possible addressing schemes as well as the format into which they must be transformed in order to work on UNIX and with sendmail and other mail and routing agents.

Performing these address transformations is not a simple task. The process involves dozens of macros and definitions, several rule sets governing how the transformations take place, and a score or so of mnemonics and variables, as well as a few constructs like conditionals. One observant system programmer noted to me that sendmail.cf's notations, rules, and rule sets are not unlike a make file.

Internal Names (Canonical Form) and "Focus"

Mail addresses must have a consistent form while internal to sendmail. In addition, a "focus" -- represented by the <> operators -- is added to underscore, in a virtual sense, part of the address. The following are internal names with focus applied to the domain part of the name, leaving the user and host names and the token @ unfocused.

sam@<apex.uucp>
sam@<apex.dnet>
sam@<apex.ibm>

The form represented here is called canonical form. This form is required by one of the sendmail rulesets, ruleset 0, for message delivery.

Mail Routing Made Sane

Before plunging any deeper into sendmail.cf, I want to look at the mail agents again and discuss some of their functions. Users do not always know the domain name of the person to whom they want to send mail -- and even if they do, they are not likely to know the hostname of the recipient's machine. If there are 10,000 nodes in an organization, how is one to learn the full user@host.domain name? Part of the problem can be resolved by the company's using a domain name service and well known aliases.

If I am in an organization and know the name or acronym of a department, why can't I use it to get mail to a user in that organization? If the design tool group is known as CAD, for example, I should be able to use

jsmith@cad

to get to John Smith in that group. This is done, at least in part, with aliasing. The mail master, a computer used for the final gathering and delivery of mail, would have an alias of cad. In the host's files it would look like

123.21.60.122 svr08 cad

Now all systems can find cad even though no machine by that name really exists. Should the mail master move from svr08, only the alias would have to be changed (on all systems) to make it work.

Mail Aliasing and Mail Groups

Mail aliasing also works at the user's level in the mail setup files like ~/.mailrc. These aliases are used to set up mailing lists as well.

alias group,jsmith@ws05,anguyen@ws48,swesson@ws357

Mail forwarding is done by way of the users .forward file and through aliases. The ~/.forward file simply contains the user_name@host.domain where the mail is to be forwarded. Aliases may also be used for alternate names (hunter, bruce, bhunter).

A domain-wide list of user aliases can be maintained and distributed via NIS with a single central aliases file that is used by mail. Traditionally, this file is /etc/aliases, but if you replace that file with a YP map, mail delivery gets much simpler and more effective. For example, if I have a machine called jaeger, few people will know that name and fewer still will know the name of the mail master, svr04. I can use aliases to tie in the two:

bhunter:bhunter@svr04.

To simplify even further, don't have a /var/spool/mail directory on every machine. Instead, set up one huge mail directory on one server and NFS-mount it to all the domain's systems. With all of this aliased to the domain's organizational name or TLA (three-letter acronym), all of the following will work:

bhunter
bhunter@jaeger
bhunter@svr4
bhunter@XYZ

Mail Setup for Server and Workstations

Mail was originally intended to exist on one system which would service all users. Almost all mail was for local delivery, and little, if any, came in from the outside. Today's paradigm is tens to hundreds of workstations using several servers, all to form a single domain. Larger organizations will require several domains. Within a domain, mail could exist with each system having its own mail spool area (like usr/spool/mail or /var/spool/mail), but this would create many problems, among them delivering mail to users whose system names are unknown or who move from workstation to workstation; mailing to the domain without knowing the system name; keeping the /var or /usr areas from filling up with unread mail; and being unable to spool error messages in a single place where they can be acted upon.

It is easier in the long run to have a single mail server -- a system that not only is the mail master but also has all the mail on a single disk partition, disk pack, or concatenated virtual disk. With that system's name aliased to the domain or organization name, addressing mail from the outside is painless. That one system also has access to the YP aliases map and therefore can find any user.

All that remains is to mount the master's mail directory on each workstation. Keeping the directory names simple helps make the mount simple also

mount mlsvr:/var/spool/mail /var/spool/mail

Mail Debugging with mqueue

A large central mail server makes tracking down delivery problems easier because it puts all the error messages in one place in the mqueue directory. If the master has a problem delivering a message, it will register its complaint in the logfile in mqueue (see Figure 2). If a user has problems getting or sending mail and you know there's no problem with his/her sendmail configuration file, check /var/spool/mqueue for error messages. Look at the times required to complete the deliveries as an indicator of potential problems. Generally speaking, mail delivery is stopped or hampered when the recipient system is not up or not on the network; addressing is erroneous; the wrong user name is used (a solid argument for first initial-last name user naming conventions); or the user-name/address/aliases combination is not correct in the mail aliases file.

Coming Soon

In the next issue (March/April 1993), I'll deal in more detail with sendmail administration and related issues.

About the Author

Bruce H. Hunter is the co-author, with Karen Hunter, of UNIX Systems Advanced Administration and Management Handbook (Macmillan: 1991).