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