Sendmail uses a highly complex rule system for it's
configuration. While you can do lots of neat tricks with
this stuff, writing a sendmail.cf
file from scratch
is rather unusual and time-consuming. If you are
interested in doing so, you should stop reading this
document right now and instead read the "Bat Book" from
O'Reilly.
Instead of hand-crafting these rules, we will rely on
the m4
macro processor to put together our
configuration file from ready-made pieces which are
distributed together with sendmail.
Let's look at the first lines of the sendmail.mc
file:
include(/usr/lib/sendmail.cf/m4/cf.m4) VERSIONID(`sendmail.mc - roessler@guug.de') OSTYPE(debian) define(`ALIAS_FILE',`/etc/mail/aliases')
In the beginning, cf.m4
is included. This m4 macro
file contains lots of macro definitions for the rest of the
file. Be sure that the path you give here is correct -
the one we are representing in our example is typical for
Debian GNU/Linux. The OSTYPE
macro is used to give
some useful defaults for certain configuration values. If
you aren't using a Debian system, you should replace the
word "debian" by "linux" here. ALIAS_FILE
tells
sendmail where to look for the list of aliases.
The following lines tell sendmail to use the
genericstable
feature, and where to find the
configuration files needed to use it:
FEATURE(masquerade_envelope) FEATURE(genericstable, `hash -o /etc/mail/genericstable') GENERICS_DOMAIN_FILE(`/etc/mail/genericsdomain')
masquerade_envelope
feature tells sendmail to
apply header rewriting to the envelope sender of a
message. This is the mail address to which external mail
delivery subsystems will direct their delivery failure
reports and warning messages. The generics*
files
will be explained below.
Now, we have to define a so-called smart host, that is, a machine which will handle outgoing mail for your system. Note that this machine may be different from your ISP's POP and IMAP servers. If in doubt, contact the hotline. The code in the master configuration file:
define(`SMART_HOST',`mail-out.your.provider')
The final two lines include the "mailer" definitions which are needed by sendmail to find out how to handle various types of mail:
MAILER(local) MAILER(smtp)
To generate the sendmail.cf
file from this
sendmail.mc
, type the following commands (as root):
# m4 sendmail.mc > _sendmail.cf # mv -f _sendmail.cf sendmail.cf
m4
's output to a
temporary file which is thereafter moved to the proper
place. This helps us to prevent sendmail from reading
partially written configuration files.
First, we have to tell sendmail what addresses are to
be considered local (and thus should be subjected to the
rewriting). This is quite simple: Just put the fully
qualified host name of your machine into the file
/etc/mail/genericsdomain
. To get your
host's fully qualified name, type the following command:
$ hostname -f
Now, let's come to the rewriting table proper:
/etc/mail/genericstable
. This file
consists of two white-space separated columns. The first
column contains the local address, the second column
contains the e-mail address which should be used instead.
The file may look like this:
harry harryx@your.isp maude maudey@her.isp root fredx@your.isp news fredx@your.isp
Note that there should be one entry for each account on the local machine, so that automatically generated mail which leaks out of the local system carries correct header information.
For performance reasons, sendmail won't use this text file directly, but rely on a "hashed" version instead. To generate it, type the following command:
# makemap -r hash genericstable.db < genericstable
Note that the rewriting rules from the
genericstable
will not apply to local mail or to
messages you receive from outside - the mapping is only
used if a message leaves your local system for your ISP's
smart host.
The aliases file contains additional local names which
are only valid for local messages. This is useful for
administrative accounts like root
which receive
automatically generated messages from your system.
A reasonable start for
/etc/mail/aliases
could look like the
following file:
root: fred news: root postmaster: root mail: root www: root nobody: /dev/null MAILER-DAEMON: nobody
This example will forward local mail for the root
,
news
, postmaster
, mail
, and www
users
to fred
, while messages for nobody
and
MAILER-DAEMON
will be redirected to
/dev/null
.
Just like the genericstable
, aliases
may
contain lots of entries. Thus, it would once again
be inefficient for sendmail to use the text file we just
described. The same mechanism as with genericstable
is used for aliases
: A hashed database is generated.
Instead of using makemap
directly, you can type in
the command newaliases
this time. It will
automatically take care of all what's needed.