source: trunk/third/sendmail/contrib/domainmap.m4 @ 19204

Revision 19204, 4.2 KB checked in by zacheiss, 22 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r19203, which included commits to RCS files with non-trunk default branches.
Line 
1divert(-1)changequote(<<, >>)<<
2-----------------------------------------------------------------------------
3
4                     FEATURE(domainmap) Macro
5                                       
6   The existing virtusertable feature distributed with sendmail is a good
7   basic approach to virtual hosting, but it is missing a few key
8   features:
9
10    1. Ability to have a different map for each domain.
11    2. Ability to perform virtual hosting for domains which are not in $=w.
12    3. Ability to use a centralized network-accessible database (such as
13       PH) which is keyed on username alone (as opposed to the
14       fully-qualified email address).
15
16   The FEATURE(domainmap) macro neatly solves these problems.
17   
18   The basic syntax of the macro is:
19        FEATURE(domainmap, `domain.com', `map definition ...')dnl
20
21   To illustrate how it works, here is an example:
22        FEATURE(domainmap, `foo.com', `dbm -o /etc/mail/foo-users')dnl
23
24   In this example, mail sent to user@foo.com will be rewritten by the
25   domainmap. The username will be looked up in the DBM map
26   /etc/mail/foo-users, which looks like this:
27        jsmith  johnsmith@mailbox.foo.com
28        jdoe    janedoe@sandbox.bar.com
29
30   So mail sent to jsmith@foo.com will be relayed to
31   johnsmith@mailbox.foo.com, and mail sent to jdoe@foo.com will be
32   relayed to janedoe@sandbox.bar.com.
33   
34   The FEATURE(domainmap) Macro supports the user+detail syntax by
35   stripping off the +detail portion before the domainmap lookup and
36   tacking it back on to the result. Using the example above, mail sent
37   to jsmith+sometext@foo.com will be rewritten as
38   johnsmith+sometext@mailbox.foo.com.
39   
40   If one of the elements in the $=w class (i.e., "local" delivery hosts)
41   is a domain specified in a FEATURE(domainmap) entry, you need to use
42   the LOCAL_USER(username) macro to specify the list of users for whom
43   domainmap lookups should not be done.
44
45   To use this macro, simply copy this file into the cf/feature directory
46   in the sendmail source tree.  For more information, please see the
47   following URL:
48
49      http://www-dev.cso.uiuc.edu/sendmail/domainmap/
50
51   Feedback is welcome.
52
53                                             Mark D. Roth <roth@uiuc.edu>
54
55-----------------------------------------------------------------------------
56>>changequote(`, ')undivert(-1)divert
57
58ifdef(`_DOMAIN_MAP_',`',`dnl
59LOCAL_RULE_0
60# do mapping for domains where applicable
61R$* $=O $* <@ $={MappedDomain} .>       $@ $>Recurse $1 $2 $3   Strip extraneous routing
62R$+ <@ $={MappedDomain} .>              $>DomainMapLookup $1 <@ $2 .>   domain mapping
63
64LOCAL_RULESETS
65###########################################################################
66###   Ruleset DomainMapLookup -- special rewriting for mapped domains   ###
67###########################################################################
68
69SDomainMapLookup
70R $=L <@ $=w .>         $@ $1 <@ $2 .>          weed out local users, in case
71#                                               Cw contains a mapped domain
72R $+ <@ $+>             $: $1 <@ $2 > <$&{addr_type}>   check if sender
73R $+ <@ $+> <e s>       $#smtp $@ $2 $: $1 @ $2         do not process sender
74ifdef(`DOMAINMAP_NO_REGEX',`dnl
75R $+ <@ $+> <$*>        $: $1 <@ $2> <$2>       find domain
76R $+ <$+> <$+ . $+>     $1 <$2> < $(dequote $3 "_" $4 $) >
77#                                               change "." to "_"
78R $+ <$+> <$+ .>        $: $1 <$2> < $(dequote "domain_" $3 $) >
79#                                               prepend "domain_"
80dnl',`dnl
81R $+ <@ $+> <$*>        $: $1 <@ $2> <$2 :NOTDONE:>     find domain
82R $+ <$+> <$+ . :NOTDONE:>      $1 <$2> < $(domainmap_regex $3 $: $3 $) >
83#                                               change "." and "-" to "_"
84R $+ <$+> <$+>          $: $1 <$2> < $(dequote "domain_" $3 $) >
85#                                               prepend "domain_"
86dnl')
87R $+ <$+> <$+>          $: $1 <$2> <$3> $1      find user name
88R $+ <$+> <$+> $+ + $*  $: $1 <$2> <$3> $4      handle user+detail syntax
89R $+ <$+> <$+> $+       $: $1 <$2> $( $3 $4 $: <ERROR> $)
90#                                               do actual domain map lookup
91R $+ <$+> <ERROR>       $#error $@ 5.1.1 $: "550 email address lookup in domain map failed"
92R $+ <@ $+> $* <TEMP> $*        $#dsmtp $@ localhost $: $1 @ $2
93#                                               queue it up for later delivery
94R $+ + $* <$+> $+ @ $+          $: $1 + $2 <$3> $4 + $2 @ $5
95#                                               reset original user+detail
96R $+ <$+> $+            $@ $>Recurse $3         recanonify
97
98ifdef(`DOMAINMAP_NO_REGEX',`',`dnl
99LOCAL_CONFIG
100K domainmap_regex regex -a.:NOTDONE: -s1,2 -d_ (.*)[-\.]([^-\.]*)$
101')define(`_DOMAIN_MAP_',`1')')
102
103LOCAL_CONFIG
104C{MappedDomain} _ARG_
105K `domain_'translit(_ARG_, `.-', `__') _ARG2_ -T<TEMP>
Note: See TracBrowser for help on using the repository browser.