Testing Rewrite Rules The sendmail −bt Command

Figure 20.6: Rewriting an address. Note: BITNET relay host B is cunyvm.cuny.edu This example explains the implementation of the metasymbol n, and the substitution of the indefinite tokens. However, there are also other metasymbols that could be used in the rules rhs: The [ name ] metasymbol is based on the DNS and converts a hosts nickname or its IP address to its canonical name by passing the value name to the Name Server for resolution. • The n metasymbol calls a ruleset n and passes the address defined by the remainder of the transformation to the ruleset n for processing, for example: 912 ♦ This transformation calls ruleset 9 metasymbol 9, and passes the contents of 1, a literal , and the contents of 2 to ruleset 9 for processing. When ruleset 9 finishes processing, it returns a rewritten address to the calling rule. The return transformed address is then compared again to the pattern in the calling rule. If it still matches, ruleset 9 is called again. • The recursion built into rewrite rules creates the possibility for infinite loops. The and : metasymbols are used to control processing; the terminates the entire ruleset and the remainder of the transformation is the value returned by the ruleset; the : controls the execution of the individual rewrite rule only once. So these two metasymbols could be used to prevent recursion and looping. •

20.4 Testing sendmail Configuration

sendmail provides powerful tools for configuration testing and debugging. These tools are invoked from the command line using some of the many sendmail command−line arguments options. Testing is highly recommended after each sendmail configuration change to verify what has been done, and to gain confidence in the new configuration. We already discussed the case when sendmail is invoked in verbose mode −v argument; it displays the complete SMTP exchange and we can observe communication between source and destination hosts. A few more useful options are presented hereafter.

20.4.1 Testing Rewrite Rules

Problems in e−mail delivery could be caused by implemented rewrite rules for address parsing. Testing the rewrite rules can prevent many problems with e−mail delivery and not only delivery, but many other problems, too. Generally, testing should always be performed before the modified configuration is put into operation. 489

20.4.2 The sendmail −bt Command

We run the sendmail −bt command from the command line to get more information about rewrite rules. Once it is started, sendmail prompts for input using the greater than symbol . At the prompt, enter a ruleset number and the e−mail address you want to test. The address is easy to select; you can start with the most common addresses, and finish with specific, strange, but applicable ones. Among many rulesets, ruleset 0 is an obvious candidate for the test. In this way you can cover nearly all of the possible cases and be sure that your system is running properly. Ruleset 3 is the first ruleset applied to all addresses see Figure 20.4, and many sendmail versions assume the same in the address test mode. No matter which ruleset is specified, the address is first processed by ruleset 3 and then by the selected ruleset. This is not the case with all sendmail versions. Usually, sendmail informs you whether ruleset 3 is included by default or not before the address processing starts. To find out which mailer is delivering the test e−mail, process a recipient address through ruleset 0 remember ruleset 3 could be, but might not be, called by default. It is relatively easy to determine if everything is working correctly or not by following the messages that sendmail displays at the start and the exit from each ruleset about the input and the output address. It is more difficult to figure out the reason for incorrect address parsing if something goes wrong the syntax of rewrite rules is not very friendly, but at least an incorrect ruleset can be identified. In the presented example ruleset 0 was tested for three e−mail addresses, with supposedly three different outputs for mailers. The testing was performed on the host patsy.myschool. scps.edu; the first address is the local one, the second address belongs to the same domain so it can be delivered directly to the final destination, and the third one is out of the domain and its delivery is performed over a mail relay in this case the mailhost: mail1.scps.edu. usrlibsendmail −bt ADDRESS TEST MODE Enter ruleset address 0 bjlpatsy.myschool.scps.edu rewrite: ruleset 3 input: bjl patsy . myschool . scps . edu rewrite: ruleset 6 input: bjl patsy . myschool . scps . edu rewrite: ruleset 6 returns: bjl patsy . LOCAL rewrite: ruleset 3 returns: bjl patsy . LOCAL rewrite: ruleset 0 input: bjl patsy . LOCAL rewrite: ruleset 30 input: bjl rewrite: ruleset 3 input: bjl rewrite: ruleset 3 returns: bjl rewrite: ruleset 0 input: bjl rewrite: ruleset 9 input: bjl rewrite: ruleset 9 returns: bjl rewrite: ruleset 0 returns: local :bjl rewrite: ruleset 30 returns: local :bjl rewrite: ruleset 0 returns: local :bjl 0 bjlapollo.ph.myschool.scps.edu rewrite: ruleset 3 input: bjl apollo . ph . myschool . scps . edu rewrite: ruleset 6 input: bjl apollo . ph . myschool . scps . edu 490 rewrite: ruleset 0 returns: ether apollo . ph . myschool . scps . edu : bjl apollo . ph . myschool . scps . edu 0 bjlacf4.yourschool.edu rewrite: ruleset 3 input: bjl acf4 . yourschool . edu rewrite: ruleset 6 input: bjl acf4 . yourschool . edu rewrite: ruleset 6 returns: bjl acf4 . yourschool . edu rewrite: ruleset 3 returns: bjl acf4 . yourschool . edu rewrite: ruleset 0 input: bjl acf4 . yourschool . edu rewrite: ruleset 9 input: bjl acf4 . yourschool . edu rewrite: ruleset 9 returns: bjl acf4 . yourschool . edu rewrite: ruleset 0 returns: ddn mail1 . scps . edu : bjl acf4 . yourschool . edu D The same test procedure can be implemented for other rulesets and addresses.

20.4.3 The Debugging Level