The error Delivery Agent
Although all mail, under the hub scheme, should be passed to the hub for processing, certain errors should still be handled locally. By recognizing these errors locally, the user is advised of mistakes immediately, rather than having to wait for mail to bounce.
When we discussed delivery agents, we showed you that sendmail requires the local
delivery agent. Because sendmail requires it, you had to define it yourself (to keep sendmail from complaining):
Mlocal, P=/bin/mail, F=lsDFMAw5:/|@rmn, S=0, R=0, A=mail -d $u
Inside sendmail, a specially defined delivery agent exists. Called error
, that delivery agent is one that you can't define yourself.
The error
delivery agent is the internal mechanism that sendmail uses to process errors. When that delivery agent is selected, it causes sendmail to print the offending address, then the username part of the triple (the $:
part) as an error message.
For example, recall the earlier experiment with three demo rules:
S0 R@ one R@$+ two R$+@$+ three
When this rule set was given an address of @host (note the missing user part), the RHS rewrote the workspace to be two
. [3] We use a similar technique to select sendmail's built-in error handling delivery agent error
.
[3] We are fudging here for the sake of a simple example. In reality a leading
@
is legal for route addresses (see theDontPruneRoutes
option in DontPruneRoutes (R), how route addresses are handled in rules in "Handling Routing Addresses", and theF=d
delivery agent flag in F=d).
Add the following new line to the client.cf file's rule set 0. Don't forget that the LHS, RHS, and comment must be separated from each other by tab characters, not spaces. But note that the RHS may contain space characters (not tabs) for clarity.
S0 # select delivery agentR@$+ $#error $: Missing user name
new R$+ $#hub $@${REMOTE} $:$1 forward to hub
Run sendmail again, this time to see which addresses are caught locally as errors and which are passed onward to the central hub.
%./sendmail -Cclient.cf -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked) Enter <ruleset> <address> >0 @acme
rewrite: ruleset 0 input: @ acme rewrite: ruleset 0 returns: $# error $: Missing user name
Here, you are supplying an address that lacks a username. As expected, the error
delivery agent is selected. If someone attempted to send mail to this address, they would get the error
@acme... Missing user name
Now feed sendmail a legal address:
>0 boss@acme
rewrite: ruleset 0 input: boss @ acme rewrite: ruleset 0 returns: $# hub $@ mailhost $: boss @ acme
This legal address, one with both a user and host part, bypasses the error-handling rule and will be accepted for delivery via the hub
delivery agent.
Take some time to experiment. Give sendmail an assortment of addresses and try to predict which will produce errors and which will not.