home | O'Reilly's CD bookshelfs | FreeBSD | Linux | Cisco | Cisco Exam    


sendmailSearch this book
Previous: 9.3 Testing Rule Set 0 Chapter 9
Rule Set 0
Next: 9.5 Things to Try

9.4 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:

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 the DontPruneRoutes option in Section 34.8.20, DontPruneRoutes (R) , how route addresses are handled in rules in Section 29.4.3, "Handling Routing Addresses" , and the F=d delivery agent flag in Section 30.8.16, 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 agent

R@$+    $#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.