Reading the aliases file every time sendmail begins to run can slow mail delivery and create a lot of unnecessary computational overhead. To improve efficiency, sendmail has the ability to store aliases in a separate database format on disk. In this format, sendmail rarely needs to read the aliases file. Instead, it merely opens the database and performs lookups as necessary.
The sendmail program builds its database files by reading the aliases (5) file and rewriting that file in database format. Usually, the aliases file is called aliases . With that name, ndbm (3) database files are called aliases.pag and aliases.dir , and the db (5) database file is called aliases.db .
The sendmail program offers several forms of database, one of which is chosen at compile time (see Section 18.4.1, "DBMDEF=" ).
You tell
sendmail
to rebuild its database files by running it in
-bi
mode. This mode can be executed in two different ways:
%newaliases
%/usr/lib/sendmail -bi
The first form is shorthand for the second. Either causes sendmail to rebuild those files. If the database is successfully built, sendmail prints a single line:
895 aliases, longest 565 bytes, 30444 bytes total
This shows that 895
local
entries appeared to the left of colons in the
aliases
file. The longest list of addresses to the right of a colon was 565 bytes (excluding the newline). And there were 30,444 total bytes of noncomment information in the file.
V8
sendmail
supports multiple alias database files (see the
AliasFile
(
A
) option,
Section 34.8.1
). Consequently, each line of its output is prefixed with the name of the alias file being rebuilt. For example,
/etc/aliasdir/users: 895 aliases, longest 565 bytes, 30444 bytes total /etc/aliasdir/lists: 34 aliases, longest 89 bytes, 1296 bytes total
When V8
sendmail
rebuilds the alias database files, it can optionally be told to check the legality of all addresses to the right of the colons. The
CheckAliases
(
n
) option (see
Section 34.8.6, CheckAliases (n)
) turns on this check:
O CheckAliases=True # validate RHS in newaliases
Each address is validated by running it through rule set 3, then rule set 0. Rule set 0 must select a delivery agent for the address. If it does, the address is silently validated and accepted. If not, the address is skipped, and the following warning is printed:
address
... bad address
Other errors may be printed before the above line that indicate more specific reasons for the failure. For example,
... Unbalanced '<'
The
-d20.1
debugging switch (see
Section 37.5.66, -d20.1
) can be used to gain a better idea of why the
address
failed. But be forewarned: The
-d20.1
switch can produce many screens of output.
In general, we do not recommend setting the
CheckAliases
(
n
) option to true in the configuration file, because it can cause each right-side address to be resolved through DNS and thus slow down the rebuild considerably. For better efficiency, leave the
CheckAliases
(
n
) option off in the configuration file and turn it on only when rebuilding by hand:
%newaliases -on
The alias database files can be automatically rebuilt in three ways: by the daemon (if the
AutoRebuildAliases
(
D
) option, see
Section 34.8.4, AutoRebuildAliases (D)
, is true), by users sending mail (and thereby indirectly running
sendmail
), and by users intentionally rebuilding the database with
newaliases
(or the
-bi
command-line switch). To prevent one rebuild from compromising and corrupting another,
sendmail
uses file locking.
The sendmail program uses flock (2) or fcntl (2) with F_SETLK to lock the aliases file (depending on how it was compiled). If the aliases file is already locked (because the database is currently being rebuilt), sendmail prints the following message:
Alias filename
is already being rebuilt
If
sendmail
is attempting to rebuild because it was run as
newaliases
or with the
-bi
command-line switch, the above message is printed, and the program exits. Otherwise, the above message is printed, and
sendmail
waits for the
aliases
file to become unlocked.
Once the
aliases
file is locked,
sendmail
next looks to see whether the key
@
appears in the database. If that key is missing,
sendmail
knows that the database is still being rebuilt. If the
AliasWait
(
a
) option (see
Section 34.8.2, AliasWait (a)
) has a value,
sendmail
waits that amount of time for the other rebuild to finish. If the
AliasWait
(
a
) option is missing or has a zero value,
sendmail
plows ahead, trusting the previous lock to prevent simultaneous rebuilds.
The
sendmail
program waits the number of seconds specified by the
AliasWait
(
a
) option for an
@
key to appear in the database. If that key doesn't appear within that wait,
sendmail
continues with the rebuild, assuming that some other process died while attempting to rebuild.
Before entering the key (the name to the left of the colon) and contents (everything to the right of the colon) pairs into the database,
sendmail
truncates the database (reduces it to size zero), thereby removing the
@
key. After all the key and contents pairs have been written to the database,
sendmail
adds a new
@
key to show that it is done.
Finally, sendmail closes the database and the aliases file. Closing the aliases file releases all locks it has on that file.
Some versions of UNIX do not provide the libraries that are needed to compile sendmail with database support. When neither the db (3) nor ndbm (3) library is available, and when no other method for getting aliases is declared (such as nis ), sendmail keeps aliases in its internal symbol table.
When the symbol table is used, sendmail builds its alias database only once. When sendmail is run as a daemon, the aliases file is read only once. If the file changes, the daemon needs to be killed and restarted. In general, it is not recommended to run sendmail in daemon mode without external database files.