151222Sericdivert(-1) 251222Seric# 368840Seric# Copyright (c) 1983, 1995 Eric P. Allman 463592Sbostic# Copyright (c) 1988, 1993 563592Sbostic# The Regents of the University of California. All rights reserved. 651222Seric# 751222Seric# %sccs.include.redist.sh% 851222Seric# 951222Sericdivert(0) 1051222Seric 11*69215SericVERSIONID(`@(#)proto.m4 8.71 (Berkeley) 05/04/95') 1251222Seric 1351322SericMAILER(local)dnl 1451222Seric 1567696Seric# level 6 config file format 1668651SericV6/Berkeley 1768651Sericdivert(-1) 1868651Seric 1968830Seric# do some sanity checking 2068830Sericifdef(`__OSTYPE__',, 2168830Seric `errprint(`*** ERROR: No system type defined (use OSTYPE macro)')') 2268830Seric 2368651Seric# pick our default mailers 2468651Sericifdef(`confSMTP_MAILER',, `define(`confSMTP_MAILER', `smtp')') 2568651Sericifdef(`confLOCAL_MAILER',, `define(`confLOCAL_MAILER', `local')') 2664010Sericifdef(`confRELAY_MAILER',, 2764010Seric `define(`confRELAY_MAILER', 2864010Seric `ifdef(`_MAILER_smtp_', `relay', 2968651Seric `ifdef(`_MAILER_uucp', `suucp', `unknown')')')') 3063998Sericdefine(`_SMTP_', `confSMTP_MAILER')dnl for readability only 3163998Sericdefine(`_LOCAL_', `confLOCAL_MAILER')dnl for readability only 3264010Sericdefine(`_RELAY_', `confRELAY_MAILER')dnl for readability only 3352646Seric 3468651Seric# back compatibility with old config files 3568651Sericifdef(`confDEF_GROUP_ID', 3668651Seric `errprint(`*** confDEF_GROUP_ID is obsolete.') 3768651Seric errprint(` Use confDEF_USER_ID with a colon in the value instead.')') 3868651Sericifdef(`confREAD_TIMEOUT', 3968651Seric `errprint(`*** confREAD_TIMEOUT is obsolete.') 4068651Seric errprint(` Use individual confTO_<timeout> parameters instead.')') 4168651Sericifdef(`confMESSAGE_TIMEOUT', 4268651Seric `define(`_ARG_', index(confMESSAGE_TIMEOUT, /)) 4368651Seric ifelse(_ARG_, -1, 4468651Seric `define(`confTO_QUEUERETURN', confMESSAGE_TIMEOUT)', 4568651Seric `define(`confTO_QUEUERETURN', 4668651Seric substr(confMESSAGE_TIMEOUT, 0, _ARG_)) 4768651Seric define(`confTO_QUEUEWARN', 4868651Seric substr(confMESSAGE_TIMEOUT, eval(_ARG_+1)))')') 4968651Sericifdef(`confMIN_FREE_BLOCKS', `ifelse(index(confMIN_FREE_BLOCKS, /), -1,, 5068651Seric `errprint(`*** compound confMIN_FREE_BLOCKS is obsolete.') 5168651Seric errprint(` Use confMAX_MESSAGE_SIZE for the second part of the value.')')') 5268651Seric 5368651Seric# clean option definitions below.... 5468651Sericdefine(`_OPTION', `ifdef(`$2', `O $1=$2', `#O $1`'ifelse($3, `',, `=$3')')')dnl 5568651Seric 5668651Sericdivert(0)dnl 5768651Seric 5851222Seric################## 5951222Seric# local info # 6051222Seric################## 6151222Seric 6251889SericCwlocalhost 6351887Sericifdef(`USE_CW_FILE', 6451889Seric`# file containing names of hosts for which we receive email 6564033SericFw`'confCW_FILE', 6664033Seric `dnl') 6768651Seric 6864321Seric# my official domain name 6968651Seric# ... define this only if sendmail cannot automatically determine your domain 7068651Sericifdef(`confDOMAIN_NAME', `Dj`'confDOMAIN_NAME', `#Dj$w.Foo.COM') 7151222Seric 7268651Sericifdef(`_NULL_CLIENT_ONLY_', `divert(-1)')dnl 7364321Seric 7464321SericCP. 7564321Seric 7651222Sericifdef(`UUCP_RELAY', 7751222Seric`# UUCP relay host 7864033SericDY`'UUCP_RELAY 7960212SericCPUUCP 8057944Seric 8151222Seric')dnl 8251222Sericifdef(`BITNET_RELAY', 8351222Seric`# BITNET relay host 8464033SericDB`'BITNET_RELAY 8560212SericCPBITNET 8657944Seric 8751222Seric')dnl 8858364Sericifdef(`FAX_RELAY', 8958364Seric`# FAX relay host 9064033SericDF`'FAX_RELAY 9160212SericCPFAX 9258364Seric 9358364Seric')dnl 9464321Seric# "Smart" relay host (may be null) 9564321SericDS`'ifdef(`SMART_HOST', SMART_HOST) 9651222Seric 9767914Sericifdef(`LUSER_RELAY', 9867914Seric`# place to which unknown users should be forwarded 9967914SericKuser user -m -a<> 10067914SericDL`'LUSER_RELAY 10167914Seric', `dnl') 10267914Seric 10368651Seric# operators that cannot be in local usernames (i.e., network indicators) 10468651SericCO @ % ifdef(`_NO_UUCP_', `', `!') 10568651Seric 10668651Seric# a class with just dot (for identifying canonical names) 10768651SericC.. 10868651Seric 10958781Sericifdef(`MAILER_TABLE', 11058781Seric`# Mailer table (overriding domains) 11158781SericKmailertable MAILER_TABLE 11258781Seric 11358781Seric')dnl 11463754Sericifdef(`DOMAIN_TABLE', 11563754Seric`# Domain table (adding domains) 11663754SericKdomaintable DOMAIN_TABLE 11763754Seric 11863754Seric')dnl 11951222Seric# who I send unqualified names to (null means deliver locally) 12064033SericDR`'ifdef(`LOCAL_RELAY', LOCAL_RELAY) 12151222Seric 12257527Seric# who gets all local email traffic ($R has precedence for unqualified names) 12364033SericDH`'ifdef(`MAIL_HUB', MAIL_HUB) 12457527Seric 12557245Seric# class L: names that should be delivered locally, even if we have a relay 12657245Seric# class E: names that should be exposed as from this host, even if we masquerade 12767538Seric# class D: dotted names, e.g., root.machinename 12867538Seric#CL root 12967538SericCE root 13051279Sericundivert(5)dnl 13167538Sericifdef(`__DOTTED_USER_LIST__', 13267538Seric `__DOTTED_USER_LIST__', 13367538Seric `#CD postmaster') 13451279Seric 13567469Seric# dequoting map 13667469SericKdequote dequote 13757944Seric 13868651Sericdivert(0)dnl 13968651Seric# who I masquerade as (null for no masquerading) 14068651SericDM`'ifdef(`MASQUERADE_NAME', MASQUERADE_NAME) 14168651Seric 14259033Sericundivert(6)dnl 14359033Seric 14457944Seric###################### 14557944Seric# Special macros # 14657944Seric###################### 14757944Seric 14857944Seric# SMTP initial login message 14964033SericDe`'confSMTP_LOGIN_MSG 15057944Seric 15157944Seric# UNIX initial From header format 15264033SericDl`'confFROM_LINE 15357944Seric 15457944Seric# my name for error messages 15564033SericDn`'confMAILER_NAME 15657944Seric 15757944Seric# delimiter (operator) characters 15864033SericDo`'confOPERATORS 15957944Seric 16057944Seric# format of a total name 16167538SericDq`'ifdef(`confFROM_HEADER', confFROM_HEADER, `$?x$x <$g>$|$g$.') 16257944Sericinclude(`../m4/version.m4') 16357944Seric 16457944Seric############### 16557944Seric# Options # 16657944Seric############### 16757944Seric 16859887Seric# strip message body to 7 bits on input? 16968651Seric_OPTION(SevenBitInput, `confSEVEN_BIT_INPUT') 17057944Seric 17167550Seric# 8-bit data handling 17268651Seric_OPTION(EightBitMode, `confEIGHT_BIT_HANDLING', adaptive) 17367550Seric 17468651Seric# wait for alias file rebuild (default units: minutes) 17568651Seric_OPTION(AliasWait, `confALIAS_WAIT', 5m) 17657944Seric 17757944Seric# location of alias file 17868651SericO AliasFile=ifdef(`ALIAS_FILE', `ALIAS_FILE', /etc/aliases) 17957944Seric 18058084Seric# minimum number of free blocks on filesystem 18168651Seric_OPTION(MinFreeBlocks, `confMIN_FREE_BLOCKS', 100) 18258084Seric 18368651Seric# maximum message size 18468651Seric_OPTION(MaxMessageSize, `confMAX_MESSAGE_SIZE', 1000000) 18568651Seric 18657944Seric# substitution for space (blank) characters 18768651Seric_OPTION(BlankSub, `confBLANK_SUB', _) 18857944Seric 18965618Seric# avoid connecting to "expensive" mailers on initial submission? 19068651Seric_OPTION(HoldExpensive, `confCON_EXPENSIVE') 19157944Seric 19257944Seric# checkpoint queue runs after every N successful deliveries 19368651Seric_OPTION(CheckpointInterval, `confCHECKPOINT_INTERVAL', 10) 19457944Seric 19557944Seric# default delivery mode 19668651Seric_OPTION(DeliveryMode, `confDELIVERY_MODE', background) 19757944Seric 19857944Seric# automatically rebuild the alias database? 19968651Seric_OPTION(AutoRebuildAliases, `confAUTO_REBUILD') 20057944Seric 20164033Seric# error message header/file 20268651Seric_OPTION(ErrorHeader, `confERROR_MESSAGE', /etc/sendmail.oE) 20357944Seric 20457944Seric# error mode 20568651Seric_OPTION(ErrorMode, `confERROR_MODE', print) 20657944Seric 20757944Seric# save Unix-style "From_" lines at top of header? 20868651Seric_OPTION(SaveFromLine, `confSAVE_FROM_LINES') 20957944Seric 21057944Seric# temporary file mode 21168651Seric_OPTION(TempFileMode, `confTEMP_FILE_MODE', 0600) 21257944Seric 21357944Seric# match recipients against GECOS field? 21468651Seric_OPTION(MatchGECOS, `confMATCH_GECOS') 21557944Seric 21657944Seric# maximum hop count 21768651Seric_OPTION(MaxHopCount, `confMAX_HOP', 17) 21857944Seric 21957944Seric# location of help file 22068651SericO HelpFile=ifdef(`HELP_FILE', HELP_FILE, /usr/lib/sendmail.hf) 22157944Seric 22257944Seric# ignore dots as terminators in incoming messages? 22368651Seric_OPTION(IgnoreDots, `confIGNORE_DOTS') 22457944Seric 22568651Seric# name resolver options 22668651Seric_OPTION(ResolverOptions, `confBIND_OPTS', +AAONLY) 22757944Seric 22859887Seric# deliver MIME-encapsulated error messages? 22968651Seric_OPTION(SendMimeErrors, `confMIME_FORMAT_ERRORS') 23059887Seric 23157944Seric# Forward file search path 23268651Seric_OPTION(ForwardPath, `confFORWARD_PATH', /var/forward/$u:$z/.forward.$w:$z/.forward) 23357944Seric 23457944Seric# open connection cache size 23568651Seric_OPTION(ConnectionCacheSize, `confMCI_CACHE_SIZE', 2) 23657944Seric 23757944Seric# open connection cache timeout 23868651Seric_OPTION(ConnectionCacheTimeout, `confMCI_CACHE_TIMEOUT', 5m) 23957944Seric 24061106Seric# use Errors-To: header? 24168651Seric_OPTION(UseErrorsTo, `confUSE_ERRORS_TO') 24261106Seric 24357944Seric# log level 24468651Seric_OPTION(LogLevel, `confLOG_LEVEL', 10) 24557944Seric 24657944Seric# send to me too, even in an alias expansion? 24768651Seric_OPTION(MeToo, `confME_TOO') 24857944Seric 24957944Seric# verify RHS in newaliases? 25068651Seric_OPTION(CheckAliases, `confCHECK_ALIASES') 25157944Seric 25257944Seric# default messages to old style headers if no special punctuation? 25368651Seric_OPTION(OldStyleHeaders, `confOLD_STYLE_HEADERS') 25457944Seric 25558860Seric# SMTP daemon options 25668651Seric_OPTION(DaemonPortOptions, `confDAEMON_OPTIONS', Port=esmtp) 25758860Seric 25858084Seric# privacy flags 25968651Seric_OPTION(PrivacyOptions, `confPRIVACY_FLAGS', authwarnings) 26058084Seric 26157944Seric# who (if anyone) should get extra copies of error messages 26268651Seric_OPTION(PostMasterCopy, `confCOPY_ERRORS_TO', Postmaster) 26357944Seric 26457944Seric# slope of queue-only function 26568651Seric_OPTION(QueueFactor, `confQUEUE_FACTOR', 600000) 26657944Seric 26757944Seric# queue directory 26868651SericO QueueDirectory=ifdef(`QUEUE_DIR', QUEUE_DIR, /var/spool/mqueue) 26957944Seric 27068651Seric# timeouts (many of these) 27168651Seric_OPTION(Timeout.initial, `confTO_INITIAL', 5m) 27268651Seric_OPTION(Timeout.helo, `confTO_HELO', 5m) 27368651Seric_OPTION(Timeout.mail, `confTO_MAIL', 10m) 27468651Seric_OPTION(Timeout.rcpt, `confTO_RCPT', 1h) 27568651Seric_OPTION(Timeout.datainit, `confTO_DATAINIT', 5m) 27668651Seric_OPTION(Timeout.datablock, `confTO_DATABLOCK', 1h) 27768651Seric_OPTION(Timeout.datafinal, `confTO_DATAFINAL', 1h) 27868651Seric_OPTION(Timeout.rset, `confTO_RSET', 5m) 27968651Seric_OPTION(Timeout.quit, `confTO_QUIT', 2m) 28068651Seric_OPTION(Timeout.misc, `confTO_MISC', 2m) 28168651Seric_OPTION(Timeout.command, `confTO_COMMAND', 1h) 28268651Seric_OPTION(Timeout.ident, `confTO_IDENT', 30s) 28368651Seric_OPTION(Timeout.fileopen, `confTO_FILEOPEN', 60s) 28468651Seric_OPTION(Timeout.queuereturn, `confTO_QUEUERETURN', 5d) 28568651Seric_OPTION(Timeout.queuereturn.normal, `confTO_QUEUERETURN_NORMAL', 5d) 28668651Seric_OPTION(Timeout.queuereturn.urgent, `confTO_QUEUERETURN_URGENT', 2d) 28768651Seric_OPTION(Timeout.queuereturn.non-urgent, `confTO_QUEUERETURN_NONURGENT', 7d) 28868651Seric_OPTION(Timeout.queuewarn, `confTO_QUEUEWARN', 4h) 28968651Seric_OPTION(Timeout.queuewarn.normal, `confTO_QUEUEWARN_NORMAL', 4h) 29068651Seric_OPTION(Timeout.queuewarn.urgent, `confTO_QUEUEWARN_URGENT', 1h) 29168651Seric_OPTION(Timeout.queuewarn.non-urgent, `confTO_QUEUEWARN_NONURGENT', 12h) 29257944Seric 29367810Seric# should we not prune routes in route-addr syntax addresses? 29468651Seric_OPTION(DontPruneRoutes, `confDONT_PRUNE_ROUTES') 29567810Seric 29657944Seric# queue up everything before forking? 29768651Seric_OPTION(SuperSafe, `confSAFE_QUEUE') 29857944Seric 29957944Seric# status file 30068651Seric_OPTION(StatusFile, `STATUS_FILE', /etc/sendmail.st) 30157944Seric 30257944Seric# time zone handling: 30357944Seric# if undefined, use system default 30457944Seric# if defined but null, use TZ envariable passed in 30557944Seric# if defined and non-null, use that info 30668651Sericifelse(confTIME_ZONE, `USE_SYSTEM', `#O TimeZoneSpec=', 30768651Seric confTIME_ZONE, `USE_TZ', `O TimeZoneSpec=', 30868651Seric `O TimeZoneSpec=confTIME_ZONE') 30957944Seric 31068651Seric# default UID (can be username or userid:groupid) 31168651Seric_OPTION(DefaultUser, `confDEF_USER_ID', nobody) 31257944Seric 31351887Seric# list of locations of user database file (null means no lookup) 31468651Seric_OPTION(UserDatabaseSpec, `confUSERDB_SPEC', /etc/userdb) 31551222Seric 31658860Seric# fallback MX host 31768651Seric_OPTION(FallbackMXhost, `confFALLBACK_MX', fall.back.host.net) 31858860Seric 31963858Seric# if we are the best MX host for a site, try it directly instead of config err 32068651Seric_OPTION(TryNullMXList, `confTRY_NULL_MX_LIST') 32163858Seric 32257944Seric# load average at which we just queue messages 32368651Seric_OPTION(QueueLA, `confQUEUE_LA', 8) 32457944Seric 32557944Seric# load average at which we refuse connections 32668651Seric_OPTION(RefuseLA, `confREFUSE_LA', 12) 32757944Seric 32857944Seric# work recipient factor 32968651Seric_OPTION(RecipientFactor, `confWORK_RECIPIENT_FACTOR', 30000) 33057944Seric 33157944Seric# deliver each queued job in a separate process? 33268651Seric_OPTION(ForkEachJob, `confSEPARATE_PROC') 33357944Seric 33457944Seric# work class factor 33568651Seric_OPTION(ClassFactor, `confWORK_CLASS_FACTOR', 1800) 33657944Seric 33757944Seric# work time factor 33868651Seric_OPTION(RetryFactor, `confWORK_TIME_FACTOR', 90000) 33957944Seric 34067697Seric# shall we sort the queue by hostname first? 34168651Seric_OPTION(QueueSortOrder, `confQUEUE_SORT_ORDER', priority) 34267697Seric 34368651Seric# minimum time in queue before retry 34468651Seric_OPTION(MinQueueAge, `confMIN_QUEUE_AGE', 30m) 34568651Seric 34668651Seric# default character set 34768651Seric_OPTION(DefaultCharSet, `confDEF_CHAR_SET', iso-8859-1) 34868651Seric 34968651Seric# service switch file (ignored on Solaris, Ultrix, OSF/1, others) 35068651Seric_OPTION(ServiceSwitchFile, `confSERVICE_SWITCH_FILE', /etc/service.switch) 35168651Seric 35268651Seric# dialup line delay on connection failure 35368651Seric_OPTION(DialDelay, `confDIAL_DELAY', 10s) 35468651Seric 35568651Seric# action to take if there are no recipients in the message 35668651Seric_OPTION(NoRecipientAction, `confNO_RCPT_ACTION', add-to-undisclosed) 35768651Seric 35868651Seric# chrooted environment for writing to files 35968651Seric_OPTION(SafeFileEnvironment, `confSAFE_FILE_ENV', /arch) 36068651Seric 36168806Seric# are colons OK in addresses? 36268806Seric_OPTION(ColonOkInAddr, `confCOLON_OK_IN_ADDR') 36368806Seric 36457944Seric########################### 36557944Seric# Message precedences # 36657944Seric########################### 36757944Seric 36857944SericPfirst-class=0 36957944SericPspecial-delivery=100 37058070SericPlist=-30 37157944SericPbulk=-60 37257944SericPjunk=-100 37357944Seric 37457944Seric##################### 37557944Seric# Trusted users # 37657944Seric##################### 37757944Seric 37868651Seric# this is equivalent to setting class "t" 37968651Seric#Ft/etc/sendmail.trusted 38057944SericTroot 38157944SericTdaemon 38257944SericTuucp 38357944Seric 38457944Seric######################### 38557944Seric# Format of headers # 38657944Seric######################### 38757944Seric 38858679SericH?P?Return-Path: $g 38967819SericHReceived: confRECEIVED_HEADER 39057944SericH?D?Resent-Date: $a 39157944SericH?D?Date: $a 39257944SericH?F?Resent-From: $q 39357944SericH?F?From: $q 39457944SericH?x?Full-Name: $x 39557944SericHSubject: 39657944Seric# HPosted-Date: $a 39757944Seric# H?l?Received-Date: $b 39857944SericH?M?Resent-Message-Id: <$t.$i@$j> 39957944SericH?M?Message-Id: <$t.$i@$j> 40068651Sericifdef(`_NULL_CLIENT_ONLY_', 40168651Seric `include(../m4/nullrelay.m4)m4exit', 40268651Seric `dnl') 40351222Seric# 40451222Seric###################################################################### 40551222Seric###################################################################### 40651222Seric##### 40751222Seric##### REWRITING RULES 40851222Seric##### 40951222Seric###################################################################### 41051222Seric###################################################################### 41151222Seric 41258678Sericundivert(9)dnl 41351222Seric 41451222Seric########################################### 41551222Seric### Rulset 3 -- Name Canonicalization ### 41651222Seric########################################### 41751260SericS3 41851222Seric 41964802Seric# handle null input (translate to <@> special case) 42058499SericR$@ $@ <@> 42158174Seric 42268763Seric# strip group: syntax (not inside angle brackets!) and trailing semicolon 42368763SericR$* $: $1 <@> mark addresses 42468763SericR$* < $* > $* <@> $: $1 < $2 > $3 unmark <addr> 42568763SericR$* :: $* <@> $: $1 :: $2 unmark host::addr 426*69215SericR:include: $* <@> $: :include: $1 unmark :include:... 42768763SericR$* : $* <@> $: $2 strip colon if marked 42868763SericR$* <@> $: $1 unmark 42968763SericR$* ; $: $1 strip trailing semi 43068763Seric 43168763Seric# null input now results from list:; syntax 43268763SericR$@ $@ :; <@> 43368763Seric 43451222Seric# basic textual canonicalization -- note RFC733 heuristic here 43564144SericR$*<$*>$*<$*>$* $2$3<$4>$5 strip multiple <> <> 43658158SericR$*<$*<$+>$*>$* <$3>$5 2-level <> nesting 43758499SericR$*<>$* $@ <@> MAIL FROM:<> case 43851222SericR$*<$+>$* $2 basic RFC821/822 parsing 43951222Seric 44051222Seric# make sure <@a,@b,@c:user@d> syntax is easy to parse -- undone later 44155416SericR@ $+ , $+ @ $1 : $2 change all "," to ":" 44251222Seric 44351222Seric# localize and dispose of route-based addresses 44467469SericR@ $+ : $+ $@ $>96 < @$1 > : $2 handle <route-addr> 44551222Seric 44651222Seric# find focus for list syntax 44767469SericR $+ : $* ; @ $+ $@ $>96 $1 : $2 ; < @ $3 > list syntax 44855416SericR $+ : $* ; $@ $1 : $2; list syntax 44951222Seric 45051222Seric# find focus for @ syntax addresses 45155416SericR$+ @ $+ $: $1 < @ $2 > focus on domain 45255416SericR$+ < $+ @ $+ > $1 $2 < @ $3 > move gaze right 45367469SericR$+ < @ $+ > $@ $>96 $1 < @ $2 > already canonical 45451222Seric 45564968Seric# do some sanity checking 45664968SericR$* < @ $* : $* > $* $1 < @ $2 $3 > $4 nix colons in addrs 45764968Seric 45858288Sericifdef(`_NO_UUCP_', `dnl', 45958288Seric`# convert old-style addresses to a domain-based address 46067469SericR$- ! $+ $@ $>96 $2 < @ $1 .UUCP > resolve uucp names 46167469SericR$+ . $- ! $+ $@ $>96 $3 < @ $1 . $2 > domain uucps 46267469SericR$+ ! $+ $@ $>96 $2 < @ $1 .UUCP > uucp subdomains') 46351222Seric 46451222Seric# if we have % signs, take the rightmost one 46555416SericR$* % $* $1 @ $2 First make them all @s. 46655416SericR$* @ $* @ $* $1 % $2 @ $3 Undo all but the last. 46767469SericR$* @ $* $@ $>96 $1 < @ $2 > Insert < > and finish 46851222Seric 46951222Seric# else we must be a local name 47051222Seric 47151222Seric 47260894Seric################################################ 47367469Seric### Ruleset 96 -- bottom half of ruleset 3 ### 47460894Seric################################################ 47551222Seric 47657245Seric# At this point, everything should be in a "local_part<@domain>extra" format. 47767469SericS96 47851222Seric 47951222Seric# handle special cases for local names 48060262SericR$* < @ localhost > $* $: $1 < @ $j . > $2 no domain at all 48160262SericR$* < @ localhost . $m > $* $: $1 < @ $j . > $2 local domain 48260262Sericifdef(`_NO_UUCP_', `dnl', 48360262Seric`R$* < @ localhost . UUCP > $* $: $1 < @ $j . > $2 .UUCP domain') 48465825SericR$* < @ [ $+ ] > $* $: $1 < @@ [ $2 ] > $3 mark [a.b.c.d] 48565825SericR$* < @@ $=w > $* $: $1 < @ $j . > $3 self-literal 48666306SericR$* < @@ $+ > $* $@ $1 < @ $2 > $3 canon IP addr 48763754Sericifdef(`DOMAIN_TABLE', ` 48867450Seric# look up domains in the domain table 48967450SericR$* < @ $+ > $* $: $1 < @ $(domaintable $2 $) > $3', 49063754Seric`dnl') 49151889Sericundivert(2)dnl 49251222Seric 49359081Sericifdef(`_NO_UUCP_', `dnl', 49459081Seric`ifdef(`UUCP_RELAY', 49551274Seric`# pass UUCP addresses straight through 49664971SericR$* < @ $+ . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', 49751274Seric`# if really UUCP, handle it immediately 49851322Sericifdef(`_CLASS_U_', 49964971Seric`R$* < @ $=U . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') 50051322Sericifdef(`_CLASS_V_', 50164971Seric`R$* < @ $=V . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') 50251322Sericifdef(`_CLASS_W_', 50364971Seric`R$* < @ $=W . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') 50451322Sericifdef(`_CLASS_X_', 50564971Seric`R$* < @ $=X . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') 50651322Sericifdef(`_CLASS_Y_', 50764971Seric`R$* < @ $=Y . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') 50851267Seric 50951267Seric# try UUCP traffic as a local address 51064971SericR$* < @ $+ . UUCP > $* $: $1 < @ $[ $2 $] . UUCP . > $3 51167469SericR$* < @ $+ . . UUCP . > $* $@ $1 < @ $2 . > $3') 51259081Seric') 51365061Sericifdef(`_NO_CANONIFY_', `dnl', 51459081Seric`# pass to name server to make hostname canonical 51561470SericR$* < @ $* $~P > $* $: $1 < @ $[ $2 $3 $] > $4') 51661470Seric 51765061Seric# local host aliases and pseudo-domains are always canonical 51865061SericR$* < @ $=w > $* $: $1 < @ $2 . > $3 51964971SericR$* < @ $* $=P > $* $: $1 < @ $2 $3 . > $4 52065061SericR$* < @ $* . . > $* $1 < @ $2 . > $3 52164971Seric 52251322Seric# if this is the local hostname, make sure we treat is as canonical 52351322SericR$* < @ $j > $* $: $1 < @ $j . > $2 52451222Seric 52551322Seric 52651222Seric################################################## 52751222Seric### Ruleset 4 -- Final Output Post-rewriting ### 52851222Seric################################################## 52951222SericS4 53051222Seric 531*69215SericR$* <@> $@ handle <> and list:; 53251222Seric 53351322Seric# strip trailing dot off possibly canonical name 53451322SericR$* < @ $+ . > $* $1 < @ $2 > $3 53551322Seric 53651222Seric# externalize local domain info 53751322SericR$* < $+ > $* $1 $2 $3 defocus 53851322SericR@ $+ : @ $+ : $+ @ $1 , @ $2 : $3 <route-addr> canonical 53951997SericR@ $* $@ @ $1 ... and exit 54051222Seric 54158288Sericifdef(`_NO_UUCP_', `dnl', 54258288Seric`# UUCP must always be presented in old form 54358288SericR$+ @ $- . UUCP $2!$1 u@h.UUCP => h!u') 54451222Seric 54551222Seric# delete duplicate local names 54651322SericR$+ % $=w @ $=w $1 @ $j u%host@host => u@host 54751222Seric 54851222Seric 54951222Seric 55060894Seric############################################################## 55167469Seric### Ruleset 97 -- recanonicalize and call ruleset zero ### 55260894Seric### (used for recursive calls) ### 55360894Seric############################################################## 55451222Seric 55567469SericS`'97 55651222SericR$* $: $>3 $1 55751222SericR$* $@ $>0 $1 55851222Seric 55951222Seric 56051222Seric###################################### 56151222Seric### Ruleset 0 -- Parse Address ### 56251222Seric###################################### 56351222Seric 56451222SericS0 56551222Seric 56667118SericR<@> $#_LOCAL_ $: <@> special case error msgs 56768852SericR$* : $* ; <@> $#error $@ 5.1.3 $: "list:; syntax illegal for recipient addresses" 56868852SericR<@ $+> $#error $@ 5.1.1 $: "user address required" 56968852SericR$* <$* : $* > $* $#error $@ 5.1.1 $: "colon illegal in host name part" 57068852SericR$* < @ . > $* $#error $@ 5.1.2 $: "invalid host name" 57158340Seric 57255416Sericifdef(`_MAILER_smtp_', 57355416Seric`# handle numeric address spec 57467469SericR$* < @ [ $+ ] > $* $: $>98 $1 < @ [ $2 ] > $3 numeric internet spec 57565191SericR$* < @ [ $+ ] > $* $#_SMTP_ $@ [$2] $: $1 < @ [$2] > $3 still numeric: send', 57663858Seric `dnl') 57751222Seric 57851887Seric# now delete the local info -- note $=O to find characters that cause forwarding 57967469SericR$* < @ > $* $@ $>97 $1 user@ => user 58067469SericR< @ $=w . > : $* $@ $>97 $2 @here:... -> ... 58167469SericR$* $=O $* < @ $=w . > $@ $>97 $1 $2 $3 ...@here -> ... 58263967Seric 58363967Seric# handle local hacks 58467469SericR$* $: $>98 $1 58566048Seric 58666048Seric# short circuit local delivery so forwarded email works 58767914Sericifdef(`_STICKY_LOCAL_DOMAIN_', 58867914Seric`R$+ < @ $=w . > $: < $H > $1 < @ $2 . > first try hub 58968698SericR< $+ > $+ < $+ > $>95 < $1 > $2 < $3 > yep .... 59067914SericR< > $=D . $+ < $+ > $#_LOCAL_ $: $1 . $2 dotted name? 59168155SericR< > $+ + $* < $+ > $#_LOCAL_ $: $1 + $2 plussed name? 59267914SericR< > $+ < $+ > $#_LOCAL_ $: @ $1 nope, local address', 59368698Seric`R$=L < @ $=w . > $#_LOCAL_ $: @ $1 special local names 59468155SericR$+ < @ $=w . > $#_LOCAL_ $: $1 regular local name') 59566090Sericifdef(`MAILER_TABLE', 59666090Seric` 59766090Seric# not local -- try mailer table lookup 59866090SericR$* <@ $+ > $* $: < $2 > $1 < @ $2 > $3 extract host name 59966090SericR< $+ . > $* $: < $1 > $2 strip trailing dot 60066090SericR< $+ > $* $: < $(mailertable $1 $) > $2 lookup 60166090SericR< $- : $+ > $* $# $1 $@ $2 $: $3 check -- resolved? 60266090SericR< $+ > $* $: $>90 <$1> $2 try domain', 60366090Seric`dnl') 60451260Sericundivert(4)dnl 60551260Seric 60661468Sericifdef(`_NO_UUCP_', `dnl', 60761468Seric`# resolve remotely connected UUCP links (if any) 60851285Sericifdef(`_CLASS_V_', 60967469Seric`R$* < @ $=V . UUCP . > $* $: $>95 < $V > $1 <@$2.UUCP.> $3', 61052044Seric `dnl') 61151285Sericifdef(`_CLASS_W_', 61267469Seric`R$* < @ $=W . UUCP . > $* $: $>95 < $W > $1 <@$2.UUCP.> $3', 61352044Seric `dnl') 61451285Sericifdef(`_CLASS_X_', 61567469Seric`R$* < @ $=X . UUCP . > $* $: $>95 < $X > $1 <@$2.UUCP.> $3', 61661468Seric `dnl')') 61751260Seric 61851222Seric# resolve fake top level domains by forwarding to other hosts 61951222Sericifdef(`BITNET_RELAY', 62067469Seric`R$*<@$+.BITNET.>$* $: $>95 < $B > $1 <@$2.BITNET.> $3 user@host.BITNET', 62151222Seric `dnl') 62265149Sericifdef(`_MAILER_pop_', 62365149Seric`R$+ < @ POP. > $#pop $: $1 user@POP', 62465149Seric `dnl') 62558364Sericifdef(`_MAILER_fax_', 62664971Seric`R$+ < @ $+ .FAX. > $#fax $@ $2 $: $1 user@host.FAX', 62758364Seric`ifdef(`FAX_RELAY', 62867469Seric`R$*<@$+.FAX.>$* $: $>95 < $F > $1 <@$2.FAX.> $3 user@host.FAX', 62958364Seric `dnl')') 63051222Seric 63151260Sericifdef(`UUCP_RELAY', 63251260Seric`# forward non-local UUCP traffic to our UUCP relay 63367469SericR$*<@$*.UUCP.>$* $: $>95 < $Y > $1 <@$2.UUCP.> $3 uucp mail', 63455416Seric`ifdef(`_MAILER_uucp_', 63551260Seric`# forward other UUCP traffic straight to UUCP 63665557SericR$* < @ $+ .UUCP. > $* $#uucp $@ $2 $: $1 < @ $2 .UUCP. > $3 user@host.UUCP', 63751260Seric `dnl')') 63863967Sericifdef(`_MAILER_usenet_', ` 63963754Seric# addresses sent to net.group.USENET will get forwarded to a newsgroup 64065851SericR$+ . USENET $#usenet $: $1', 64163860Seric `dnl') 64263754Seric 64358070Sericifdef(`_LOCAL_RULES_', 64458070Seric`# figure out what should stay in our local mail system 64563754Sericundivert(1)', `dnl') 64663754Seric 64764321Seric# pass names that still have a host to a smarthost (if defined) 64867469SericR$* < @ $* > $* $: $>95 < $S > $1 < @ $2 > $3 glue on smarthost name 64963754Seric 65064321Seric# deal with other remote names 65163946Sericifdef(`_MAILER_smtp_', 65263973Seric`R$* < @$* > $* $#_SMTP_ $@ $2 $: $1 < @ $2 > $3 user@host.domain', 65368852Seric`R$* < @$* > $* $#error $@ 5.1.2 $: Unrecognized host name $2') 65451222Seric 65567469Seric# if this is quoted, strip the quotes and try again 65658811SericR$+ $: $(dequote $1 $) strip quotes 65767469SericR$+ $=O $+ $@ $>97 $1 $2 $3 try again 65858811Seric 65958811Seric# handle locally delivered names 66063998SericR$=L $#_LOCAL_ $: @ $1 special local names 66163998SericR$+ $#_LOCAL_ $: $1 regular local names 66251222Seric 66355416Seric########################################################################### 66455416Seric### Ruleset 5 -- special rewriting after aliases have been expanded ### 66555416Seric########################################################################### 66651222Seric 66751322SericS5 66851322Seric 66967538Seric# if we have a "special dotted user", convert it back to the base name 67067538SericR$=D . * $#_LOCAL_ $: $1 67167538SericR$=D . $+ $#_LOCAL_ $: $1 . * 67267538Seric 67367914Seric# prepend an empty "forward host" on the front 67467914SericR$+ $: <> $1 67567914Seric 67667914Sericifdef(`LUSER_RELAY', 67767914Seric`# send unrecognized local users to a relay host 67868149SericR< > $+ + $* $: < $L . > $( user $1 $) + $2 67968149SericR< > $+ $: < $L . > $( user $1 $) look up user 68068149SericR< $* > $+ <> $* $: < > $2 $3 found; strip $L 68168149SericR< $* . > $+ $: < $1 > $2 strip extra dot') 68267914Seric 68368149Seric# handle plussed local names 68468149SericR< > $+ + $* $#_LOCAL_ $@ $2 $: $1 68568149Seric 68658808Seric# see if we have a relay or a hub 68768698SericR< > $+ $: < $H > $1 try hub 68867914SericR< > $+ $: < $R > $1 try relay 68966048SericR< > $+ $@ $1 nope, give up 69067469SericR< $- : $+ > $+ $: $>95 < $1 : $2 > $3 < @ $2 > 69167469SericR< $+ > $+ $@ $>95 < $1 > $2 < @ $1 > 69260540Sericifdef(`MAILER_TABLE', 69360540Seric` 69460540Seric 69563858Seric################################################################### 69663858Seric### Ruleset 90 -- try domain part of mailertable entry ### 69763858Seric################################################################### 69860540Seric 69960540SericS90 70066091SericR$* <$- . $+ > $* $: $1$2 < $(mailertable .$3 $@ $1$2 $@ $2 $) > $4 70166081SericR$* <$- : $+ > $* $# $2 $@ $3 $: $4 check -- resolved? 70266081SericR$* < . $+ > $* $@ $>90 $1 . <$2> $3 no -- strip & try again 70366094SericR$* < $* > $* $: < $(mailertable . $@ $1$2 $) > $3 try "." 70466090SericR<$- : $+ > $* $# $1 $@ $2 $: $3 "." found? 70566090SericR< $* > $* $@ $2 no mailertable match', 70660540Seric`dnl') 70763858Seric 70863858Seric################################################################### 70967469Seric### Ruleset 95 -- canonify mailer:host syntax to triple ### 71064010Seric################################################################### 71164010Seric 71267469SericS95 71364010SericR< > $* $@ $1 strip off null relay 71464010SericR< $- : $+ > $* $# $1 $@ $2 $: $3 try qualified mailer 71564010SericR< $=w > $* $@ $2 delete local host 71664010SericR< $+ > $* $#_RELAY_ $@ $1 $: $2 use unqualified mailer 71764010Seric 71864010Seric################################################################### 71967469Seric### Ruleset 98 -- local part of ruleset zero (can be null) ### 72063858Seric################################################################### 72163858Seric 72267469SericS98 72363858Sericundivert(3)dnl 72451222Seric# 72551222Seric###################################################################### 72651222Seric###################################################################### 72751222Seric##### 72856790Seric`##### MAILER DEFINITIONS' 72951222Seric##### 73051222Seric###################################################################### 73151222Seric###################################################################### 73251222Sericundivert(7)dnl 733