add confSORT_QUEUE_BY_HOST and confBROKEN_SMTP_PEERS
[unix-history] / usr / src / usr.sbin / sendmail / cf / m4 / proto.m4
CommitLineData
f25ecb3d
EA
1divert(-1)
2#
3# Copyright (c) 1983 Eric P. Allman
cb1a7064
KB
4# Copyright (c) 1988, 1993
5# The Regents of the University of California. All rights reserved.
f25ecb3d
EA
6#
7# %sccs.include.redist.sh%
8#
9divert(0)
10
26984f4d 11VERSIONID(`@(#)proto.m4 8.54 (Berkeley) %G%')
f25ecb3d 12
6f403f33 13MAILER(local)dnl
f25ecb3d 14
d4e68feb
EA
15# level 6 config file format
16V6
feae130e 17ifdef(`confSMTP_MAILER',, `define(`confSMTP_MAILER', `smtp')')dnl
2c840221 18ifdef(`confLOCAL_MAILER',, `define(`confLOCAL_MAILER', `local')')dnl
feae130e
EA
19ifdef(`confRELAY_MAILER',,
20 `define(`confRELAY_MAILER',
21 `ifdef(`_MAILER_smtp_', `relay',
22 `ifdef(`_MAILER_uucp', `suucp', `unknown')')')')dnl
2c840221
EA
23define(`_SMTP_', `confSMTP_MAILER')dnl for readability only
24define(`_LOCAL_', `confLOCAL_MAILER')dnl for readability only
feae130e 25define(`_RELAY_', `confRELAY_MAILER')dnl for readability only
242270da 26
f25ecb3d
EA
27##################
28# local info #
29##################
30
dacf3c9f 31Cwlocalhost
5461a68b 32ifdef(`USE_CW_FILE',
dacf3c9f 33`# file containing names of hosts for which we receive email
1bdba97e
EA
34Fw`'confCW_FILE',
35 `dnl')
64100696
EA
36ifdef(`confDOMAIN_NAME', `
37# my official domain name
38Dj`'confDOMAIN_NAME',
39 `dnl')
40
41ifdef(`_NULL_CLIENT_ONLY_',
42`include(../m4/nullrelay.m4)m4exit',
43 `dnl')
44
45CP.
f25ecb3d
EA
46
47ifdef(`UUCP_RELAY',
48`# UUCP relay host
1bdba97e 49DY`'UUCP_RELAY
7df175c3 50CPUUCP
a151c868 51
f25ecb3d
EA
52')dnl
53ifdef(`BITNET_RELAY',
54`# BITNET relay host
1bdba97e 55DB`'BITNET_RELAY
7df175c3 56CPBITNET
a151c868 57
d2e7dfa9
EA
58')dnl
59ifdef(`FAX_RELAY',
60`# FAX relay host
1bdba97e 61DF`'FAX_RELAY
7df175c3 62CPFAX
d2e7dfa9 63
f25ecb3d 64')dnl
64100696
EA
65# "Smart" relay host (may be null)
66DS`'ifdef(`SMART_HOST', SMART_HOST)
f25ecb3d 67
8d95d628
EA
68ifdef(`MAILER_TABLE',
69`# Mailer table (overriding domains)
70Kmailertable MAILER_TABLE
71
e653dde7
EA
72')dnl
73ifdef(`DOMAIN_TABLE',
74`# Domain table (adding domains)
75Kdomaintable DOMAIN_TABLE
76
97dcbde7 77')dnl
f25ecb3d 78# who I send unqualified names to (null means deliver locally)
1bdba97e 79DR`'ifdef(`LOCAL_RELAY', LOCAL_RELAY)
f25ecb3d 80
22bc0471 81# who gets all local email traffic ($R has precedence for unqualified names)
1bdba97e 82DH`'ifdef(`MAIL_HUB', MAIL_HUB)
22bc0471 83
41c6b54c
EA
84# who I masquerade as (null for no masquerading)
85DM`'ifdef(`MASQUERADE_NAME', MASQUERADE_NAME)
97dcbde7 86
45eb1b8f
EA
87# class L: names that should be delivered locally, even if we have a relay
88# class E: names that should be exposed as from this host, even if we masquerade
f4d9c9f9
EA
89# class D: dotted names, e.g., root.machinename
90#CL root
91CE root
3eb5f759 92undivert(5)dnl
f4d9c9f9
EA
93ifdef(`__DOTTED_USER_LIST__',
94 `__DOTTED_USER_LIST__',
95 `#CD postmaster')
3eb5f759 96
f25ecb3d 97# operators that cannot be in local usernames (i.e., network indicators)
1429c39b 98CO @ % ifdef(`_NO_UUCP_', `', `!')
f25ecb3d 99
6f403f33
EA
100# a class with just dot (for identifying canonical names)
101C..
102
f22970ed
EA
103# dequoting map
104Kdequote dequote
f25ecb3d 105
9863b6e1
EA
106undivert(6)dnl
107
a151c868
EA
108######################
109# Special macros #
110######################
111
112# SMTP initial login message
1bdba97e 113De`'confSMTP_LOGIN_MSG
a151c868
EA
114
115# UNIX initial From header format
1bdba97e 116Dl`'confFROM_LINE
a151c868
EA
117
118# my name for error messages
1bdba97e 119Dn`'confMAILER_NAME
a151c868
EA
120
121# delimiter (operator) characters
1bdba97e 122Do`'confOPERATORS
f25ecb3d 123
a151c868 124# format of a total name
f4d9c9f9 125Dq`'ifdef(`confFROM_HEADER', confFROM_HEADER, `$?x$x <$g>$|$g$.')
f25ecb3d 126include(`../m4/version.m4')
a151c868
EA
127
128###############
129# Options #
130###############
131
0b8c3ec1 132# strip message body to 7 bits on input?
1bdba97e 133O7`'confSEVEN_BIT_INPUT
a151c868 134
3ffefc8a
EA
135# 8-bit data handling
136O8`'confEIGHT_BIT_HANDLING
137
a151c868 138# wait (in minutes) for alias file rebuild
1bdba97e 139Oa`'confALIAS_WAIT
a151c868
EA
140
141# location of alias file
e1beeb7d 142OA`'ifdef(`ALIAS_FILE', `ALIAS_FILE', /etc/aliases)
a151c868 143
63381843 144# minimum number of free blocks on filesystem
1bdba97e 145Ob`'confMIN_FREE_BLOCKS
63381843 146
a151c868 147# substitution for space (blank) characters
1bdba97e 148OB`'confBLANK_SUB
a151c868 149
82561627 150# avoid connecting to "expensive" mailers on initial submission?
1bdba97e 151Oc`'confCON_EXPENSIVE
a151c868
EA
152
153# checkpoint queue runs after every N successful deliveries
1bdba97e 154OC`'confCHECKPOINT_INTERVAL
a151c868
EA
155
156# default delivery mode
1bdba97e 157Od`'confDELIVERY_MODE
a151c868
EA
158
159# automatically rebuild the alias database?
1bdba97e 160OD`'confAUTO_REBUILD
a151c868 161
1bdba97e 162# error message header/file
a151c868 163ifdef(`confERROR_MESSAGE',
1bdba97e 164 OE`'confERROR_MESSAGE,
a151c868
EA
165 #OE/etc/sendmail.oE)
166
167# error mode
168ifdef(`confERROR_MODE',
1bdba97e 169 Oe`'confERROR_MODE,
a151c868
EA
170 #Oep)
171
172# save Unix-style "From_" lines at top of header?
1bdba97e 173Of`'confSAVE_FROM_LINES
a151c868
EA
174
175# temporary file mode
1bdba97e 176OF`'confTEMP_FILE_MODE
a151c868
EA
177
178# match recipients against GECOS field?
1bdba97e 179OG`'confMATCH_GECOS
a151c868
EA
180
181# default GID
1bdba97e 182Og`'confDEF_GROUP_ID
a151c868
EA
183
184# maximum hop count
1bdba97e 185Oh`'confMAX_HOP
a151c868
EA
186
187# location of help file
1bdba97e 188OH`'ifdef(`HELP_FILE', HELP_FILE, /usr/lib/sendmail.hf)
a151c868
EA
189
190# ignore dots as terminators in incoming messages?
1bdba97e 191Oi`'confIGNORE_DOTS
a151c868
EA
192
193# Insist that the BIND name server be running to resolve names
194ifdef(`confBIND_OPTS',
1bdba97e 195 OI`'confBIND_OPTS,
a151c868
EA
196 #OI)
197
0b8c3ec1 198# deliver MIME-encapsulated error messages?
1bdba97e 199Oj`'confMIME_FORMAT_ERRORS
0b8c3ec1 200
a151c868
EA
201# Forward file search path
202ifdef(`confFORWARD_PATH',
1bdba97e 203 OJ`'confFORWARD_PATH,
a151c868
EA
204 #OJ/var/forward/$u:$z/.forward.$w:$z/.forward)
205
206# open connection cache size
1bdba97e 207Ok`'confMCI_CACHE_SIZE
a151c868
EA
208
209# open connection cache timeout
1bdba97e 210OK`'confMCI_CACHE_TIMEOUT
a151c868 211
b28237e4 212# use Errors-To: header?
1bdba97e 213Ol`'confUSE_ERRORS_TO
b28237e4 214
a151c868 215# log level
1bdba97e 216OL`'confLOG_LEVEL
a151c868
EA
217
218# send to me too, even in an alias expansion?
1bdba97e 219Om`'confME_TOO
a151c868
EA
220
221# verify RHS in newaliases?
1bdba97e 222On`'confCHECK_ALIASES
a151c868
EA
223
224# default messages to old style headers if no special punctuation?
1bdba97e 225Oo`'confOLD_STYLE_HEADERS
a151c868 226
4c230f32
EA
227# SMTP daemon options
228ifdef(`confDAEMON_OPTIONS',
1bdba97e 229 OO`'confDAEMON_OPTIONS,
4c230f32
EA
230 #OOPort=esmtp)
231
63381843 232# privacy flags
1bdba97e 233Op`'confPRIVACY_FLAGS
63381843 234
a151c868
EA
235# who (if anyone) should get extra copies of error messages
236ifdef(`confCOPY_ERRORS_TO',
1bdba97e 237 OP`'confCOPY_ERRORS_TO,
a151c868
EA
238 #OPPostmaster)
239
240# slope of queue-only function
241ifdef(`confQUEUE_FACTOR',
1bdba97e 242 Oq`'confQUEUE_FACTOR,
a151c868
EA
243 #Oq600000)
244
245# queue directory
1bdba97e 246OQ`'ifdef(`QUEUE_DIR', QUEUE_DIR, /var/spool/mqueue)
a151c868
EA
247
248# read timeout -- now OK per RFC 1123 section 5.3.2
e46fc989 249ifdef(`confREAD_TIMEOUT',
1bdba97e 250 Or`'confREAD_TIMEOUT,
e46fc989 251 #Ordatablock=10m)
a151c868
EA
252
253# queue up everything before forking?
1bdba97e 254Os`'confSAFE_QUEUE
a151c868
EA
255
256# status file
1bdba97e 257OS`'ifdef(`STATUS_FILE', STATUS_FILE, /etc/sendmail.st)
a151c868
EA
258
259# default message timeout interval
1bdba97e 260OT`'confMESSAGE_TIMEOUT
a151c868
EA
261
262# time zone handling:
263# if undefined, use system default
264# if defined but null, use TZ envariable passed in
265# if defined and non-null, use that info
266ifelse(confTIME_ZONE, `USE_SYSTEM', `#Ot',
8b1da1db 267 confTIME_ZONE, `USE_TZ', `Ot',
1bdba97e 268 `Ot`'confTIME_ZONE')
a151c868
EA
269
270# default UID
1bdba97e 271Ou`'confDEF_USER_ID
a151c868
EA
272
273# list of locations of user database file (null means no lookup)
bd00122c 274OU`'ifdef(`confUSERDB_SPEC', `confUSERDB_SPEC')
a151c868 275
4c230f32
EA
276# fallback MX host
277ifdef(`confFALLBACK_MX',
1bdba97e 278 OV`'confFALLBACK_MX,
4c230f32
EA
279 #OVfall.back.host.net)
280
d8ebcd49 281# if we are the best MX host for a site, try it directly instead of config err
1bdba97e 282Ow`'confTRY_NULL_MX_LIST
d8ebcd49 283
a151c868 284# load average at which we just queue messages
1bdba97e 285Ox`'confQUEUE_LA
a151c868
EA
286
287# load average at which we refuse connections
1bdba97e 288OX`'confREFUSE_LA
a151c868
EA
289
290# work recipient factor
291ifdef(`confWORK_RECIPIENT_FACTOR',
1bdba97e 292 Oy`'confWORK_RECIPIENT_FACTOR,
a151c868
EA
293 #Oy30000)
294
295# deliver each queued job in a separate process?
1bdba97e 296OY`'confSEPARATE_PROC
a151c868
EA
297
298# work class factor
299ifdef(`confWORK_CLASS_FACTOR',
1bdba97e 300 Oz`'confWORK_CLASS_FACTOR,
a151c868
EA
301 #Oz1800)
302
303# work time factor
304ifdef(`confWORK_TIME_FACTOR',
1bdba97e 305 OZ`'confWORK_TIME_FACTOR,
a151c868
EA
306 #OZ90000)
307
26984f4d
EA
308# do our SMTP peers choke on multi-line greeting messages?
309O BrokenSmtpPeers=confBROKEN_SMTP_PEERS
310
311# shall we sort the queue by hostname first?
312O SortQueueByHost=confSORT_QUEUE_BY_HOST
313
a151c868
EA
314###########################
315# Message precedences #
316###########################
317
318Pfirst-class=0
319Pspecial-delivery=100
97dcbde7 320Plist=-30
a151c868
EA
321Pbulk=-60
322Pjunk=-100
323
324#####################
325# Trusted users #
326#####################
327
328Troot
329Tdaemon
330Tuucp
331
332#########################
333# Format of headers #
334#########################
335
e0a38185 336H?P?Return-Path: $g
59fe1409 337HReceived: $?sfrom $s $.$?_($?s$|from $.$_) $.by $j ($v/$Z)$?r with $r$. id $i$?u for $u$.; $b
a151c868
EA
338H?D?Resent-Date: $a
339H?D?Date: $a
340H?F?Resent-From: $q
341H?F?From: $q
342H?x?Full-Name: $x
343HSubject:
344# HPosted-Date: $a
345# H?l?Received-Date: $b
346H?M?Resent-Message-Id: <$t.$i@$j>
347H?M?Message-Id: <$t.$i@$j>
f25ecb3d
EA
348#\f
349######################################################################
350######################################################################
351#####
352##### REWRITING RULES
353#####
354######################################################################
355######################################################################
356
da9b1c77 357undivert(9)dnl
f25ecb3d
EA
358
359###########################################
360### Rulset 3 -- Name Canonicalization ###
361###########################################
755e2424 362S3
f25ecb3d 363
d2fe4e9e 364# handle null input (translate to <@> special case)
66fe2d65 365R$@ $@ <@>
77e96a45 366
f25ecb3d 367# basic textual canonicalization -- note RFC733 heuristic here
0758279f 368R$*<$*>$*<$*>$* $2$3<$4>$5 strip multiple <> <>
4850f6e1 369R$*<$*<$+>$*>$* <$3>$5 2-level <> nesting
66fe2d65 370R$*<>$* $@ <@> MAIL FROM:<> case
f25ecb3d
EA
371R$*<$+>$* $2 basic RFC821/822 parsing
372
d2fe4e9e
EA
373# handle list:; syntax as special case
374R$*:;$* $@ $1 :; <@>
375
f25ecb3d 376# make sure <@a,@b,@c:user@d> syntax is easy to parse -- undone later
56ec6f89 377R@ $+ , $+ @ $1 : $2 change all "," to ":"
f25ecb3d
EA
378
379# localize and dispose of route-based addresses
f22970ed 380R@ $+ : $+ $@ $>96 < @$1 > : $2 handle <route-addr>
f25ecb3d
EA
381
382# find focus for list syntax
f22970ed 383R $+ : $* ; @ $+ $@ $>96 $1 : $2 ; < @ $3 > list syntax
56ec6f89 384R $+ : $* ; $@ $1 : $2; list syntax
f25ecb3d
EA
385
386# find focus for @ syntax addresses
56ec6f89
EA
387R$+ @ $+ $: $1 < @ $2 > focus on domain
388R$+ < $+ @ $+ > $1 $2 < @ $3 > move gaze right
f22970ed 389R$+ < @ $+ > $@ $>96 $1 < @ $2 > already canonical
f25ecb3d 390
d646efc4
EA
391# do some sanity checking
392R$* < @ $* : $* > $* $1 < @ $2 $3 > $4 nix colons in addrs
393
1429c39b
EA
394ifdef(`_NO_UUCP_', `dnl',
395`# convert old-style addresses to a domain-based address
f22970ed
EA
396R$- ! $+ $@ $>96 $2 < @ $1 .UUCP > resolve uucp names
397R$+ . $- ! $+ $@ $>96 $3 < @ $1 . $2 > domain uucps
398R$+ ! $+ $@ $>96 $2 < @ $1 .UUCP > uucp subdomains')
f25ecb3d
EA
399
400# if we have % signs, take the rightmost one
56ec6f89
EA
401R$* % $* $1 @ $2 First make them all @s.
402R$* @ $* @ $* $1 % $2 @ $3 Undo all but the last.
f22970ed 403R$* @ $* $@ $>96 $1 < @ $2 > Insert < > and finish
f25ecb3d
EA
404
405# else we must be a local name
406
407
576bbd75 408################################################
f22970ed 409### Ruleset 96 -- bottom half of ruleset 3 ###
576bbd75 410################################################
f25ecb3d 411
45eb1b8f 412# At this point, everything should be in a "local_part<@domain>extra" format.
f22970ed 413S96
f25ecb3d
EA
414
415# handle special cases for local names
89906048
EA
416R$* < @ localhost > $* $: $1 < @ $j . > $2 no domain at all
417R$* < @ localhost . $m > $* $: $1 < @ $j . > $2 local domain
418ifdef(`_NO_UUCP_', `dnl',
419`R$* < @ localhost . UUCP > $* $: $1 < @ $j . > $2 .UUCP domain')
e1beeb7d
EA
420R$* < @ [ $+ ] > $* $: $1 < @@ [ $2 ] > $3 mark [a.b.c.d]
421R$* < @@ $=w > $* $: $1 < @ $j . > $3 self-literal
1d9af8b4 422R$* < @@ $+ > $* $@ $1 < @ $2 > $3 canon IP addr
e653dde7 423ifdef(`DOMAIN_TABLE', `
4e973900
EA
424# look up domains in the domain table
425R$* < @ $+ > $* $: $1 < @ $(domaintable $2 $) > $3',
e653dde7 426`dnl')
dacf3c9f 427undivert(2)dnl
80961747 428
f5ade8ff
EA
429ifdef(`_NO_UUCP_', `dnl',
430`ifdef(`UUCP_RELAY',
1ab66980 431`# pass UUCP addresses straight through
9ee2219d 432R$* < @ $+ . UUCP > $* $@ $1 < @ $2 . UUCP . > $3',
1ab66980 433`# if really UUCP, handle it immediately
6f403f33 434ifdef(`_CLASS_U_',
9ee2219d 435`R$* < @ $=U . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl')
6f403f33 436ifdef(`_CLASS_V_',
9ee2219d 437`R$* < @ $=V . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl')
6f403f33 438ifdef(`_CLASS_W_',
9ee2219d 439`R$* < @ $=W . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl')
6f403f33 440ifdef(`_CLASS_X_',
9ee2219d 441`R$* < @ $=X . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl')
6f403f33 442ifdef(`_CLASS_Y_',
9ee2219d 443`R$* < @ $=Y . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl')
80961747
EA
444
445# try UUCP traffic as a local address
9ee2219d 446R$* < @ $+ . UUCP > $* $: $1 < @ $[ $2 $] . UUCP . > $3
f22970ed 447R$* < @ $+ . . UUCP . > $* $@ $1 < @ $2 . > $3')
f5ade8ff 448')
e0fe178c 449ifdef(`_NO_CANONIFY_', `dnl',
f5ade8ff 450`# pass to name server to make hostname canonical
ad8d5f97
EA
451R$* < @ $* $~P > $* $: $1 < @ $[ $2 $3 $] > $4')
452
e0fe178c
EA
453# local host aliases and pseudo-domains are always canonical
454R$* < @ $=w > $* $: $1 < @ $2 . > $3
9ee2219d 455R$* < @ $* $=P > $* $: $1 < @ $2 $3 . > $4
e0fe178c 456R$* < @ $* . . > $* $1 < @ $2 . > $3
9ee2219d 457
6f403f33
EA
458# if this is the local hostname, make sure we treat is as canonical
459R$* < @ $j > $* $: $1 < @ $j . > $2
f25ecb3d 460
f25ecb3d
EA
461
462##################################################
463### Ruleset 4 -- Final Output Post-rewriting ###
464##################################################
465S4
466
66fe2d65 467R$*<@> $@ $1 handle <> and list:;
f25ecb3d 468
6f403f33
EA
469# strip trailing dot off possibly canonical name
470R$* < @ $+ . > $* $1 < @ $2 > $3
f25ecb3d
EA
471
472# externalize local domain info
6f403f33
EA
473R$* < $+ > $* $1 $2 $3 defocus
474R@ $+ : @ $+ : $+ @ $1 , @ $2 : $3 <route-addr> canonical
9d6b5c00 475R@ $* $@ @ $1 ... and exit
f25ecb3d 476
1429c39b
EA
477ifdef(`_NO_UUCP_', `dnl',
478`# UUCP must always be presented in old form
479R$+ @ $- . UUCP $2!$1 u@h.UUCP => h!u')
f25ecb3d
EA
480
481# delete duplicate local names
6f403f33 482R$+ % $=w @ $=w $1 @ $j u%host@host => u@host
f25ecb3d
EA
483
484
485
576bbd75 486##############################################################
f22970ed 487### Ruleset 97 -- recanonicalize and call ruleset zero ###
576bbd75
EA
488### (used for recursive calls) ###
489##############################################################
f25ecb3d 490
f22970ed 491S`'97
f25ecb3d
EA
492R$* $: $>3 $1
493R$* $@ $>0 $1
494
495
496######################################
497### Ruleset 0 -- Parse Address ###
498######################################
499
500S0
501
39789777 502R<@> $#_LOCAL_ $: <@> special case error msgs
f3f4549f 503R$* : $* ; $#error $@ USAGE $: "list:; syntax illegal for recipient addresses"
2adfe5d6 504R<@ $+> $#error $@ USAGE $: "user address required"
39789777 505R$* <$* : $* > $* $#error $@ USAGE $: "colon illegal in host name part"
8395a858 506R$* < @ . > $* $#error $@ USAGE $: "invalid host name"
89d51ef0 507
56ec6f89
EA
508ifdef(`_MAILER_smtp_',
509`# handle numeric address spec
f22970ed 510R$* < @ [ $+ ] > $* $: $>98 $1 < @ [ $2 ] > $3 numeric internet spec
90307086 511R$* < @ [ $+ ] > $* $#_SMTP_ $@ [$2] $: $1 < @ [$2] > $3 still numeric: send',
d8ebcd49 512 `dnl')
f25ecb3d 513
5461a68b 514# now delete the local info -- note $=O to find characters that cause forwarding
f22970ed
EA
515R$* < @ > $* $@ $>97 $1 user@ => user
516R< @ $=w . > : $* $@ $>97 $2 @here:... -> ...
517R$* $=O $* < @ $=w . > $@ $>97 $1 $2 $3 ...@here -> ...
194df6ac
EA
518
519# handle local hacks
f22970ed 520R$* $: $>98 $1
f25ecb3d
EA
521
522# short circuit local delivery so forwarded email works
664ff353
EA
523R$* < @ $=w . > $: < $R @ $H > $1 < @ $2 . > if both relay & hub ...
524R<$+ @ $+ > $* < $+ > $: $>_SET_95_ < $H > $3 < $4 > ... send direct to hub
525R<$* @ $* > $* < $+ > $: $3 < $4 >
2664707d 526ifdef(`_LOCAL_NOT_STICKY_',
664ff353
EA
527`R$+ < @ $=w . > $#_LOCAL_ $: $1 dispose directly',
528`R$+ < @ $=w . > $: $>_SET_95_ < $H > $1 < @ $2 . > sticky local names
529R$+ < @ $=w . > $#_LOCAL_ $: @ $1 sticky local names')
755e2424
EA
530undivert(4)dnl
531
979297f9
EA
532ifdef(`_NO_UUCP_', `dnl',
533`# resolve remotely connected UUCP links (if any)
708a514b 534ifdef(`_CLASS_V_',
7d426e19 535`R$* < @ $=V . UUCP > $* $#smtp $@ $V $: @ $V : $1 @ $2.UUCP $3',
47523c33 536 `dnl')
708a514b 537ifdef(`_CLASS_W_',
7d426e19 538`R$* < @ $=W . UUCP > $* $#smtp $@ $W $: @ $W : $1 @ $2.UUCP $3',
47523c33 539 `dnl')
708a514b 540ifdef(`_CLASS_X_',
7d426e19 541`R$* < @ $=X . UUCP > $* $#smtp $@ $X $: @ $X : $1 @ $2.UUCP $3',
979297f9 542 `dnl')')
755e2424 543
f25ecb3d
EA
544# resolve fake top level domains by forwarding to other hosts
545ifdef(`BITNET_RELAY',
7d426e19 546`R$*<@$+.BITNET>$* $#smtp $@ $B $: $1 @ $2 . BITNET $3 user@host.BITNET',
7d426e19 547`R$*<@$+.CSNET>$* $#smtp $@ $C $: $1 @ $2 . CSNET $3 user@host.CSNET',
f25ecb3d 548 `dnl')
418602bc
EA
549ifdef(`_MAILER_pop_',
550`R$+ < @ POP. > $#pop $: $1 user@POP',
551 `dnl')
d2e7dfa9 552ifdef(`_MAILER_fax_',
9ee2219d 553`R$+ < @ $+ .FAX. > $#fax $@ $2 $: $1 user@host.FAX',
d2e7dfa9 554`ifdef(`FAX_RELAY',
7d426e19 555`R$*<@$+.FAX>$* $#smtp $@ $F $: $1 @ $2 . FAX $3 user@host.FAX',
d2e7dfa9 556 `dnl')')
f25ecb3d 557
755e2424
EA
558ifdef(`UUCP_RELAY',
559`# forward non-local UUCP traffic to our UUCP relay
7d426e19 560R$*<@$*.UUCP>$* $#smtp $@ $Y $: @ $Y : $1 @ $2.UUCP $3 uucp mail',
56ec6f89 561`ifdef(`_MAILER_uucp_',
755e2424 562`# forward other UUCP traffic straight to UUCP
7aa54c60 563R$* < @ $+ .UUCP. > $* $#uucp $@ $2 $: $1 < @ $2 .UUCP. > $3 user@host.UUCP',
755e2424 564 `dnl')')
194df6ac 565ifdef(`_MAILER_usenet_', `
e653dde7 566# addresses sent to net.group.USENET will get forwarded to a newsgroup
5adfff4e 567R$+ . USENET $#usenet $: $1',
3a5030a1 568 `dnl')
e653dde7 569
97dcbde7
EA
570ifdef(`_LOCAL_RULES_',
571`# figure out what should stay in our local mail system
7d426e19 572R$* < @ $* > $* $#smtp $@ $2 $: $1 @ $2 $3 user@host.domain')')
64100696 573# pass names that still have a host to a smarthost (if defined)
f22970ed 574R$* < @ $* > $* $: $>95 < $S > $1 < @ $2 > $3 glue on smarthost name
e653dde7 575
64100696 576# deal with other remote names
3bd9528c 577ifdef(`_MAILER_smtp_',
2c97939f 578`R$* < @$* > $* $#_SMTP_ $@ $2 $: $1 < @ $2 > $3 user@host.domain',
64100696 579`R$* < @$* > $* $#error $@NOHOST $: Unrecognized host name $2')
f25ecb3d 580
f22970ed 581# if this is quoted, strip the quotes and try again
ccfcf4aa 582R$+ $: $(dequote $1 $) strip quotes
f22970ed 583R$+ $=O $+ $@ $>97 $1 $2 $3 try again
ccfcf4aa
EA
584
585# handle locally delivered names
664ff353 586R$=L $: $>_SET_95_ < $H > $1 special local names
2c840221
EA
587R$=L $#_LOCAL_ $: @ $1 special local names
588R$+ $#_LOCAL_ $: $1 regular local names
6f403f33 589
56ec6f89
EA
590###########################################################################
591### Ruleset 5 -- special rewriting after aliases have been expanded ###
592### (new sendmail only) ###
593###########################################################################
f25ecb3d 594
6f403f33 595S5
f25ecb3d 596
f4d9c9f9
EA
597# if we have a "special dotted user", convert it back to the base name
598R$=D . * $#_LOCAL_ $: $1
599R$=D . $+ $#_LOCAL_ $: $1 . *
600
32014295 601# see if we have a relay or a hub
664ff353
EA
602R$+ $: $>_SET_95_ < $R > $1 try relay
603R$+ $: $>_SET_95_ < $H > $1 try hub')
bc09d8d3
EA
604ifdef(`MAILER_TABLE',
605`
606
d8ebcd49
EA
607###################################################################
608### Ruleset 90 -- try domain part of mailertable entry ###
609### (new sendmail only) ###
610###################################################################
bc09d8d3
EA
611
612S90
46977ce0
EA
613R<$*> <$- $+ > $* $: < $1 . $2 > < $3 > $4
614R<. $+ > $+ $: < $1 > $2
615R< $+ > < > $+ $: < $1 > < . > $2
616R<$*> < $+ > $* $: <$1> < $(mailertable $2 $@ $1 $) > $3 lookup
617R<$+> <$- : $+ > $* $# $2 $@ $3 $: $4 check -- resolved?
618R$* $: $>87 $1
619R<$+> < . $+ > $*<$*> $@ $>90 <$1> <$2> $3<$4> no -- strip & try again
620R$* $: $>88 $1
621R<$+> <$*> $* $@ $3 no match',
bc09d8d3 622`dnl')
d8ebcd49 623
feae130e 624###################################################################
f22970ed 625### Ruleset 95 -- canonify mailer:host syntax to triple ###
feae130e
EA
626###################################################################
627
f22970ed 628S95
feae130e
EA
629R< > $* $@ $1 strip off null relay
630R< $- : $+ > $* $# $1 $@ $2 $: $3 try qualified mailer
631R< $=w > $* $@ $2 delete local host
632R< $+ > $* $#_RELAY_ $@ $1 $: $2 use unqualified mailer
633
d8ebcd49 634###################################################################
f22970ed 635### Ruleset 98 -- local part of ruleset zero (can be null) ###
d8ebcd49
EA
636###################################################################
637
f22970ed 638S98
d8ebcd49 639undivert(3)dnl
f25ecb3d
EA
640#\f
641######################################################################
642######################################################################
643#####
ec174858 644`##### MAILER DEFINITIONS'
f25ecb3d
EA
645#####
646######################################################################
647######################################################################
f25ecb3d 648undivert(7)dnl