The Hubset
rule set next needs a rule that will
take an address consisting of a username and a short hostname and will change only the host
part. Consider an address of the form:
user@thishost
Here, the user
part is what you already dealt with: a user's login
name such as you. It is followed by an @
character and then the local host's name.
One method of matching this form of address
in the LHS would be to match the user, the @
character, and any hostname
(recall that the $+
matches one or more tokens in the workspace):
R$-@$+
This form is easy to use because the $+
would match
any hostname at all and wouldn't require that you know
all the possible names for the local host ahead of time. Unfortunately,
you shouldn't use this approach, because
you want to rewrite the sender's hostname only if it is that of
the local machine.
Using $+
would cause the sender's hostname to be rewritten whether or
not it is the name of the local machine.
But how could the sender's address not be from the local machine?
Recall that sendmail gets the sender address from one
of four places: from the envelope, from the From:
header, from the -f
switch (see below),
or from the uid of the process that ran sendmail.
Consider, for example, a Usenet news-posting program that posts news by sending
mail. It may be desirable to have all posted news messages appear
to be from the news program
on the news server machine. One
way to achieve this is by running sendmail with
the -f
switch:
-f news@news.server
Here, the -f
switch causes sendmail to
use the address specified on the command line as the address
of the sender.
But in this example you would not want to change
the address of the sender to appear as though it were from the
hub. That would undo what news
tries to do with
the -f
switch.
A better approach is to match the user, the @
character, and the specific local hostname:
R$-@$w
Recall that $w
was defined
to be the short hostname of the local host.
This LHS matches only a workspace (sender's address) that
begins with a single user's login name ($-
),
followed by @
, and then by the name
of the local host ($w
).
Add this new rule to the client.cf file:
SHubset # Rewrite the sender for the hub R$- $@ $1@${HUB} user -> user@hubR$-@$w $@ $1@${HUB} user@local -> user@hub
new
Notice that, other than their comments, the two rules differ only in their LHS. The flow through these rules is that the first tries to match a lone username in the workspace. If that match fails, the second rule tries to match the workspace. It matches only a workspace that contains the name of a user at the local machine. To observe this rule in action, run sendmail in rule-testing mode again:
%./sendmail -d0.1 -Cclient.cf -bt
This time, we added the -d0.1
debugging command-line switch,
which tells sendmail to print the identity of the local machine:
Version 8.8.4 Compiled with: LOG MATCHGECOS MIME7TO8 MIME8TO7 NAMED_BIND NDBM NETINET NETUNIX NIS SCANF XDEBUG ============ SYSTEM IDENTITY (after readcf) ============ (short domain name) $w = here (canonical domain name) $j = here.us.edu (subdomain name) $m = us.edu (node name) $k = here ======================================================== ADDRESS TEST MODE (ruleset 3 NOT automatically invoked) Enter <ruleset> <address> >
Note that sendmail, in this example, defines $w
as here
, the name of the local
machine. Your local machine name will, of course, differ. Fortunately,
you don't have to know what that name is to design
a new rule. Simply use $w
, and let sendmail
do all the work.
Now give sendmail rule sets 3 and Hubset
as you did before, but this
time specify a sender's address that contains a user and
a host part:
>3,Hubset you@here
the same as appeared in $w
The user part can be any login name. The host part must be
the text in the $w
macro
(displayed when you just ran sendmail with the -d0.1
debugging command-line switch above).
rewrite: ruleset 3 input: you @ here rewrite: ruleset 3 returns: you @ here rewrite: ruleset 199 input: you @ here rewrite: ruleset 199 returns: you @ mail . us . edu
As intended, Hubset
, the custom rule set for rewriting
the sender's address for the hub delivery agent, made
the local address appear to be from the hub
.
Note, however, that you cannot specify macros when testing addresses; that is, the following does not work:
>3,Hubset you@$w
The sendmail program does not recognize macros in addresses. They aren't recognized because macros in rule sets are expanded when the configuration file is read, not when sendmail reads addresses. The command above results in the following erroneous output:
rewrite: ruleset 3 input: you @ $w rewrite: ruleset 3 returns: you @ $w rewrite: ruleset 199 input: you @ $w rewrite: ruleset 199 returns: you @ $w
Also note that the value in $w
is the short hostname,
here, instead of the fully qualified name here.us.edu.
Instead of adding an additional rule to test for the fully qualified name,
we defer this problem to the next chapter.