1c2aa98e2SPeter Wemmdivert(-1) 2c2aa98e2SPeter Wemm# 3c2aa98e2SPeter Wemm# Copyright (c) 1998 Sendmail, Inc. All rights reserved. 4c2aa98e2SPeter Wemm# Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved. 5c2aa98e2SPeter Wemm# Copyright (c) 1988, 1993 6c2aa98e2SPeter Wemm# The Regents of the University of California. All rights reserved. 7c2aa98e2SPeter Wemm# 8c2aa98e2SPeter Wemm# By using this file, you agree to the terms and conditions set 9c2aa98e2SPeter Wemm# forth in the LICENSE file which can be found at the top level of 10c2aa98e2SPeter Wemm# the sendmail distribution. 11c2aa98e2SPeter Wemm# 12c2aa98e2SPeter Wemm# 13c2aa98e2SPeter Wemmdivert(0) 14c2aa98e2SPeter Wemm 15c2aa98e2SPeter WemmVERSIONID(`@(#)proto.m4 8.223 (Berkeley) 6/30/98') 16c2aa98e2SPeter Wemm 17c2aa98e2SPeter WemmMAILER(local)dnl 18c2aa98e2SPeter Wemm 19c2aa98e2SPeter Wemm# level 8 config file format 20c2aa98e2SPeter WemmV8/Berkeley 21c2aa98e2SPeter Wemmdivert(-1) 22c2aa98e2SPeter Wemm 23c2aa98e2SPeter Wemm# do some sanity checking 24c2aa98e2SPeter Wemmifdef(`__OSTYPE__',, 25c2aa98e2SPeter Wemm `errprint(`*** ERROR: No system type defined (use OSTYPE macro)')') 26c2aa98e2SPeter Wemm 27c2aa98e2SPeter Wemm# pick our default mailers 28c2aa98e2SPeter Wemmifdef(`confSMTP_MAILER',, `define(`confSMTP_MAILER', `esmtp')') 29c2aa98e2SPeter Wemmifdef(`confLOCAL_MAILER',, `define(`confLOCAL_MAILER', `local')') 30c2aa98e2SPeter Wemmifdef(`confRELAY_MAILER',, 31c2aa98e2SPeter Wemm `define(`confRELAY_MAILER', 32c2aa98e2SPeter Wemm `ifdef(`_MAILER_smtp_', `relay', 33c2aa98e2SPeter Wemm `ifdef(`_MAILER_uucp', `uucp-new', `unknown')')')') 34c2aa98e2SPeter Wemmifdef(`confUUCP_MAILER',, `define(`confUUCP_MAILER', `uucp-old')') 35c2aa98e2SPeter Wemmdefine(`_SMTP_', `confSMTP_MAILER')dnl for readability only 36c2aa98e2SPeter Wemmdefine(`_LOCAL_', `confLOCAL_MAILER')dnl for readability only 37c2aa98e2SPeter Wemmdefine(`_RELAY_', `confRELAY_MAILER')dnl for readability only 38c2aa98e2SPeter Wemmdefine(`_UUCP_', `confUUCP_MAILER')dnl for readability only 39c2aa98e2SPeter Wemm 40c2aa98e2SPeter Wemm# set our default hashed database type 41c2aa98e2SPeter Wemmifdef(`DATABASE_MAP_TYPE',, `define(`DATABASE_MAP_TYPE', `hash')') 42c2aa98e2SPeter Wemm 43c2aa98e2SPeter Wemm# back compatibility with old config files 44c2aa98e2SPeter Wemmifdef(`confDEF_GROUP_ID', 45c2aa98e2SPeter Wemm `errprint(`*** confDEF_GROUP_ID is obsolete.') 46c2aa98e2SPeter Wemm errprint(` Use confDEF_USER_ID with a colon in the value instead.')') 47c2aa98e2SPeter Wemmifdef(`confREAD_TIMEOUT', 48c2aa98e2SPeter Wemm `errprint(`*** confREAD_TIMEOUT is obsolete.') 49c2aa98e2SPeter Wemm errprint(` Use individual confTO_<timeout> parameters instead.')') 50c2aa98e2SPeter Wemmifdef(`confMESSAGE_TIMEOUT', 51c2aa98e2SPeter Wemm `define(`_ARG_', index(confMESSAGE_TIMEOUT, /)) 52c2aa98e2SPeter Wemm ifelse(_ARG_, -1, 53c2aa98e2SPeter Wemm `define(`confTO_QUEUERETURN', confMESSAGE_TIMEOUT)', 54c2aa98e2SPeter Wemm `define(`confTO_QUEUERETURN', 55c2aa98e2SPeter Wemm substr(confMESSAGE_TIMEOUT, 0, _ARG_)) 56c2aa98e2SPeter Wemm define(`confTO_QUEUEWARN', 57c2aa98e2SPeter Wemm substr(confMESSAGE_TIMEOUT, eval(_ARG_+1)))')') 58c2aa98e2SPeter Wemmifdef(`confMIN_FREE_BLOCKS', `ifelse(index(confMIN_FREE_BLOCKS, /), -1,, 59c2aa98e2SPeter Wemm `errprint(`*** compound confMIN_FREE_BLOCKS is obsolete.') 60c2aa98e2SPeter Wemm errprint(` Use confMAX_MESSAGE_SIZE for the second part of the value.')')') 61c2aa98e2SPeter Wemm 62c2aa98e2SPeter Wemm# clean option definitions below.... 63c2aa98e2SPeter Wemmdefine(`_OPTION', `ifdef(`$2', `O $1=$2', `#O $1`'ifelse($3, `',, `=$3')')')dnl 64c2aa98e2SPeter Wemm 65c2aa98e2SPeter Wemmdivert(0)dnl 66c2aa98e2SPeter Wemm 67c2aa98e2SPeter Wemm# override file safeties - setting this option compromises system security 68c2aa98e2SPeter Wemm# need to set this now for the sake of class files 69c2aa98e2SPeter Wemm_OPTION(DontBlameSendmail, `confDONT_BLAME_SENDMAIL', safe) 70c2aa98e2SPeter Wemm 71c2aa98e2SPeter Wemm################## 72c2aa98e2SPeter Wemm# local info # 73c2aa98e2SPeter Wemm################## 74c2aa98e2SPeter Wemm 75c2aa98e2SPeter WemmCwlocalhost 76c2aa98e2SPeter Wemmifdef(`USE_CW_FILE', 77c2aa98e2SPeter Wemm`# file containing names of hosts for which we receive email 78c2aa98e2SPeter WemmFw`'confCW_FILE', 79c2aa98e2SPeter Wemm `dnl') 80c2aa98e2SPeter Wemm 81c2aa98e2SPeter Wemm# my official domain name 82c2aa98e2SPeter Wemm# ... `define' this only if sendmail cannot automatically determine your domain 83c2aa98e2SPeter Wemmifdef(`confDOMAIN_NAME', `Dj`'confDOMAIN_NAME', `#Dj$w.Foo.COM') 84c2aa98e2SPeter Wemm 85c2aa98e2SPeter Wemmifdef(`_NULL_CLIENT_ONLY_', `divert(-1)')dnl 86c2aa98e2SPeter Wemm 87c2aa98e2SPeter WemmCP. 88c2aa98e2SPeter Wemm 89c2aa98e2SPeter Wemmifdef(`UUCP_RELAY', 90c2aa98e2SPeter Wemm`# UUCP relay host 91c2aa98e2SPeter WemmDY`'UUCP_RELAY 92c2aa98e2SPeter WemmCPUUCP 93c2aa98e2SPeter Wemm 94c2aa98e2SPeter Wemm')dnl 95c2aa98e2SPeter Wemmifdef(`BITNET_RELAY', 96c2aa98e2SPeter Wemm`# BITNET relay host 97c2aa98e2SPeter WemmDB`'BITNET_RELAY 98c2aa98e2SPeter WemmCPBITNET 99c2aa98e2SPeter Wemm 100c2aa98e2SPeter Wemm')dnl 101c2aa98e2SPeter Wemmifdef(`DECNET_RELAY', 102c2aa98e2SPeter Wemm`define(`_USE_DECNET_SYNTAX_', 1)dnl 103c2aa98e2SPeter Wemm# DECnet relay host 104c2aa98e2SPeter WemmDC`'DECNET_RELAY 105c2aa98e2SPeter WemmCPDECNET 106c2aa98e2SPeter Wemm 107c2aa98e2SPeter Wemm')dnl 108c2aa98e2SPeter Wemmifdef(`FAX_RELAY', 109c2aa98e2SPeter Wemm`# FAX relay host 110c2aa98e2SPeter WemmDF`'FAX_RELAY 111c2aa98e2SPeter WemmCPFAX 112c2aa98e2SPeter Wemm 113c2aa98e2SPeter Wemm')dnl 114c2aa98e2SPeter Wemm# "Smart" relay host (may be null) 115c2aa98e2SPeter WemmDS`'ifdef(`SMART_HOST', SMART_HOST) 116c2aa98e2SPeter Wemm 117c2aa98e2SPeter Wemmifdef(`LUSER_RELAY', `dnl 118c2aa98e2SPeter Wemm# place to which unknown users should be forwarded 119c2aa98e2SPeter WemmKuser user -m -a<> 120c2aa98e2SPeter WemmDL`'LUSER_RELAY', 121c2aa98e2SPeter Wemm`dnl') 122c2aa98e2SPeter Wemm 123c2aa98e2SPeter Wemm# operators that cannot be in local usernames (i.e., network indicators) 124c2aa98e2SPeter WemmCO @ % ifdef(`_NO_UUCP_', `', `!') 125c2aa98e2SPeter Wemm 126c2aa98e2SPeter Wemm# a class with just dot (for identifying canonical names) 127c2aa98e2SPeter WemmC.. 128c2aa98e2SPeter Wemm 129c2aa98e2SPeter Wemm# a class with just a left bracket (for identifying domain literals) 130c2aa98e2SPeter WemmC[[ 131c2aa98e2SPeter Wemm 132c2aa98e2SPeter Wemmifdef(`MAILER_TABLE', `dnl 133c2aa98e2SPeter Wemm# Mailer table (overriding domains) 134c2aa98e2SPeter WemmKmailertable MAILER_TABLE', 135c2aa98e2SPeter Wemm`dnl') 136c2aa98e2SPeter Wemm 137c2aa98e2SPeter Wemmifdef(`DOMAIN_TABLE', `dnl 138c2aa98e2SPeter Wemm# Domain table (adding domains) 139c2aa98e2SPeter WemmKdomaintable DOMAIN_TABLE', 140c2aa98e2SPeter Wemm`dnl') 141c2aa98e2SPeter Wemm 142c2aa98e2SPeter Wemmifdef(`GENERICS_TABLE', `dnl 143c2aa98e2SPeter Wemm# Generics table (mapping outgoing addresses) 144c2aa98e2SPeter WemmKgenerics GENERICS_TABLE', 145c2aa98e2SPeter Wemm`dnl') 146c2aa98e2SPeter Wemm 147c2aa98e2SPeter Wemmifdef(`UUDOMAIN_TABLE', `dnl 148c2aa98e2SPeter Wemm# UUCP domain table 149c2aa98e2SPeter WemmKuudomain UUDOMAIN_TABLE', 150c2aa98e2SPeter Wemm`dnl') 151c2aa98e2SPeter Wemm 152c2aa98e2SPeter Wemmifdef(`BITDOMAIN_TABLE', `dnl 153c2aa98e2SPeter Wemm# BITNET mapping table 154c2aa98e2SPeter WemmKbitdomain BITDOMAIN_TABLE', 155c2aa98e2SPeter Wemm`dnl') 156c2aa98e2SPeter Wemm 157c2aa98e2SPeter Wemmifdef(`VIRTUSER_TABLE', `dnl 158c2aa98e2SPeter Wemm# Virtual user table (maps incoming users) 159c2aa98e2SPeter WemmKvirtuser VIRTUSER_TABLE', 160c2aa98e2SPeter Wemm`dnl') 161c2aa98e2SPeter Wemm 162c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 163c2aa98e2SPeter Wemm# Access list database (for spam stomping) 164c2aa98e2SPeter WemmKaccess ACCESS_TABLE', 165c2aa98e2SPeter Wemm`dnl') 166c2aa98e2SPeter Wemm 167c2aa98e2SPeter Wemmifdef(`_RELAY_MX_SERVED_', `dnl 168c2aa98e2SPeter Wemm# MX map (to allow relaying to hosts that we MX for) 169c2aa98e2SPeter WemmKmxserved bestmx -z: -T<TEMP>', 170c2aa98e2SPeter Wemm`dnl') 171c2aa98e2SPeter Wemm 172c2aa98e2SPeter Wemmifdef(`_ACCEPT_UNRESOLVABLE_DOMAINS_',`dnl',`dnl 173c2aa98e2SPeter Wemm# Resolve map (to check if a host exists in check_mail) 174c2aa98e2SPeter WemmKresolve host -a<OK> -T<TEMP>') 175c2aa98e2SPeter Wemm 176c2aa98e2SPeter Wemmifdef(`confCR_FILE', `dnl 177c2aa98e2SPeter Wemm# Hosts that will permit relaying ($=R) 178c2aa98e2SPeter WemmFR`'confCR_FILE', 179c2aa98e2SPeter Wemm`dnl') 180c2aa98e2SPeter Wemm 181c2aa98e2SPeter Wemm# who I send unqualified names to (null means deliver locally) 182c2aa98e2SPeter WemmDR`'ifdef(`LOCAL_RELAY', LOCAL_RELAY) 183c2aa98e2SPeter Wemm 184c2aa98e2SPeter Wemm# who gets all local email traffic ($R has precedence for unqualified names) 185c2aa98e2SPeter WemmDH`'ifdef(`MAIL_HUB', MAIL_HUB) 186c2aa98e2SPeter Wemm 187c2aa98e2SPeter Wemm# dequoting map 188c2aa98e2SPeter WemmKdequote dequote 189c2aa98e2SPeter Wemm 190c2aa98e2SPeter Wemmdivert(0)dnl # end of nullclient diversion 191c2aa98e2SPeter Wemm# class E: names that should be exposed as from this host, even if we masquerade 192c2aa98e2SPeter Wemmifdef(`_NULL_CLIENT_ONLY_', `#', 193c2aa98e2SPeter Wemm`# class L: names that should be delivered locally, even if we have a relay 194c2aa98e2SPeter Wemm# class M: domains that should be converted to $M 195c2aa98e2SPeter Wemm#CL root 196c2aa98e2SPeter Wemm')CE root 197c2aa98e2SPeter Wemmundivert(5)dnl 198c2aa98e2SPeter Wemm 199c2aa98e2SPeter Wemm# who I masquerade as (null for no masquerading) (see also $=M) 200c2aa98e2SPeter WemmDM`'ifdef(`MASQUERADE_NAME', MASQUERADE_NAME) 201c2aa98e2SPeter Wemm 202c2aa98e2SPeter Wemm# my name for error messages 203c2aa98e2SPeter Wemmifdef(`confMAILER_NAME', `Dn`'confMAILER_NAME', `#DnMAILER-DAEMON') 204c2aa98e2SPeter Wemm 205c2aa98e2SPeter Wemmundivert(6)dnl 206c2aa98e2SPeter Wemminclude(_CF_DIR_`m4/version.m4') 207c2aa98e2SPeter Wemm 208c2aa98e2SPeter Wemm############### 209c2aa98e2SPeter Wemm# Options # 210c2aa98e2SPeter Wemm############### 211c2aa98e2SPeter Wemm 212c2aa98e2SPeter Wemm# strip message body to 7 bits on input? 213c2aa98e2SPeter Wemm_OPTION(SevenBitInput, `confSEVEN_BIT_INPUT') 214c2aa98e2SPeter Wemm 215c2aa98e2SPeter Wemm# 8-bit data handling 216c2aa98e2SPeter Wemm_OPTION(EightBitMode, `confEIGHT_BIT_HANDLING', adaptive) 217c2aa98e2SPeter Wemm 218c2aa98e2SPeter Wemmifdef(`_NULL_CLIENT_ONLY_', `dnl', ` 219c2aa98e2SPeter Wemm# wait for alias file rebuild (default units: minutes) 220c2aa98e2SPeter Wemm_OPTION(AliasWait, `confALIAS_WAIT', 5m) 221c2aa98e2SPeter Wemm 222c2aa98e2SPeter Wemm# location of alias file 223c2aa98e2SPeter Wemm_OPTION(AliasFile, `ALIAS_FILE', /etc/aliases) 224c2aa98e2SPeter Wemm') 225c2aa98e2SPeter Wemm# minimum number of free blocks on filesystem 226c2aa98e2SPeter Wemm_OPTION(MinFreeBlocks, `confMIN_FREE_BLOCKS', 100) 227c2aa98e2SPeter Wemm 228c2aa98e2SPeter Wemm# maximum message size 229c2aa98e2SPeter Wemm_OPTION(MaxMessageSize, `confMAX_MESSAGE_SIZE', 1000000) 230c2aa98e2SPeter Wemm 231c2aa98e2SPeter Wemm# substitution for space (blank) characters 232c2aa98e2SPeter Wemm_OPTION(BlankSub, `confBLANK_SUB', _) 233c2aa98e2SPeter Wemm 234c2aa98e2SPeter Wemm# avoid connecting to "expensive" mailers on initial submission? 235c2aa98e2SPeter Wemm_OPTION(HoldExpensive, `confCON_EXPENSIVE') 236c2aa98e2SPeter Wemm 237c2aa98e2SPeter Wemm# checkpoint queue runs after every N successful deliveries 238c2aa98e2SPeter Wemm_OPTION(CheckpointInterval, `confCHECKPOINT_INTERVAL', 10) 239c2aa98e2SPeter Wemm 240c2aa98e2SPeter Wemm# default delivery mode 241c2aa98e2SPeter Wemm_OPTION(DeliveryMode, `confDELIVERY_MODE', background) 242c2aa98e2SPeter Wemm 243c2aa98e2SPeter Wemm# automatically rebuild the alias database? 244c2aa98e2SPeter Wemm_OPTION(AutoRebuildAliases, `confAUTO_REBUILD') 245c2aa98e2SPeter Wemm 246c2aa98e2SPeter Wemm# error message header/file 247c2aa98e2SPeter Wemm_OPTION(ErrorHeader, `confERROR_MESSAGE', /etc/sendmail.oE) 248c2aa98e2SPeter Wemm 249c2aa98e2SPeter Wemm# error mode 250c2aa98e2SPeter Wemm_OPTION(ErrorMode, `confERROR_MODE', print) 251c2aa98e2SPeter Wemm 252c2aa98e2SPeter Wemm# save Unix-style "From_" lines at top of header? 253c2aa98e2SPeter Wemm_OPTION(SaveFromLine, `confSAVE_FROM_LINES') 254c2aa98e2SPeter Wemm 255c2aa98e2SPeter Wemm# temporary file mode 256c2aa98e2SPeter Wemm_OPTION(TempFileMode, `confTEMP_FILE_MODE', 0600) 257c2aa98e2SPeter Wemm 258c2aa98e2SPeter Wemm# match recipients against GECOS field? 259c2aa98e2SPeter Wemm_OPTION(MatchGECOS, `confMATCH_GECOS') 260c2aa98e2SPeter Wemm 261c2aa98e2SPeter Wemm# maximum hop count 262c2aa98e2SPeter Wemm_OPTION(MaxHopCount, `confMAX_HOP', 17) 263c2aa98e2SPeter Wemm 264c2aa98e2SPeter Wemm# location of help file 265c2aa98e2SPeter WemmO HelpFile=ifdef(`HELP_FILE', HELP_FILE, /usr/lib/sendmail.hf) 266c2aa98e2SPeter Wemm 267c2aa98e2SPeter Wemm# ignore dots as terminators in incoming messages? 268c2aa98e2SPeter Wemm_OPTION(IgnoreDots, `confIGNORE_DOTS') 269c2aa98e2SPeter Wemm 270c2aa98e2SPeter Wemm# name resolver options 271c2aa98e2SPeter Wemm_OPTION(ResolverOptions, `confBIND_OPTS', +AAONLY) 272c2aa98e2SPeter Wemm 273c2aa98e2SPeter Wemm# deliver MIME-encapsulated error messages? 274c2aa98e2SPeter Wemm_OPTION(SendMimeErrors, `confMIME_FORMAT_ERRORS') 275c2aa98e2SPeter Wemm 276c2aa98e2SPeter Wemm# Forward file search path 277c2aa98e2SPeter Wemm_OPTION(ForwardPath, `confFORWARD_PATH', /var/forward/$u:$z/.forward.$w:$z/.forward) 278c2aa98e2SPeter Wemm 279c2aa98e2SPeter Wemm# open connection cache size 280c2aa98e2SPeter Wemm_OPTION(ConnectionCacheSize, `confMCI_CACHE_SIZE', 2) 281c2aa98e2SPeter Wemm 282c2aa98e2SPeter Wemm# open connection cache timeout 283c2aa98e2SPeter Wemm_OPTION(ConnectionCacheTimeout, `confMCI_CACHE_TIMEOUT', 5m) 284c2aa98e2SPeter Wemm 285c2aa98e2SPeter Wemm# persistent host status directory 286c2aa98e2SPeter Wemm_OPTION(HostStatusDirectory, `confHOST_STATUS_DIRECTORY', .hoststat) 287c2aa98e2SPeter Wemm 288c2aa98e2SPeter Wemm# single thread deliveries (requires HostStatusDirectory)? 289c2aa98e2SPeter Wemm_OPTION(SingleThreadDelivery, `confSINGLE_THREAD_DELIVERY') 290c2aa98e2SPeter Wemm 291c2aa98e2SPeter Wemm# use Errors-To: header? 292c2aa98e2SPeter Wemm_OPTION(UseErrorsTo, `confUSE_ERRORS_TO') 293c2aa98e2SPeter Wemm 294c2aa98e2SPeter Wemm# log level 295c2aa98e2SPeter Wemm_OPTION(LogLevel, `confLOG_LEVEL', 10) 296c2aa98e2SPeter Wemm 297c2aa98e2SPeter Wemm# send to me too, even in an alias expansion? 298c2aa98e2SPeter Wemm_OPTION(MeToo, `confME_TOO') 299c2aa98e2SPeter Wemm 300c2aa98e2SPeter Wemm# verify RHS in newaliases? 301c2aa98e2SPeter Wemm_OPTION(CheckAliases, `confCHECK_ALIASES') 302c2aa98e2SPeter Wemm 303c2aa98e2SPeter Wemm# default messages to old style headers if no special punctuation? 304c2aa98e2SPeter Wemm_OPTION(OldStyleHeaders, `confOLD_STYLE_HEADERS') 305c2aa98e2SPeter Wemm 306c2aa98e2SPeter Wemm# SMTP daemon options 307c2aa98e2SPeter Wemm_OPTION(DaemonPortOptions, `confDAEMON_OPTIONS', Port=esmtp) 308c2aa98e2SPeter Wemm 309c2aa98e2SPeter Wemm# privacy flags 310c2aa98e2SPeter Wemm_OPTION(PrivacyOptions, `confPRIVACY_FLAGS', authwarnings) 311c2aa98e2SPeter Wemm 312c2aa98e2SPeter Wemm# who (if anyone) should get extra copies of error messages 313c2aa98e2SPeter Wemm_OPTION(PostMasterCopy, `confCOPY_ERRORS_TO', Postmaster) 314c2aa98e2SPeter Wemm 315c2aa98e2SPeter Wemm# slope of queue-only function 316c2aa98e2SPeter Wemm_OPTION(QueueFactor, `confQUEUE_FACTOR', 600000) 317c2aa98e2SPeter Wemm 318c2aa98e2SPeter Wemm# queue directory 319c2aa98e2SPeter WemmO QueueDirectory=ifdef(`QUEUE_DIR', QUEUE_DIR, /var/spool/mqueue) 320c2aa98e2SPeter Wemm 321c2aa98e2SPeter Wemm# timeouts (many of these) 322c2aa98e2SPeter Wemm_OPTION(Timeout.initial, `confTO_INITIAL', 5m) 323c2aa98e2SPeter Wemm_OPTION(Timeout.connect, `confTO_CONNECT', 5m) 324c2aa98e2SPeter Wemm_OPTION(Timeout.iconnect, `confTO_ICONNECT', 5m) 325c2aa98e2SPeter Wemm_OPTION(Timeout.helo, `confTO_HELO', 5m) 326c2aa98e2SPeter Wemm_OPTION(Timeout.mail, `confTO_MAIL', 10m) 327c2aa98e2SPeter Wemm_OPTION(Timeout.rcpt, `confTO_RCPT', 1h) 328c2aa98e2SPeter Wemm_OPTION(Timeout.datainit, `confTO_DATAINIT', 5m) 329c2aa98e2SPeter Wemm_OPTION(Timeout.datablock, `confTO_DATABLOCK', 1h) 330c2aa98e2SPeter Wemm_OPTION(Timeout.datafinal, `confTO_DATAFINAL', 1h) 331c2aa98e2SPeter Wemm_OPTION(Timeout.rset, `confTO_RSET', 5m) 332c2aa98e2SPeter Wemm_OPTION(Timeout.quit, `confTO_QUIT', 2m) 333c2aa98e2SPeter Wemm_OPTION(Timeout.misc, `confTO_MISC', 2m) 334c2aa98e2SPeter Wemm_OPTION(Timeout.command, `confTO_COMMAND', 1h) 335c2aa98e2SPeter Wemm_OPTION(Timeout.ident, `confTO_IDENT', 30s) 336c2aa98e2SPeter Wemm_OPTION(Timeout.fileopen, `confTO_FILEOPEN', 60s) 337c2aa98e2SPeter Wemm_OPTION(Timeout.queuereturn, `confTO_QUEUERETURN', 5d) 338c2aa98e2SPeter Wemm_OPTION(Timeout.queuereturn.normal, `confTO_QUEUERETURN_NORMAL', 5d) 339c2aa98e2SPeter Wemm_OPTION(Timeout.queuereturn.urgent, `confTO_QUEUERETURN_URGENT', 2d) 340c2aa98e2SPeter Wemm_OPTION(Timeout.queuereturn.non-urgent, `confTO_QUEUERETURN_NONURGENT', 7d) 341c2aa98e2SPeter Wemm_OPTION(Timeout.queuewarn, `confTO_QUEUEWARN', 4h) 342c2aa98e2SPeter Wemm_OPTION(Timeout.queuewarn.normal, `confTO_QUEUEWARN_NORMAL', 4h) 343c2aa98e2SPeter Wemm_OPTION(Timeout.queuewarn.urgent, `confTO_QUEUEWARN_URGENT', 1h) 344c2aa98e2SPeter Wemm_OPTION(Timeout.queuewarn.non-urgent, `confTO_QUEUEWARN_NONURGENT', 12h) 345c2aa98e2SPeter Wemm_OPTION(Timeout.hoststatus, `confTO_HOSTSTATUS', 30m) 346c2aa98e2SPeter Wemm 347c2aa98e2SPeter Wemm# should we not prune routes in route-addr syntax addresses? 348c2aa98e2SPeter Wemm_OPTION(DontPruneRoutes, `confDONT_PRUNE_ROUTES') 349c2aa98e2SPeter Wemm 350c2aa98e2SPeter Wemm# queue up everything before forking? 351c2aa98e2SPeter Wemm_OPTION(SuperSafe, `confSAFE_QUEUE') 352c2aa98e2SPeter Wemm 353c2aa98e2SPeter Wemm# status file 354c2aa98e2SPeter WemmO StatusFile=ifdef(`STATUS_FILE', `STATUS_FILE', /etc/sendmail.st) 355c2aa98e2SPeter Wemm 356c2aa98e2SPeter Wemm# time zone handling: 357c2aa98e2SPeter Wemm# if undefined, use system default 358c2aa98e2SPeter Wemm# if defined but null, use TZ envariable passed in 359c2aa98e2SPeter Wemm# if defined and non-null, use that info 360c2aa98e2SPeter Wemmifelse(confTIME_ZONE, `USE_SYSTEM', `#O TimeZoneSpec=', 361c2aa98e2SPeter Wemm confTIME_ZONE, `USE_TZ', `O TimeZoneSpec=', 362c2aa98e2SPeter Wemm `O TimeZoneSpec=confTIME_ZONE') 363c2aa98e2SPeter Wemm 364c2aa98e2SPeter Wemm# default UID (can be username or userid:groupid) 365c2aa98e2SPeter Wemm_OPTION(DefaultUser, `confDEF_USER_ID', mailnull) 366c2aa98e2SPeter Wemm 367c2aa98e2SPeter Wemm# list of locations of user database file (null means no lookup) 368c2aa98e2SPeter Wemm_OPTION(UserDatabaseSpec, `confUSERDB_SPEC', /etc/userdb) 369c2aa98e2SPeter Wemm 370c2aa98e2SPeter Wemm# fallback MX host 371c2aa98e2SPeter Wemm_OPTION(FallbackMXhost, `confFALLBACK_MX', fall.back.host.net) 372c2aa98e2SPeter Wemm 373c2aa98e2SPeter Wemm# if we are the best MX host for a site, try it directly instead of config err 374c2aa98e2SPeter Wemm_OPTION(TryNullMXList, `confTRY_NULL_MX_LIST') 375c2aa98e2SPeter Wemm 376c2aa98e2SPeter Wemm# load average at which we just queue messages 377c2aa98e2SPeter Wemm_OPTION(QueueLA, `confQUEUE_LA', 8) 378c2aa98e2SPeter Wemm 379c2aa98e2SPeter Wemm# load average at which we refuse connections 380c2aa98e2SPeter Wemm_OPTION(RefuseLA, `confREFUSE_LA', 12) 381c2aa98e2SPeter Wemm 382c2aa98e2SPeter Wemm# maximum number of children we allow at one time 383c2aa98e2SPeter Wemm_OPTION(MaxDaemonChildren, `confMAX_DAEMON_CHILDREN', 12) 384c2aa98e2SPeter Wemm 385c2aa98e2SPeter Wemm# maximum number of new connections per second 386c2aa98e2SPeter Wemm_OPTION(ConnectionRateThrottle, `confCONNECTION_RATE_THROTTLE', 3) 387c2aa98e2SPeter Wemm 388c2aa98e2SPeter Wemm# work recipient factor 389c2aa98e2SPeter Wemm_OPTION(RecipientFactor, `confWORK_RECIPIENT_FACTOR', 30000) 390c2aa98e2SPeter Wemm 391c2aa98e2SPeter Wemm# deliver each queued job in a separate process? 392c2aa98e2SPeter Wemm_OPTION(ForkEachJob, `confSEPARATE_PROC') 393c2aa98e2SPeter Wemm 394c2aa98e2SPeter Wemm# work class factor 395c2aa98e2SPeter Wemm_OPTION(ClassFactor, `confWORK_CLASS_FACTOR', 1800) 396c2aa98e2SPeter Wemm 397c2aa98e2SPeter Wemm# work time factor 398c2aa98e2SPeter Wemm_OPTION(RetryFactor, `confWORK_TIME_FACTOR', 90000) 399c2aa98e2SPeter Wemm 400c2aa98e2SPeter Wemm# shall we sort the queue by hostname first? 401c2aa98e2SPeter Wemm_OPTION(QueueSortOrder, `confQUEUE_SORT_ORDER', priority) 402c2aa98e2SPeter Wemm 403c2aa98e2SPeter Wemm# minimum time in queue before retry 404c2aa98e2SPeter Wemm_OPTION(MinQueueAge, `confMIN_QUEUE_AGE', 30m) 405c2aa98e2SPeter Wemm 406c2aa98e2SPeter Wemm# default character set 407c2aa98e2SPeter Wemm_OPTION(DefaultCharSet, `confDEF_CHAR_SET', iso-8859-1) 408c2aa98e2SPeter Wemm 409c2aa98e2SPeter Wemm# service switch file (ignored on Solaris, Ultrix, OSF/1, others) 410c2aa98e2SPeter Wemm_OPTION(ServiceSwitchFile, `confSERVICE_SWITCH_FILE', /etc/service.switch) 411c2aa98e2SPeter Wemm 412c2aa98e2SPeter Wemm# hosts file (normally /etc/hosts) 413c2aa98e2SPeter Wemm_OPTION(HostsFile, `confHOSTS_FILE', /etc/hosts) 414c2aa98e2SPeter Wemm 415c2aa98e2SPeter Wemm# dialup line delay on connection failure 416c2aa98e2SPeter Wemm_OPTION(DialDelay, `confDIAL_DELAY', 10s) 417c2aa98e2SPeter Wemm 418c2aa98e2SPeter Wemm# action to take if there are no recipients in the message 419c2aa98e2SPeter Wemm_OPTION(NoRecipientAction, `confNO_RCPT_ACTION', add-to-undisclosed) 420c2aa98e2SPeter Wemm 421c2aa98e2SPeter Wemm# chrooted environment for writing to files 422c2aa98e2SPeter Wemm_OPTION(SafeFileEnvironment, `confSAFE_FILE_ENV', /arch) 423c2aa98e2SPeter Wemm 424c2aa98e2SPeter Wemm# are colons OK in addresses? 425c2aa98e2SPeter Wemm_OPTION(ColonOkInAddr, `confCOLON_OK_IN_ADDR') 426c2aa98e2SPeter Wemm 427c2aa98e2SPeter Wemm# how many jobs can you process in the queue? 428c2aa98e2SPeter Wemm_OPTION(MaxQueueRunSize, `confMAX_QUEUE_RUN_SIZE', 10000) 429c2aa98e2SPeter Wemm 430c2aa98e2SPeter Wemm# shall I avoid expanding CNAMEs (violates protocols)? 431c2aa98e2SPeter Wemm_OPTION(DontExpandCnames, `confDONT_EXPAND_CNAMES') 432c2aa98e2SPeter Wemm 433c2aa98e2SPeter Wemm# SMTP initial login message (old $e macro) 434c2aa98e2SPeter Wemm_OPTION(SmtpGreetingMessage, `confSMTP_LOGIN_MSG') 435c2aa98e2SPeter Wemm 436c2aa98e2SPeter Wemm# UNIX initial From header format (old $l macro) 437c2aa98e2SPeter Wemm_OPTION(UnixFromLine, `confFROM_LINE') 438c2aa98e2SPeter Wemm 439c2aa98e2SPeter Wemm# From: lines that have embedded newlines are unwrapped onto one line 440c2aa98e2SPeter Wemm_OPTION(SingleLineFromHeader, `confSINGLE_LINE_FROM_HEADER', False) 441c2aa98e2SPeter Wemm 442c2aa98e2SPeter Wemm# Allow HELO SMTP command that does not `include' a host name 443c2aa98e2SPeter Wemm_OPTION(AllowBogusHELO, `confALLOW_BOGUS_HELO', False) 444c2aa98e2SPeter Wemm 445c2aa98e2SPeter Wemm# Characters to be quoted in a full name phrase (@,;:\()[] are automatic) 446c2aa98e2SPeter Wemm_OPTION(MustQuoteChars, `confMUST_QUOTE_CHARS', .) 447c2aa98e2SPeter Wemm 448c2aa98e2SPeter Wemm# delimiter (operator) characters (old $o macro) 449c2aa98e2SPeter Wemm_OPTION(OperatorChars, `confOPERATORS') 450c2aa98e2SPeter Wemm 451c2aa98e2SPeter Wemm# shall I avoid calling initgroups(3) because of high NIS costs? 452c2aa98e2SPeter Wemm_OPTION(DontInitGroups, `confDONT_INIT_GROUPS') 453c2aa98e2SPeter Wemm 454c2aa98e2SPeter Wemm# are group-writable `:include:' and .forward files (un)trustworthy? 455c2aa98e2SPeter Wemm_OPTION(UnsafeGroupWrites, `confUNSAFE_GROUP_WRITES') 456c2aa98e2SPeter Wemm 457c2aa98e2SPeter Wemm# where do errors that occur when sending errors get sent? 458c2aa98e2SPeter Wemm_OPTION(DoubleBounceAddress, `confDOUBLE_BOUNCE_ADDRESS', postmaster) 459c2aa98e2SPeter Wemm 460c2aa98e2SPeter Wemm# what user id do we assume for the majority of the processing? 461c2aa98e2SPeter Wemm_OPTION(RunAsUser, `confRUN_AS_USER', sendmail) 462c2aa98e2SPeter Wemm 463c2aa98e2SPeter Wemm# maximum number of recipients per SMTP envelope 464c2aa98e2SPeter Wemm_OPTION(MaxRecipientsPerMessage, `confMAX_RCPTS_PER_MESSAGE', 100) 465c2aa98e2SPeter Wemm 466c2aa98e2SPeter Wemm# shall we get local names from our installed interfaces? 467c2aa98e2SPeter Wemm_OPTION(DontProbeInterfaces, `confDONT_PROBE_INTERFACES') 468c2aa98e2SPeter Wemm 469c2aa98e2SPeter Wemm########################### 470c2aa98e2SPeter Wemm# Message precedences # 471c2aa98e2SPeter Wemm########################### 472c2aa98e2SPeter Wemm 473c2aa98e2SPeter WemmPfirst-class=0 474c2aa98e2SPeter WemmPspecial-delivery=100 475c2aa98e2SPeter WemmPlist=-30 476c2aa98e2SPeter WemmPbulk=-60 477c2aa98e2SPeter WemmPjunk=-100 478c2aa98e2SPeter Wemm 479c2aa98e2SPeter Wemm##################### 480c2aa98e2SPeter Wemm# Trusted users # 481c2aa98e2SPeter Wemm##################### 482c2aa98e2SPeter Wemm 483c2aa98e2SPeter Wemm# this is equivalent to setting class "t" 484c2aa98e2SPeter Wemmifdef(`_USE_CT_FILE_', `', `#')Ft`'ifdef(`confCT_FILE', confCT_FILE, `/etc/sendmail.ct') 485c2aa98e2SPeter WemmTroot 486c2aa98e2SPeter WemmTdaemon 487c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl', `Tuucp') 488c2aa98e2SPeter Wemmifdef(`confTRUSTED_USERS', `T`'confTRUSTED_USERS', `dnl') 489c2aa98e2SPeter Wemm 490c2aa98e2SPeter Wemm######################### 491c2aa98e2SPeter Wemm# Format of headers # 492c2aa98e2SPeter Wemm######################### 493c2aa98e2SPeter Wemm 494c2aa98e2SPeter Wemmifdef(`confFROM_HEADER',, `define(`confFROM_HEADER', `$?x$x <$g>$|$g$.')')dnl 495c2aa98e2SPeter WemmH?P?Return-Path: <$g> 496c2aa98e2SPeter WemmHReceived: confRECEIVED_HEADER 497c2aa98e2SPeter WemmH?D?Resent-Date: $a 498c2aa98e2SPeter WemmH?D?Date: $a 499c2aa98e2SPeter WemmH?F?Resent-From: confFROM_HEADER 500c2aa98e2SPeter WemmH?F?From: confFROM_HEADER 501c2aa98e2SPeter WemmH?x?Full-Name: $x 502c2aa98e2SPeter Wemm# HPosted-Date: $a 503c2aa98e2SPeter Wemm# H?l?Received-Date: $b 504c2aa98e2SPeter WemmH?M?Resent-Message-Id: <$t.$i@$j> 505c2aa98e2SPeter WemmH?M?Message-Id: <$t.$i@$j> 506c2aa98e2SPeter Wemmifdef(`_NULL_CLIENT_ONLY_', 507c2aa98e2SPeter Wemm `include(_CF_DIR_`'m4/nullrelay.m4)m4exit', 508c2aa98e2SPeter Wemm `dnl') 509c2aa98e2SPeter Wemm# 510c2aa98e2SPeter Wemm###################################################################### 511c2aa98e2SPeter Wemm###################################################################### 512c2aa98e2SPeter Wemm##### 513c2aa98e2SPeter Wemm##### REWRITING RULES 514c2aa98e2SPeter Wemm##### 515c2aa98e2SPeter Wemm###################################################################### 516c2aa98e2SPeter Wemm###################################################################### 517c2aa98e2SPeter Wemm 518c2aa98e2SPeter Wemm############################################ 519c2aa98e2SPeter Wemm### Ruleset 3 -- Name Canonicalization ### 520c2aa98e2SPeter Wemm############################################ 521c2aa98e2SPeter WemmS3 522c2aa98e2SPeter Wemm 523c2aa98e2SPeter Wemm# handle null input (translate to <@> special case) 524c2aa98e2SPeter WemmR$@ $@ <@> 525c2aa98e2SPeter Wemm 526c2aa98e2SPeter Wemm# strip group: syntax (not inside angle brackets!) and trailing semicolon 527c2aa98e2SPeter WemmR$* $: $1 <@> mark addresses 528c2aa98e2SPeter WemmR$* < $* > $* <@> $: $1 < $2 > $3 unmark <addr> 529c2aa98e2SPeter WemmR@ $* <@> $: @ $1 unmark @host:... 530c2aa98e2SPeter WemmR$* :: $* <@> $: $1 :: $2 unmark node::addr 531c2aa98e2SPeter WemmR:`include': $* <@> $: :`include': $1 unmark :`include':... 532c2aa98e2SPeter WemmR$* [ $* : $* ] <@> $: $1 [ $2 : $3 ] unmark IPv6 addrs 533c2aa98e2SPeter WemmR$* : $* [ $* ] $: $1 : $2 [ $3 ] <@> remark if leading colon 534c2aa98e2SPeter WemmR$* : $* <@> $: $2 strip colon if marked 535c2aa98e2SPeter WemmR$* <@> $: $1 unmark 536c2aa98e2SPeter WemmR$* ; $1 strip trailing semi 537c2aa98e2SPeter WemmR$* < $* ; > $1 < $2 > bogus bracketed semi 538c2aa98e2SPeter Wemm 539c2aa98e2SPeter Wemm# null input now results from list:; syntax 540c2aa98e2SPeter WemmR$@ $@ :; <@> 541c2aa98e2SPeter Wemm 542c2aa98e2SPeter Wemm# strip angle brackets -- note RFC733 heuristic to get innermost item 543c2aa98e2SPeter WemmR$* $: < $1 > housekeeping <> 544c2aa98e2SPeter WemmR$+ < $* > < $2 > strip excess on left 545c2aa98e2SPeter WemmR< $* > $+ < $1 > strip excess on right 546c2aa98e2SPeter WemmR<> $@ < @ > MAIL FROM:<> case 547c2aa98e2SPeter WemmR< $+ > $: $1 remove housekeeping <> 548c2aa98e2SPeter Wemm 549c2aa98e2SPeter Wemm# make sure <@a,@b,@c:user@d> syntax is easy to parse -- undone later 550c2aa98e2SPeter WemmR@ $+ , $+ @ $1 : $2 change all "," to ":" 551c2aa98e2SPeter Wemm 552c2aa98e2SPeter Wemm# localize and dispose of route-based addresses 553c2aa98e2SPeter WemmR@ $+ : $+ $@ $>96 < @$1 > : $2 handle <route-addr> 554c2aa98e2SPeter Wemm 555c2aa98e2SPeter Wemm# find focus for list syntax 556c2aa98e2SPeter WemmR $+ : $* ; @ $+ $@ $>96 $1 : $2 ; < @ $3 > list syntax 557c2aa98e2SPeter WemmR $+ : $* ; $@ $1 : $2; list syntax 558c2aa98e2SPeter Wemm 559c2aa98e2SPeter Wemm# find focus for @ syntax addresses 560c2aa98e2SPeter WemmR$+ @ $+ $: $1 < @ $2 > focus on domain 561c2aa98e2SPeter WemmR$+ < $+ @ $+ > $1 $2 < @ $3 > move gaze right 562c2aa98e2SPeter WemmR$+ < @ $+ > $@ $>96 $1 < @ $2 > already canonical 563c2aa98e2SPeter Wemm 564c2aa98e2SPeter Wemm# do some sanity checking 565c2aa98e2SPeter WemmR$* < @ $* : $* > $* $1 < @ $2 $3 > $4 nix colons in addrs 566c2aa98e2SPeter Wemm 567c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl', 568c2aa98e2SPeter Wemm`# convert old-style addresses to a domain-based address 569c2aa98e2SPeter WemmR$- ! $+ $@ $>96 $2 < @ $1 .UUCP > resolve uucp names 570c2aa98e2SPeter WemmR$+ . $- ! $+ $@ $>96 $3 < @ $1 . $2 > domain uucps 571c2aa98e2SPeter WemmR$+ ! $+ $@ $>96 $2 < @ $1 .UUCP > uucp subdomains 572c2aa98e2SPeter Wemm') 573c2aa98e2SPeter Wemmifdef(`_USE_DECNET_SYNTAX_', 574c2aa98e2SPeter Wemm`# convert node::user addresses into a domain-based address 575c2aa98e2SPeter WemmR$- :: $+ $@ $>96 $2 < @ $1 .DECNET > resolve DECnet names 576c2aa98e2SPeter WemmR$- . $- :: $+ $@ $>96 $3 < @ $1.$2 .DECNET > numeric DECnet addr 577c2aa98e2SPeter Wemm', 578c2aa98e2SPeter Wemm `dnl') 579c2aa98e2SPeter Wemm# if we have % signs, take the rightmost one 580c2aa98e2SPeter WemmR$* % $* $1 @ $2 First make them all @s. 581c2aa98e2SPeter WemmR$* @ $* @ $* $1 % $2 @ $3 Undo all but the last. 582c2aa98e2SPeter WemmR$* @ $* $@ $>96 $1 < @ $2 > Insert < > and finish 583c2aa98e2SPeter Wemm 584c2aa98e2SPeter Wemm# else we must be a local name 585c2aa98e2SPeter WemmR$* $@ $>96 $1 586c2aa98e2SPeter Wemm 587c2aa98e2SPeter Wemm 588c2aa98e2SPeter Wemm################################################ 589c2aa98e2SPeter Wemm### Ruleset 96 -- bottom half of ruleset 3 ### 590c2aa98e2SPeter Wemm################################################ 591c2aa98e2SPeter Wemm 592c2aa98e2SPeter WemmS96 593c2aa98e2SPeter Wemm 594c2aa98e2SPeter Wemm# handle special cases for local names 595c2aa98e2SPeter WemmR$* < @ localhost > $* $: $1 < @ $j . > $2 no domain at all 596c2aa98e2SPeter WemmR$* < @ localhost . $m > $* $: $1 < @ $j . > $2 local domain 597c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl', 598c2aa98e2SPeter Wemm`R$* < @ localhost . UUCP > $* $: $1 < @ $j . > $2 .UUCP domain') 599c2aa98e2SPeter WemmR$* < @ [ $+ ] > $* $: $1 < @@ [ $2 ] > $3 mark [a.b.c.d] 600c2aa98e2SPeter WemmR$* < @@ $=w > $* $: $1 < @ $j . > $3 self-literal 601c2aa98e2SPeter WemmR$* < @@ $+ > $* $@ $1 < @ $2 > $3 canon IP addr 602c2aa98e2SPeter Wemm 603c2aa98e2SPeter Wemmifdef(`DOMAIN_TABLE', `dnl 604c2aa98e2SPeter Wemm# look up domains in the domain table 605c2aa98e2SPeter WemmR$* < @ $+ > $* $: $1 < @ $(domaintable $2 $) > $3', `dnl') 606c2aa98e2SPeter Wemm 607c2aa98e2SPeter Wemmundivert(2)dnl 608c2aa98e2SPeter Wemm 609c2aa98e2SPeter Wemmifdef(`BITDOMAIN_TABLE', `dnl 610c2aa98e2SPeter Wemm# handle BITNET mapping 611c2aa98e2SPeter WemmR$* < @ $+ .BITNET > $* $: $1 < @ $(bitdomain $2 $: $2.BITNET $) > $3', `dnl') 612c2aa98e2SPeter Wemm 613c2aa98e2SPeter Wemmifdef(`UUDOMAIN_TABLE', `dnl 614c2aa98e2SPeter Wemm# handle UUCP mapping 615c2aa98e2SPeter WemmR$* < @ $+ .UUCP > $* $: $1 < @ $(uudomain $2 $: $2.UUCP $) > $3', `dnl') 616c2aa98e2SPeter Wemm 617c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl', 618c2aa98e2SPeter Wemm`ifdef(`UUCP_RELAY', 619c2aa98e2SPeter Wemm`# pass UUCP addresses straight through 620c2aa98e2SPeter WemmR$* < @ $+ . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', 621c2aa98e2SPeter Wemm`# if really UUCP, handle it immediately 622c2aa98e2SPeter Wemmifdef(`_CLASS_U_', 623c2aa98e2SPeter Wemm`R$* < @ $=U . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') 624c2aa98e2SPeter Wemmifdef(`_CLASS_V_', 625c2aa98e2SPeter Wemm`R$* < @ $=V . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') 626c2aa98e2SPeter Wemmifdef(`_CLASS_W_', 627c2aa98e2SPeter Wemm`R$* < @ $=W . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') 628c2aa98e2SPeter Wemmifdef(`_CLASS_X_', 629c2aa98e2SPeter Wemm`R$* < @ $=X . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') 630c2aa98e2SPeter Wemmifdef(`_CLASS_Y_', 631c2aa98e2SPeter Wemm`R$* < @ $=Y . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') 632c2aa98e2SPeter Wemm 633c2aa98e2SPeter Wemmifdef(`_NO_CANONIFY_', `dnl', `dnl 634c2aa98e2SPeter Wemm# try UUCP traffic as a local address 635c2aa98e2SPeter WemmR$* < @ $+ . UUCP > $* $: $1 < @ $[ $2 $] . UUCP . > $3 636c2aa98e2SPeter WemmR$* < @ $+ . . UUCP . > $* $@ $1 < @ $2 . > $3') 637c2aa98e2SPeter Wemm')') 638c2aa98e2SPeter Wemmifdef(`_NO_CANONIFY_', `dnl', `dnl 639c2aa98e2SPeter Wemm# pass to name server to make hostname canonical 640c2aa98e2SPeter WemmR$* < @ $* $~P > $* $: $1 < @ $[ $2 $3 $] > $4') 641c2aa98e2SPeter Wemm 642c2aa98e2SPeter Wemm# local host aliases and pseudo-domains are always canonical 643c2aa98e2SPeter WemmR$* < @ $=w > $* $: $1 < @ $2 . > $3 644c2aa98e2SPeter WemmR$* < @ $j > $* $: $1 < @ $j . > $2 645c2aa98e2SPeter Wemmifdef(`_MASQUERADE_ENTIRE_DOMAIN_', 646c2aa98e2SPeter Wemm`R$* < @ $* $=M > $* $: $1 < @ $2 $3 . > $4', 647c2aa98e2SPeter Wemm`R$* < @ $=M > $* $: $1 < @ $2 . > $3') 648c2aa98e2SPeter WemmR$* < @ $* $=P > $* $: $1 < @ $2 $3 . > $4 649c2aa98e2SPeter WemmR$* < @ $* . . > $* $1 < @ $2 . > $3 650c2aa98e2SPeter Wemm 651c2aa98e2SPeter Wemm 652c2aa98e2SPeter Wemm################################################## 653c2aa98e2SPeter Wemm### Ruleset 4 -- Final Output Post-rewriting ### 654c2aa98e2SPeter Wemm################################################## 655c2aa98e2SPeter WemmS4 656c2aa98e2SPeter Wemm 657c2aa98e2SPeter WemmR$* <@> $@ handle <> and list:; 658c2aa98e2SPeter Wemm 659c2aa98e2SPeter Wemm# strip trailing dot off possibly canonical name 660c2aa98e2SPeter WemmR$* < @ $+ . > $* $1 < @ $2 > $3 661c2aa98e2SPeter Wemm 662c2aa98e2SPeter Wemm# eliminate internal code -- should never get this far! 663c2aa98e2SPeter WemmR$* < @ *LOCAL* > $* $1 < @ $j > $2 664c2aa98e2SPeter Wemm 665c2aa98e2SPeter Wemm# externalize local domain info 666c2aa98e2SPeter WemmR$* < $+ > $* $1 $2 $3 defocus 667c2aa98e2SPeter WemmR@ $+ : @ $+ : $+ @ $1 , @ $2 : $3 <route-addr> canonical 668c2aa98e2SPeter WemmR@ $* $@ @ $1 ... and exit 669c2aa98e2SPeter Wemm 670c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl', 671c2aa98e2SPeter Wemm`# UUCP must always be presented in old form 672c2aa98e2SPeter WemmR$+ @ $- . UUCP $2!$1 u@h.UUCP => h!u') 673c2aa98e2SPeter Wemm 674c2aa98e2SPeter Wemmifdef(`_USE_DECNET_SYNTAX_', 675c2aa98e2SPeter Wemm`# put DECnet back in :: form 676c2aa98e2SPeter WemmR$+ @ $+ . DECNET $2 :: $1 u@h.DECNET => h::u', 677c2aa98e2SPeter Wemm `dnl') 678c2aa98e2SPeter Wemm# delete duplicate local names 679c2aa98e2SPeter WemmR$+ % $=w @ $=w $1 @ $2 u%host@host => u@host 680c2aa98e2SPeter Wemm 681c2aa98e2SPeter Wemm 682c2aa98e2SPeter Wemm 683c2aa98e2SPeter Wemm############################################################## 684c2aa98e2SPeter Wemm### Ruleset 97 -- recanonicalize and call ruleset zero ### 685c2aa98e2SPeter Wemm### (used for recursive calls) ### 686c2aa98e2SPeter Wemm############################################################## 687c2aa98e2SPeter Wemm 688c2aa98e2SPeter WemmS`'97 689c2aa98e2SPeter WemmR$* $: $>3 $1 690c2aa98e2SPeter WemmR$* $@ $>0 $1 691c2aa98e2SPeter Wemm 692c2aa98e2SPeter Wemm 693c2aa98e2SPeter Wemm###################################### 694c2aa98e2SPeter Wemm### Ruleset 0 -- Parse Address ### 695c2aa98e2SPeter Wemm###################################### 696c2aa98e2SPeter Wemm 697c2aa98e2SPeter WemmS0 698c2aa98e2SPeter Wemm 699c2aa98e2SPeter WemmR$* $: $>Parse0 $1 initial parsing 700c2aa98e2SPeter WemmR<@> $#_LOCAL_ $: <@> special case error msgs 701c2aa98e2SPeter WemmR$* $: $>98 $1 handle local hacks 702c2aa98e2SPeter WemmR$* $: $>Parse1 $1 final parsing 703c2aa98e2SPeter Wemm 704c2aa98e2SPeter Wemm# 705c2aa98e2SPeter Wemm# Parse0 -- do initial syntax checking and eliminate local addresses. 706c2aa98e2SPeter Wemm# This should either return with the (possibly modified) input 707c2aa98e2SPeter Wemm# or return with a #error mailer. It should not return with a 708c2aa98e2SPeter Wemm# #mailer other than the #error mailer. 709c2aa98e2SPeter Wemm# 710c2aa98e2SPeter Wemm 711c2aa98e2SPeter WemmSParse0 712c2aa98e2SPeter WemmR<@> $@ <@> special case error msgs 713c2aa98e2SPeter WemmR$* : $* ; <@> $#error $@ 5.1.3 $: "List:; syntax illegal for recipient addresses" 714c2aa98e2SPeter Wemm#R@ <@ $* > < @ $1 > catch "@@host" bogosity 715c2aa98e2SPeter WemmR<@ $+> $#error $@ 5.1.3 $: "User address required" 716c2aa98e2SPeter WemmR$* $: <> $1 717c2aa98e2SPeter WemmR<> $* < @ [ $+ ] > $* $1 < @ [ $2 ] > $3 718c2aa98e2SPeter WemmR<> $* <$* : $* > $* $#error $@ 5.1.3 $: "Colon illegal in host name part" 719c2aa98e2SPeter WemmR<> $* $1 720c2aa98e2SPeter WemmR$* < @ . $* > $* $#error $@ 5.1.2 $: "Invalid host name" 721c2aa98e2SPeter WemmR$* < @ $* .. $* > $* $#error $@ 5.1.2 $: "Invalid host name" 722c2aa98e2SPeter Wemm 723c2aa98e2SPeter Wemm# now delete the local info -- note $=O to find characters that cause forwarding 724c2aa98e2SPeter WemmR$* < @ > $* $@ $>Parse0 $>3 $1 user@ => user 725c2aa98e2SPeter WemmR< @ $=w . > : $* $@ $>Parse0 $>3 $2 @here:... -> ... 726c2aa98e2SPeter WemmR$- < @ $=w . > $: $(dequote $1 $) < @ $2 . > dequote "foo"@here 727c2aa98e2SPeter WemmR< @ $+ > $#error $@ 5.1.3 $: "User address required" 728c2aa98e2SPeter WemmR$* $=O $* < @ $=w . > $@ $>Parse0 $>3 $1 $2 $3 ...@here -> ... 729c2aa98e2SPeter WemmR$- $: $(dequote $1 $) < @ *LOCAL* > dequote "foo" 730c2aa98e2SPeter WemmR< @ *LOCAL* > $#error $@ 5.1.3 $: "User address required" 731c2aa98e2SPeter WemmR$* $=O $* < @ *LOCAL* > 732c2aa98e2SPeter Wemm $@ $>Parse0 $>3 $1 $2 $3 ...@*LOCAL* -> ... 733c2aa98e2SPeter WemmR$* < @ *LOCAL* > $: $1 734c2aa98e2SPeter Wemm 735c2aa98e2SPeter Wemm# 736c2aa98e2SPeter Wemm# Parse1 -- the bottom half of ruleset 0. 737c2aa98e2SPeter Wemm# 738c2aa98e2SPeter Wemm 739c2aa98e2SPeter WemmSParse1 740c2aa98e2SPeter Wemmifdef(`_MAILER_smtp_', 741c2aa98e2SPeter Wemm`# handle numeric address spec 742c2aa98e2SPeter WemmR$* < @ [ $+ ] > $* $: $>98 $1 < @ [ $2 ] > $3 numeric internet spec 743c2aa98e2SPeter WemmR$* < @ [ $+ ] > $* $#_SMTP_ $@ [$2] $: $1 < @ [$2] > $3 still numeric: send', 744c2aa98e2SPeter Wemm `dnl') 745c2aa98e2SPeter Wemm 746c2aa98e2SPeter Wemmifdef(`VIRTUSER_TABLE', `dnl 747c2aa98e2SPeter Wemm# handle virtual users 748c2aa98e2SPeter WemmR$+ < @ $=w . > $: < $(virtuser $1 @ $2 $@ $1 $: @ $) > $1 < @ $2 . > 749c2aa98e2SPeter WemmR<@> $+ + $* < @ $* . > 750c2aa98e2SPeter Wemm $: < $(virtuser $1 + * @ $3 $@ $1 $: @ $) > $1 + $2 < @ $3 . > 751c2aa98e2SPeter WemmR<@> $+ + $* < @ $* . > 752c2aa98e2SPeter Wemm $: < $(virtuser $1 @ $3 $@ $1 $: @ $) > $1 + $2 < @ $3 . > 753c2aa98e2SPeter WemmR<@> $+ < @ $+ . > $: < $(virtuser @ $2 $@ $1 $: @ $) > $1 < @ $2 . > 754c2aa98e2SPeter WemmR<@> $+ $: $1 755c2aa98e2SPeter WemmR< error : $- $+ > $* $#error $@ $(dequote $1 $) $: $2 756c2aa98e2SPeter WemmR< $+ > $+ < @ $+ > $: $>97 $1', 757c2aa98e2SPeter Wemm`dnl') 758c2aa98e2SPeter Wemm 759c2aa98e2SPeter Wemm# short circuit local delivery so forwarded email works 760c2aa98e2SPeter Wemmifdef(`_MAILER_usenet_', `dnl 761c2aa98e2SPeter WemmR$+ . USENET < @ $=w . > $#usenet $: $1 handle usenet specially', `dnl') 762c2aa98e2SPeter Wemmifdef(`_STICKY_LOCAL_DOMAIN_', 763c2aa98e2SPeter Wemm`R$+ < @ $=w . > $: < $H > $1 < @ $2 . > first try hub 764c2aa98e2SPeter WemmR< $+ > $+ < $+ > $>95 < $1 > $2 < $3 > yep .... 765c2aa98e2SPeter WemmR< > $+ + $* < $+ > $#_LOCAL_ $: $1 + $2 plussed name? 766c2aa98e2SPeter WemmR< > $+ < $+ > $#_LOCAL_ $: @ $1 nope, local address', 767c2aa98e2SPeter Wemm`R$=L < @ $=w . > $#_LOCAL_ $: @ $1 special local names 768c2aa98e2SPeter WemmR$+ < @ $=w . > $#_LOCAL_ $: $1 regular local name') 769c2aa98e2SPeter Wemm 770c2aa98e2SPeter Wemmifdef(`MAILER_TABLE', `dnl 771c2aa98e2SPeter Wemm# not local -- try mailer table lookup 772c2aa98e2SPeter WemmR$* <@ $+ > $* $: < $2 > $1 < @ $2 > $3 extract host name 773c2aa98e2SPeter WemmR< $+ . > $* $: < $1 > $2 strip trailing dot 774c2aa98e2SPeter WemmR< $+ > $* $: < $(mailertable $1 $) > $2 lookup 775c2aa98e2SPeter WemmR< $~[ : $+ > $* $>95 < $1 : $2 > $3 check -- resolved? 776c2aa98e2SPeter WemmR< $+ > $* $: $>90 <$1> $2 try domain', 777c2aa98e2SPeter Wemm`dnl') 778c2aa98e2SPeter Wemmundivert(4)dnl 779c2aa98e2SPeter Wemm 780c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl', 781c2aa98e2SPeter Wemm`# resolve remotely connected UUCP links (if any) 782c2aa98e2SPeter Wemmifdef(`_CLASS_V_', 783c2aa98e2SPeter Wemm`R$* < @ $=V . UUCP . > $* $: $>95 < $V > $1 <@$2.UUCP.> $3', 784c2aa98e2SPeter Wemm `dnl') 785c2aa98e2SPeter Wemmifdef(`_CLASS_W_', 786c2aa98e2SPeter Wemm`R$* < @ $=W . UUCP . > $* $: $>95 < $W > $1 <@$2.UUCP.> $3', 787c2aa98e2SPeter Wemm `dnl') 788c2aa98e2SPeter Wemmifdef(`_CLASS_X_', 789c2aa98e2SPeter Wemm`R$* < @ $=X . UUCP . > $* $: $>95 < $X > $1 <@$2.UUCP.> $3', 790c2aa98e2SPeter Wemm `dnl')') 791c2aa98e2SPeter Wemm 792c2aa98e2SPeter Wemm# resolve fake top level domains by forwarding to other hosts 793c2aa98e2SPeter Wemmifdef(`BITNET_RELAY', 794c2aa98e2SPeter Wemm`R$*<@$+.BITNET.>$* $: $>95 < $B > $1 <@$2.BITNET.> $3 user@host.BITNET', 795c2aa98e2SPeter Wemm `dnl') 796c2aa98e2SPeter Wemmifdef(`DECNET_RELAY', 797c2aa98e2SPeter Wemm`R$*<@$+.DECNET.>$* $: $>95 < $C > $1 <@$2.DECNET.> $3 user@host.DECNET', 798c2aa98e2SPeter Wemm `dnl') 799c2aa98e2SPeter Wemmifdef(`_MAILER_pop_', 800c2aa98e2SPeter Wemm`R$+ < @ POP. > $#pop $: $1 user@POP', 801c2aa98e2SPeter Wemm `dnl') 802c2aa98e2SPeter Wemmifdef(`_MAILER_fax_', 803c2aa98e2SPeter Wemm`R$+ < @ $+ .FAX. > $#fax $@ $2 $: $1 user@host.FAX', 804c2aa98e2SPeter Wemm`ifdef(`FAX_RELAY', 805c2aa98e2SPeter Wemm`R$*<@$+.FAX.>$* $: $>95 < $F > $1 <@$2.FAX.> $3 user@host.FAX', 806c2aa98e2SPeter Wemm `dnl')') 807c2aa98e2SPeter Wemm 808c2aa98e2SPeter Wemmifdef(`UUCP_RELAY', 809c2aa98e2SPeter Wemm`# forward non-local UUCP traffic to our UUCP relay 810c2aa98e2SPeter WemmR$*<@$*.UUCP.>$* $: $>95 < $Y > $1 <@$2.UUCP.> $3 uucp mail', 811c2aa98e2SPeter Wemm`ifdef(`_MAILER_uucp_', 812c2aa98e2SPeter Wemm`# forward other UUCP traffic straight to UUCP 813c2aa98e2SPeter WemmR$* < @ $+ .UUCP. > $* $#_UUCP_ $@ $2 $: $1 < @ $2 .UUCP. > $3 user@host.UUCP', 814c2aa98e2SPeter Wemm `dnl')') 815c2aa98e2SPeter Wemmifdef(`_MAILER_usenet_', ` 816c2aa98e2SPeter Wemm# addresses sent to net.group.USENET will get forwarded to a newsgroup 817c2aa98e2SPeter WemmR$+ . USENET $#usenet $: $1', 818c2aa98e2SPeter Wemm `dnl') 819c2aa98e2SPeter Wemm 820c2aa98e2SPeter Wemmifdef(`_LOCAL_RULES_', 821c2aa98e2SPeter Wemm`# figure out what should stay in our local mail system 822c2aa98e2SPeter Wemmundivert(1)', `dnl') 823c2aa98e2SPeter Wemm 824c2aa98e2SPeter Wemm# pass names that still have a host to a smarthost (if defined) 825c2aa98e2SPeter WemmR$* < @ $* > $* $: $>95 < $S > $1 < @ $2 > $3 glue on smarthost name 826c2aa98e2SPeter Wemm 827c2aa98e2SPeter Wemm# deal with other remote names 828c2aa98e2SPeter Wemmifdef(`_MAILER_smtp_', 829c2aa98e2SPeter Wemm`R$* < @$* > $* $#_SMTP_ $@ $2 $: $1 < @ $2 > $3 user@host.domain', 830c2aa98e2SPeter Wemm`R$* < @$* > $* $#error $@ 5.1.2 $: "Unrecognized host name" $2') 831c2aa98e2SPeter Wemm 832c2aa98e2SPeter Wemm# handle locally delivered names 833c2aa98e2SPeter WemmR$=L $#_LOCAL_ $: @ $1 special local names 834c2aa98e2SPeter WemmR$+ $#_LOCAL_ $: $1 regular local names 835c2aa98e2SPeter Wemm 836c2aa98e2SPeter Wemm########################################################################### 837c2aa98e2SPeter Wemm### Ruleset 5 -- special rewriting after aliases have been expanded ### 838c2aa98e2SPeter Wemm########################################################################### 839c2aa98e2SPeter Wemm 840c2aa98e2SPeter WemmS5 841c2aa98e2SPeter Wemm 842c2aa98e2SPeter Wemm# deal with plussed users so aliases work nicely 843c2aa98e2SPeter WemmR$+ + * $#_LOCAL_ $@ $&h $: $1 844c2aa98e2SPeter WemmR$+ + $* $#_LOCAL_ $@ + $2 $: $1 + * 845c2aa98e2SPeter Wemm 846c2aa98e2SPeter Wemm# prepend an empty "forward host" on the front 847c2aa98e2SPeter WemmR$+ $: <> $1 848c2aa98e2SPeter Wemm 849c2aa98e2SPeter Wemmifdef(`LUSER_RELAY', `dnl 850c2aa98e2SPeter Wemm# send unrecognized local users to a relay host 851c2aa98e2SPeter WemmR< > $+ $: < $L . > $(user $1 $) look up user 852c2aa98e2SPeter WemmR< $* > $+ <> $* $: < > $2 $3 found; strip $L 853c2aa98e2SPeter WemmR< $* . > $+ $: < $1 > $2 strip extra dot', 854c2aa98e2SPeter Wemm`dnl') 855c2aa98e2SPeter Wemm 856c2aa98e2SPeter Wemm# see if we have a relay or a hub 857c2aa98e2SPeter WemmR< > $+ $: < $H > $1 try hub 858c2aa98e2SPeter WemmR< > $+ $: < $R > $1 try relay 859c2aa98e2SPeter WemmR< > $+ $: < > < $1 $&h > nope, restore +detail 860c2aa98e2SPeter WemmR< > < $+ + $* > $* < > < $1 > + $2 $3 find the user part 861c2aa98e2SPeter WemmR< > < $+ > + $* $#_LOCAL_ $@ $2 $: @ $1 strip the extra + 862c2aa98e2SPeter WemmR< > < $+ > $@ $1 no +detail 863c2aa98e2SPeter WemmR$+ $: $1 $&h add +detail back in 864c2aa98e2SPeter WemmR< local : $* > $* $: $>95 < local : $1 > $2 no host extension 865c2aa98e2SPeter WemmR< error : $* > $* $: $>95 < error : $1 > $2 no host extension 866c2aa98e2SPeter WemmR< $- : $+ > $+ $: $>95 < $1 : $2 > $3 < @ $2 > 867c2aa98e2SPeter WemmR< $+ > $+ $@ $>95 < $1 > $2 < @ $1 > 868c2aa98e2SPeter Wemm 869c2aa98e2SPeter Wemmifdef(`MAILER_TABLE', `dnl 870c2aa98e2SPeter Wemm################################################################### 871c2aa98e2SPeter Wemm### Ruleset 90 -- try domain part of mailertable entry ### 872c2aa98e2SPeter Wemm################################################################### 873c2aa98e2SPeter Wemm 874c2aa98e2SPeter WemmS90 875c2aa98e2SPeter WemmR$* <$- . $+ > $* $: $1$2 < $(mailertable .$3 $@ $1$2 $@ $2 $) > $4 876c2aa98e2SPeter WemmR$* <$~[ : $+ > $* $>95 < $2 : $3 > $4 check -- resolved? 877c2aa98e2SPeter WemmR$* < . $+ > $* $@ $>90 $1 . <$2> $3 no -- strip & try again 878c2aa98e2SPeter WemmR$* < $* > $* $: < $(mailertable . $@ $1$2 $) > $3 try "." 879c2aa98e2SPeter WemmR< $~[ : $+ > $* $>95 < $1 : $2 > $3 "." found? 880c2aa98e2SPeter WemmR< $* > $* $@ $2 no mailertable match', 881c2aa98e2SPeter Wemm`dnl') 882c2aa98e2SPeter Wemm 883c2aa98e2SPeter Wemm################################################################### 884c2aa98e2SPeter Wemm### Ruleset 95 -- canonify mailer:[user@]host syntax to triple ### 885c2aa98e2SPeter Wemm################################################################### 886c2aa98e2SPeter Wemm 887c2aa98e2SPeter WemmS95 888c2aa98e2SPeter WemmR< > $* $@ $1 strip off null relay 889c2aa98e2SPeter WemmR< error : $- $+ > $* $#error $@ $(dequote $1 $) $: $2 890c2aa98e2SPeter WemmR< local : $* > $* $>CanonLocal < $1 > $2 891c2aa98e2SPeter WemmR< $- : $+ @ $+ > $*<$*>$* $# $1 $@ $3 $: $2<@$3> use literal user 892c2aa98e2SPeter WemmR< $- : $+ > $* $# $1 $@ $2 $: $3 try qualified mailer 893c2aa98e2SPeter WemmR< $=w > $* $@ $2 delete local host 894c2aa98e2SPeter WemmR< $+ > $* $#_RELAY_ $@ $1 $: $2 use unqualified mailer 895c2aa98e2SPeter Wemm 896c2aa98e2SPeter Wemm################################################################### 897c2aa98e2SPeter Wemm### Ruleset CanonLocal -- canonify local: syntax ### 898c2aa98e2SPeter Wemm################################################################### 899c2aa98e2SPeter Wemm 900c2aa98e2SPeter WemmSCanonLocal 901c2aa98e2SPeter Wemm# strip trailing dot from any host name that may appear 902c2aa98e2SPeter WemmR< $* > $* < @ $* . > $: < $1 > $2 < @ $3 > 903c2aa98e2SPeter Wemm 904c2aa98e2SPeter Wemm# handle local: syntax -- use old user, either with or without host 905c2aa98e2SPeter WemmR< > $* < @ $* > $* $#_LOCAL_ $@ $1@$2 $: $1 906c2aa98e2SPeter WemmR< > $+ $#_LOCAL_ $@ $1 $: $1 907c2aa98e2SPeter Wemm 908c2aa98e2SPeter Wemm# handle local:user@host syntax -- ignore host part 909c2aa98e2SPeter WemmR< $+ @ $+ > $* < @ $* > $: < $1 > $3 < @ $4 > 910c2aa98e2SPeter Wemm 911c2aa98e2SPeter Wemm# handle local:user syntax 912c2aa98e2SPeter WemmR< $+ > $* <@ $* > $* $#_LOCAL_ $@ $2@$3 $: $1 913c2aa98e2SPeter WemmR< $+ > $* $#_LOCAL_ $@ $2 $: $1 914c2aa98e2SPeter Wemm 915c2aa98e2SPeter Wemm################################################################### 916c2aa98e2SPeter Wemm### Ruleset 93 -- convert header names to masqueraded form ### 917c2aa98e2SPeter Wemm################################################################### 918c2aa98e2SPeter Wemm 919c2aa98e2SPeter WemmS93 920c2aa98e2SPeter Wemm 921c2aa98e2SPeter Wemmifdef(`GENERICS_TABLE', `dnl 922c2aa98e2SPeter Wemm# handle generics database 923c2aa98e2SPeter Wemmifdef(`_GENERICS_ENTIRE_DOMAIN_', 924c2aa98e2SPeter Wemm`R$+ < @ $* $=G . > $: < $1@$2$3 > $1 < @ $2$3 . > @ mark', 925c2aa98e2SPeter Wemm`R$+ < @ $=G . > $: < $1@$2 > $1 < @ $2 . > @ mark') 926c2aa98e2SPeter WemmR$+ < @ *LOCAL* > $: < $1@$j > $1 < @ *LOCAL* > @ mark 927c2aa98e2SPeter WemmR< $+ > $+ < $* > @ $: < $(generics $1 $: $) > $2 < $3 > 928c2aa98e2SPeter WemmR< > $+ < @ $+ > $: < $(generics $1 $: $) > $1 < @ $2 > 929c2aa98e2SPeter WemmR< $* @ $* > $* < $* > $@ $>3 $1 @ $2 found qualified 930c2aa98e2SPeter WemmR< $+ > $* < $* > $: $>3 $1 @ *LOCAL* found unqualified 931c2aa98e2SPeter WemmR< > $* $: $1 not found', 932c2aa98e2SPeter Wemm`dnl') 933c2aa98e2SPeter Wemm 934c2aa98e2SPeter Wemm# special case the users that should be exposed 935c2aa98e2SPeter WemmR$=E < @ *LOCAL* > $@ $1 < @ $j . > leave exposed 936c2aa98e2SPeter Wemmifdef(`_MASQUERADE_ENTIRE_DOMAIN_', 937c2aa98e2SPeter Wemm`R$=E < @ $* $=M . > $@ $1 < @ $2 $3 . >', 938c2aa98e2SPeter Wemm`R$=E < @ $=M . > $@ $1 < @ $2 . >') 939c2aa98e2SPeter Wemmifdef(`_LIMITED_MASQUERADE_', `dnl', 940c2aa98e2SPeter Wemm`R$=E < @ $=w . > $@ $1 < @ $2 . >') 941c2aa98e2SPeter Wemm 942c2aa98e2SPeter Wemm# handle domain-specific masquerading 943c2aa98e2SPeter Wemmifdef(`_MASQUERADE_ENTIRE_DOMAIN_', 944c2aa98e2SPeter Wemm`R$* < @ $* $=M . > $* $: $1 < @ $2 $3 . @ $M > $4 convert masqueraded doms', 945c2aa98e2SPeter Wemm`R$* < @ $=M . > $* $: $1 < @ $2 . @ $M > $3 convert masqueraded doms') 946c2aa98e2SPeter Wemmifdef(`_LIMITED_MASQUERADE_', `dnl', 947c2aa98e2SPeter Wemm`R$* < @ $=w . > $* $: $1 < @ $2 . @ $M > $3') 948c2aa98e2SPeter WemmR$* < @ *LOCAL* > $* $: $1 < @ $j . @ $M > $2 949c2aa98e2SPeter WemmR$* < @ $+ @ > $* $: $1 < @ $2 > $3 $M is null 950c2aa98e2SPeter WemmR$* < @ $+ @ $+ > $* $: $1 < @ $3 . > $4 $M is not null 951c2aa98e2SPeter Wemm 952c2aa98e2SPeter Wemm################################################################### 953c2aa98e2SPeter Wemm### Ruleset 94 -- convert envelope names to masqueraded form ### 954c2aa98e2SPeter Wemm################################################################### 955c2aa98e2SPeter Wemm 956c2aa98e2SPeter WemmS94 957c2aa98e2SPeter Wemmifdef(`_MASQUERADE_ENVELOPE_', 958c2aa98e2SPeter Wemm`R$+ $@ $>93 $1', 959c2aa98e2SPeter Wemm`R$* < @ *LOCAL* > $* $: $1 < @ $j . > $2') 960c2aa98e2SPeter Wemm 961c2aa98e2SPeter Wemm################################################################### 962c2aa98e2SPeter Wemm### Ruleset 98 -- local part of ruleset zero (can be null) ### 963c2aa98e2SPeter Wemm################################################################### 964c2aa98e2SPeter Wemm 965c2aa98e2SPeter WemmS98 966c2aa98e2SPeter Wemmundivert(3)dnl 967c2aa98e2SPeter Wemm 968c2aa98e2SPeter Wemmifelse(confDELIVERY_MODE, defer, `errprint(`WARNING: Antispam rules not available in deferred delivery mode.')') 969c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 970c2aa98e2SPeter Wemm###################################################################### 971c2aa98e2SPeter Wemm### LookUpDomain -- search for domain in access database 972c2aa98e2SPeter Wemm### 973c2aa98e2SPeter Wemm### Parameters: 974c2aa98e2SPeter Wemm### <$1> -- key (domain name) 975c2aa98e2SPeter Wemm### <$2> -- default (what to return if not found in db) 976c2aa98e2SPeter Wemm### <$3> -- passthru (additional data passed unchanged through) 977c2aa98e2SPeter Wemm###################################################################### 978c2aa98e2SPeter Wemm 979c2aa98e2SPeter WemmSLookUpDomain 980c2aa98e2SPeter WemmR<$+> <$+> <$*> $: < $(access $1 $: ? $) > <$1> <$2> <$3> 981c2aa98e2SPeter WemmR<?> <$+.$+> <$+> <$*> $@ $>LookUpDomain <$2> <$3> <$4> 982c2aa98e2SPeter WemmR<?> <$+> <$+> <$*> $@ <$2> <$3> 983c2aa98e2SPeter WemmR<$*> <$+> <$+> <$*> $@ <$1> <$4> 984c2aa98e2SPeter Wemm 985c2aa98e2SPeter Wemm###################################################################### 986c2aa98e2SPeter Wemm### LookUpAddress -- search for host address in access database 987c2aa98e2SPeter Wemm### 988c2aa98e2SPeter Wemm### Parameters: 989c2aa98e2SPeter Wemm### <$1> -- key (dot quadded host address) 990c2aa98e2SPeter Wemm### <$2> -- default (what to return if not found in db) 991c2aa98e2SPeter Wemm### <$3> -- passthru (additional data passed through) 992c2aa98e2SPeter Wemm###################################################################### 993c2aa98e2SPeter Wemm 994c2aa98e2SPeter WemmSLookUpAddress 995c2aa98e2SPeter WemmR<$+> <$+> <$*> $: < $(access $1 $: ? $) > <$1> <$2> <$3> 996c2aa98e2SPeter WemmR<?> <$+.$-> <$+> <$*> $@ $>LookUpAddress <$1> <$3> <$4> 997c2aa98e2SPeter WemmR<?> <$+> <$+> <$*> $@ <$2> <$3> 998c2aa98e2SPeter WemmR<$*> <$+> <$+> <$*> $@ <$1> <$4>', 999c2aa98e2SPeter Wemm`dnl') 1000c2aa98e2SPeter Wemm 1001c2aa98e2SPeter Wemm###################################################################### 1002c2aa98e2SPeter Wemm### ParseRecipient -- Strip off hosts in $=R as well as possibly 1003c2aa98e2SPeter Wemm### $* $=m or the access database. 1004c2aa98e2SPeter Wemm### Check user portion for host separators. 1005c2aa98e2SPeter Wemm### 1006c2aa98e2SPeter Wemm### Parameters: 1007c2aa98e2SPeter Wemm### $1 -- full recipient address 1008c2aa98e2SPeter Wemm### 1009c2aa98e2SPeter Wemm### Returns: 1010c2aa98e2SPeter Wemm### parsed, non-local-relaying address 1011c2aa98e2SPeter Wemm###################################################################### 1012c2aa98e2SPeter Wemm 1013c2aa98e2SPeter WemmSParseRecipient 1014c2aa98e2SPeter WemmR$* $: <?> $>Parse0 $>3 $1 1015c2aa98e2SPeter WemmR<?> $* < @ $* . > <?> $1 < @ $2 > strip trailing dots 1016c2aa98e2SPeter WemmR<?> $- < @ $* > $: <?> $(dequote $1 $) < @ $2 > dequote local part 1017c2aa98e2SPeter Wemm 1018c2aa98e2SPeter Wemm# if no $=O character, no host in the user portion, we are done 1019c2aa98e2SPeter WemmR<?> $* $=O $* < @ $* > $: <NO> $1 $2 $3 < @ $4> 1020c2aa98e2SPeter WemmR<?> $* $@ $1 1021c2aa98e2SPeter Wemm 1022c2aa98e2SPeter Wemmifdef(`_RELAY_ENTIRE_DOMAIN_', `dnl 1023c2aa98e2SPeter Wemm# if we relay, check username portion for user%host so host can be checked also 1024c2aa98e2SPeter WemmR<NO> $* < @ $* $=m > $: <RELAY> $1 < @ $2 $3 >', `dnl') 1025c2aa98e2SPeter Wemmifdef(`_RELAY_HOSTS_ONLY_', 1026c2aa98e2SPeter Wemm`R<NO> $* < @ $=R > $: <RELAY> $1 < @ $2 > 1027c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1028c2aa98e2SPeter WemmR<NO> $* < @ $* > $: <$(access $2 $: NO $)> $1 < @ $2 >',`dnl')', 1029c2aa98e2SPeter Wemm`R<NO> $* < @ $* $=R > $: <RELAY> $1 < @ $2 $3 > 1030c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1031c2aa98e2SPeter WemmR<NO> $* < @ $* > $: $>LookUpDomain <$2> <NO> <$1 < @ $2 >> 1032c2aa98e2SPeter WemmR<$+> <$+> $: <$1> $2',`dnl')') 1033c2aa98e2SPeter WemmR<RELAY> $* < @ $* > $@ $>ParseRecipient $1 1034c2aa98e2SPeter WemmR<$-> $* $@ $2 1035c2aa98e2SPeter Wemm 1036c2aa98e2SPeter Wemm###################################################################### 1037c2aa98e2SPeter Wemm### check_relay -- check hostname/address on SMTP startup 1038c2aa98e2SPeter Wemm###################################################################### 1039c2aa98e2SPeter Wemm 1040c2aa98e2SPeter WemmSLocal_check_relay 1041c2aa98e2SPeter WemmScheck_relay 1042c2aa98e2SPeter WemmR$* $: $1 $| $>"Local_check_relay" $1 1043c2aa98e2SPeter WemmR$* $| $* $| $#$* $#$3 1044c2aa98e2SPeter WemmR$* $| $* $| $* $@ $>"Basic_check_relay" $1 $| $2 1045c2aa98e2SPeter Wemm 1046c2aa98e2SPeter WemmSBasic_check_relay 1047c2aa98e2SPeter Wemm# check for deferred delivery mode 1048c2aa98e2SPeter WemmR$* $: < ${deliveryMode} > $1 1049c2aa98e2SPeter WemmR< d > $* $@ deferred 1050c2aa98e2SPeter WemmR< $* > $* $: $2 1051c2aa98e2SPeter Wemm 1052c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1053c2aa98e2SPeter WemmR$+ $| $+ $: $>LookUpDomain < $1 > <?> < $2 > 1054c2aa98e2SPeter WemmR<?> < $+ > $: $>LookUpAddress < $1 > <OK> < $1 > 1055c2aa98e2SPeter WemmR<OK> < $* > $: $1 1056c2aa98e2SPeter WemmR<RELAY> < $* > $: $1 1057c2aa98e2SPeter WemmR<REJECT> $* $#error $@ 5.7.1 $: "ifdef(`confREJECT_MSG', `confREJECT_MSG', `550 Access denied')" 1058c2aa98e2SPeter WemmR<DISCARD> $* $#discard $: discard 1059c2aa98e2SPeter WemmR<$+> $* $#error $@ 5.7.1 $: $1', `dnl') 1060c2aa98e2SPeter Wemm 1061c2aa98e2SPeter Wemmifdef(`_RBL_', `dnl 1062c2aa98e2SPeter Wemm# MAPS project checks -- http://maps.vix.com/ 1063c2aa98e2SPeter WemmR$* $: $&{client_addr} 1064c2aa98e2SPeter WemmR$-.$-.$-.$- $: $(host $4.$3.$2.$1._RBL_. $: OK $) 1065c2aa98e2SPeter WemmROK $@ OK 1066c2aa98e2SPeter WemmR$+ $#error $@ 5.7.1 $: "Mail from " $&{client_addr} " refused; see http://maps.vix.com/rbl/"', 1067c2aa98e2SPeter Wemm`dnl') 1068c2aa98e2SPeter Wemm 1069c2aa98e2SPeter Wemm###################################################################### 1070c2aa98e2SPeter Wemm### check_mail -- check SMTP ``MAIL FROM:'' command argument 1071c2aa98e2SPeter Wemm###################################################################### 1072c2aa98e2SPeter Wemm 1073c2aa98e2SPeter WemmSLocal_check_mail 1074c2aa98e2SPeter WemmScheck_mail 1075c2aa98e2SPeter WemmR$* $: $1 $| $>"Local_check_mail" $1 1076c2aa98e2SPeter WemmR$* $| $#$* $#$2 1077c2aa98e2SPeter WemmR$* $| $* $@ $>"Basic_check_mail" $1 1078c2aa98e2SPeter Wemm 1079c2aa98e2SPeter WemmSBasic_check_mail 1080c2aa98e2SPeter Wemm# check for deferred delivery mode 1081c2aa98e2SPeter WemmR$* $: < ${deliveryMode} > $1 1082c2aa98e2SPeter WemmR< d > $* $@ deferred 1083c2aa98e2SPeter WemmR< $* > $* $: $2 1084c2aa98e2SPeter Wemm 1085c2aa98e2SPeter WemmR<> $@ <OK> 1086c2aa98e2SPeter WemmR$* $: <?> $>Parse0 $>3 $1 make domain canonical 1087c2aa98e2SPeter WemmR<?> $* < @ $+ . > $* <?> $1 < @ $2 > $3 strip trailing dots 1088c2aa98e2SPeter Wemm# handle non-DNS hostnames (*.bitnet, *.decnet, *.uucp, etc) 1089c2aa98e2SPeter WemmR<?> $* < $* $=P > $* $: <OK> $1 < @ $2 $3 > $4 1090c2aa98e2SPeter Wemmifdef(`_ACCEPT_UNRESOLVABLE_DOMAINS_', 1091c2aa98e2SPeter Wemm`R<?> $* < @ $+ > $* $: <OK> $1 < @ $2 > $3 ... unresolvable OK', 1092c2aa98e2SPeter Wemm`R<?> $* < @ $+ > $* $: <? $(resolve $2 $: $2 <PERM> $) > $1 < @ $2 > $3 1093c2aa98e2SPeter WemmR<? $* <$->> $* < @ $+ > $* 1094c2aa98e2SPeter Wemm $: <$2> $3 < @ $4 > $5') 1095c2aa98e2SPeter Wemm 1096c2aa98e2SPeter Wemmifdef(`_ACCEPT_UNQUALIFIED_SENDERS_',`dnl',`dnl 1097c2aa98e2SPeter Wemm# handle case of @localhost on address 1098c2aa98e2SPeter WemmR<$+> $* < @localhost > $: < ? $&{client_name} > <$1> $2 < @localhost > 1099c2aa98e2SPeter WemmR<$+> $* < @localhost.$m > 1100c2aa98e2SPeter Wemm $: < ? $&{client_name} > <$1> $2 < @localhost.$m > 1101c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl', 1102c2aa98e2SPeter Wemm`R<$+> $* < @localhost.UUCP > 1103c2aa98e2SPeter Wemm $: < ? $&{client_name} > <$1> $2 < @localhost.UUCP >') 1104c2aa98e2SPeter WemmR<? $=w> <$+> $* <?> <$2> $3 1105c2aa98e2SPeter WemmR<? $+> <$+> $* $#error $@ 5.5.4 $: "553 Real domain name required" 1106c2aa98e2SPeter WemmR<?> <$+> $* $: <$1> $2') 1107c2aa98e2SPeter Wemm 1108c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1109c2aa98e2SPeter Wemm# lookup localpart (user@) 1110c2aa98e2SPeter WemmR<$+> $* < @ $+ > $* $: <USER $(access $2@ $: ? $) > <$1> $2 < @ $3 > $4 1111c2aa98e2SPeter Wemm# no match, try full address (user@domain rest) 1112c2aa98e2SPeter WemmR<USER ?> <$+> $* < @ $* > $* 1113c2aa98e2SPeter Wemm $: <USER $(access $2@$3$4 $: ? $) > <$1> $2 < @ $3 > $4 1114c2aa98e2SPeter Wemm# no match, try address (user@domain) 1115c2aa98e2SPeter WemmR<USER ?> <$+> $+ < @ $+ > $* 1116c2aa98e2SPeter Wemm $: <USER $(access $2@$3 $: ? $) > <$1> $2 < @ $3 > $4 1117c2aa98e2SPeter Wemm# no match, try (sub)domain (domain) 1118c2aa98e2SPeter WemmR<USER ?> <$+> $* < @ $+ > $* 1119c2aa98e2SPeter Wemm $: $>LookUpDomain <$3> <$1> <> 1120c2aa98e2SPeter Wemm# check unqualified user in access database 1121c2aa98e2SPeter WemmR<?> $* $: <USER $(access $1@ $: ? $) > <?> $1 1122c2aa98e2SPeter Wemm# retransform for further use 1123c2aa98e2SPeter WemmR<USER $+> <$+> $* $: <$1> $3', 1124c2aa98e2SPeter Wemm`dnl') 1125c2aa98e2SPeter Wemm 1126c2aa98e2SPeter Wemmifdef(`_ACCEPT_UNQUALIFIED_SENDERS_',`dnl',`dnl 1127c2aa98e2SPeter Wemm# handle case of no @domain on address 1128c2aa98e2SPeter WemmR<?> $* $: < ? $&{client_name} > $1 1129c2aa98e2SPeter WemmR<?> $* $@ <OK> ...local unqualed ok 1130c2aa98e2SPeter WemmR<? $+> $* $#error $@ 5.5.4 $: "553 Domain name required" 1131c2aa98e2SPeter Wemm ...remote is not') 1132c2aa98e2SPeter Wemm# check results 1133c2aa98e2SPeter WemmR<?> $* $@ <OK> 1134c2aa98e2SPeter WemmR<OK> $* $@ <OK> 1135c2aa98e2SPeter WemmR<TEMP> $* $#error $@ 4.1.8 $: "451 Sender domain must resolve" 1136c2aa98e2SPeter WemmR<PERM> $* $#error $@ 5.1.8 $: "501 Sender domain must exist" 1137c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1138c2aa98e2SPeter WemmR<RELAY> $* $@ <RELAY> 1139c2aa98e2SPeter WemmR<DISCARD> $* $#discard $: discard 1140c2aa98e2SPeter WemmR<REJECT> $* $#error $@ 5.7.1 $: "ifdef(`confREJECT_MSG', `confREJECT_MSG', `550 Access denied')" 1141c2aa98e2SPeter WemmR<$+> $* $#error $@ 5.7.1 $: $1 error from access db', 1142c2aa98e2SPeter Wemm`dnl') 1143c2aa98e2SPeter Wemm 1144c2aa98e2SPeter Wemm###################################################################### 1145c2aa98e2SPeter Wemm### check_rcpt -- check SMTP ``RCPT TO:'' command argument 1146c2aa98e2SPeter Wemm###################################################################### 1147c2aa98e2SPeter Wemm 1148c2aa98e2SPeter WemmSLocal_check_rcpt 1149c2aa98e2SPeter WemmScheck_rcpt 1150c2aa98e2SPeter WemmR$* $: $1 $| $>"Local_check_rcpt" $1 1151c2aa98e2SPeter WemmR$* $| $#$* $#$2 1152c2aa98e2SPeter WemmR$* $| $* $@ $>"Basic_check_rcpt" $1 1153c2aa98e2SPeter Wemm 1154c2aa98e2SPeter WemmSBasic_check_rcpt 1155c2aa98e2SPeter Wemm# check for deferred delivery mode 1156c2aa98e2SPeter WemmR$* $: < ${deliveryMode} > $1 1157c2aa98e2SPeter WemmR< d > $* $@ deferred 1158c2aa98e2SPeter WemmR< $* > $* $: $2 1159c2aa98e2SPeter Wemm 1160c2aa98e2SPeter Wemmifdef(`_LOOSE_RELAY_CHECK_',`dnl 1161c2aa98e2SPeter WemmR$* $: $>Parse0 $>3 $1 1162c2aa98e2SPeter WemmR$* < @ $* . > $1 < @ $2 > strip trailing dots', 1163c2aa98e2SPeter Wemm`R$* $: $>ParseRecipient $1 strip relayable hosts') 1164c2aa98e2SPeter Wemm 1165c2aa98e2SPeter Wemmifdef(`_BLACKLIST_RCPT_',`dnl 1166c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1167c2aa98e2SPeter Wemm# blacklist local users or any host from receiving mail 1168c2aa98e2SPeter WemmR$* $: <?> $1 1169c2aa98e2SPeter WemmR<?> $+ < @ $=w > $: <> <USER $1> <FULL $1@$2> <HOST $2> <$1 < @ $2 >> 1170c2aa98e2SPeter WemmR<?> $+ < @ $* > $: <> <FULL $1@$2> <HOST $2> <$1 < @ $2 >> 1171c2aa98e2SPeter WemmR<?> $+ $: <> <USER $1> <$1> 1172c2aa98e2SPeter WemmR<> <USER $+> $* $: <$(access $1 $: $)> $2 1173c2aa98e2SPeter WemmR<> <FULL $+> $* $: <$(access $1 $: $)> $2 1174c2aa98e2SPeter WemmR<OK> <FULL $+> $* $: <$(access $1 $: $)> $2 1175c2aa98e2SPeter WemmR<> <HOST $+> $* $: <$(access $1 $: $)> $2 1176c2aa98e2SPeter WemmR<OK> <HOST $+> $* $: <$(access $1 $: $)> $2 1177c2aa98e2SPeter WemmR<> <$*> $: $1 1178c2aa98e2SPeter WemmR<OK> <$*> $: $1 1179c2aa98e2SPeter WemmR<RELAY> <$*> $: $1 1180c2aa98e2SPeter WemmR<REJECT> $* $#error $@ 5.2.1 $: "550 Mailbox disabled for this recipient" 1181c2aa98e2SPeter WemmR<$+> $* $#error $@ 5.2.1 $: $1 error from access db', `dnl')', `dnl') 1182c2aa98e2SPeter Wemm 1183c2aa98e2SPeter Wemmifdef(`_PROMISCUOUS_RELAY_', `dnl', `dnl 1184c2aa98e2SPeter Wemm# anything terminating locally is ok 1185c2aa98e2SPeter Wemmifdef(`_RELAY_ENTIRE_DOMAIN_', `dnl 1186c2aa98e2SPeter WemmR$+ < @ $* $=m > $@ OK', `dnl') 1187c2aa98e2SPeter WemmR$+ < @ $=w > $@ OK 1188c2aa98e2SPeter Wemmifdef(`_RELAY_HOSTS_ONLY_', 1189c2aa98e2SPeter Wemm`R$+ < @ $=R > $@ OK 1190c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1191c2aa98e2SPeter WemmR$+ < @ $* > $: <$(access $2 $: ? $)> <$1 < @ $2 >>',`dnl')', 1192c2aa98e2SPeter Wemm`R$+ < @ $* $=R > $@ OK 1193c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1194c2aa98e2SPeter WemmR$+ < @ $* > $: $>LookUpDomain <$2> <?> <$1 < @ $2 >>',`dnl')') 1195c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1196c2aa98e2SPeter WemmR<RELAY> $* $@ RELAY 1197c2aa98e2SPeter WemmR<$*> <$*> $: $2',`dnl') 1198c2aa98e2SPeter Wemm 1199c2aa98e2SPeter Wemmifdef(`_RELAY_MX_SERVED_', `dnl 1200c2aa98e2SPeter Wemm# allow relaying for hosts which we MX serve 1201c2aa98e2SPeter WemmR$+ < @ $* > $: < : $(mxserved $2 $) : > $1 < @ $2 > 1202c2aa98e2SPeter WemmR< : $* <TEMP> : > $* $#error $@ 4.7.1 $: "450 Can not check MX records for recipient host " $1 1203c2aa98e2SPeter WemmR<$* : $=w . : $*> $* $@ OK 1204c2aa98e2SPeter WemmR<$*> $* $: $2', 1205c2aa98e2SPeter Wemm`dnl') 1206c2aa98e2SPeter Wemm 1207c2aa98e2SPeter Wemm# check for local user (i.e. unqualified address) 1208c2aa98e2SPeter WemmR$* $: <?> $1 1209c2aa98e2SPeter WemmR<?> $+ < @ $+ > $: <REMOTE> $1 < @ $2 > 1210c2aa98e2SPeter Wemm# local user is ok 1211c2aa98e2SPeter WemmR<?> $+ $@ OK 1212c2aa98e2SPeter WemmR<$+> $* $: $2 1213c2aa98e2SPeter Wemm 1214c2aa98e2SPeter Wemm# anything originating locally is ok 1215c2aa98e2SPeter WemmR$* $: <?> $&{client_name} 1216c2aa98e2SPeter Wemm# check if bracketed IP address (forward lookup != reverse lookup) 1217c2aa98e2SPeter WemmR<?> [$+] $: <BAD> [$1] 1218c2aa98e2SPeter Wemm# pass to name server to make hostname canonical 1219c2aa98e2SPeter WemmR<?> $* $~P $: <?> $[ $1 $2 $] 1220c2aa98e2SPeter WemmR<$-> $* $: $2 1221c2aa98e2SPeter WemmR$* . $1 strip trailing dots 1222c2aa98e2SPeter WemmR$@ $@ OK 1223c2aa98e2SPeter Wemmifdef(`_RELAY_ENTIRE_DOMAIN_', `dnl 1224c2aa98e2SPeter WemmR$* $=m $@ OK', `dnl') 1225c2aa98e2SPeter WemmR$=w $@ OK 1226c2aa98e2SPeter Wemmifdef(`_RELAY_HOSTS_ONLY_', 1227c2aa98e2SPeter Wemm`R$=R $@ OK 1228c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1229c2aa98e2SPeter WemmR$* $: <$(access $1 $: ? $)> <$1>',`dnl')', 1230c2aa98e2SPeter Wemm`R$* $=R $@ OK 1231c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1232c2aa98e2SPeter WemmR$* $: $>LookUpDomain <$1> <?> <$1>',`dnl')') 1233c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1234c2aa98e2SPeter WemmR<RELAY> $* $@ RELAY 1235c2aa98e2SPeter WemmR<$*> <$*> $: $2',`dnl') 1236c2aa98e2SPeter Wemm 1237c2aa98e2SPeter Wemm# check IP address 1238c2aa98e2SPeter WemmR$* $: $&{client_addr} 1239c2aa98e2SPeter WemmR$@ $@ OK originated locally 1240c2aa98e2SPeter WemmR0 $@ OK originated locally 1241c2aa98e2SPeter WemmR$=R $* $@ OK relayable IP address 1242c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1243c2aa98e2SPeter WemmR$* $: $>LookUpAddress <$1> <?> <$1> 1244c2aa98e2SPeter WemmR<RELAY> $* $@ RELAY relayable IP address 1245c2aa98e2SPeter WemmR<$*> <$*> $: $2', `dnl') 1246c2aa98e2SPeter WemmR$* $: [ $1 ] put brackets around it... 1247c2aa98e2SPeter WemmR$=w $@ OK ... and see if it is local 1248c2aa98e2SPeter Wemm 1249c2aa98e2SPeter Wemmifdef(`_RELAY_LOCAL_FROM_', `dnl 1250c2aa98e2SPeter Wemm# anything with a local FROM is ok 1251c2aa98e2SPeter WemmR$* $: $1 $| $>Parse0 $>3 $&f 1252c2aa98e2SPeter WemmR$* $| $+ < @ $=w . > $@ OK FROM local 1253c2aa98e2SPeter WemmR$* $| $* $: $1 1254c2aa98e2SPeter Wemm', `dnl') 1255c2aa98e2SPeter Wemm 1256c2aa98e2SPeter Wemm# anything else is bogus 1257c2aa98e2SPeter WemmR$* $#error $@ 5.7.1 $: "550 Relaying denied"') 1258c2aa98e2SPeter Wemm 1259c2aa98e2SPeter Wemmundivert(9)dnl 1260c2aa98e2SPeter Wemm# 1261c2aa98e2SPeter Wemm###################################################################### 1262c2aa98e2SPeter Wemm###################################################################### 1263c2aa98e2SPeter Wemm##### 1264c2aa98e2SPeter Wemm`##### MAILER DEFINITIONS' 1265c2aa98e2SPeter Wemm##### 1266c2aa98e2SPeter Wemm###################################################################### 1267c2aa98e2SPeter Wemm###################################################################### 1268c2aa98e2SPeter Wemmundivert(7)dnl 1269