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 152e43090eSPeter WemmVERSIONID(`@(#)proto.m4 8.243 (Berkeley) 2/2/1999') 16c2aa98e2SPeter Wemm 17c2aa98e2SPeter WemmMAILER(local)dnl 18c2aa98e2SPeter Wemm 19c2aa98e2SPeter Wemm# level 8 config file format 20065a643dSPeter WemmV8/ifdef(`VENDOR_NAME', `VENDOR_NAME', `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 223065a643dSPeter Wemm_OPTION(AliasFile, `ALIAS_FILE', ifdef(`_USE_ETC_MAIL_', /etc/mail/aliases, /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 247065a643dSPeter Wemm_OPTION(ErrorHeader, `confERROR_MESSAGE', ifdef(`_USE_ETC_MAIL_', /etc/mail/error-header, /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 265065a643dSPeter WemmO HelpFile=ifdef(`HELP_FILE', HELP_FILE, ifdef(`_USE_ETC_MAIL_', /etc/mail/helpfile, /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 354065a643dSPeter WemmO StatusFile=ifdef(`STATUS_FILE', `STATUS_FILE', ifdef(`_USE_ETC_MAIL_', /etc/mail/statistics, /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) 368065a643dSPeter Wemm_OPTION(UserDatabaseSpec, `confUSERDB_SPEC', ifdef(`_USE_ETC_MAIL_', /etc/mail/userdb, /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) 410065a643dSPeter Wemm_OPTION(ServiceSwitchFile, `confSERVICE_SWITCH_FILE', ifdef(`_USE_ETC_MAIL_', /etc/mail/service.switch, /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 469065a643dSPeter Wemmifdef(`confTRUSTED_USER', 470065a643dSPeter Wemm`# Trusted user for file ownership and starting the daemon 471065a643dSPeter WemmO TrustedUser=confTRUSTED_USER 472065a643dSPeter Wemm') 473065a643dSPeter Wemmifdef(`confCONTROL_SOCKET_NAME', 474065a643dSPeter Wemm`# Control socket for daemon management 475065a643dSPeter WemmO ControlSocketName=confCONTROL_SOCKET_NAME 476065a643dSPeter Wemm') 477065a643dSPeter Wemmifdef(`confMAX_MIME_HEADER_LENGTH', 478065a643dSPeter Wemm`# Maximum MIME header length to protect MUAs 479065a643dSPeter WemmO MaxMimeHeaderLength=confMAX_MIME_HEADER_LENGTH 480065a643dSPeter Wemm') 4812e43090eSPeter Wemmifdef(`confMAX_HEADERS_LENGTH', 4822e43090eSPeter Wemm`# Maximum length of the sum of all headers 4832e43090eSPeter WemmO MaxHeadersLength=confMAX_HEADERS_LENGTH 48425bab6e9SPeter Wemm') 485065a643dSPeter Wemm 486c2aa98e2SPeter Wemm########################### 487c2aa98e2SPeter Wemm# Message precedences # 488c2aa98e2SPeter Wemm########################### 489c2aa98e2SPeter Wemm 490c2aa98e2SPeter WemmPfirst-class=0 491c2aa98e2SPeter WemmPspecial-delivery=100 492c2aa98e2SPeter WemmPlist=-30 493c2aa98e2SPeter WemmPbulk=-60 494c2aa98e2SPeter WemmPjunk=-100 495c2aa98e2SPeter Wemm 496c2aa98e2SPeter Wemm##################### 497c2aa98e2SPeter Wemm# Trusted users # 498c2aa98e2SPeter Wemm##################### 499c2aa98e2SPeter Wemm 500c2aa98e2SPeter Wemm# this is equivalent to setting class "t" 501065a643dSPeter Wemmifdef(`_USE_CT_FILE_', `', `#')Ft`'ifdef(`confCT_FILE', confCT_FILE, ifdef(`_USE_ETC_MAIL_', `/etc/mail/trusted-users', `/etc/sendmail.ct')) 502c2aa98e2SPeter WemmTroot 503c2aa98e2SPeter WemmTdaemon 504c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl', `Tuucp') 505c2aa98e2SPeter Wemmifdef(`confTRUSTED_USERS', `T`'confTRUSTED_USERS', `dnl') 506c2aa98e2SPeter Wemm 507c2aa98e2SPeter Wemm######################### 508c2aa98e2SPeter Wemm# Format of headers # 509c2aa98e2SPeter Wemm######################### 510c2aa98e2SPeter Wemm 511c2aa98e2SPeter Wemmifdef(`confFROM_HEADER',, `define(`confFROM_HEADER', `$?x$x <$g>$|$g$.')')dnl 512c2aa98e2SPeter WemmH?P?Return-Path: <$g> 513c2aa98e2SPeter WemmHReceived: confRECEIVED_HEADER 514c2aa98e2SPeter WemmH?D?Resent-Date: $a 515c2aa98e2SPeter WemmH?D?Date: $a 516c2aa98e2SPeter WemmH?F?Resent-From: confFROM_HEADER 517c2aa98e2SPeter WemmH?F?From: confFROM_HEADER 518c2aa98e2SPeter WemmH?x?Full-Name: $x 519c2aa98e2SPeter Wemm# HPosted-Date: $a 520c2aa98e2SPeter Wemm# H?l?Received-Date: $b 521c2aa98e2SPeter WemmH?M?Resent-Message-Id: <$t.$i@$j> 522c2aa98e2SPeter WemmH?M?Message-Id: <$t.$i@$j> 523c2aa98e2SPeter Wemmifdef(`_NULL_CLIENT_ONLY_', 524c2aa98e2SPeter Wemm `include(_CF_DIR_`'m4/nullrelay.m4)m4exit', 525c2aa98e2SPeter Wemm `dnl') 526c2aa98e2SPeter Wemm# 527c2aa98e2SPeter Wemm###################################################################### 528c2aa98e2SPeter Wemm###################################################################### 529c2aa98e2SPeter Wemm##### 530c2aa98e2SPeter Wemm##### REWRITING RULES 531c2aa98e2SPeter Wemm##### 532c2aa98e2SPeter Wemm###################################################################### 533c2aa98e2SPeter Wemm###################################################################### 534c2aa98e2SPeter Wemm 535c2aa98e2SPeter Wemm############################################ 536c2aa98e2SPeter Wemm### Ruleset 3 -- Name Canonicalization ### 537c2aa98e2SPeter Wemm############################################ 538c2aa98e2SPeter WemmS3 539c2aa98e2SPeter Wemm 540c2aa98e2SPeter Wemm# handle null input (translate to <@> special case) 541c2aa98e2SPeter WemmR$@ $@ <@> 542c2aa98e2SPeter Wemm 543c2aa98e2SPeter Wemm# strip group: syntax (not inside angle brackets!) and trailing semicolon 544c2aa98e2SPeter WemmR$* $: $1 <@> mark addresses 545c2aa98e2SPeter WemmR$* < $* > $* <@> $: $1 < $2 > $3 unmark <addr> 546c2aa98e2SPeter WemmR@ $* <@> $: @ $1 unmark @host:... 547c2aa98e2SPeter WemmR$* :: $* <@> $: $1 :: $2 unmark node::addr 548c2aa98e2SPeter WemmR:`include': $* <@> $: :`include': $1 unmark :`include':... 549c2aa98e2SPeter WemmR$* [ $* : $* ] <@> $: $1 [ $2 : $3 ] unmark IPv6 addrs 550c2aa98e2SPeter WemmR$* : $* [ $* ] $: $1 : $2 [ $3 ] <@> remark if leading colon 551c2aa98e2SPeter WemmR$* : $* <@> $: $2 strip colon if marked 552c2aa98e2SPeter WemmR$* <@> $: $1 unmark 553c2aa98e2SPeter WemmR$* ; $1 strip trailing semi 554c2aa98e2SPeter WemmR$* < $* ; > $1 < $2 > bogus bracketed semi 555c2aa98e2SPeter Wemm 556c2aa98e2SPeter Wemm# null input now results from list:; syntax 557c2aa98e2SPeter WemmR$@ $@ :; <@> 558c2aa98e2SPeter Wemm 559c2aa98e2SPeter Wemm# strip angle brackets -- note RFC733 heuristic to get innermost item 560c2aa98e2SPeter WemmR$* $: < $1 > housekeeping <> 561c2aa98e2SPeter WemmR$+ < $* > < $2 > strip excess on left 562c2aa98e2SPeter WemmR< $* > $+ < $1 > strip excess on right 563c2aa98e2SPeter WemmR<> $@ < @ > MAIL FROM:<> case 564c2aa98e2SPeter WemmR< $+ > $: $1 remove housekeeping <> 565c2aa98e2SPeter Wemm 566c2aa98e2SPeter Wemm# make sure <@a,@b,@c:user@d> syntax is easy to parse -- undone later 567c2aa98e2SPeter WemmR@ $+ , $+ @ $1 : $2 change all "," to ":" 568c2aa98e2SPeter Wemm 569c2aa98e2SPeter Wemm# localize and dispose of route-based addresses 570c2aa98e2SPeter WemmR@ $+ : $+ $@ $>96 < @$1 > : $2 handle <route-addr> 571c2aa98e2SPeter Wemm 572c2aa98e2SPeter Wemm# find focus for list syntax 573c2aa98e2SPeter WemmR $+ : $* ; @ $+ $@ $>96 $1 : $2 ; < @ $3 > list syntax 574c2aa98e2SPeter WemmR $+ : $* ; $@ $1 : $2; list syntax 575c2aa98e2SPeter Wemm 576c2aa98e2SPeter Wemm# find focus for @ syntax addresses 577c2aa98e2SPeter WemmR$+ @ $+ $: $1 < @ $2 > focus on domain 578c2aa98e2SPeter WemmR$+ < $+ @ $+ > $1 $2 < @ $3 > move gaze right 579c2aa98e2SPeter WemmR$+ < @ $+ > $@ $>96 $1 < @ $2 > already canonical 580c2aa98e2SPeter Wemm 581c2aa98e2SPeter Wemm# do some sanity checking 582c2aa98e2SPeter WemmR$* < @ $* : $* > $* $1 < @ $2 $3 > $4 nix colons in addrs 583c2aa98e2SPeter Wemm 584c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl', 585c2aa98e2SPeter Wemm`# convert old-style addresses to a domain-based address 586c2aa98e2SPeter WemmR$- ! $+ $@ $>96 $2 < @ $1 .UUCP > resolve uucp names 587c2aa98e2SPeter WemmR$+ . $- ! $+ $@ $>96 $3 < @ $1 . $2 > domain uucps 588c2aa98e2SPeter WemmR$+ ! $+ $@ $>96 $2 < @ $1 .UUCP > uucp subdomains 589c2aa98e2SPeter Wemm') 590c2aa98e2SPeter Wemmifdef(`_USE_DECNET_SYNTAX_', 591c2aa98e2SPeter Wemm`# convert node::user addresses into a domain-based address 592c2aa98e2SPeter WemmR$- :: $+ $@ $>96 $2 < @ $1 .DECNET > resolve DECnet names 593c2aa98e2SPeter WemmR$- . $- :: $+ $@ $>96 $3 < @ $1.$2 .DECNET > numeric DECnet addr 594c2aa98e2SPeter Wemm', 595c2aa98e2SPeter Wemm `dnl') 596c2aa98e2SPeter Wemm# if we have % signs, take the rightmost one 597c2aa98e2SPeter WemmR$* % $* $1 @ $2 First make them all @s. 598c2aa98e2SPeter WemmR$* @ $* @ $* $1 % $2 @ $3 Undo all but the last. 599c2aa98e2SPeter WemmR$* @ $* $@ $>96 $1 < @ $2 > Insert < > and finish 600c2aa98e2SPeter Wemm 601c2aa98e2SPeter Wemm# else we must be a local name 602c2aa98e2SPeter WemmR$* $@ $>96 $1 603c2aa98e2SPeter Wemm 604c2aa98e2SPeter Wemm 605c2aa98e2SPeter Wemm################################################ 606c2aa98e2SPeter Wemm### Ruleset 96 -- bottom half of ruleset 3 ### 607c2aa98e2SPeter Wemm################################################ 608c2aa98e2SPeter Wemm 609c2aa98e2SPeter WemmS96 610c2aa98e2SPeter Wemm 611c2aa98e2SPeter Wemm# handle special cases for local names 612c2aa98e2SPeter WemmR$* < @ localhost > $* $: $1 < @ $j . > $2 no domain at all 613c2aa98e2SPeter WemmR$* < @ localhost . $m > $* $: $1 < @ $j . > $2 local domain 614c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl', 615c2aa98e2SPeter Wemm`R$* < @ localhost . UUCP > $* $: $1 < @ $j . > $2 .UUCP domain') 616c2aa98e2SPeter WemmR$* < @ [ $+ ] > $* $: $1 < @@ [ $2 ] > $3 mark [a.b.c.d] 617c2aa98e2SPeter WemmR$* < @@ $=w > $* $: $1 < @ $j . > $3 self-literal 618c2aa98e2SPeter WemmR$* < @@ $+ > $* $@ $1 < @ $2 > $3 canon IP addr 619c2aa98e2SPeter Wemm 620c2aa98e2SPeter Wemmifdef(`DOMAIN_TABLE', `dnl 621c2aa98e2SPeter Wemm# look up domains in the domain table 622c2aa98e2SPeter WemmR$* < @ $+ > $* $: $1 < @ $(domaintable $2 $) > $3', `dnl') 623c2aa98e2SPeter Wemm 624c2aa98e2SPeter Wemmundivert(2)dnl 625c2aa98e2SPeter Wemm 626c2aa98e2SPeter Wemmifdef(`BITDOMAIN_TABLE', `dnl 627c2aa98e2SPeter Wemm# handle BITNET mapping 628c2aa98e2SPeter WemmR$* < @ $+ .BITNET > $* $: $1 < @ $(bitdomain $2 $: $2.BITNET $) > $3', `dnl') 629c2aa98e2SPeter Wemm 630c2aa98e2SPeter Wemmifdef(`UUDOMAIN_TABLE', `dnl 631c2aa98e2SPeter Wemm# handle UUCP mapping 632c2aa98e2SPeter WemmR$* < @ $+ .UUCP > $* $: $1 < @ $(uudomain $2 $: $2.UUCP $) > $3', `dnl') 633c2aa98e2SPeter Wemm 634c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl', 635c2aa98e2SPeter Wemm`ifdef(`UUCP_RELAY', 636c2aa98e2SPeter Wemm`# pass UUCP addresses straight through 637c2aa98e2SPeter WemmR$* < @ $+ . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', 638c2aa98e2SPeter Wemm`# if really UUCP, handle it immediately 639c2aa98e2SPeter Wemmifdef(`_CLASS_U_', 640c2aa98e2SPeter Wemm`R$* < @ $=U . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') 641c2aa98e2SPeter Wemmifdef(`_CLASS_V_', 642c2aa98e2SPeter Wemm`R$* < @ $=V . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') 643c2aa98e2SPeter Wemmifdef(`_CLASS_W_', 644c2aa98e2SPeter Wemm`R$* < @ $=W . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') 645c2aa98e2SPeter Wemmifdef(`_CLASS_X_', 646c2aa98e2SPeter Wemm`R$* < @ $=X . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') 647c2aa98e2SPeter Wemmifdef(`_CLASS_Y_', 648c2aa98e2SPeter Wemm`R$* < @ $=Y . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') 649c2aa98e2SPeter Wemm 650c2aa98e2SPeter Wemmifdef(`_NO_CANONIFY_', `dnl', `dnl 651c2aa98e2SPeter Wemm# try UUCP traffic as a local address 652c2aa98e2SPeter WemmR$* < @ $+ . UUCP > $* $: $1 < @ $[ $2 $] . UUCP . > $3 653c2aa98e2SPeter WemmR$* < @ $+ . . UUCP . > $* $@ $1 < @ $2 . > $3') 654c2aa98e2SPeter Wemm')') 655c2aa98e2SPeter Wemmifdef(`_NO_CANONIFY_', `dnl', `dnl 656c2aa98e2SPeter Wemm# pass to name server to make hostname canonical 657c2aa98e2SPeter WemmR$* < @ $* $~P > $* $: $1 < @ $[ $2 $3 $] > $4') 658c2aa98e2SPeter Wemm 659c2aa98e2SPeter Wemm# local host aliases and pseudo-domains are always canonical 660c2aa98e2SPeter WemmR$* < @ $=w > $* $: $1 < @ $2 . > $3 661c2aa98e2SPeter WemmR$* < @ $j > $* $: $1 < @ $j . > $2 662c2aa98e2SPeter Wemmifdef(`_MASQUERADE_ENTIRE_DOMAIN_', 663c2aa98e2SPeter Wemm`R$* < @ $* $=M > $* $: $1 < @ $2 $3 . > $4', 664c2aa98e2SPeter Wemm`R$* < @ $=M > $* $: $1 < @ $2 . > $3') 665c2aa98e2SPeter WemmR$* < @ $* $=P > $* $: $1 < @ $2 $3 . > $4 666c2aa98e2SPeter WemmR$* < @ $* . . > $* $1 < @ $2 . > $3 667c2aa98e2SPeter Wemm 668c2aa98e2SPeter Wemm 669c2aa98e2SPeter Wemm################################################## 670c2aa98e2SPeter Wemm### Ruleset 4 -- Final Output Post-rewriting ### 671c2aa98e2SPeter Wemm################################################## 672c2aa98e2SPeter WemmS4 673c2aa98e2SPeter Wemm 674c2aa98e2SPeter WemmR$* <@> $@ handle <> and list:; 675c2aa98e2SPeter Wemm 676c2aa98e2SPeter Wemm# strip trailing dot off possibly canonical name 677c2aa98e2SPeter WemmR$* < @ $+ . > $* $1 < @ $2 > $3 678c2aa98e2SPeter Wemm 679c2aa98e2SPeter Wemm# eliminate internal code -- should never get this far! 680c2aa98e2SPeter WemmR$* < @ *LOCAL* > $* $1 < @ $j > $2 681c2aa98e2SPeter Wemm 682c2aa98e2SPeter Wemm# externalize local domain info 683c2aa98e2SPeter WemmR$* < $+ > $* $1 $2 $3 defocus 684c2aa98e2SPeter WemmR@ $+ : @ $+ : $+ @ $1 , @ $2 : $3 <route-addr> canonical 685c2aa98e2SPeter WemmR@ $* $@ @ $1 ... and exit 686c2aa98e2SPeter Wemm 687c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl', 688c2aa98e2SPeter Wemm`# UUCP must always be presented in old form 689c2aa98e2SPeter WemmR$+ @ $- . UUCP $2!$1 u@h.UUCP => h!u') 690c2aa98e2SPeter Wemm 691c2aa98e2SPeter Wemmifdef(`_USE_DECNET_SYNTAX_', 692c2aa98e2SPeter Wemm`# put DECnet back in :: form 693c2aa98e2SPeter WemmR$+ @ $+ . DECNET $2 :: $1 u@h.DECNET => h::u', 694c2aa98e2SPeter Wemm `dnl') 695c2aa98e2SPeter Wemm# delete duplicate local names 696c2aa98e2SPeter WemmR$+ % $=w @ $=w $1 @ $2 u%host@host => u@host 697c2aa98e2SPeter Wemm 698c2aa98e2SPeter Wemm 699c2aa98e2SPeter Wemm 700c2aa98e2SPeter Wemm############################################################## 701c2aa98e2SPeter Wemm### Ruleset 97 -- recanonicalize and call ruleset zero ### 702c2aa98e2SPeter Wemm### (used for recursive calls) ### 703c2aa98e2SPeter Wemm############################################################## 704c2aa98e2SPeter Wemm 705c2aa98e2SPeter WemmS`'97 706c2aa98e2SPeter WemmR$* $: $>3 $1 707c2aa98e2SPeter WemmR$* $@ $>0 $1 708c2aa98e2SPeter Wemm 709c2aa98e2SPeter Wemm 710c2aa98e2SPeter Wemm###################################### 711c2aa98e2SPeter Wemm### Ruleset 0 -- Parse Address ### 712c2aa98e2SPeter Wemm###################################### 713c2aa98e2SPeter Wemm 714c2aa98e2SPeter WemmS0 715c2aa98e2SPeter Wemm 716c2aa98e2SPeter WemmR$* $: $>Parse0 $1 initial parsing 717c2aa98e2SPeter WemmR<@> $#_LOCAL_ $: <@> special case error msgs 718c2aa98e2SPeter WemmR$* $: $>98 $1 handle local hacks 719c2aa98e2SPeter WemmR$* $: $>Parse1 $1 final parsing 720c2aa98e2SPeter Wemm 721c2aa98e2SPeter Wemm# 722c2aa98e2SPeter Wemm# Parse0 -- do initial syntax checking and eliminate local addresses. 723c2aa98e2SPeter Wemm# This should either return with the (possibly modified) input 724c2aa98e2SPeter Wemm# or return with a #error mailer. It should not return with a 725c2aa98e2SPeter Wemm# #mailer other than the #error mailer. 726c2aa98e2SPeter Wemm# 727c2aa98e2SPeter Wemm 728c2aa98e2SPeter WemmSParse0 729c2aa98e2SPeter WemmR<@> $@ <@> special case error msgs 730c2aa98e2SPeter WemmR$* : $* ; <@> $#error $@ 5.1.3 $: "List:; syntax illegal for recipient addresses" 731c2aa98e2SPeter Wemm#R@ <@ $* > < @ $1 > catch "@@host" bogosity 732c2aa98e2SPeter WemmR<@ $+> $#error $@ 5.1.3 $: "User address required" 733c2aa98e2SPeter WemmR$* $: <> $1 734c2aa98e2SPeter WemmR<> $* < @ [ $+ ] > $* $1 < @ [ $2 ] > $3 735c2aa98e2SPeter WemmR<> $* <$* : $* > $* $#error $@ 5.1.3 $: "Colon illegal in host name part" 736c2aa98e2SPeter WemmR<> $* $1 737c2aa98e2SPeter WemmR$* < @ . $* > $* $#error $@ 5.1.2 $: "Invalid host name" 738c2aa98e2SPeter WemmR$* < @ $* .. $* > $* $#error $@ 5.1.2 $: "Invalid host name" 739c2aa98e2SPeter Wemm 740c2aa98e2SPeter Wemm# now delete the local info -- note $=O to find characters that cause forwarding 741c2aa98e2SPeter WemmR$* < @ > $* $@ $>Parse0 $>3 $1 user@ => user 742c2aa98e2SPeter WemmR< @ $=w . > : $* $@ $>Parse0 $>3 $2 @here:... -> ... 743c2aa98e2SPeter WemmR$- < @ $=w . > $: $(dequote $1 $) < @ $2 . > dequote "foo"@here 744c2aa98e2SPeter WemmR< @ $+ > $#error $@ 5.1.3 $: "User address required" 745c2aa98e2SPeter WemmR$* $=O $* < @ $=w . > $@ $>Parse0 $>3 $1 $2 $3 ...@here -> ... 746c2aa98e2SPeter WemmR$- $: $(dequote $1 $) < @ *LOCAL* > dequote "foo" 747c2aa98e2SPeter WemmR< @ *LOCAL* > $#error $@ 5.1.3 $: "User address required" 748c2aa98e2SPeter WemmR$* $=O $* < @ *LOCAL* > 749c2aa98e2SPeter Wemm $@ $>Parse0 $>3 $1 $2 $3 ...@*LOCAL* -> ... 750c2aa98e2SPeter WemmR$* < @ *LOCAL* > $: $1 751c2aa98e2SPeter Wemm 752c2aa98e2SPeter Wemm# 753c2aa98e2SPeter Wemm# Parse1 -- the bottom half of ruleset 0. 754c2aa98e2SPeter Wemm# 755c2aa98e2SPeter Wemm 756c2aa98e2SPeter WemmSParse1 757c2aa98e2SPeter Wemmifdef(`_MAILER_smtp_', 758c2aa98e2SPeter Wemm`# handle numeric address spec 759c2aa98e2SPeter WemmR$* < @ [ $+ ] > $* $: $>98 $1 < @ [ $2 ] > $3 numeric internet spec 760c2aa98e2SPeter WemmR$* < @ [ $+ ] > $* $#_SMTP_ $@ [$2] $: $1 < @ [$2] > $3 still numeric: send', 761c2aa98e2SPeter Wemm `dnl') 762c2aa98e2SPeter Wemm 763c2aa98e2SPeter Wemmifdef(`VIRTUSER_TABLE', `dnl 764c2aa98e2SPeter Wemm# handle virtual users 765c2aa98e2SPeter WemmR$+ < @ $=w . > $: < $(virtuser $1 @ $2 $@ $1 $: @ $) > $1 < @ $2 . > 766c2aa98e2SPeter WemmR<@> $+ + $* < @ $* . > 767c2aa98e2SPeter Wemm $: < $(virtuser $1 + * @ $3 $@ $1 $: @ $) > $1 + $2 < @ $3 . > 768c2aa98e2SPeter WemmR<@> $+ + $* < @ $* . > 769c2aa98e2SPeter Wemm $: < $(virtuser $1 @ $3 $@ $1 $: @ $) > $1 + $2 < @ $3 . > 770c2aa98e2SPeter WemmR<@> $+ < @ $+ . > $: < $(virtuser @ $2 $@ $1 $: @ $) > $1 < @ $2 . > 771c2aa98e2SPeter WemmR<@> $+ $: $1 772c2aa98e2SPeter WemmR< error : $- $+ > $* $#error $@ $(dequote $1 $) $: $2 773c2aa98e2SPeter WemmR< $+ > $+ < @ $+ > $: $>97 $1', 774c2aa98e2SPeter Wemm`dnl') 775c2aa98e2SPeter Wemm 776c2aa98e2SPeter Wemm# short circuit local delivery so forwarded email works 777c2aa98e2SPeter Wemmifdef(`_MAILER_usenet_', `dnl 778c2aa98e2SPeter WemmR$+ . USENET < @ $=w . > $#usenet $: $1 handle usenet specially', `dnl') 779c2aa98e2SPeter Wemmifdef(`_STICKY_LOCAL_DOMAIN_', 780c2aa98e2SPeter Wemm`R$+ < @ $=w . > $: < $H > $1 < @ $2 . > first try hub 781c2aa98e2SPeter WemmR< $+ > $+ < $+ > $>95 < $1 > $2 < $3 > yep .... 782c2aa98e2SPeter WemmR< > $+ + $* < $+ > $#_LOCAL_ $: $1 + $2 plussed name? 783c2aa98e2SPeter WemmR< > $+ < $+ > $#_LOCAL_ $: @ $1 nope, local address', 784c2aa98e2SPeter Wemm`R$=L < @ $=w . > $#_LOCAL_ $: @ $1 special local names 785c2aa98e2SPeter WemmR$+ < @ $=w . > $#_LOCAL_ $: $1 regular local name') 786c2aa98e2SPeter Wemm 787c2aa98e2SPeter Wemmifdef(`MAILER_TABLE', `dnl 788c2aa98e2SPeter Wemm# not local -- try mailer table lookup 789c2aa98e2SPeter WemmR$* <@ $+ > $* $: < $2 > $1 < @ $2 > $3 extract host name 790c2aa98e2SPeter WemmR< $+ . > $* $: < $1 > $2 strip trailing dot 791c2aa98e2SPeter WemmR< $+ > $* $: < $(mailertable $1 $) > $2 lookup 7922e43090eSPeter WemmR< $~[ : $* > $* $>95 < $1 : $2 > $3 check -- resolved? 793c2aa98e2SPeter WemmR< $+ > $* $: $>90 <$1> $2 try domain', 794c2aa98e2SPeter Wemm`dnl') 795c2aa98e2SPeter Wemmundivert(4)dnl 796c2aa98e2SPeter Wemm 797c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl', 798c2aa98e2SPeter Wemm`# resolve remotely connected UUCP links (if any) 799c2aa98e2SPeter Wemmifdef(`_CLASS_V_', 800c2aa98e2SPeter Wemm`R$* < @ $=V . UUCP . > $* $: $>95 < $V > $1 <@$2.UUCP.> $3', 801c2aa98e2SPeter Wemm `dnl') 802c2aa98e2SPeter Wemmifdef(`_CLASS_W_', 803c2aa98e2SPeter Wemm`R$* < @ $=W . UUCP . > $* $: $>95 < $W > $1 <@$2.UUCP.> $3', 804c2aa98e2SPeter Wemm `dnl') 805c2aa98e2SPeter Wemmifdef(`_CLASS_X_', 806c2aa98e2SPeter Wemm`R$* < @ $=X . UUCP . > $* $: $>95 < $X > $1 <@$2.UUCP.> $3', 807c2aa98e2SPeter Wemm `dnl')') 808c2aa98e2SPeter Wemm 809c2aa98e2SPeter Wemm# resolve fake top level domains by forwarding to other hosts 810c2aa98e2SPeter Wemmifdef(`BITNET_RELAY', 811c2aa98e2SPeter Wemm`R$*<@$+.BITNET.>$* $: $>95 < $B > $1 <@$2.BITNET.> $3 user@host.BITNET', 812c2aa98e2SPeter Wemm `dnl') 813c2aa98e2SPeter Wemmifdef(`DECNET_RELAY', 814c2aa98e2SPeter Wemm`R$*<@$+.DECNET.>$* $: $>95 < $C > $1 <@$2.DECNET.> $3 user@host.DECNET', 815c2aa98e2SPeter Wemm `dnl') 816c2aa98e2SPeter Wemmifdef(`_MAILER_pop_', 817c2aa98e2SPeter Wemm`R$+ < @ POP. > $#pop $: $1 user@POP', 818c2aa98e2SPeter Wemm `dnl') 819c2aa98e2SPeter Wemmifdef(`_MAILER_fax_', 820c2aa98e2SPeter Wemm`R$+ < @ $+ .FAX. > $#fax $@ $2 $: $1 user@host.FAX', 821c2aa98e2SPeter Wemm`ifdef(`FAX_RELAY', 822c2aa98e2SPeter Wemm`R$*<@$+.FAX.>$* $: $>95 < $F > $1 <@$2.FAX.> $3 user@host.FAX', 823c2aa98e2SPeter Wemm `dnl')') 824c2aa98e2SPeter Wemm 825c2aa98e2SPeter Wemmifdef(`UUCP_RELAY', 826c2aa98e2SPeter Wemm`# forward non-local UUCP traffic to our UUCP relay 827c2aa98e2SPeter WemmR$*<@$*.UUCP.>$* $: $>95 < $Y > $1 <@$2.UUCP.> $3 uucp mail', 828c2aa98e2SPeter Wemm`ifdef(`_MAILER_uucp_', 829c2aa98e2SPeter Wemm`# forward other UUCP traffic straight to UUCP 830c2aa98e2SPeter WemmR$* < @ $+ .UUCP. > $* $#_UUCP_ $@ $2 $: $1 < @ $2 .UUCP. > $3 user@host.UUCP', 831c2aa98e2SPeter Wemm `dnl')') 832c2aa98e2SPeter Wemmifdef(`_MAILER_usenet_', ` 833c2aa98e2SPeter Wemm# addresses sent to net.group.USENET will get forwarded to a newsgroup 834c2aa98e2SPeter WemmR$+ . USENET $#usenet $: $1', 835c2aa98e2SPeter Wemm `dnl') 836c2aa98e2SPeter Wemm 837c2aa98e2SPeter Wemmifdef(`_LOCAL_RULES_', 838c2aa98e2SPeter Wemm`# figure out what should stay in our local mail system 839c2aa98e2SPeter Wemmundivert(1)', `dnl') 840c2aa98e2SPeter Wemm 841c2aa98e2SPeter Wemm# pass names that still have a host to a smarthost (if defined) 842c2aa98e2SPeter WemmR$* < @ $* > $* $: $>95 < $S > $1 < @ $2 > $3 glue on smarthost name 843c2aa98e2SPeter Wemm 844c2aa98e2SPeter Wemm# deal with other remote names 845c2aa98e2SPeter Wemmifdef(`_MAILER_smtp_', 846c2aa98e2SPeter Wemm`R$* < @$* > $* $#_SMTP_ $@ $2 $: $1 < @ $2 > $3 user@host.domain', 847c2aa98e2SPeter Wemm`R$* < @$* > $* $#error $@ 5.1.2 $: "Unrecognized host name " $2') 848c2aa98e2SPeter Wemm 849c2aa98e2SPeter Wemm# handle locally delivered names 850c2aa98e2SPeter WemmR$=L $#_LOCAL_ $: @ $1 special local names 851c2aa98e2SPeter WemmR$+ $#_LOCAL_ $: $1 regular local names 852c2aa98e2SPeter Wemm 853c2aa98e2SPeter Wemm########################################################################### 854c2aa98e2SPeter Wemm### Ruleset 5 -- special rewriting after aliases have been expanded ### 855c2aa98e2SPeter Wemm########################################################################### 856c2aa98e2SPeter Wemm 857c2aa98e2SPeter WemmS5 858c2aa98e2SPeter Wemm 859c2aa98e2SPeter Wemm# deal with plussed users so aliases work nicely 860c2aa98e2SPeter WemmR$+ + * $#_LOCAL_ $@ $&h $: $1 861c2aa98e2SPeter WemmR$+ + $* $#_LOCAL_ $@ + $2 $: $1 + * 862c2aa98e2SPeter Wemm 863c2aa98e2SPeter Wemm# prepend an empty "forward host" on the front 864c2aa98e2SPeter WemmR$+ $: <> $1 865c2aa98e2SPeter Wemm 866c2aa98e2SPeter Wemmifdef(`LUSER_RELAY', `dnl 867c2aa98e2SPeter Wemm# send unrecognized local users to a relay host 868c2aa98e2SPeter WemmR< > $+ $: < $L . > $(user $1 $) look up user 869c2aa98e2SPeter WemmR< $* > $+ <> $* $: < > $2 $3 found; strip $L 870c2aa98e2SPeter WemmR< $* . > $+ $: < $1 > $2 strip extra dot', 871c2aa98e2SPeter Wemm`dnl') 872c2aa98e2SPeter Wemm 873c2aa98e2SPeter Wemm# see if we have a relay or a hub 874c2aa98e2SPeter WemmR< > $+ $: < $H > $1 try hub 875c2aa98e2SPeter WemmR< > $+ $: < $R > $1 try relay 876c2aa98e2SPeter WemmR< > $+ $: < > < $1 $&h > nope, restore +detail 877c2aa98e2SPeter WemmR< > < $+ + $* > $* < > < $1 > + $2 $3 find the user part 878c2aa98e2SPeter WemmR< > < $+ > + $* $#_LOCAL_ $@ $2 $: @ $1 strip the extra + 879c2aa98e2SPeter WemmR< > < $+ > $@ $1 no +detail 8802e43090eSPeter WemmR$+ $: $1 <> $&h add +detail back in 8812e43090eSPeter WemmR$+ <> + $* $: $1 + $2 check whether +detail 8822e43090eSPeter WemmR$+ <> $* $: $1 else discard 883c2aa98e2SPeter WemmR< local : $* > $* $: $>95 < local : $1 > $2 no host extension 884c2aa98e2SPeter WemmR< error : $* > $* $: $>95 < error : $1 > $2 no host extension 885c2aa98e2SPeter WemmR< $- : $+ > $+ $: $>95 < $1 : $2 > $3 < @ $2 > 886c2aa98e2SPeter WemmR< $+ > $+ $@ $>95 < $1 > $2 < @ $1 > 887c2aa98e2SPeter Wemm 888c2aa98e2SPeter Wemmifdef(`MAILER_TABLE', `dnl 889c2aa98e2SPeter Wemm################################################################### 890c2aa98e2SPeter Wemm### Ruleset 90 -- try domain part of mailertable entry ### 891c2aa98e2SPeter Wemm################################################################### 892c2aa98e2SPeter Wemm 893c2aa98e2SPeter WemmS90 894c2aa98e2SPeter WemmR$* <$- . $+ > $* $: $1$2 < $(mailertable .$3 $@ $1$2 $@ $2 $) > $4 8952e43090eSPeter WemmR$* <$~[ : $* > $* $>95 < $2 : $3 > $4 check -- resolved? 896c2aa98e2SPeter WemmR$* < . $+ > $* $@ $>90 $1 . <$2> $3 no -- strip & try again 897c2aa98e2SPeter WemmR$* < $* > $* $: < $(mailertable . $@ $1$2 $) > $3 try "." 8982e43090eSPeter WemmR< $~[ : $* > $* $>95 < $1 : $2 > $3 "." found? 899c2aa98e2SPeter WemmR< $* > $* $@ $2 no mailertable match', 900c2aa98e2SPeter Wemm`dnl') 901c2aa98e2SPeter Wemm 902c2aa98e2SPeter Wemm################################################################### 903c2aa98e2SPeter Wemm### Ruleset 95 -- canonify mailer:[user@]host syntax to triple ### 904c2aa98e2SPeter Wemm################################################################### 905c2aa98e2SPeter Wemm 906c2aa98e2SPeter WemmS95 907c2aa98e2SPeter WemmR< > $* $@ $1 strip off null relay 908c2aa98e2SPeter WemmR< error : $- $+ > $* $#error $@ $(dequote $1 $) $: $2 909c2aa98e2SPeter WemmR< local : $* > $* $>CanonLocal < $1 > $2 910c2aa98e2SPeter WemmR< $- : $+ @ $+ > $*<$*>$* $# $1 $@ $3 $: $2<@$3> use literal user 911c2aa98e2SPeter WemmR< $- : $+ > $* $# $1 $@ $2 $: $3 try qualified mailer 912c2aa98e2SPeter WemmR< $=w > $* $@ $2 delete local host 913c2aa98e2SPeter WemmR< $+ > $* $#_RELAY_ $@ $1 $: $2 use unqualified mailer 914c2aa98e2SPeter Wemm 915c2aa98e2SPeter Wemm################################################################### 916c2aa98e2SPeter Wemm### Ruleset CanonLocal -- canonify local: syntax ### 917c2aa98e2SPeter Wemm################################################################### 918c2aa98e2SPeter Wemm 919c2aa98e2SPeter WemmSCanonLocal 9202e43090eSPeter Wemm# strip local host from routed addresses 9212e43090eSPeter WemmR< $* > < @ $+ > : $+ $@ $>97 $3 9222e43090eSPeter WemmR< $* > $+ $=O $+ < @ $+ > $@ $>97 $2 $3 $4 9232e43090eSPeter Wemm 924c2aa98e2SPeter Wemm# strip trailing dot from any host name that may appear 925c2aa98e2SPeter WemmR< $* > $* < @ $* . > $: < $1 > $2 < @ $3 > 926c2aa98e2SPeter Wemm 927c2aa98e2SPeter Wemm# handle local: syntax -- use old user, either with or without host 928c2aa98e2SPeter WemmR< > $* < @ $* > $* $#_LOCAL_ $@ $1@$2 $: $1 929c2aa98e2SPeter WemmR< > $+ $#_LOCAL_ $@ $1 $: $1 930c2aa98e2SPeter Wemm 931c2aa98e2SPeter Wemm# handle local:user@host syntax -- ignore host part 932c2aa98e2SPeter WemmR< $+ @ $+ > $* < @ $* > $: < $1 > $3 < @ $4 > 933c2aa98e2SPeter Wemm 934c2aa98e2SPeter Wemm# handle local:user syntax 935c2aa98e2SPeter WemmR< $+ > $* <@ $* > $* $#_LOCAL_ $@ $2@$3 $: $1 936c2aa98e2SPeter WemmR< $+ > $* $#_LOCAL_ $@ $2 $: $1 937c2aa98e2SPeter Wemm 938c2aa98e2SPeter Wemm################################################################### 939c2aa98e2SPeter Wemm### Ruleset 93 -- convert header names to masqueraded form ### 940c2aa98e2SPeter Wemm################################################################### 941c2aa98e2SPeter Wemm 942c2aa98e2SPeter WemmS93 943c2aa98e2SPeter Wemm 944c2aa98e2SPeter Wemmifdef(`GENERICS_TABLE', `dnl 945c2aa98e2SPeter Wemm# handle generics database 946c2aa98e2SPeter Wemmifdef(`_GENERICS_ENTIRE_DOMAIN_', 947c2aa98e2SPeter Wemm`R$+ < @ $* $=G . > $: < $1@$2$3 > $1 < @ $2$3 . > @ mark', 948c2aa98e2SPeter Wemm`R$+ < @ $=G . > $: < $1@$2 > $1 < @ $2 . > @ mark') 949c2aa98e2SPeter WemmR$+ < @ *LOCAL* > $: < $1@$j > $1 < @ *LOCAL* > @ mark 950c2aa98e2SPeter WemmR< $+ > $+ < $* > @ $: < $(generics $1 $: $) > $2 < $3 > 951c2aa98e2SPeter WemmR< > $+ < @ $+ > $: < $(generics $1 $: $) > $1 < @ $2 > 952c2aa98e2SPeter WemmR< $* @ $* > $* < $* > $@ $>3 $1 @ $2 found qualified 953c2aa98e2SPeter WemmR< $+ > $* < $* > $: $>3 $1 @ *LOCAL* found unqualified 954c2aa98e2SPeter WemmR< > $* $: $1 not found', 955c2aa98e2SPeter Wemm`dnl') 956c2aa98e2SPeter Wemm 957c2aa98e2SPeter Wemm# special case the users that should be exposed 958c2aa98e2SPeter WemmR$=E < @ *LOCAL* > $@ $1 < @ $j . > leave exposed 959c2aa98e2SPeter Wemmifdef(`_MASQUERADE_ENTIRE_DOMAIN_', 960c2aa98e2SPeter Wemm`R$=E < @ $* $=M . > $@ $1 < @ $2 $3 . >', 961c2aa98e2SPeter Wemm`R$=E < @ $=M . > $@ $1 < @ $2 . >') 962c2aa98e2SPeter Wemmifdef(`_LIMITED_MASQUERADE_', `dnl', 963c2aa98e2SPeter Wemm`R$=E < @ $=w . > $@ $1 < @ $2 . >') 964c2aa98e2SPeter Wemm 965c2aa98e2SPeter Wemm# handle domain-specific masquerading 966c2aa98e2SPeter Wemmifdef(`_MASQUERADE_ENTIRE_DOMAIN_', 967c2aa98e2SPeter Wemm`R$* < @ $* $=M . > $* $: $1 < @ $2 $3 . @ $M > $4 convert masqueraded doms', 968c2aa98e2SPeter Wemm`R$* < @ $=M . > $* $: $1 < @ $2 . @ $M > $3 convert masqueraded doms') 969c2aa98e2SPeter Wemmifdef(`_LIMITED_MASQUERADE_', `dnl', 970c2aa98e2SPeter Wemm`R$* < @ $=w . > $* $: $1 < @ $2 . @ $M > $3') 971c2aa98e2SPeter WemmR$* < @ *LOCAL* > $* $: $1 < @ $j . @ $M > $2 972c2aa98e2SPeter WemmR$* < @ $+ @ > $* $: $1 < @ $2 > $3 $M is null 973c2aa98e2SPeter WemmR$* < @ $+ @ $+ > $* $: $1 < @ $3 . > $4 $M is not null 974c2aa98e2SPeter Wemm 975c2aa98e2SPeter Wemm################################################################### 976c2aa98e2SPeter Wemm### Ruleset 94 -- convert envelope names to masqueraded form ### 977c2aa98e2SPeter Wemm################################################################### 978c2aa98e2SPeter Wemm 979c2aa98e2SPeter WemmS94 980c2aa98e2SPeter Wemmifdef(`_MASQUERADE_ENVELOPE_', 981c2aa98e2SPeter Wemm`R$+ $@ $>93 $1', 982c2aa98e2SPeter Wemm`R$* < @ *LOCAL* > $* $: $1 < @ $j . > $2') 983c2aa98e2SPeter Wemm 984c2aa98e2SPeter Wemm################################################################### 985c2aa98e2SPeter Wemm### Ruleset 98 -- local part of ruleset zero (can be null) ### 986c2aa98e2SPeter Wemm################################################################### 987c2aa98e2SPeter Wemm 988c2aa98e2SPeter WemmS98 989c2aa98e2SPeter Wemmundivert(3)dnl 990c2aa98e2SPeter Wemm 991065a643dSPeter Wemmifelse(substr(confDELIVERY_MODE,0,1), `d', `errprint(`WARNING: Antispam rules not available in deferred delivery mode.')') 992c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 993c2aa98e2SPeter Wemm###################################################################### 994c2aa98e2SPeter Wemm### LookUpDomain -- search for domain in access database 995c2aa98e2SPeter Wemm### 996c2aa98e2SPeter Wemm### Parameters: 997c2aa98e2SPeter Wemm### <$1> -- key (domain name) 998c2aa98e2SPeter Wemm### <$2> -- default (what to return if not found in db) 999c2aa98e2SPeter Wemm### <$3> -- passthru (additional data passed unchanged through) 1000c2aa98e2SPeter Wemm###################################################################### 1001c2aa98e2SPeter Wemm 1002c2aa98e2SPeter WemmSLookUpDomain 1003c2aa98e2SPeter WemmR<$+> <$+> <$*> $: < $(access $1 $: ? $) > <$1> <$2> <$3> 1004c2aa98e2SPeter WemmR<?> <$+.$+> <$+> <$*> $@ $>LookUpDomain <$2> <$3> <$4> 1005c2aa98e2SPeter WemmR<?> <$+> <$+> <$*> $@ <$2> <$3> 1006c2aa98e2SPeter WemmR<$*> <$+> <$+> <$*> $@ <$1> <$4> 1007c2aa98e2SPeter Wemm 1008c2aa98e2SPeter Wemm###################################################################### 1009c2aa98e2SPeter Wemm### LookUpAddress -- search for host address in access database 1010c2aa98e2SPeter Wemm### 1011c2aa98e2SPeter Wemm### Parameters: 1012c2aa98e2SPeter Wemm### <$1> -- key (dot quadded host address) 1013c2aa98e2SPeter Wemm### <$2> -- default (what to return if not found in db) 1014c2aa98e2SPeter Wemm### <$3> -- passthru (additional data passed through) 1015c2aa98e2SPeter Wemm###################################################################### 1016c2aa98e2SPeter Wemm 1017c2aa98e2SPeter WemmSLookUpAddress 1018c2aa98e2SPeter WemmR<$+> <$+> <$*> $: < $(access $1 $: ? $) > <$1> <$2> <$3> 1019c2aa98e2SPeter WemmR<?> <$+.$-> <$+> <$*> $@ $>LookUpAddress <$1> <$3> <$4> 1020c2aa98e2SPeter WemmR<?> <$+> <$+> <$*> $@ <$2> <$3> 1021c2aa98e2SPeter WemmR<$*> <$+> <$+> <$*> $@ <$1> <$4>', 1022c2aa98e2SPeter Wemm`dnl') 1023c2aa98e2SPeter Wemm 1024c2aa98e2SPeter Wemm###################################################################### 1025065a643dSPeter Wemm### CanonAddr -- Convert an address into a standard form for 1026065a643dSPeter Wemm### relay checking. Route address syntax is 1027065a643dSPeter Wemm### crudely converted into a %-hack address. 1028065a643dSPeter Wemm### 1029065a643dSPeter Wemm### Parameters: 1030065a643dSPeter Wemm### $1 -- full recipient address 1031065a643dSPeter Wemm### 1032065a643dSPeter Wemm### Returns: 1033065a643dSPeter Wemm### parsed address, not in source route form 1034065a643dSPeter Wemm###################################################################### 1035065a643dSPeter Wemm 1036065a643dSPeter WemmSCanonAddr 1037065a643dSPeter WemmR$* $: $>Parse0 $>3 $1 make domain canonical 1038065a643dSPeter WemmR< @ $+ > : $* @ $* < @ $1 > : $2 % $3 change @ to % in src route 1039065a643dSPeter WemmR$* < @ $+ > : $* : $* $3 $1 < @ $2 > : $4 change to % hack. 1040065a643dSPeter WemmR$* < @ $+ > : $* $3 $1 < @ $2 > 1041065a643dSPeter Wemm 1042065a643dSPeter Wemm###################################################################### 1043c2aa98e2SPeter Wemm### ParseRecipient -- Strip off hosts in $=R as well as possibly 1044c2aa98e2SPeter Wemm### $* $=m or the access database. 1045c2aa98e2SPeter Wemm### Check user portion for host separators. 1046c2aa98e2SPeter Wemm### 1047c2aa98e2SPeter Wemm### Parameters: 1048c2aa98e2SPeter Wemm### $1 -- full recipient address 1049c2aa98e2SPeter Wemm### 1050c2aa98e2SPeter Wemm### Returns: 1051c2aa98e2SPeter Wemm### parsed, non-local-relaying address 1052c2aa98e2SPeter Wemm###################################################################### 1053c2aa98e2SPeter Wemm 1054c2aa98e2SPeter WemmSParseRecipient 1055065a643dSPeter WemmR$* $: <?> $>CanonAddr $1 1056c2aa98e2SPeter WemmR<?> $* < @ $* . > <?> $1 < @ $2 > strip trailing dots 1057c2aa98e2SPeter WemmR<?> $- < @ $* > $: <?> $(dequote $1 $) < @ $2 > dequote local part 1058c2aa98e2SPeter Wemm 1059c2aa98e2SPeter Wemm# if no $=O character, no host in the user portion, we are done 1060c2aa98e2SPeter WemmR<?> $* $=O $* < @ $* > $: <NO> $1 $2 $3 < @ $4> 1061c2aa98e2SPeter WemmR<?> $* $@ $1 1062c2aa98e2SPeter Wemm 1063c2aa98e2SPeter Wemmifdef(`_RELAY_ENTIRE_DOMAIN_', `dnl 1064c2aa98e2SPeter Wemm# if we relay, check username portion for user%host so host can be checked also 1065c2aa98e2SPeter WemmR<NO> $* < @ $* $=m > $: <RELAY> $1 < @ $2 $3 >', `dnl') 1066065a643dSPeter Wemm 1067065a643dSPeter Wemmifdef(`_RELAY_MX_SERVED_', `dnl 1068065a643dSPeter WemmR<NO> $* < @ $+ > $: <MX> < : $(mxserved $2 $) : > < $1 < @$2 > > 1069065a643dSPeter WemmR<MX> < : $* <TEMP> : > $* $#error $@ 4.7.1 $: "450 Can not check MX records for recipient host " $1 1070065a643dSPeter WemmR<MX> < $* : $=w. : $* > < $+ > $: <RELAY> $4 1071065a643dSPeter WemmR<MX> < : $* : > < $+ > $: <NO> $2', `dnl') 1072065a643dSPeter Wemm 1073c2aa98e2SPeter Wemmifdef(`_RELAY_HOSTS_ONLY_', 1074c2aa98e2SPeter Wemm`R<NO> $* < @ $=R > $: <RELAY> $1 < @ $2 > 1075c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1076065a643dSPeter WemmR<NO> $* < @ $+ > $: <$(access $2 $: NO $)> $1 < @ $2 >',`dnl')', 1077c2aa98e2SPeter Wemm`R<NO> $* < @ $* $=R > $: <RELAY> $1 < @ $2 $3 > 1078c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1079065a643dSPeter WemmR<NO> $* < @ $+ > $: $>LookUpDomain <$2> <NO> <$1 < @ $2 >> 1080c2aa98e2SPeter WemmR<$+> <$+> $: <$1> $2',`dnl')') 1081065a643dSPeter Wemm 1082c2aa98e2SPeter WemmR<RELAY> $* < @ $* > $@ $>ParseRecipient $1 1083c2aa98e2SPeter WemmR<$-> $* $@ $2 1084c2aa98e2SPeter Wemm 1085c2aa98e2SPeter Wemm###################################################################### 1086c2aa98e2SPeter Wemm### check_relay -- check hostname/address on SMTP startup 1087c2aa98e2SPeter Wemm###################################################################### 1088c2aa98e2SPeter Wemm 1089c2aa98e2SPeter WemmSLocal_check_relay 1090c2aa98e2SPeter WemmScheck_relay 1091c2aa98e2SPeter WemmR$* $: $1 $| $>"Local_check_relay" $1 1092c2aa98e2SPeter WemmR$* $| $* $| $#$* $#$3 1093c2aa98e2SPeter WemmR$* $| $* $| $* $@ $>"Basic_check_relay" $1 $| $2 1094c2aa98e2SPeter Wemm 1095c2aa98e2SPeter WemmSBasic_check_relay 1096c2aa98e2SPeter Wemm# check for deferred delivery mode 1097c2aa98e2SPeter WemmR$* $: < ${deliveryMode} > $1 1098c2aa98e2SPeter WemmR< d > $* $@ deferred 1099c2aa98e2SPeter WemmR< $* > $* $: $2 1100c2aa98e2SPeter Wemm 1101c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1102c2aa98e2SPeter WemmR$+ $| $+ $: $>LookUpDomain < $1 > <?> < $2 > 1103065a643dSPeter WemmR<?> < $+ > $: $>LookUpAddress < $1 > <?> < $1 > 1104065a643dSPeter WemmR<?> < $+ > $: $1 1105065a643dSPeter WemmR<OK> < $* > $@ OK 1106065a643dSPeter WemmR<RELAY> < $* > $@ RELAY 1107c2aa98e2SPeter WemmR<REJECT> $* $#error $@ 5.7.1 $: "ifdef(`confREJECT_MSG', `confREJECT_MSG', `550 Access denied')" 1108c2aa98e2SPeter WemmR<DISCARD> $* $#discard $: discard 1109c2aa98e2SPeter WemmR<$+> $* $#error $@ 5.7.1 $: $1', `dnl') 1110c2aa98e2SPeter Wemm 1111c2aa98e2SPeter Wemmifdef(`_RBL_', `dnl 1112065a643dSPeter Wemm# DNS based IP address spam lists 1113c2aa98e2SPeter WemmR$* $: $&{client_addr} 1114c2aa98e2SPeter WemmR$-.$-.$-.$- $: $(host $4.$3.$2.$1._RBL_. $: OK $) 1115c2aa98e2SPeter WemmROK $@ OK 1116065a643dSPeter WemmR$+ $#error $@ 5.7.1 $: "Mail from " $&{client_addr} " refused by blackhole site _RBL_"', 1117c2aa98e2SPeter Wemm`dnl') 1118c2aa98e2SPeter Wemm 1119c2aa98e2SPeter Wemm###################################################################### 1120c2aa98e2SPeter Wemm### check_mail -- check SMTP ``MAIL FROM:'' command argument 1121c2aa98e2SPeter Wemm###################################################################### 1122c2aa98e2SPeter Wemm 1123c2aa98e2SPeter WemmSLocal_check_mail 1124c2aa98e2SPeter WemmScheck_mail 1125c2aa98e2SPeter WemmR$* $: $1 $| $>"Local_check_mail" $1 1126c2aa98e2SPeter WemmR$* $| $#$* $#$2 1127c2aa98e2SPeter WemmR$* $| $* $@ $>"Basic_check_mail" $1 1128c2aa98e2SPeter Wemm 1129c2aa98e2SPeter WemmSBasic_check_mail 1130c2aa98e2SPeter Wemm# check for deferred delivery mode 1131c2aa98e2SPeter WemmR$* $: < ${deliveryMode} > $1 1132c2aa98e2SPeter WemmR< d > $* $@ deferred 1133c2aa98e2SPeter WemmR< $* > $* $: $2 1134c2aa98e2SPeter Wemm 1135c2aa98e2SPeter WemmR<> $@ <OK> 1136065a643dSPeter WemmR$* $: <?> $>CanonAddr $1 1137065a643dSPeter WemmR<?> $* < @ $+ . > <?> $1 < @ $2 > strip trailing dots 1138c2aa98e2SPeter Wemm# handle non-DNS hostnames (*.bitnet, *.decnet, *.uucp, etc) 1139c2aa98e2SPeter WemmR<?> $* < $* $=P > $* $: <OK> $1 < @ $2 $3 > $4 1140c2aa98e2SPeter Wemmifdef(`_ACCEPT_UNRESOLVABLE_DOMAINS_', 1141c2aa98e2SPeter Wemm`R<?> $* < @ $+ > $* $: <OK> $1 < @ $2 > $3 ... unresolvable OK', 1142c2aa98e2SPeter Wemm`R<?> $* < @ $+ > $* $: <? $(resolve $2 $: $2 <PERM> $) > $1 < @ $2 > $3 1143c2aa98e2SPeter WemmR<? $* <$->> $* < @ $+ > $* 1144c2aa98e2SPeter Wemm $: <$2> $3 < @ $4 > $5') 1145c2aa98e2SPeter Wemm 1146c2aa98e2SPeter Wemmifdef(`_ACCEPT_UNQUALIFIED_SENDERS_',`dnl',`dnl 1147c2aa98e2SPeter Wemm# handle case of @localhost on address 1148c2aa98e2SPeter WemmR<$+> $* < @localhost > $: < ? $&{client_name} > <$1> $2 < @localhost > 1149c2aa98e2SPeter WemmR<$+> $* < @localhost.$m > 1150c2aa98e2SPeter Wemm $: < ? $&{client_name} > <$1> $2 < @localhost.$m > 1151c2aa98e2SPeter Wemmifdef(`_NO_UUCP_', `dnl', 1152c2aa98e2SPeter Wemm`R<$+> $* < @localhost.UUCP > 1153c2aa98e2SPeter Wemm $: < ? $&{client_name} > <$1> $2 < @localhost.UUCP >') 1154c2aa98e2SPeter WemmR<? $=w> <$+> $* <?> <$2> $3 1155c2aa98e2SPeter WemmR<? $+> <$+> $* $#error $@ 5.5.4 $: "553 Real domain name required" 1156c2aa98e2SPeter WemmR<?> <$+> $* $: <$1> $2') 1157c2aa98e2SPeter Wemm 1158c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1159c2aa98e2SPeter Wemm# lookup localpart (user@) 1160c2aa98e2SPeter WemmR<$+> $* < @ $+ > $* $: <USER $(access $2@ $: ? $) > <$1> $2 < @ $3 > $4 1161c2aa98e2SPeter Wemm# no match, try full address (user@domain rest) 1162c2aa98e2SPeter WemmR<USER ?> <$+> $* < @ $* > $* 1163c2aa98e2SPeter Wemm $: <USER $(access $2@$3$4 $: ? $) > <$1> $2 < @ $3 > $4 1164c2aa98e2SPeter Wemm# no match, try address (user@domain) 1165c2aa98e2SPeter WemmR<USER ?> <$+> $+ < @ $+ > $* 1166c2aa98e2SPeter Wemm $: <USER $(access $2@$3 $: ? $) > <$1> $2 < @ $3 > $4 1167c2aa98e2SPeter Wemm# no match, try (sub)domain (domain) 1168c2aa98e2SPeter WemmR<USER ?> <$+> $* < @ $+ > $* 1169c2aa98e2SPeter Wemm $: $>LookUpDomain <$3> <$1> <> 1170c2aa98e2SPeter Wemm# check unqualified user in access database 1171c2aa98e2SPeter WemmR<?> $* $: <USER $(access $1@ $: ? $) > <?> $1 1172c2aa98e2SPeter Wemm# retransform for further use 1173c2aa98e2SPeter WemmR<USER $+> <$+> $* $: <$1> $3', 1174c2aa98e2SPeter Wemm`dnl') 1175c2aa98e2SPeter Wemm 1176c2aa98e2SPeter Wemmifdef(`_ACCEPT_UNQUALIFIED_SENDERS_',`dnl',`dnl 1177c2aa98e2SPeter Wemm# handle case of no @domain on address 1178c2aa98e2SPeter WemmR<?> $* $: < ? $&{client_name} > $1 1179c2aa98e2SPeter WemmR<?> $* $@ <OK> ...local unqualed ok 1180c2aa98e2SPeter WemmR<? $+> $* $#error $@ 5.5.4 $: "553 Domain name required" 1181c2aa98e2SPeter Wemm ...remote is not') 1182c2aa98e2SPeter Wemm# check results 1183c2aa98e2SPeter WemmR<?> $* $@ <OK> 1184c2aa98e2SPeter WemmR<OK> $* $@ <OK> 1185c2aa98e2SPeter WemmR<TEMP> $* $#error $@ 4.1.8 $: "451 Sender domain must resolve" 1186c2aa98e2SPeter WemmR<PERM> $* $#error $@ 5.1.8 $: "501 Sender domain must exist" 1187c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1188c2aa98e2SPeter WemmR<RELAY> $* $@ <RELAY> 1189c2aa98e2SPeter WemmR<DISCARD> $* $#discard $: discard 1190c2aa98e2SPeter WemmR<REJECT> $* $#error $@ 5.7.1 $: "ifdef(`confREJECT_MSG', `confREJECT_MSG', `550 Access denied')" 1191c2aa98e2SPeter WemmR<$+> $* $#error $@ 5.7.1 $: $1 error from access db', 1192c2aa98e2SPeter Wemm`dnl') 1193c2aa98e2SPeter Wemm 1194c2aa98e2SPeter Wemm###################################################################### 1195c2aa98e2SPeter Wemm### check_rcpt -- check SMTP ``RCPT TO:'' command argument 1196c2aa98e2SPeter Wemm###################################################################### 1197c2aa98e2SPeter Wemm 1198c2aa98e2SPeter WemmSLocal_check_rcpt 1199c2aa98e2SPeter WemmScheck_rcpt 1200c2aa98e2SPeter WemmR$* $: $1 $| $>"Local_check_rcpt" $1 1201c2aa98e2SPeter WemmR$* $| $#$* $#$2 1202c2aa98e2SPeter WemmR$* $| $* $@ $>"Basic_check_rcpt" $1 1203c2aa98e2SPeter Wemm 1204c2aa98e2SPeter WemmSBasic_check_rcpt 1205c2aa98e2SPeter Wemm# check for deferred delivery mode 1206c2aa98e2SPeter WemmR$* $: < ${deliveryMode} > $1 1207c2aa98e2SPeter WemmR< d > $* $@ deferred 1208c2aa98e2SPeter WemmR< $* > $* $: $2 1209c2aa98e2SPeter Wemm 1210c2aa98e2SPeter Wemmifdef(`_LOOSE_RELAY_CHECK_',`dnl 1211065a643dSPeter WemmR$* $: $>CanonAddr $1 1212c2aa98e2SPeter WemmR$* < @ $* . > $1 < @ $2 > strip trailing dots', 1213c2aa98e2SPeter Wemm`R$* $: $>ParseRecipient $1 strip relayable hosts') 1214c2aa98e2SPeter Wemm 1215065a643dSPeter Wemmifdef(`_BESTMX_IS_LOCAL_',`dnl 1216065a643dSPeter Wemmifelse(_BESTMX_IS_LOCAL_, `', `dnl 1217065a643dSPeter Wemm# unlimited bestmx 1218065a643dSPeter WemmR$* < @ $* > $* $: $1 < @ $2 @@ $(bestmx $2 $) > $3', 1219065a643dSPeter Wemm`dnl 1220065a643dSPeter Wemm# limit bestmx to $=B 12212e43090eSPeter WemmR$* < @ $* $=B > $* $: $1 < @ $2 $3 @@ $(bestmx $2 $3 $) > $4') 1222065a643dSPeter WemmR$* $=O $* < @ $* @@ $=w . > $* $@ $>Basic_check_rcpt $1 $2 $3 1223065a643dSPeter WemmR$* < @ $* @@ $=w . > $* $: $1 < @ $3 > $4 1224065a643dSPeter WemmR$* < @ $* @@ $* > $* $: $1 < @ $2 > $4') 1225065a643dSPeter Wemm 1226c2aa98e2SPeter Wemmifdef(`_BLACKLIST_RCPT_',`dnl 1227c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1228c2aa98e2SPeter Wemm# blacklist local users or any host from receiving mail 1229c2aa98e2SPeter WemmR$* $: <?> $1 1230c2aa98e2SPeter WemmR<?> $+ < @ $=w > $: <> <USER $1> <FULL $1@$2> <HOST $2> <$1 < @ $2 >> 1231c2aa98e2SPeter WemmR<?> $+ < @ $* > $: <> <FULL $1@$2> <HOST $2> <$1 < @ $2 >> 1232c2aa98e2SPeter WemmR<?> $+ $: <> <USER $1> <$1> 1233c2aa98e2SPeter WemmR<> <USER $+> $* $: <$(access $1 $: $)> $2 1234c2aa98e2SPeter WemmR<> <FULL $+> $* $: <$(access $1 $: $)> $2 1235c2aa98e2SPeter WemmR<OK> <FULL $+> $* $: <$(access $1 $: $)> $2 1236c2aa98e2SPeter WemmR<> <HOST $+> $* $: <$(access $1 $: $)> $2 1237c2aa98e2SPeter WemmR<OK> <HOST $+> $* $: <$(access $1 $: $)> $2 1238c2aa98e2SPeter WemmR<> <$*> $: $1 1239c2aa98e2SPeter WemmR<OK> <$*> $: $1 1240c2aa98e2SPeter WemmR<RELAY> <$*> $: $1 1241c2aa98e2SPeter WemmR<REJECT> $* $#error $@ 5.2.1 $: "550 Mailbox disabled for this recipient" 1242c2aa98e2SPeter WemmR<$+> $* $#error $@ 5.2.1 $: $1 error from access db', `dnl')', `dnl') 1243c2aa98e2SPeter Wemm 1244c2aa98e2SPeter Wemmifdef(`_PROMISCUOUS_RELAY_', `dnl', `dnl 1245c2aa98e2SPeter Wemm# anything terminating locally is ok 1246c2aa98e2SPeter Wemmifdef(`_RELAY_ENTIRE_DOMAIN_', `dnl 1247c2aa98e2SPeter WemmR$+ < @ $* $=m > $@ OK', `dnl') 1248c2aa98e2SPeter WemmR$+ < @ $=w > $@ OK 1249c2aa98e2SPeter Wemmifdef(`_RELAY_HOSTS_ONLY_', 1250c2aa98e2SPeter Wemm`R$+ < @ $=R > $@ OK 1251c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1252c2aa98e2SPeter WemmR$+ < @ $* > $: <$(access $2 $: ? $)> <$1 < @ $2 >>',`dnl')', 1253c2aa98e2SPeter Wemm`R$+ < @ $* $=R > $@ OK 1254c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1255c2aa98e2SPeter WemmR$+ < @ $* > $: $>LookUpDomain <$2> <?> <$1 < @ $2 >>',`dnl')') 1256c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1257c2aa98e2SPeter WemmR<RELAY> $* $@ RELAY 1258c2aa98e2SPeter WemmR<$*> <$*> $: $2',`dnl') 1259c2aa98e2SPeter Wemm 1260c2aa98e2SPeter Wemmifdef(`_RELAY_MX_SERVED_', `dnl 1261c2aa98e2SPeter Wemm# allow relaying for hosts which we MX serve 1262c2aa98e2SPeter WemmR$+ < @ $* > $: < : $(mxserved $2 $) : > $1 < @ $2 > 1263c2aa98e2SPeter WemmR< : $* <TEMP> : > $* $#error $@ 4.7.1 $: "450 Can not check MX records for recipient host " $1 1264c2aa98e2SPeter WemmR<$* : $=w . : $*> $* $@ OK 1265065a643dSPeter WemmR< : $* : > $* $: $2', 1266c2aa98e2SPeter Wemm`dnl') 1267c2aa98e2SPeter Wemm 1268c2aa98e2SPeter Wemm# check for local user (i.e. unqualified address) 1269c2aa98e2SPeter WemmR$* $: <?> $1 1270065a643dSPeter WemmR<?> $* < @ $+ > $: <REMOTE> $1 < @ $2 > 1271c2aa98e2SPeter Wemm# local user is ok 1272c2aa98e2SPeter WemmR<?> $+ $@ OK 1273c2aa98e2SPeter WemmR<$+> $* $: $2 1274c2aa98e2SPeter Wemm 1275c2aa98e2SPeter Wemm# anything originating locally is ok 1276c2aa98e2SPeter WemmR$* $: <?> $&{client_name} 1277c2aa98e2SPeter Wemm# check if bracketed IP address (forward lookup != reverse lookup) 1278c2aa98e2SPeter WemmR<?> [$+] $: <BAD> [$1] 1279c2aa98e2SPeter Wemm# pass to name server to make hostname canonical 1280c2aa98e2SPeter WemmR<?> $* $~P $: <?> $[ $1 $2 $] 1281c2aa98e2SPeter WemmR<$-> $* $: $2 1282c2aa98e2SPeter WemmR$* . $1 strip trailing dots 1283c2aa98e2SPeter WemmR$@ $@ OK 1284c2aa98e2SPeter Wemmifdef(`_RELAY_ENTIRE_DOMAIN_', `dnl 1285c2aa98e2SPeter WemmR$* $=m $@ OK', `dnl') 1286c2aa98e2SPeter WemmR$=w $@ OK 1287c2aa98e2SPeter Wemmifdef(`_RELAY_HOSTS_ONLY_', 1288c2aa98e2SPeter Wemm`R$=R $@ OK 1289c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1290c2aa98e2SPeter WemmR$* $: <$(access $1 $: ? $)> <$1>',`dnl')', 1291c2aa98e2SPeter Wemm`R$* $=R $@ OK 1292c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1293c2aa98e2SPeter WemmR$* $: $>LookUpDomain <$1> <?> <$1>',`dnl')') 1294c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1295c2aa98e2SPeter WemmR<RELAY> $* $@ RELAY 1296c2aa98e2SPeter WemmR<$*> <$*> $: $2',`dnl') 1297c2aa98e2SPeter Wemm 1298c2aa98e2SPeter Wemm# check IP address 1299c2aa98e2SPeter WemmR$* $: $&{client_addr} 1300c2aa98e2SPeter WemmR$@ $@ OK originated locally 1301c2aa98e2SPeter WemmR0 $@ OK originated locally 1302c2aa98e2SPeter WemmR$=R $* $@ OK relayable IP address 1303c2aa98e2SPeter Wemmifdef(`ACCESS_TABLE', `dnl 1304c2aa98e2SPeter WemmR$* $: $>LookUpAddress <$1> <?> <$1> 1305c2aa98e2SPeter WemmR<RELAY> $* $@ RELAY relayable IP address 1306c2aa98e2SPeter WemmR<$*> <$*> $: $2', `dnl') 1307c2aa98e2SPeter WemmR$* $: [ $1 ] put brackets around it... 1308c2aa98e2SPeter WemmR$=w $@ OK ... and see if it is local 1309c2aa98e2SPeter Wemm 1310c2aa98e2SPeter Wemmifdef(`_RELAY_LOCAL_FROM_', `dnl 1311c2aa98e2SPeter Wemm# anything with a local FROM is ok 1312065a643dSPeter WemmR$* $: $1 $| $>CanonAddr $&f 1313c2aa98e2SPeter WemmR$* $| $+ < @ $=w . > $@ OK FROM local 1314c2aa98e2SPeter WemmR$* $| $* $: $1 1315c2aa98e2SPeter Wemm', `dnl') 1316c2aa98e2SPeter Wemm 1317c2aa98e2SPeter Wemm# anything else is bogus 1318c2aa98e2SPeter WemmR$* $#error $@ 5.7.1 $: "550 Relaying denied"') 1319c2aa98e2SPeter Wemm 1320c2aa98e2SPeter Wemmundivert(9)dnl 1321c2aa98e2SPeter Wemm# 1322c2aa98e2SPeter Wemm###################################################################### 1323c2aa98e2SPeter Wemm###################################################################### 1324c2aa98e2SPeter Wemm##### 1325c2aa98e2SPeter Wemm`##### MAILER DEFINITIONS' 1326c2aa98e2SPeter Wemm##### 1327c2aa98e2SPeter Wemm###################################################################### 1328c2aa98e2SPeter Wemm###################################################################### 1329c2aa98e2SPeter Wemmundivert(7)dnl 1330