Rule set 4 cleans up after all the other rule sets. In general it attempts to undo anything done by rule sets 3 and 96. Recall that rule set 96 looked up the canonical name and appended a dot to any that it found. Any bogus trailing dots need to be stripped away, and that is what rule set 4 does:
# strip trailing dot off possibly canonical name R$* < @ $+ . > $* $1 < @ $2 > $3
Recall that UUCP addresses were converted from their host!user form into a .UUCP pseudo domain. Rule set 4 returns them to their original form:
# UUCP must always be presented in old form R$+ @ $- . UUCP $2!$1 u@h.UUCP => h!u
Recall also that rule set 3 focused on the host part of the address. Rule set 4 will defocus:
R$* < $+ > $* $1 $2 $3 defocus
Depending on how ambitious the other rules are, rule set 4's job can be easy or hard. In general, processing any address with the sequence 3 then 4 should leave all but extraordinary addresses (such as the null address) unchanged:
%/usr/lib/sendmail -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked) Enter <ruleset> <address> >3,4 user@host
rewrite: ruleset 3 input: user @ host rewrite: ruleset 96 input: user < @ host > rewrite: ruleset 96 returns: user < @ host > rewrite: ruleset 3 returns: user < @ host > rewrite: ruleset 4 input: user < @ host > rewrite: ruleset 4 returns: user @ host >3,4 user@host.domain
rewrite: ruleset 3 input: user @ host . domain rewrite: ruleset 96 input: user < @ host . domain > rewrite: ruleset 96 returns: user < @ host . domain > rewrite: ruleset 3 returns: user < @ host . domain > rewrite: ruleset 4 input: user < @ host . domain > rewrite: ruleset 4 returns: user @ host . domain >3,4 host!user
rewrite: ruleset 3 input: host ! user rewrite: ruleset 96 input: user < @ host . UUCP > rewrite: ruleset 96 returns: user < @ host . UUCP . > rewrite: ruleset 3 returns: user < @ host . UUCP . > rewrite: ruleset 4 input: user < @ host . UUCP . > rewrite: ruleset 4 returns: host ! user