summaryrefslogtreecommitdiffstats
path: root/contrib/sendmail/contrib/domainmap.m4
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/sendmail/contrib/domainmap.m4')
-rw-r--r--contrib/sendmail/contrib/domainmap.m490
1 files changed, 90 insertions, 0 deletions
diff --git a/contrib/sendmail/contrib/domainmap.m4 b/contrib/sendmail/contrib/domainmap.m4
new file mode 100644
index 0000000..31d284c
--- /dev/null
+++ b/contrib/sendmail/contrib/domainmap.m4
@@ -0,0 +1,90 @@
+divert(-1)changequote(<<, >>)<<
+-----------------------------------------------------------------------------
+
+ FEATURE(domainmap) Macro
+
+ The existing virtusertable feature distributed with sendmail is a good
+ basic approach to virtual hosting, but it is missing a few key
+ features:
+
+ 1. Ability to have a different map for each domain.
+ 2. Ability to perform virtual hosting for domains which are not in $=w.
+ 3. Ability to use a centralized network-accessible database (such as
+ PH) which is keyed on username alone (as opposed to the
+ fully-qualified email address).
+
+ The FEATURE(domainmap) macro neatly solves these problems.
+
+ The basic syntax of the macro is:
+ FEATURE(domainmap, `domain.com', `map definition ...')dnl
+
+ To illustrate how it works, here is an example:
+ FEATURE(domainmap, `foo.com', `dbm -o /etc/mail/foo-users')dnl
+
+ In this example, mail sent to user@foo.com will be rewritten by the
+ domainmap. The username will be looked up in the DBM map
+ /etc/mail/foo-users, which looks like this:
+ jsmith johnsmith@mailbox.foo.com
+ jdoe janedoe@sandbox.bar.com
+
+ So mail sent to jsmith@foo.com will be relayed to
+ johnsmith@mailbox.foo.com, and mail sent to jdoe@foo.com will be
+ relayed to janedoe@sandbox.bar.com.
+
+ The FEATURE(domainmap) Macro supports the user+detail syntax by
+ stripping off the +detail portion before the domainmap lookup and
+ tacking it back on to the result. Using the example above, mail sent
+ to jsmith+sometext@foo.com will be rewritten as
+ johnsmith+sometext@mailbox.foo.com.
+
+ If one of the elements in the $=w class (i.e., "local" delivery hosts)
+ is a domain specified in a FEATURE(domainmap) entry, you need to use
+ the LOCAL_USER(username) macro to specify the list of users for whom
+ domainmap lookups should not be done.
+
+ To use this macro, simply copy this file into the cf/feature directory
+ in the sendmail source tree. For more information, please see the
+ following URL:
+
+ http://www-wsg.cso.uiuc.edu/sendmail/patches/domainmap.html
+
+ Feedback is welcome.
+
+ Mark D. Roth <roth@uiuc.edu>
+
+-----------------------------------------------------------------------------
+>>changequote(`, ')undivert(-1)divert
+
+ifdef(`_DOMAIN_MAP_',`',`dnl
+LOCAL_RULE_0
+# do mapping for domains where applicable
+R$* $=O $* <@ $={MappedDomain} .> $@ $>97 $1 $2 $3 Strip extraneous routing
+R$+ <@ $={MappedDomain} .> $>DomainMapLookup $1 <@ $2 .> domain mapping
+
+LOCAL_RULESETS
+###########################################################################
+### Ruleset DomainMapLookup -- special rewriting for mapped domains ###
+###########################################################################
+
+SDomainMapLookup
+R $=L <@ $=w .> $@ $1 <@ $2 .> weed out local users, in case
+# Cw contains a mapped domain
+R $+ <@ $+ .> $1 <@ $2 > strip trailing dot
+R $+ <@ $+ . $+ > $1 <@ $(dequote $2 "_" $3 $) >
+# change "." to "_"
+R $+ <@ $+ > $: $1 <@ $(dequote "domain_" $2 $) >
+# prepend "domain_"
+R $+ + $+ <@ $*> $1 <@ $3 > <+> $2 handle user+list syntax
+R $+ <@ $* > $* $( $2 $1 $: <ERROR> $) $3
+# do actual domain map lookup
+R <ERROR> $* $#error $@ 5.1.1 $: "550 email address lookup in domain map failed"
+R $* <TEMP> $* $#error $@ 4.3.0 $: "450 domain map temporarily unavailable"
+R $+ @ $+ <+> $+ $1 + $3 @ $2 reset original user+list
+R $+ <+> $* $1 paranoid check - remove <+>
+R $+ @ $+ . $1 @ $2 strip trailing dot
+R $+ @ $+ $@ $>97 $1 @ $2 recanonify
+define(`_DOMAIN_MAP_',`1')')
+
+LOCAL_CONFIG
+C{MappedDomain} _ARG_
+K `domain_'translit(_ARG_, `.', `_') _ARG2_ -T<TEMP>
OpenPOWER on IntegriCloud