The job of rule set 0 is to resolve each address into a triple: the delivery agent's symbolic name, the name of the host, and the name of the user in that order (see Figure 9.2 ).
Recall that rules are like if-then statements. If the rule in the LHS evaluates to true, then sendmail evaluates the RHS:
if true do this R$+ $#hub $@${REMOTE} $:$1 forward to hub otherwise go to next rule
This RHS resolves all three parts of the triple. To accomplish this, the text of the RHS is transformed and then copied into the workspace:
$#hub copied as is (delivery agent part) $@${REMOTE} defined macro is expanded (host part) $:$1 positional macro is expanded (user part)
We examine these parts in order, showing how each is transformed and copied into the workspace. The transformation operators are shown in Table 9.1 .
Operator | Description |
---|---|
$# | The mail delivery agent |
$@ | The host |
$: | The user |
The first part of the triple is the name of the delivery agent. The RHS
$#
transformation operator tells
sendmail
that the text following (up to but not including the next operator, ignoring spaces) is the symbolic name of the delivery agent to use.
The symbolic name
hub
was defined in the
client.cf
file as
# Delivery agent definition to forward mail to hub Mhub, P=[IPC], S=0, R=0, F=mDFMuXa, T=DNS/RFC822/SMTP, A=IPC $h
When the RHS is copied into the workspace, any transformation operators such as
$#
are copied as is and become new tokens:
$# the workspace thus far
When text, such as
hub
, is copied into the workspace, it is tokenized by using the separation characters: [1]
[1] As a result, the symbolic name of the mail delivery agent cannot contain any separation characters.
.:@[] you can change these ()<>,;\"\r\n you cannot change these
Since our symbolic name
hub
contains none of those characters, it is copied as a single token into the workspace:
$# hub the workspace thus far
The second part of the triple is the hostname. The RHS
$@
transformation operator tells
sendmail
that the text following (up to, but not including, the next operator and ignoring spaces) is the name of the host to which the mail will be sent. Whenever
sendmail
encounters
${
name
}
in the RHS, it uses the value of the named macro. You previously defined
${REMOTE}
to contain the name of the host to which all mail will be sent:
D{REMOTE}mailhost # The name of the mail hub
The second part of the triple is now copied to the workspace. The name of the host is in
${REMOTE}
. Combined, they look like this:
$@${REMOTE}
$@
is copied as is.
${REMOTE}
is expanded (its value taken), and then that value is broken into tokens and copied into the workspace. If the value of the
${REMOTE}
macro is
mailhost
, the workspace will look like this:
$# hub $@ mailhost the workspace thus far
The third part of the triple is the username. The RHS
$:
transformation operator tells
sendmail
that the following text (up to, but not including, the next operator and ignoring spaces) is the user to whom mail is being sent.
Here, the username is determined by the
$1
, which is called a "positional operator":
$:$1
When
sendmail
sees a positional operator, a
$
followed by a single digit in the RHS, it counts up the number of wildcard operators in the LHS. In this example the LHS has only one wildcard operator,
$+
, so
$1
refers to that operator. If there were more than one wildcard operator in the LHS, for example,
$+.$+ $1 $2
then
$1
would refer to the first
$+
and
$2
to the second
$+
.
A
$
digit
tells
sendmail
to copy whatever tokens the corresponding LHS wildcard operator matched. If the original workspace had contained
boss @ acme in the original workspace
then the lone
$+
(match one or more) LHS wildcard operator would match the entire workspace (all of its tokens).
All of the original workspace's tokens are then copied. The workspace contains
$# hub $@ mailhost $: boss @ acme
After sendmail has completed writing the workspace, the workspace (the triple) is returned.