proto.m4 revision 38032
138032Speterdivert(-1) 238032Speter# 338032Speter# Copyright (c) 1998 Sendmail, Inc. All rights reserved. 438032Speter# Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved. 538032Speter# Copyright (c) 1988, 1993 638032Speter# The Regents of the University of California. All rights reserved. 738032Speter# 838032Speter# By using this file, you agree to the terms and conditions set 938032Speter# forth in the LICENSE file which can be found at the top level of 1038032Speter# the sendmail distribution. 1138032Speter# 1238032Speter# 1338032Speterdivert(0) 1438032Speter 1538032SpeterVERSIONID(`@(#)proto.m4 8.223 (Berkeley) 6/30/98') 1638032Speter 1738032SpeterMAILER(local)dnl 1838032Speter 1938032Speter# level 8 config file format 2038032SpeterV8/Berkeley 2138032Speterdivert(-1) 2238032Speter 2338032Speter# do some sanity checking 2438032Speterifdef(`__OSTYPE__',, 2538032Speter `errprint(`*** ERROR: No system type defined (use OSTYPE macro)')') 2638032Speter 2738032Speter# pick our default mailers 2838032Speterifdef(`confSMTP_MAILER',, `define(`confSMTP_MAILER', `esmtp')') 2938032Speterifdef(`confLOCAL_MAILER',, `define(`confLOCAL_MAILER', `local')') 3038032Speterifdef(`confRELAY_MAILER',, 3138032Speter `define(`confRELAY_MAILER', 3238032Speter `ifdef(`_MAILER_smtp_', `relay', 3338032Speter `ifdef(`_MAILER_uucp', `uucp-new', `unknown')')')') 3438032Speterifdef(`confUUCP_MAILER',, `define(`confUUCP_MAILER', `uucp-old')') 3538032Speterdefine(`_SMTP_', `confSMTP_MAILER')dnl for readability only 3638032Speterdefine(`_LOCAL_', `confLOCAL_MAILER')dnl for readability only 3738032Speterdefine(`_RELAY_', `confRELAY_MAILER')dnl for readability only 3838032Speterdefine(`_UUCP_', `confUUCP_MAILER')dnl for readability only 3938032Speter 4038032Speter# set our default hashed database type 4138032Speterifdef(`DATABASE_MAP_TYPE',, `define(`DATABASE_MAP_TYPE', `hash')') 4238032Speter 4338032Speter# back compatibility with old config files 4438032Speterifdef(`confDEF_GROUP_ID', 4538032Speter `errprint(`*** confDEF_GROUP_ID is obsolete.') 4638032Speter errprint(` Use confDEF_USER_ID with a colon in the value instead.')') 4738032Speterifdef(`confREAD_TIMEOUT', 4838032Speter `errprint(`*** confREAD_TIMEOUT is obsolete.') 4938032Speter errprint(` Use individual confTO_<timeout> parameters instead.')') 5038032Speterifdef(`confMESSAGE_TIMEOUT', 5138032Speter `define(`_ARG_', index(confMESSAGE_TIMEOUT, /)) 5238032Speter ifelse(_ARG_, -1, 5338032Speter `define(`confTO_QUEUERETURN', confMESSAGE_TIMEOUT)', 5438032Speter `define(`confTO_QUEUERETURN', 5538032Speter substr(confMESSAGE_TIMEOUT, 0, _ARG_)) 5638032Speter define(`confTO_QUEUEWARN', 5738032Speter substr(confMESSAGE_TIMEOUT, eval(_ARG_+1)))')') 5838032Speterifdef(`confMIN_FREE_BLOCKS', `ifelse(index(confMIN_FREE_BLOCKS, /), -1,, 5938032Speter `errprint(`*** compound confMIN_FREE_BLOCKS is obsolete.') 6038032Speter errprint(` Use confMAX_MESSAGE_SIZE for the second part of the value.')')') 6138032Speter 6238032Speter# clean option definitions below.... 6338032Speterdefine(`_OPTION', `ifdef(`$2', `O $1=$2', `#O $1`'ifelse($3, `',, `=$3')')')dnl 6438032Speter 6538032Speterdivert(0)dnl 6638032Speter 6738032Speter# override file safeties - setting this option compromises system security 6838032Speter# need to set this now for the sake of class files 6938032Speter_OPTION(DontBlameSendmail, `confDONT_BLAME_SENDMAIL', safe) 7038032Speter 7138032Speter################## 7238032Speter# local info # 7338032Speter################## 7438032Speter 7538032SpeterCwlocalhost 7638032Speterifdef(`USE_CW_FILE', 7738032Speter`# file containing names of hosts for which we receive email 7838032SpeterFw`'confCW_FILE', 7938032Speter `dnl') 8038032Speter 8138032Speter# my official domain name 8238032Speter# ... `define' this only if sendmail cannot automatically determine your domain 8338032Speterifdef(`confDOMAIN_NAME', `Dj`'confDOMAIN_NAME', `#Dj$w.Foo.COM') 8438032Speter 8538032Speterifdef(`_NULL_CLIENT_ONLY_', `divert(-1)')dnl 8638032Speter 8738032SpeterCP. 8838032Speter 8938032Speterifdef(`UUCP_RELAY', 9038032Speter`# UUCP relay host 9138032SpeterDY`'UUCP_RELAY 9238032SpeterCPUUCP 9338032Speter 9438032Speter')dnl 9538032Speterifdef(`BITNET_RELAY', 9638032Speter`# BITNET relay host 9738032SpeterDB`'BITNET_RELAY 9838032SpeterCPBITNET 9938032Speter 10038032Speter')dnl 10138032Speterifdef(`DECNET_RELAY', 10238032Speter`define(`_USE_DECNET_SYNTAX_', 1)dnl 10338032Speter# DECnet relay host 10438032SpeterDC`'DECNET_RELAY 10538032SpeterCPDECNET 10638032Speter 10738032Speter')dnl 10838032Speterifdef(`FAX_RELAY', 10938032Speter`# FAX relay host 11038032SpeterDF`'FAX_RELAY 11138032SpeterCPFAX 11238032Speter 11338032Speter')dnl 11438032Speter# "Smart" relay host (may be null) 11538032SpeterDS`'ifdef(`SMART_HOST', SMART_HOST) 11638032Speter 11738032Speterifdef(`LUSER_RELAY', `dnl 11838032Speter# place to which unknown users should be forwarded 11938032SpeterKuser user -m -a<> 12038032SpeterDL`'LUSER_RELAY', 12138032Speter`dnl') 12238032Speter 12338032Speter# operators that cannot be in local usernames (i.e., network indicators) 12438032SpeterCO @ % ifdef(`_NO_UUCP_', `', `!') 12538032Speter 12638032Speter# a class with just dot (for identifying canonical names) 12738032SpeterC.. 12838032Speter 12938032Speter# a class with just a left bracket (for identifying domain literals) 13038032SpeterC[[ 13138032Speter 13238032Speterifdef(`MAILER_TABLE', `dnl 13338032Speter# Mailer table (overriding domains) 13438032SpeterKmailertable MAILER_TABLE', 13538032Speter`dnl') 13638032Speter 13738032Speterifdef(`DOMAIN_TABLE', `dnl 13838032Speter# Domain table (adding domains) 13938032SpeterKdomaintable DOMAIN_TABLE', 14038032Speter`dnl') 14138032Speter 14238032Speterifdef(`GENERICS_TABLE', `dnl 14338032Speter# Generics table (mapping outgoing addresses) 14438032SpeterKgenerics GENERICS_TABLE', 14538032Speter`dnl') 14638032Speter 14738032Speterifdef(`UUDOMAIN_TABLE', `dnl 14838032Speter# UUCP domain table 14938032SpeterKuudomain UUDOMAIN_TABLE', 15038032Speter`dnl') 15138032Speter 15238032Speterifdef(`BITDOMAIN_TABLE', `dnl 15338032Speter# BITNET mapping table 15438032SpeterKbitdomain BITDOMAIN_TABLE', 15538032Speter`dnl') 15638032Speter 15738032Speterifdef(`VIRTUSER_TABLE', `dnl 15838032Speter# Virtual user table (maps incoming users) 15938032SpeterKvirtuser VIRTUSER_TABLE', 16038032Speter`dnl') 16138032Speter 16238032Speterifdef(`ACCESS_TABLE', `dnl 16338032Speter# Access list database (for spam stomping) 16438032SpeterKaccess ACCESS_TABLE', 16538032Speter`dnl') 16638032Speter 16738032Speterifdef(`_RELAY_MX_SERVED_', `dnl 16838032Speter# MX map (to allow relaying to hosts that we MX for) 16938032SpeterKmxserved bestmx -z: -T<TEMP>', 17038032Speter`dnl') 17138032Speter 17238032Speterifdef(`_ACCEPT_UNRESOLVABLE_DOMAINS_',`dnl',`dnl 17338032Speter# Resolve map (to check if a host exists in check_mail) 17438032SpeterKresolve host -a<OK> -T<TEMP>') 17538032Speter 17638032Speterifdef(`confCR_FILE', `dnl 17738032Speter# Hosts that will permit relaying ($=R) 17838032SpeterFR`'confCR_FILE', 17938032Speter`dnl') 18038032Speter 18138032Speter# who I send unqualified names to (null means deliver locally) 18238032SpeterDR`'ifdef(`LOCAL_RELAY', LOCAL_RELAY) 18338032Speter 18438032Speter# who gets all local email traffic ($R has precedence for unqualified names) 18538032SpeterDH`'ifdef(`MAIL_HUB', MAIL_HUB) 18638032Speter 18738032Speter# dequoting map 18838032SpeterKdequote dequote 18938032Speter 19038032Speterdivert(0)dnl # end of nullclient diversion 19138032Speter# class E: names that should be exposed as from this host, even if we masquerade 19238032Speterifdef(`_NULL_CLIENT_ONLY_', `#', 19338032Speter`# class L: names that should be delivered locally, even if we have a relay 19438032Speter# class M: domains that should be converted to $M 19538032Speter#CL root 19638032Speter')CE root 19738032Speterundivert(5)dnl 19838032Speter 19938032Speter# who I masquerade as (null for no masquerading) (see also $=M) 20038032SpeterDM`'ifdef(`MASQUERADE_NAME', MASQUERADE_NAME) 20138032Speter 20238032Speter# my name for error messages 20338032Speterifdef(`confMAILER_NAME', `Dn`'confMAILER_NAME', `#DnMAILER-DAEMON') 20438032Speter 20538032Speterundivert(6)dnl 20638032Speterinclude(_CF_DIR_`m4/version.m4') 20738032Speter 20838032Speter############### 20938032Speter# Options # 21038032Speter############### 21138032Speter 21238032Speter# strip message body to 7 bits on input? 21338032Speter_OPTION(SevenBitInput, `confSEVEN_BIT_INPUT') 21438032Speter 21538032Speter# 8-bit data handling 21638032Speter_OPTION(EightBitMode, `confEIGHT_BIT_HANDLING', adaptive) 21738032Speter 21838032Speterifdef(`_NULL_CLIENT_ONLY_', `dnl', ` 21938032Speter# wait for alias file rebuild (default units: minutes) 22038032Speter_OPTION(AliasWait, `confALIAS_WAIT', 5m) 22138032Speter 22238032Speter# location of alias file 22338032Speter_OPTION(AliasFile, `ALIAS_FILE', /etc/aliases) 22438032Speter') 22538032Speter# minimum number of free blocks on filesystem 22638032Speter_OPTION(MinFreeBlocks, `confMIN_FREE_BLOCKS', 100) 22738032Speter 22838032Speter# maximum message size 22938032Speter_OPTION(MaxMessageSize, `confMAX_MESSAGE_SIZE', 1000000) 23038032Speter 23138032Speter# substitution for space (blank) characters 23238032Speter_OPTION(BlankSub, `confBLANK_SUB', _) 23338032Speter 23438032Speter# avoid connecting to "expensive" mailers on initial submission? 23538032Speter_OPTION(HoldExpensive, `confCON_EXPENSIVE') 23638032Speter 23738032Speter# checkpoint queue runs after every N successful deliveries 23838032Speter_OPTION(CheckpointInterval, `confCHECKPOINT_INTERVAL', 10) 23938032Speter 24038032Speter# default delivery mode 24138032Speter_OPTION(DeliveryMode, `confDELIVERY_MODE', background) 24238032Speter 24338032Speter# automatically rebuild the alias database? 24438032Speter_OPTION(AutoRebuildAliases, `confAUTO_REBUILD') 24538032Speter 24638032Speter# error message header/file 24738032Speter_OPTION(ErrorHeader, `confERROR_MESSAGE', /etc/sendmail.oE) 24838032Speter 24938032Speter# error mode 25038032Speter_OPTION(ErrorMode, `confERROR_MODE', print) 25138032Speter 25238032Speter# save Unix-style "From_" lines at top of header? 25338032Speter_OPTION(SaveFromLine, `confSAVE_FROM_LINES') 25438032Speter 25538032Speter# temporary file mode 25638032Speter_OPTION(TempFileMode, `confTEMP_FILE_MODE', 0600) 25738032Speter 25838032Speter# match recipients against GECOS field? 25938032Speter_OPTION(MatchGECOS, `confMATCH_GECOS') 26038032Speter 26138032Speter# maximum hop count 26238032Speter_OPTION(MaxHopCount, `confMAX_HOP', 17) 26338032Speter 26438032Speter# location of help file 26538032SpeterO HelpFile=ifdef(`HELP_FILE', HELP_FILE, /usr/lib/sendmail.hf) 26638032Speter 26738032Speter# ignore dots as terminators in incoming messages? 26838032Speter_OPTION(IgnoreDots, `confIGNORE_DOTS') 26938032Speter 27038032Speter# name resolver options 27138032Speter_OPTION(ResolverOptions, `confBIND_OPTS', +AAONLY) 27238032Speter 27338032Speter# deliver MIME-encapsulated error messages? 27438032Speter_OPTION(SendMimeErrors, `confMIME_FORMAT_ERRORS') 27538032Speter 27638032Speter# Forward file search path 27738032Speter_OPTION(ForwardPath, `confFORWARD_PATH', /var/forward/$u:$z/.forward.$w:$z/.forward) 27838032Speter 27938032Speter# open connection cache size 28038032Speter_OPTION(ConnectionCacheSize, `confMCI_CACHE_SIZE', 2) 28138032Speter 28238032Speter# open connection cache timeout 28338032Speter_OPTION(ConnectionCacheTimeout, `confMCI_CACHE_TIMEOUT', 5m) 28438032Speter 28538032Speter# persistent host status directory 28638032Speter_OPTION(HostStatusDirectory, `confHOST_STATUS_DIRECTORY', .hoststat) 28738032Speter 28838032Speter# single thread deliveries (requires HostStatusDirectory)? 28938032Speter_OPTION(SingleThreadDelivery, `confSINGLE_THREAD_DELIVERY') 29038032Speter 29138032Speter# use Errors-To: header? 29238032Speter_OPTION(UseErrorsTo, `confUSE_ERRORS_TO') 29338032Speter 29438032Speter# log level 29538032Speter_OPTION(LogLevel, `confLOG_LEVEL', 10) 29638032Speter 29738032Speter# send to me too, even in an alias expansion? 29838032Speter_OPTION(MeToo, `confME_TOO') 29938032Speter 30038032Speter# verify RHS in newaliases? 30138032Speter_OPTION(CheckAliases, `confCHECK_ALIASES') 30238032Speter 30338032Speter# default messages to old style headers if no special punctuation? 30438032Speter_OPTION(OldStyleHeaders, `confOLD_STYLE_HEADERS') 30538032Speter 30638032Speter# SMTP daemon options 30738032Speter_OPTION(DaemonPortOptions, `confDAEMON_OPTIONS', Port=esmtp) 30838032Speter 30938032Speter# privacy flags 31038032Speter_OPTION(PrivacyOptions, `confPRIVACY_FLAGS', authwarnings) 31138032Speter 31238032Speter# who (if anyone) should get extra copies of error messages 31338032Speter_OPTION(PostMasterCopy, `confCOPY_ERRORS_TO', Postmaster) 31438032Speter 31538032Speter# slope of queue-only function 31638032Speter_OPTION(QueueFactor, `confQUEUE_FACTOR', 600000) 31738032Speter 31838032Speter# queue directory 31938032SpeterO QueueDirectory=ifdef(`QUEUE_DIR', QUEUE_DIR, /var/spool/mqueue) 32038032Speter 32138032Speter# timeouts (many of these) 32238032Speter_OPTION(Timeout.initial, `confTO_INITIAL', 5m) 32338032Speter_OPTION(Timeout.connect, `confTO_CONNECT', 5m) 32438032Speter_OPTION(Timeout.iconnect, `confTO_ICONNECT', 5m) 32538032Speter_OPTION(Timeout.helo, `confTO_HELO', 5m) 32638032Speter_OPTION(Timeout.mail, `confTO_MAIL', 10m) 32738032Speter_OPTION(Timeout.rcpt, `confTO_RCPT', 1h) 32838032Speter_OPTION(Timeout.datainit, `confTO_DATAINIT', 5m) 32938032Speter_OPTION(Timeout.datablock, `confTO_DATABLOCK', 1h) 33038032Speter_OPTION(Timeout.datafinal, `confTO_DATAFINAL', 1h) 33138032Speter_OPTION(Timeout.rset, `confTO_RSET', 5m) 33238032Speter_OPTION(Timeout.quit, `confTO_QUIT', 2m) 33338032Speter_OPTION(Timeout.misc, `confTO_MISC', 2m) 33438032Speter_OPTION(Timeout.command, `confTO_COMMAND', 1h) 33538032Speter_OPTION(Timeout.ident, `confTO_IDENT', 30s) 33638032Speter_OPTION(Timeout.fileopen, `confTO_FILEOPEN', 60s) 33738032Speter_OPTION(Timeout.queuereturn, `confTO_QUEUERETURN', 5d) 33838032Speter_OPTION(Timeout.queuereturn.normal, `confTO_QUEUERETURN_NORMAL', 5d) 33938032Speter_OPTION(Timeout.queuereturn.urgent, `confTO_QUEUERETURN_URGENT', 2d) 34038032Speter_OPTION(Timeout.queuereturn.non-urgent, `confTO_QUEUERETURN_NONURGENT', 7d) 34138032Speter_OPTION(Timeout.queuewarn, `confTO_QUEUEWARN', 4h) 34238032Speter_OPTION(Timeout.queuewarn.normal, `confTO_QUEUEWARN_NORMAL', 4h) 34338032Speter_OPTION(Timeout.queuewarn.urgent, `confTO_QUEUEWARN_URGENT', 1h) 34438032Speter_OPTION(Timeout.queuewarn.non-urgent, `confTO_QUEUEWARN_NONURGENT', 12h) 34538032Speter_OPTION(Timeout.hoststatus, `confTO_HOSTSTATUS', 30m) 34638032Speter 34738032Speter# should we not prune routes in route-addr syntax addresses? 34838032Speter_OPTION(DontPruneRoutes, `confDONT_PRUNE_ROUTES') 34938032Speter 35038032Speter# queue up everything before forking? 35138032Speter_OPTION(SuperSafe, `confSAFE_QUEUE') 35238032Speter 35338032Speter# status file 35438032SpeterO StatusFile=ifdef(`STATUS_FILE', `STATUS_FILE', /etc/sendmail.st) 35538032Speter 35638032Speter# time zone handling: 35738032Speter# if undefined, use system default 35838032Speter# if defined but null, use TZ envariable passed in 35938032Speter# if defined and non-null, use that info 36038032Speterifelse(confTIME_ZONE, `USE_SYSTEM', `#O TimeZoneSpec=', 36138032Speter confTIME_ZONE, `USE_TZ', `O TimeZoneSpec=', 36238032Speter `O TimeZoneSpec=confTIME_ZONE') 36338032Speter 36438032Speter# default UID (can be username or userid:groupid) 36538032Speter_OPTION(DefaultUser, `confDEF_USER_ID', mailnull) 36638032Speter 36738032Speter# list of locations of user database file (null means no lookup) 36838032Speter_OPTION(UserDatabaseSpec, `confUSERDB_SPEC', /etc/userdb) 36938032Speter 37038032Speter# fallback MX host 37138032Speter_OPTION(FallbackMXhost, `confFALLBACK_MX', fall.back.host.net) 37238032Speter 37338032Speter# if we are the best MX host for a site, try it directly instead of config err 37438032Speter_OPTION(TryNullMXList, `confTRY_NULL_MX_LIST') 37538032Speter 37638032Speter# load average at which we just queue messages 37738032Speter_OPTION(QueueLA, `confQUEUE_LA', 8) 37838032Speter 37938032Speter# load average at which we refuse connections 38038032Speter_OPTION(RefuseLA, `confREFUSE_LA', 12) 38138032Speter 38238032Speter# maximum number of children we allow at one time 38338032Speter_OPTION(MaxDaemonChildren, `confMAX_DAEMON_CHILDREN', 12) 38438032Speter 38538032Speter# maximum number of new connections per second 38638032Speter_OPTION(ConnectionRateThrottle, `confCONNECTION_RATE_THROTTLE', 3) 38738032Speter 38838032Speter# work recipient factor 38938032Speter_OPTION(RecipientFactor, `confWORK_RECIPIENT_FACTOR', 30000) 39038032Speter 39138032Speter# deliver each queued job in a separate process? 39238032Speter_OPTION(ForkEachJob, `confSEPARATE_PROC') 39338032Speter 39438032Speter# work class factor 39538032Speter_OPTION(ClassFactor, `confWORK_CLASS_FACTOR', 1800) 39638032Speter 39738032Speter# work time factor 39838032Speter_OPTION(RetryFactor, `confWORK_TIME_FACTOR', 90000) 39938032Speter 40038032Speter# shall we sort the queue by hostname first? 40138032Speter_OPTION(QueueSortOrder, `confQUEUE_SORT_ORDER', priority) 40238032Speter 40338032Speter# minimum time in queue before retry 40438032Speter_OPTION(MinQueueAge, `confMIN_QUEUE_AGE', 30m) 40538032Speter 40638032Speter# default character set 40738032Speter_OPTION(DefaultCharSet, `confDEF_CHAR_SET', iso-8859-1) 40838032Speter 40938032Speter# service switch file (ignored on Solaris, Ultrix, OSF/1, others) 41038032Speter_OPTION(ServiceSwitchFile, `confSERVICE_SWITCH_FILE', /etc/service.switch) 41138032Speter 41238032Speter# hosts file (normally /etc/hosts) 41338032Speter_OPTION(HostsFile, `confHOSTS_FILE', /etc/hosts) 41438032Speter 41538032Speter# dialup line delay on connection failure 41638032Speter_OPTION(DialDelay, `confDIAL_DELAY', 10s) 41738032Speter 41838032Speter# action to take if there are no recipients in the message 41938032Speter_OPTION(NoRecipientAction, `confNO_RCPT_ACTION', add-to-undisclosed) 42038032Speter 42138032Speter# chrooted environment for writing to files 42238032Speter_OPTION(SafeFileEnvironment, `confSAFE_FILE_ENV', /arch) 42338032Speter 42438032Speter# are colons OK in addresses? 42538032Speter_OPTION(ColonOkInAddr, `confCOLON_OK_IN_ADDR') 42638032Speter 42738032Speter# how many jobs can you process in the queue? 42838032Speter_OPTION(MaxQueueRunSize, `confMAX_QUEUE_RUN_SIZE', 10000) 42938032Speter 43038032Speter# shall I avoid expanding CNAMEs (violates protocols)? 43138032Speter_OPTION(DontExpandCnames, `confDONT_EXPAND_CNAMES') 43238032Speter 43338032Speter# SMTP initial login message (old $e macro) 43438032Speter_OPTION(SmtpGreetingMessage, `confSMTP_LOGIN_MSG') 43538032Speter 43638032Speter# UNIX initial From header format (old $l macro) 43738032Speter_OPTION(UnixFromLine, `confFROM_LINE') 43838032Speter 43938032Speter# From: lines that have embedded newlines are unwrapped onto one line 44038032Speter_OPTION(SingleLineFromHeader, `confSINGLE_LINE_FROM_HEADER', False) 44138032Speter 44238032Speter# Allow HELO SMTP command that does not `include' a host name 44338032Speter_OPTION(AllowBogusHELO, `confALLOW_BOGUS_HELO', False) 44438032Speter 44538032Speter# Characters to be quoted in a full name phrase (@,;:\()[] are automatic) 44638032Speter_OPTION(MustQuoteChars, `confMUST_QUOTE_CHARS', .) 44738032Speter 44838032Speter# delimiter (operator) characters (old $o macro) 44938032Speter_OPTION(OperatorChars, `confOPERATORS') 45038032Speter 45138032Speter# shall I avoid calling initgroups(3) because of high NIS costs? 45238032Speter_OPTION(DontInitGroups, `confDONT_INIT_GROUPS') 45338032Speter 45438032Speter# are group-writable `:include:' and .forward files (un)trustworthy? 45538032Speter_OPTION(UnsafeGroupWrites, `confUNSAFE_GROUP_WRITES') 45638032Speter 45738032Speter# where do errors that occur when sending errors get sent? 45838032Speter_OPTION(DoubleBounceAddress, `confDOUBLE_BOUNCE_ADDRESS', postmaster) 45938032Speter 46038032Speter# what user id do we assume for the majority of the processing? 46138032Speter_OPTION(RunAsUser, `confRUN_AS_USER', sendmail) 46238032Speter 46338032Speter# maximum number of recipients per SMTP envelope 46438032Speter_OPTION(MaxRecipientsPerMessage, `confMAX_RCPTS_PER_MESSAGE', 100) 46538032Speter 46638032Speter# shall we get local names from our installed interfaces? 46738032Speter_OPTION(DontProbeInterfaces, `confDONT_PROBE_INTERFACES') 46838032Speter 46938032Speter########################### 47038032Speter# Message precedences # 47138032Speter########################### 47238032Speter 47338032SpeterPfirst-class=0 47438032SpeterPspecial-delivery=100 47538032SpeterPlist=-30 47638032SpeterPbulk=-60 47738032SpeterPjunk=-100 47838032Speter 47938032Speter##################### 48038032Speter# Trusted users # 48138032Speter##################### 48238032Speter 48338032Speter# this is equivalent to setting class "t" 48438032Speterifdef(`_USE_CT_FILE_', `', `#')Ft`'ifdef(`confCT_FILE', confCT_FILE, `/etc/sendmail.ct') 48538032SpeterTroot 48638032SpeterTdaemon 48738032Speterifdef(`_NO_UUCP_', `dnl', `Tuucp') 48838032Speterifdef(`confTRUSTED_USERS', `T`'confTRUSTED_USERS', `dnl') 48938032Speter 49038032Speter######################### 49138032Speter# Format of headers # 49238032Speter######################### 49338032Speter 49438032Speterifdef(`confFROM_HEADER',, `define(`confFROM_HEADER', `$?x$x <$g>$|$g$.')')dnl 49538032SpeterH?P?Return-Path: <$g> 49638032SpeterHReceived: confRECEIVED_HEADER 49738032SpeterH?D?Resent-Date: $a 49838032SpeterH?D?Date: $a 49938032SpeterH?F?Resent-From: confFROM_HEADER 50038032SpeterH?F?From: confFROM_HEADER 50138032SpeterH?x?Full-Name: $x 50238032Speter# HPosted-Date: $a 50338032Speter# H?l?Received-Date: $b 50438032SpeterH?M?Resent-Message-Id: <$t.$i@$j> 50538032SpeterH?M?Message-Id: <$t.$i@$j> 50638032Speterifdef(`_NULL_CLIENT_ONLY_', 50738032Speter `include(_CF_DIR_`'m4/nullrelay.m4)m4exit', 50838032Speter `dnl') 50938032Speter# 51038032Speter###################################################################### 51138032Speter###################################################################### 51238032Speter##### 51338032Speter##### REWRITING RULES 51438032Speter##### 51538032Speter###################################################################### 51638032Speter###################################################################### 51738032Speter 51838032Speter############################################ 51938032Speter### Ruleset 3 -- Name Canonicalization ### 52038032Speter############################################ 52138032SpeterS3 52238032Speter 52338032Speter# handle null input (translate to <@> special case) 52438032SpeterR$@ $@ <@> 52538032Speter 52638032Speter# strip group: syntax (not inside angle brackets!) and trailing semicolon 52738032SpeterR$* $: $1 <@> mark addresses 52838032SpeterR$* < $* > $* <@> $: $1 < $2 > $3 unmark <addr> 52938032SpeterR@ $* <@> $: @ $1 unmark @host:... 53038032SpeterR$* :: $* <@> $: $1 :: $2 unmark node::addr 53138032SpeterR:`include': $* <@> $: :`include': $1 unmark :`include':... 53238032SpeterR$* [ $* : $* ] <@> $: $1 [ $2 : $3 ] unmark IPv6 addrs 53338032SpeterR$* : $* [ $* ] $: $1 : $2 [ $3 ] <@> remark if leading colon 53438032SpeterR$* : $* <@> $: $2 strip colon if marked 53538032SpeterR$* <@> $: $1 unmark 53638032SpeterR$* ; $1 strip trailing semi 53738032SpeterR$* < $* ; > $1 < $2 > bogus bracketed semi 53838032Speter 53938032Speter# null input now results from list:; syntax 54038032SpeterR$@ $@ :; <@> 54138032Speter 54238032Speter# strip angle brackets -- note RFC733 heuristic to get innermost item 54338032SpeterR$* $: < $1 > housekeeping <> 54438032SpeterR$+ < $* > < $2 > strip excess on left 54538032SpeterR< $* > $+ < $1 > strip excess on right 54638032SpeterR<> $@ < @ > MAIL FROM:<> case 54738032SpeterR< $+ > $: $1 remove housekeeping <> 54838032Speter 54938032Speter# make sure <@a,@b,@c:user@d> syntax is easy to parse -- undone later 55038032SpeterR@ $+ , $+ @ $1 : $2 change all "," to ":" 55138032Speter 55238032Speter# localize and dispose of route-based addresses 55338032SpeterR@ $+ : $+ $@ $>96 < @$1 > : $2 handle <route-addr> 55438032Speter 55538032Speter# find focus for list syntax 55638032SpeterR $+ : $* ; @ $+ $@ $>96 $1 : $2 ; < @ $3 > list syntax 55738032SpeterR $+ : $* ; $@ $1 : $2; list syntax 55838032Speter 55938032Speter# find focus for @ syntax addresses 56038032SpeterR$+ @ $+ $: $1 < @ $2 > focus on domain 56138032SpeterR$+ < $+ @ $+ > $1 $2 < @ $3 > move gaze right 56238032SpeterR$+ < @ $+ > $@ $>96 $1 < @ $2 > already canonical 56338032Speter 56438032Speter# do some sanity checking 56538032SpeterR$* < @ $* : $* > $* $1 < @ $2 $3 > $4 nix colons in addrs 56638032Speter 56738032Speterifdef(`_NO_UUCP_', `dnl', 56838032Speter`# convert old-style addresses to a domain-based address 56938032SpeterR$- ! $+ $@ $>96 $2 < @ $1 .UUCP > resolve uucp names 57038032SpeterR$+ . $- ! $+ $@ $>96 $3 < @ $1 . $2 > domain uucps 57138032SpeterR$+ ! $+ $@ $>96 $2 < @ $1 .UUCP > uucp subdomains 57238032Speter') 57338032Speterifdef(`_USE_DECNET_SYNTAX_', 57438032Speter`# convert node::user addresses into a domain-based address 57538032SpeterR$- :: $+ $@ $>96 $2 < @ $1 .DECNET > resolve DECnet names 57638032SpeterR$- . $- :: $+ $@ $>96 $3 < @ $1.$2 .DECNET > numeric DECnet addr 57738032Speter', 57838032Speter `dnl') 57938032Speter# if we have % signs, take the rightmost one 58038032SpeterR$* % $* $1 @ $2 First make them all @s. 58138032SpeterR$* @ $* @ $* $1 % $2 @ $3 Undo all but the last. 58238032SpeterR$* @ $* $@ $>96 $1 < @ $2 > Insert < > and finish 58338032Speter 58438032Speter# else we must be a local name 58538032SpeterR$* $@ $>96 $1 58638032Speter 58738032Speter 58838032Speter################################################ 58938032Speter### Ruleset 96 -- bottom half of ruleset 3 ### 59038032Speter################################################ 59138032Speter 59238032SpeterS96 59338032Speter 59438032Speter# handle special cases for local names 59538032SpeterR$* < @ localhost > $* $: $1 < @ $j . > $2 no domain at all 59638032SpeterR$* < @ localhost . $m > $* $: $1 < @ $j . > $2 local domain 59738032Speterifdef(`_NO_UUCP_', `dnl', 59838032Speter`R$* < @ localhost . UUCP > $* $: $1 < @ $j . > $2 .UUCP domain') 59938032SpeterR$* < @ [ $+ ] > $* $: $1 < @@ [ $2 ] > $3 mark [a.b.c.d] 60038032SpeterR$* < @@ $=w > $* $: $1 < @ $j . > $3 self-literal 60138032SpeterR$* < @@ $+ > $* $@ $1 < @ $2 > $3 canon IP addr 60238032Speter 60338032Speterifdef(`DOMAIN_TABLE', `dnl 60438032Speter# look up domains in the domain table 60538032SpeterR$* < @ $+ > $* $: $1 < @ $(domaintable $2 $) > $3', `dnl') 60638032Speter 60738032Speterundivert(2)dnl 60838032Speter 60938032Speterifdef(`BITDOMAIN_TABLE', `dnl 61038032Speter# handle BITNET mapping 61138032SpeterR$* < @ $+ .BITNET > $* $: $1 < @ $(bitdomain $2 $: $2.BITNET $) > $3', `dnl') 61238032Speter 61338032Speterifdef(`UUDOMAIN_TABLE', `dnl 61438032Speter# handle UUCP mapping 61538032SpeterR$* < @ $+ .UUCP > $* $: $1 < @ $(uudomain $2 $: $2.UUCP $) > $3', `dnl') 61638032Speter 61738032Speterifdef(`_NO_UUCP_', `dnl', 61838032Speter`ifdef(`UUCP_RELAY', 61938032Speter`# pass UUCP addresses straight through 62038032SpeterR$* < @ $+ . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', 62138032Speter`# if really UUCP, handle it immediately 62238032Speterifdef(`_CLASS_U_', 62338032Speter`R$* < @ $=U . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') 62438032Speterifdef(`_CLASS_V_', 62538032Speter`R$* < @ $=V . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') 62638032Speterifdef(`_CLASS_W_', 62738032Speter`R$* < @ $=W . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') 62838032Speterifdef(`_CLASS_X_', 62938032Speter`R$* < @ $=X . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') 63038032Speterifdef(`_CLASS_Y_', 63138032Speter`R$* < @ $=Y . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') 63238032Speter 63338032Speterifdef(`_NO_CANONIFY_', `dnl', `dnl 63438032Speter# try UUCP traffic as a local address 63538032SpeterR$* < @ $+ . UUCP > $* $: $1 < @ $[ $2 $] . UUCP . > $3 63638032SpeterR$* < @ $+ . . UUCP . > $* $@ $1 < @ $2 . > $3') 63738032Speter')') 63838032Speterifdef(`_NO_CANONIFY_', `dnl', `dnl 63938032Speter# pass to name server to make hostname canonical 64038032SpeterR$* < @ $* $~P > $* $: $1 < @ $[ $2 $3 $] > $4') 64138032Speter 64238032Speter# local host aliases and pseudo-domains are always canonical 64338032SpeterR$* < @ $=w > $* $: $1 < @ $2 . > $3 64438032SpeterR$* < @ $j > $* $: $1 < @ $j . > $2 64538032Speterifdef(`_MASQUERADE_ENTIRE_DOMAIN_', 64638032Speter`R$* < @ $* $=M > $* $: $1 < @ $2 $3 . > $4', 64738032Speter`R$* < @ $=M > $* $: $1 < @ $2 . > $3') 64838032SpeterR$* < @ $* $=P > $* $: $1 < @ $2 $3 . > $4 64938032SpeterR$* < @ $* . . > $* $1 < @ $2 . > $3 65038032Speter 65138032Speter 65238032Speter################################################## 65338032Speter### Ruleset 4 -- Final Output Post-rewriting ### 65438032Speter################################################## 65538032SpeterS4 65638032Speter 65738032SpeterR$* <@> $@ handle <> and list:; 65838032Speter 65938032Speter# strip trailing dot off possibly canonical name 66038032SpeterR$* < @ $+ . > $* $1 < @ $2 > $3 66138032Speter 66238032Speter# eliminate internal code -- should never get this far! 66338032SpeterR$* < @ *LOCAL* > $* $1 < @ $j > $2 66438032Speter 66538032Speter# externalize local domain info 66638032SpeterR$* < $+ > $* $1 $2 $3 defocus 66738032SpeterR@ $+ : @ $+ : $+ @ $1 , @ $2 : $3 <route-addr> canonical 66838032SpeterR@ $* $@ @ $1 ... and exit 66938032Speter 67038032Speterifdef(`_NO_UUCP_', `dnl', 67138032Speter`# UUCP must always be presented in old form 67238032SpeterR$+ @ $- . UUCP $2!$1 u@h.UUCP => h!u') 67338032Speter 67438032Speterifdef(`_USE_DECNET_SYNTAX_', 67538032Speter`# put DECnet back in :: form 67638032SpeterR$+ @ $+ . DECNET $2 :: $1 u@h.DECNET => h::u', 67738032Speter `dnl') 67838032Speter# delete duplicate local names 67938032SpeterR$+ % $=w @ $=w $1 @ $2 u%host@host => u@host 68038032Speter 68138032Speter 68238032Speter 68338032Speter############################################################## 68438032Speter### Ruleset 97 -- recanonicalize and call ruleset zero ### 68538032Speter### (used for recursive calls) ### 68638032Speter############################################################## 68738032Speter 68838032SpeterS`'97 68938032SpeterR$* $: $>3 $1 69038032SpeterR$* $@ $>0 $1 69138032Speter 69238032Speter 69338032Speter###################################### 69438032Speter### Ruleset 0 -- Parse Address ### 69538032Speter###################################### 69638032Speter 69738032SpeterS0 69838032Speter 69938032SpeterR$* $: $>Parse0 $1 initial parsing 70038032SpeterR<@> $#_LOCAL_ $: <@> special case error msgs 70138032SpeterR$* $: $>98 $1 handle local hacks 70238032SpeterR$* $: $>Parse1 $1 final parsing 70338032Speter 70438032Speter# 70538032Speter# Parse0 -- do initial syntax checking and eliminate local addresses. 70638032Speter# This should either return with the (possibly modified) input 70738032Speter# or return with a #error mailer. It should not return with a 70838032Speter# #mailer other than the #error mailer. 70938032Speter# 71038032Speter 71138032SpeterSParse0 71238032SpeterR<@> $@ <@> special case error msgs 71338032SpeterR$* : $* ; <@> $#error $@ 5.1.3 $: "List:; syntax illegal for recipient addresses" 71438032Speter#R@ <@ $* > < @ $1 > catch "@@host" bogosity 71538032SpeterR<@ $+> $#error $@ 5.1.3 $: "User address required" 71638032SpeterR$* $: <> $1 71738032SpeterR<> $* < @ [ $+ ] > $* $1 < @ [ $2 ] > $3 71838032SpeterR<> $* <$* : $* > $* $#error $@ 5.1.3 $: "Colon illegal in host name part" 71938032SpeterR<> $* $1 72038032SpeterR$* < @ . $* > $* $#error $@ 5.1.2 $: "Invalid host name" 72138032SpeterR$* < @ $* .. $* > $* $#error $@ 5.1.2 $: "Invalid host name" 72238032Speter 72338032Speter# now delete the local info -- note $=O to find characters that cause forwarding 72438032SpeterR$* < @ > $* $@ $>Parse0 $>3 $1 user@ => user 72538032SpeterR< @ $=w . > : $* $@ $>Parse0 $>3 $2 @here:... -> ... 72638032SpeterR$- < @ $=w . > $: $(dequote $1 $) < @ $2 . > dequote "foo"@here 72738032SpeterR< @ $+ > $#error $@ 5.1.3 $: "User address required" 72838032SpeterR$* $=O $* < @ $=w . > $@ $>Parse0 $>3 $1 $2 $3 ...@here -> ... 72938032SpeterR$- $: $(dequote $1 $) < @ *LOCAL* > dequote "foo" 73038032SpeterR< @ *LOCAL* > $#error $@ 5.1.3 $: "User address required" 73138032SpeterR$* $=O $* < @ *LOCAL* > 73238032Speter $@ $>Parse0 $>3 $1 $2 $3 ...@*LOCAL* -> ... 73338032SpeterR$* < @ *LOCAL* > $: $1 73438032Speter 73538032Speter# 73638032Speter# Parse1 -- the bottom half of ruleset 0. 73738032Speter# 73838032Speter 73938032SpeterSParse1 74038032Speterifdef(`_MAILER_smtp_', 74138032Speter`# handle numeric address spec 74238032SpeterR$* < @ [ $+ ] > $* $: $>98 $1 < @ [ $2 ] > $3 numeric internet spec 74338032SpeterR$* < @ [ $+ ] > $* $#_SMTP_ $@ [$2] $: $1 < @ [$2] > $3 still numeric: send', 74438032Speter `dnl') 74538032Speter 74638032Speterifdef(`VIRTUSER_TABLE', `dnl 74738032Speter# handle virtual users 74838032SpeterR$+ < @ $=w . > $: < $(virtuser $1 @ $2 $@ $1 $: @ $) > $1 < @ $2 . > 74938032SpeterR<@> $+ + $* < @ $* . > 75038032Speter $: < $(virtuser $1 + * @ $3 $@ $1 $: @ $) > $1 + $2 < @ $3 . > 75138032SpeterR<@> $+ + $* < @ $* . > 75238032Speter $: < $(virtuser $1 @ $3 $@ $1 $: @ $) > $1 + $2 < @ $3 . > 75338032SpeterR<@> $+ < @ $+ . > $: < $(virtuser @ $2 $@ $1 $: @ $) > $1 < @ $2 . > 75438032SpeterR<@> $+ $: $1 75538032SpeterR< error : $- $+ > $* $#error $@ $(dequote $1 $) $: $2 75638032SpeterR< $+ > $+ < @ $+ > $: $>97 $1', 75738032Speter`dnl') 75838032Speter 75938032Speter# short circuit local delivery so forwarded email works 76038032Speterifdef(`_MAILER_usenet_', `dnl 76138032SpeterR$+ . USENET < @ $=w . > $#usenet $: $1 handle usenet specially', `dnl') 76238032Speterifdef(`_STICKY_LOCAL_DOMAIN_', 76338032Speter`R$+ < @ $=w . > $: < $H > $1 < @ $2 . > first try hub 76438032SpeterR< $+ > $+ < $+ > $>95 < $1 > $2 < $3 > yep .... 76538032SpeterR< > $+ + $* < $+ > $#_LOCAL_ $: $1 + $2 plussed name? 76638032SpeterR< > $+ < $+ > $#_LOCAL_ $: @ $1 nope, local address', 76738032Speter`R$=L < @ $=w . > $#_LOCAL_ $: @ $1 special local names 76838032SpeterR$+ < @ $=w . > $#_LOCAL_ $: $1 regular local name') 76938032Speter 77038032Speterifdef(`MAILER_TABLE', `dnl 77138032Speter# not local -- try mailer table lookup 77238032SpeterR$* <@ $+ > $* $: < $2 > $1 < @ $2 > $3 extract host name 77338032SpeterR< $+ . > $* $: < $1 > $2 strip trailing dot 77438032SpeterR< $+ > $* $: < $(mailertable $1 $) > $2 lookup 77538032SpeterR< $~[ : $+ > $* $>95 < $1 : $2 > $3 check -- resolved? 77638032SpeterR< $+ > $* $: $>90 <$1> $2 try domain', 77738032Speter`dnl') 77838032Speterundivert(4)dnl 77938032Speter 78038032Speterifdef(`_NO_UUCP_', `dnl', 78138032Speter`# resolve remotely connected UUCP links (if any) 78238032Speterifdef(`_CLASS_V_', 78338032Speter`R$* < @ $=V . UUCP . > $* $: $>95 < $V > $1 <@$2.UUCP.> $3', 78438032Speter `dnl') 78538032Speterifdef(`_CLASS_W_', 78638032Speter`R$* < @ $=W . UUCP . > $* $: $>95 < $W > $1 <@$2.UUCP.> $3', 78738032Speter `dnl') 78838032Speterifdef(`_CLASS_X_', 78938032Speter`R$* < @ $=X . UUCP . > $* $: $>95 < $X > $1 <@$2.UUCP.> $3', 79038032Speter `dnl')') 79138032Speter 79238032Speter# resolve fake top level domains by forwarding to other hosts 79338032Speterifdef(`BITNET_RELAY', 79438032Speter`R$*<@$+.BITNET.>$* $: $>95 < $B > $1 <@$2.BITNET.> $3 user@host.BITNET', 79538032Speter `dnl') 79638032Speterifdef(`DECNET_RELAY', 79738032Speter`R$*<@$+.DECNET.>$* $: $>95 < $C > $1 <@$2.DECNET.> $3 user@host.DECNET', 79838032Speter `dnl') 79938032Speterifdef(`_MAILER_pop_', 80038032Speter`R$+ < @ POP. > $#pop $: $1 user@POP', 80138032Speter `dnl') 80238032Speterifdef(`_MAILER_fax_', 80338032Speter`R$+ < @ $+ .FAX. > $#fax $@ $2 $: $1 user@host.FAX', 80438032Speter`ifdef(`FAX_RELAY', 80538032Speter`R$*<@$+.FAX.>$* $: $>95 < $F > $1 <@$2.FAX.> $3 user@host.FAX', 80638032Speter `dnl')') 80738032Speter 80838032Speterifdef(`UUCP_RELAY', 80938032Speter`# forward non-local UUCP traffic to our UUCP relay 81038032SpeterR$*<@$*.UUCP.>$* $: $>95 < $Y > $1 <@$2.UUCP.> $3 uucp mail', 81138032Speter`ifdef(`_MAILER_uucp_', 81238032Speter`# forward other UUCP traffic straight to UUCP 81338032SpeterR$* < @ $+ .UUCP. > $* $#_UUCP_ $@ $2 $: $1 < @ $2 .UUCP. > $3 user@host.UUCP', 81438032Speter `dnl')') 81538032Speterifdef(`_MAILER_usenet_', ` 81638032Speter# addresses sent to net.group.USENET will get forwarded to a newsgroup 81738032SpeterR$+ . USENET $#usenet $: $1', 81838032Speter `dnl') 81938032Speter 82038032Speterifdef(`_LOCAL_RULES_', 82138032Speter`# figure out what should stay in our local mail system 82238032Speterundivert(1)', `dnl') 82338032Speter 82438032Speter# pass names that still have a host to a smarthost (if defined) 82538032SpeterR$* < @ $* > $* $: $>95 < $S > $1 < @ $2 > $3 glue on smarthost name 82638032Speter 82738032Speter# deal with other remote names 82838032Speterifdef(`_MAILER_smtp_', 82938032Speter`R$* < @$* > $* $#_SMTP_ $@ $2 $: $1 < @ $2 > $3 user@host.domain', 83038032Speter`R$* < @$* > $* $#error $@ 5.1.2 $: "Unrecognized host name" $2') 83138032Speter 83238032Speter# handle locally delivered names 83338032SpeterR$=L $#_LOCAL_ $: @ $1 special local names 83438032SpeterR$+ $#_LOCAL_ $: $1 regular local names 83538032Speter 83638032Speter########################################################################### 83738032Speter### Ruleset 5 -- special rewriting after aliases have been expanded ### 83838032Speter########################################################################### 83938032Speter 84038032SpeterS5 84138032Speter 84238032Speter# deal with plussed users so aliases work nicely 84338032SpeterR$+ + * $#_LOCAL_ $@ $&h $: $1 84438032SpeterR$+ + $* $#_LOCAL_ $@ + $2 $: $1 + * 84538032Speter 84638032Speter# prepend an empty "forward host" on the front 84738032SpeterR$+ $: <> $1 84838032Speter 84938032Speterifdef(`LUSER_RELAY', `dnl 85038032Speter# send unrecognized local users to a relay host 85138032SpeterR< > $+ $: < $L . > $(user $1 $) look up user 85238032SpeterR< $* > $+ <> $* $: < > $2 $3 found; strip $L 85338032SpeterR< $* . > $+ $: < $1 > $2 strip extra dot', 85438032Speter`dnl') 85538032Speter 85638032Speter# see if we have a relay or a hub 85738032SpeterR< > $+ $: < $H > $1 try hub 85838032SpeterR< > $+ $: < $R > $1 try relay 85938032SpeterR< > $+ $: < > < $1 $&h > nope, restore +detail 86038032SpeterR< > < $+ + $* > $* < > < $1 > + $2 $3 find the user part 86138032SpeterR< > < $+ > + $* $#_LOCAL_ $@ $2 $: @ $1 strip the extra + 86238032SpeterR< > < $+ > $@ $1 no +detail 86338032SpeterR$+ $: $1 $&h add +detail back in 86438032SpeterR< local : $* > $* $: $>95 < local : $1 > $2 no host extension 86538032SpeterR< error : $* > $* $: $>95 < error : $1 > $2 no host extension 86638032SpeterR< $- : $+ > $+ $: $>95 < $1 : $2 > $3 < @ $2 > 86738032SpeterR< $+ > $+ $@ $>95 < $1 > $2 < @ $1 > 86838032Speter 86938032Speterifdef(`MAILER_TABLE', `dnl 87038032Speter################################################################### 87138032Speter### Ruleset 90 -- try domain part of mailertable entry ### 87238032Speter################################################################### 87338032Speter 87438032SpeterS90 87538032SpeterR$* <$- . $+ > $* $: $1$2 < $(mailertable .$3 $@ $1$2 $@ $2 $) > $4 87638032SpeterR$* <$~[ : $+ > $* $>95 < $2 : $3 > $4 check -- resolved? 87738032SpeterR$* < . $+ > $* $@ $>90 $1 . <$2> $3 no -- strip & try again 87838032SpeterR$* < $* > $* $: < $(mailertable . $@ $1$2 $) > $3 try "." 87938032SpeterR< $~[ : $+ > $* $>95 < $1 : $2 > $3 "." found? 88038032SpeterR< $* > $* $@ $2 no mailertable match', 88138032Speter`dnl') 88238032Speter 88338032Speter################################################################### 88438032Speter### Ruleset 95 -- canonify mailer:[user@]host syntax to triple ### 88538032Speter################################################################### 88638032Speter 88738032SpeterS95 88838032SpeterR< > $* $@ $1 strip off null relay 88938032SpeterR< error : $- $+ > $* $#error $@ $(dequote $1 $) $: $2 89038032SpeterR< local : $* > $* $>CanonLocal < $1 > $2 89138032SpeterR< $- : $+ @ $+ > $*<$*>$* $# $1 $@ $3 $: $2<@$3> use literal user 89238032SpeterR< $- : $+ > $* $# $1 $@ $2 $: $3 try qualified mailer 89338032SpeterR< $=w > $* $@ $2 delete local host 89438032SpeterR< $+ > $* $#_RELAY_ $@ $1 $: $2 use unqualified mailer 89538032Speter 89638032Speter################################################################### 89738032Speter### Ruleset CanonLocal -- canonify local: syntax ### 89838032Speter################################################################### 89938032Speter 90038032SpeterSCanonLocal 90138032Speter# strip trailing dot from any host name that may appear 90238032SpeterR< $* > $* < @ $* . > $: < $1 > $2 < @ $3 > 90338032Speter 90438032Speter# handle local: syntax -- use old user, either with or without host 90538032SpeterR< > $* < @ $* > $* $#_LOCAL_ $@ $1@$2 $: $1 90638032SpeterR< > $+ $#_LOCAL_ $@ $1 $: $1 90738032Speter 90838032Speter# handle local:user@host syntax -- ignore host part 90938032SpeterR< $+ @ $+ > $* < @ $* > $: < $1 > $3 < @ $4 > 91038032Speter 91138032Speter# handle local:user syntax 91238032SpeterR< $+ > $* <@ $* > $* $#_LOCAL_ $@ $2@$3 $: $1 91338032SpeterR< $+ > $* $#_LOCAL_ $@ $2 $: $1 91438032Speter 91538032Speter################################################################### 91638032Speter### Ruleset 93 -- convert header names to masqueraded form ### 91738032Speter################################################################### 91838032Speter 91938032SpeterS93 92038032Speter 92138032Speterifdef(`GENERICS_TABLE', `dnl 92238032Speter# handle generics database 92338032Speterifdef(`_GENERICS_ENTIRE_DOMAIN_', 92438032Speter`R$+ < @ $* $=G . > $: < $1@$2$3 > $1 < @ $2$3 . > @ mark', 92538032Speter`R$+ < @ $=G . > $: < $1@$2 > $1 < @ $2 . > @ mark') 92638032SpeterR$+ < @ *LOCAL* > $: < $1@$j > $1 < @ *LOCAL* > @ mark 92738032SpeterR< $+ > $+ < $* > @ $: < $(generics $1 $: $) > $2 < $3 > 92838032SpeterR< > $+ < @ $+ > $: < $(generics $1 $: $) > $1 < @ $2 > 92938032SpeterR< $* @ $* > $* < $* > $@ $>3 $1 @ $2 found qualified 93038032SpeterR< $+ > $* < $* > $: $>3 $1 @ *LOCAL* found unqualified 93138032SpeterR< > $* $: $1 not found', 93238032Speter`dnl') 93338032Speter 93438032Speter# special case the users that should be exposed 93538032SpeterR$=E < @ *LOCAL* > $@ $1 < @ $j . > leave exposed 93638032Speterifdef(`_MASQUERADE_ENTIRE_DOMAIN_', 93738032Speter`R$=E < @ $* $=M . > $@ $1 < @ $2 $3 . >', 93838032Speter`R$=E < @ $=M . > $@ $1 < @ $2 . >') 93938032Speterifdef(`_LIMITED_MASQUERADE_', `dnl', 94038032Speter`R$=E < @ $=w . > $@ $1 < @ $2 . >') 94138032Speter 94238032Speter# handle domain-specific masquerading 94338032Speterifdef(`_MASQUERADE_ENTIRE_DOMAIN_', 94438032Speter`R$* < @ $* $=M . > $* $: $1 < @ $2 $3 . @ $M > $4 convert masqueraded doms', 94538032Speter`R$* < @ $=M . > $* $: $1 < @ $2 . @ $M > $3 convert masqueraded doms') 94638032Speterifdef(`_LIMITED_MASQUERADE_', `dnl', 94738032Speter`R$* < @ $=w . > $* $: $1 < @ $2 . @ $M > $3') 94838032SpeterR$* < @ *LOCAL* > $* $: $1 < @ $j . @ $M > $2 94938032SpeterR$* < @ $+ @ > $* $: $1 < @ $2 > $3 $M is null 95038032SpeterR$* < @ $+ @ $+ > $* $: $1 < @ $3 . > $4 $M is not null 95138032Speter 95238032Speter################################################################### 95338032Speter### Ruleset 94 -- convert envelope names to masqueraded form ### 95438032Speter################################################################### 95538032Speter 95638032SpeterS94 95738032Speterifdef(`_MASQUERADE_ENVELOPE_', 95838032Speter`R$+ $@ $>93 $1', 95938032Speter`R$* < @ *LOCAL* > $* $: $1 < @ $j . > $2') 96038032Speter 96138032Speter################################################################### 96238032Speter### Ruleset 98 -- local part of ruleset zero (can be null) ### 96338032Speter################################################################### 96438032Speter 96538032SpeterS98 96638032Speterundivert(3)dnl 96738032Speter 96838032Speterifelse(confDELIVERY_MODE, defer, `errprint(`WARNING: Antispam rules not available in deferred delivery mode.')') 96938032Speterifdef(`ACCESS_TABLE', `dnl 97038032Speter###################################################################### 97138032Speter### LookUpDomain -- search for domain in access database 97238032Speter### 97338032Speter### Parameters: 97438032Speter### <$1> -- key (domain name) 97538032Speter### <$2> -- default (what to return if not found in db) 97638032Speter### <$3> -- passthru (additional data passed unchanged through) 97738032Speter###################################################################### 97838032Speter 97938032SpeterSLookUpDomain 98038032SpeterR<$+> <$+> <$*> $: < $(access $1 $: ? $) > <$1> <$2> <$3> 98138032SpeterR<?> <$+.$+> <$+> <$*> $@ $>LookUpDomain <$2> <$3> <$4> 98238032SpeterR<?> <$+> <$+> <$*> $@ <$2> <$3> 98338032SpeterR<$*> <$+> <$+> <$*> $@ <$1> <$4> 98438032Speter 98538032Speter###################################################################### 98638032Speter### LookUpAddress -- search for host address in access database 98738032Speter### 98838032Speter### Parameters: 98938032Speter### <$1> -- key (dot quadded host address) 99038032Speter### <$2> -- default (what to return if not found in db) 99138032Speter### <$3> -- passthru (additional data passed through) 99238032Speter###################################################################### 99338032Speter 99438032SpeterSLookUpAddress 99538032SpeterR<$+> <$+> <$*> $: < $(access $1 $: ? $) > <$1> <$2> <$3> 99638032SpeterR<?> <$+.$-> <$+> <$*> $@ $>LookUpAddress <$1> <$3> <$4> 99738032SpeterR<?> <$+> <$+> <$*> $@ <$2> <$3> 99838032SpeterR<$*> <$+> <$+> <$*> $@ <$1> <$4>', 99938032Speter`dnl') 100038032Speter 100138032Speter###################################################################### 100238032Speter### ParseRecipient -- Strip off hosts in $=R as well as possibly 100338032Speter### $* $=m or the access database. 100438032Speter### Check user portion for host separators. 100538032Speter### 100638032Speter### Parameters: 100738032Speter### $1 -- full recipient address 100838032Speter### 100938032Speter### Returns: 101038032Speter### parsed, non-local-relaying address 101138032Speter###################################################################### 101238032Speter 101338032SpeterSParseRecipient 101438032SpeterR$* $: <?> $>Parse0 $>3 $1 101538032SpeterR<?> $* < @ $* . > <?> $1 < @ $2 > strip trailing dots 101638032SpeterR<?> $- < @ $* > $: <?> $(dequote $1 $) < @ $2 > dequote local part 101738032Speter 101838032Speter# if no $=O character, no host in the user portion, we are done 101938032SpeterR<?> $* $=O $* < @ $* > $: <NO> $1 $2 $3 < @ $4> 102038032SpeterR<?> $* $@ $1 102138032Speter 102238032Speterifdef(`_RELAY_ENTIRE_DOMAIN_', `dnl 102338032Speter# if we relay, check username portion for user%host so host can be checked also 102438032SpeterR<NO> $* < @ $* $=m > $: <RELAY> $1 < @ $2 $3 >', `dnl') 102538032Speterifdef(`_RELAY_HOSTS_ONLY_', 102638032Speter`R<NO> $* < @ $=R > $: <RELAY> $1 < @ $2 > 102738032Speterifdef(`ACCESS_TABLE', `dnl 102838032SpeterR<NO> $* < @ $* > $: <$(access $2 $: NO $)> $1 < @ $2 >',`dnl')', 102938032Speter`R<NO> $* < @ $* $=R > $: <RELAY> $1 < @ $2 $3 > 103038032Speterifdef(`ACCESS_TABLE', `dnl 103138032SpeterR<NO> $* < @ $* > $: $>LookUpDomain <$2> <NO> <$1 < @ $2 >> 103238032SpeterR<$+> <$+> $: <$1> $2',`dnl')') 103338032SpeterR<RELAY> $* < @ $* > $@ $>ParseRecipient $1 103438032SpeterR<$-> $* $@ $2 103538032Speter 103638032Speter###################################################################### 103738032Speter### check_relay -- check hostname/address on SMTP startup 103838032Speter###################################################################### 103938032Speter 104038032SpeterSLocal_check_relay 104138032SpeterScheck_relay 104238032SpeterR$* $: $1 $| $>"Local_check_relay" $1 104338032SpeterR$* $| $* $| $#$* $#$3 104438032SpeterR$* $| $* $| $* $@ $>"Basic_check_relay" $1 $| $2 104538032Speter 104638032SpeterSBasic_check_relay 104738032Speter# check for deferred delivery mode 104838032SpeterR$* $: < ${deliveryMode} > $1 104938032SpeterR< d > $* $@ deferred 105038032SpeterR< $* > $* $: $2 105138032Speter 105238032Speterifdef(`ACCESS_TABLE', `dnl 105338032SpeterR$+ $| $+ $: $>LookUpDomain < $1 > <?> < $2 > 105438032SpeterR<?> < $+ > $: $>LookUpAddress < $1 > <OK> < $1 > 105538032SpeterR<OK> < $* > $: $1 105638032SpeterR<RELAY> < $* > $: $1 105738032SpeterR<REJECT> $* $#error $@ 5.7.1 $: "ifdef(`confREJECT_MSG', `confREJECT_MSG', `550 Access denied')" 105838032SpeterR<DISCARD> $* $#discard $: discard 105938032SpeterR<$+> $* $#error $@ 5.7.1 $: $1', `dnl') 106038032Speter 106138032Speterifdef(`_RBL_', `dnl 106238032Speter# MAPS project checks -- http://maps.vix.com/ 106338032SpeterR$* $: $&{client_addr} 106438032SpeterR$-.$-.$-.$- $: $(host $4.$3.$2.$1._RBL_. $: OK $) 106538032SpeterROK $@ OK 106638032SpeterR$+ $#error $@ 5.7.1 $: "Mail from " $&{client_addr} " refused; see http://maps.vix.com/rbl/"', 106738032Speter`dnl') 106838032Speter 106938032Speter###################################################################### 107038032Speter### check_mail -- check SMTP ``MAIL FROM:'' command argument 107138032Speter###################################################################### 107238032Speter 107338032SpeterSLocal_check_mail 107438032SpeterScheck_mail 107538032SpeterR$* $: $1 $| $>"Local_check_mail" $1 107638032SpeterR$* $| $#$* $#$2 107738032SpeterR$* $| $* $@ $>"Basic_check_mail" $1 107838032Speter 107938032SpeterSBasic_check_mail 108038032Speter# check for deferred delivery mode 108138032SpeterR$* $: < ${deliveryMode} > $1 108238032SpeterR< d > $* $@ deferred 108338032SpeterR< $* > $* $: $2 108438032Speter 108538032SpeterR<> $@ <OK> 108638032SpeterR$* $: <?> $>Parse0 $>3 $1 make domain canonical 108738032SpeterR<?> $* < @ $+ . > $* <?> $1 < @ $2 > $3 strip trailing dots 108838032Speter# handle non-DNS hostnames (*.bitnet, *.decnet, *.uucp, etc) 108938032SpeterR<?> $* < $* $=P > $* $: <OK> $1 < @ $2 $3 > $4 109038032Speterifdef(`_ACCEPT_UNRESOLVABLE_DOMAINS_', 109138032Speter`R<?> $* < @ $+ > $* $: <OK> $1 < @ $2 > $3 ... unresolvable OK', 109238032Speter`R<?> $* < @ $+ > $* $: <? $(resolve $2 $: $2 <PERM> $) > $1 < @ $2 > $3 109338032SpeterR<? $* <$->> $* < @ $+ > $* 109438032Speter $: <$2> $3 < @ $4 > $5') 109538032Speter 109638032Speterifdef(`_ACCEPT_UNQUALIFIED_SENDERS_',`dnl',`dnl 109738032Speter# handle case of @localhost on address 109838032SpeterR<$+> $* < @localhost > $: < ? $&{client_name} > <$1> $2 < @localhost > 109938032SpeterR<$+> $* < @localhost.$m > 110038032Speter $: < ? $&{client_name} > <$1> $2 < @localhost.$m > 110138032Speterifdef(`_NO_UUCP_', `dnl', 110238032Speter`R<$+> $* < @localhost.UUCP > 110338032Speter $: < ? $&{client_name} > <$1> $2 < @localhost.UUCP >') 110438032SpeterR<? $=w> <$+> $* <?> <$2> $3 110538032SpeterR<? $+> <$+> $* $#error $@ 5.5.4 $: "553 Real domain name required" 110638032SpeterR<?> <$+> $* $: <$1> $2') 110738032Speter 110838032Speterifdef(`ACCESS_TABLE', `dnl 110938032Speter# lookup localpart (user@) 111038032SpeterR<$+> $* < @ $+ > $* $: <USER $(access $2@ $: ? $) > <$1> $2 < @ $3 > $4 111138032Speter# no match, try full address (user@domain rest) 111238032SpeterR<USER ?> <$+> $* < @ $* > $* 111338032Speter $: <USER $(access $2@$3$4 $: ? $) > <$1> $2 < @ $3 > $4 111438032Speter# no match, try address (user@domain) 111538032SpeterR<USER ?> <$+> $+ < @ $+ > $* 111638032Speter $: <USER $(access $2@$3 $: ? $) > <$1> $2 < @ $3 > $4 111738032Speter# no match, try (sub)domain (domain) 111838032SpeterR<USER ?> <$+> $* < @ $+ > $* 111938032Speter $: $>LookUpDomain <$3> <$1> <> 112038032Speter# check unqualified user in access database 112138032SpeterR<?> $* $: <USER $(access $1@ $: ? $) > <?> $1 112238032Speter# retransform for further use 112338032SpeterR<USER $+> <$+> $* $: <$1> $3', 112438032Speter`dnl') 112538032Speter 112638032Speterifdef(`_ACCEPT_UNQUALIFIED_SENDERS_',`dnl',`dnl 112738032Speter# handle case of no @domain on address 112838032SpeterR<?> $* $: < ? $&{client_name} > $1 112938032SpeterR<?> $* $@ <OK> ...local unqualed ok 113038032SpeterR<? $+> $* $#error $@ 5.5.4 $: "553 Domain name required" 113138032Speter ...remote is not') 113238032Speter# check results 113338032SpeterR<?> $* $@ <OK> 113438032SpeterR<OK> $* $@ <OK> 113538032SpeterR<TEMP> $* $#error $@ 4.1.8 $: "451 Sender domain must resolve" 113638032SpeterR<PERM> $* $#error $@ 5.1.8 $: "501 Sender domain must exist" 113738032Speterifdef(`ACCESS_TABLE', `dnl 113838032SpeterR<RELAY> $* $@ <RELAY> 113938032SpeterR<DISCARD> $* $#discard $: discard 114038032SpeterR<REJECT> $* $#error $@ 5.7.1 $: "ifdef(`confREJECT_MSG', `confREJECT_MSG', `550 Access denied')" 114138032SpeterR<$+> $* $#error $@ 5.7.1 $: $1 error from access db', 114238032Speter`dnl') 114338032Speter 114438032Speter###################################################################### 114538032Speter### check_rcpt -- check SMTP ``RCPT TO:'' command argument 114638032Speter###################################################################### 114738032Speter 114838032SpeterSLocal_check_rcpt 114938032SpeterScheck_rcpt 115038032SpeterR$* $: $1 $| $>"Local_check_rcpt" $1 115138032SpeterR$* $| $#$* $#$2 115238032SpeterR$* $| $* $@ $>"Basic_check_rcpt" $1 115338032Speter 115438032SpeterSBasic_check_rcpt 115538032Speter# check for deferred delivery mode 115638032SpeterR$* $: < ${deliveryMode} > $1 115738032SpeterR< d > $* $@ deferred 115838032SpeterR< $* > $* $: $2 115938032Speter 116038032Speterifdef(`_LOOSE_RELAY_CHECK_',`dnl 116138032SpeterR$* $: $>Parse0 $>3 $1 116238032SpeterR$* < @ $* . > $1 < @ $2 > strip trailing dots', 116338032Speter`R$* $: $>ParseRecipient $1 strip relayable hosts') 116438032Speter 116538032Speterifdef(`_BLACKLIST_RCPT_',`dnl 116638032Speterifdef(`ACCESS_TABLE', `dnl 116738032Speter# blacklist local users or any host from receiving mail 116838032SpeterR$* $: <?> $1 116938032SpeterR<?> $+ < @ $=w > $: <> <USER $1> <FULL $1@$2> <HOST $2> <$1 < @ $2 >> 117038032SpeterR<?> $+ < @ $* > $: <> <FULL $1@$2> <HOST $2> <$1 < @ $2 >> 117138032SpeterR<?> $+ $: <> <USER $1> <$1> 117238032SpeterR<> <USER $+> $* $: <$(access $1 $: $)> $2 117338032SpeterR<> <FULL $+> $* $: <$(access $1 $: $)> $2 117438032SpeterR<OK> <FULL $+> $* $: <$(access $1 $: $)> $2 117538032SpeterR<> <HOST $+> $* $: <$(access $1 $: $)> $2 117638032SpeterR<OK> <HOST $+> $* $: <$(access $1 $: $)> $2 117738032SpeterR<> <$*> $: $1 117838032SpeterR<OK> <$*> $: $1 117938032SpeterR<RELAY> <$*> $: $1 118038032SpeterR<REJECT> $* $#error $@ 5.2.1 $: "550 Mailbox disabled for this recipient" 118138032SpeterR<$+> $* $#error $@ 5.2.1 $: $1 error from access db', `dnl')', `dnl') 118238032Speter 118338032Speterifdef(`_PROMISCUOUS_RELAY_', `dnl', `dnl 118438032Speter# anything terminating locally is ok 118538032Speterifdef(`_RELAY_ENTIRE_DOMAIN_', `dnl 118638032SpeterR$+ < @ $* $=m > $@ OK', `dnl') 118738032SpeterR$+ < @ $=w > $@ OK 118838032Speterifdef(`_RELAY_HOSTS_ONLY_', 118938032Speter`R$+ < @ $=R > $@ OK 119038032Speterifdef(`ACCESS_TABLE', `dnl 119138032SpeterR$+ < @ $* > $: <$(access $2 $: ? $)> <$1 < @ $2 >>',`dnl')', 119238032Speter`R$+ < @ $* $=R > $@ OK 119338032Speterifdef(`ACCESS_TABLE', `dnl 119438032SpeterR$+ < @ $* > $: $>LookUpDomain <$2> <?> <$1 < @ $2 >>',`dnl')') 119538032Speterifdef(`ACCESS_TABLE', `dnl 119638032SpeterR<RELAY> $* $@ RELAY 119738032SpeterR<$*> <$*> $: $2',`dnl') 119838032Speter 119938032Speterifdef(`_RELAY_MX_SERVED_', `dnl 120038032Speter# allow relaying for hosts which we MX serve 120138032SpeterR$+ < @ $* > $: < : $(mxserved $2 $) : > $1 < @ $2 > 120238032SpeterR< : $* <TEMP> : > $* $#error $@ 4.7.1 $: "450 Can not check MX records for recipient host " $1 120338032SpeterR<$* : $=w . : $*> $* $@ OK 120438032SpeterR<$*> $* $: $2', 120538032Speter`dnl') 120638032Speter 120738032Speter# check for local user (i.e. unqualified address) 120838032SpeterR$* $: <?> $1 120938032SpeterR<?> $+ < @ $+ > $: <REMOTE> $1 < @ $2 > 121038032Speter# local user is ok 121138032SpeterR<?> $+ $@ OK 121238032SpeterR<$+> $* $: $2 121338032Speter 121438032Speter# anything originating locally is ok 121538032SpeterR$* $: <?> $&{client_name} 121638032Speter# check if bracketed IP address (forward lookup != reverse lookup) 121738032SpeterR<?> [$+] $: <BAD> [$1] 121838032Speter# pass to name server to make hostname canonical 121938032SpeterR<?> $* $~P $: <?> $[ $1 $2 $] 122038032SpeterR<$-> $* $: $2 122138032SpeterR$* . $1 strip trailing dots 122238032SpeterR$@ $@ OK 122338032Speterifdef(`_RELAY_ENTIRE_DOMAIN_', `dnl 122438032SpeterR$* $=m $@ OK', `dnl') 122538032SpeterR$=w $@ OK 122638032Speterifdef(`_RELAY_HOSTS_ONLY_', 122738032Speter`R$=R $@ OK 122838032Speterifdef(`ACCESS_TABLE', `dnl 122938032SpeterR$* $: <$(access $1 $: ? $)> <$1>',`dnl')', 123038032Speter`R$* $=R $@ OK 123138032Speterifdef(`ACCESS_TABLE', `dnl 123238032SpeterR$* $: $>LookUpDomain <$1> <?> <$1>',`dnl')') 123338032Speterifdef(`ACCESS_TABLE', `dnl 123438032SpeterR<RELAY> $* $@ RELAY 123538032SpeterR<$*> <$*> $: $2',`dnl') 123638032Speter 123738032Speter# check IP address 123838032SpeterR$* $: $&{client_addr} 123938032SpeterR$@ $@ OK originated locally 124038032SpeterR0 $@ OK originated locally 124138032SpeterR$=R $* $@ OK relayable IP address 124238032Speterifdef(`ACCESS_TABLE', `dnl 124338032SpeterR$* $: $>LookUpAddress <$1> <?> <$1> 124438032SpeterR<RELAY> $* $@ RELAY relayable IP address 124538032SpeterR<$*> <$*> $: $2', `dnl') 124638032SpeterR$* $: [ $1 ] put brackets around it... 124738032SpeterR$=w $@ OK ... and see if it is local 124838032Speter 124938032Speterifdef(`_RELAY_LOCAL_FROM_', `dnl 125038032Speter# anything with a local FROM is ok 125138032SpeterR$* $: $1 $| $>Parse0 $>3 $&f 125238032SpeterR$* $| $+ < @ $=w . > $@ OK FROM local 125338032SpeterR$* $| $* $: $1 125438032Speter', `dnl') 125538032Speter 125638032Speter# anything else is bogus 125738032SpeterR$* $#error $@ 5.7.1 $: "550 Relaying denied"') 125838032Speter 125938032Speterundivert(9)dnl 126038032Speter# 126138032Speter###################################################################### 126238032Speter###################################################################### 126338032Speter##### 126438032Speter`##### MAILER DEFINITIONS' 126538032Speter##### 126638032Speter###################################################################### 126738032Speter###################################################################### 126838032Speterundivert(7)dnl 1269