In tracking down delivery problems, it can be difficult to
determine where the problem lies. If you suspect a bad alias,
you can force aliasing to be skipped and see whether that causes the problem
to go away:
%
/usr/lib/sendmail -n user < /dev/null
This tells
sendmail
to send an empty mail message (one containing
mandatory headers only) to the recipient named
user
. The
-n
prevents
sendmail
from looking up
user
either in the
aliases
database or in
~/.forward
.
If
user
resolves to the
local
delivery agent,
the message will be delivered, and you should therefore suspect an
aliasing problem.
Other switches, such as
-v
(verbose) and
-d
(debugging), can be combined with
-n
to view the delivery process in more detail.
The
-n
command-line switch can also be used to suppress
aliasing when delivering to a list of recipients that has already
been aliased. For example, consider the following
script, which attempts to restrict delivery to users who have
mail delivered locally and to skip users who have mail forwarded
offsite:
#!/bin/sh
EX_OK=0 # From <sysexits.h>
EX_NOUSER=67 # From <sysexits.h>
EX_SOFTWARE=70 # From <sysexits.h>
if [ ${#} -ne 2 ]; then
echo Usage: $0 list-name
exit $EX_USAGE
fi
trap "exit 70" 1 2 13 15
LIST= "`/usr/lib/sendmail -bv $1 \
| grep "mailer local" 2>&1`" \
| sed 's/\\.\\.\\..*$//'
if [ -z "$LIST" ]
echo "$1 expanded to an empty list"
exit $EX_NOUSER
fi
if /usr/lib/sendmail -n $LIST >/dev/null 2>&1
then
exit $EX_OK
fi
exit $EX_SOFTWARE
The
sendmail
program is called twice inside this script. First, it
is given the
-bv
switch,
which causes it to expand the list of recipients
in
$1
. That expansion includes
aliasing (and
~/.forward
aliasing) for each name in the list. The output produced looks like
this:
user1... deliverable: mailer local, user user1
user2@otherhost... deliverable: mailer smtp, host otherhost, user user2@otherhost
The
grep
(1) program selects only those lines that
contain the expression
"mailer local"
, thus indicating a
local user.
The
sed
(1) program then discards from the ... to the end
of each selected line.
The result, a list of local recipients only, is saved in the shell variable
LIST
.
The
sendmail
program is called with the
-n
switch,
which prevents it from re-aliasing the list of names in
$LIST
(they have already been aliased once).
Note that this script should not be used as is because it checks only for the delivery
agent named
local
, rather than for any delivery agent that can
perform final delivery.