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