# $Cambridge: hermes/conf/exim/etc/etc.ppsw/configure,v 1.294 2005/02/12 00:38:08 fanf2 Exp $ ###################################################################### # MAIN CONFIGURATION SETTINGS # ###################################################################### ## Macros for locating various files. # data that comes from other machines CERTS = /opt/dist/certs DOMAINS = /opt/dist/domains LISTS = /opt/dist/lists USERS = /opt/dist/users # configuration that belongs to the Exim package DB = /opt/exim/etc/db TABLES = /opt/exim/etc/tables ## Behaviour changes based on our name INTERFACE_PARAM = ${lookup {$interface_address} cdb {DB/addrparams.cdb} } SENDER_PARAM = ${lookup {$sender_host_address} cdb {DB/addrparams.cdb} } PARAM = INTERFACE_PARAM NAME = ${extract {name}{PARAM} {$value} {localhost} } FULL_HOSTINFO = $primary_hostname (${if def:interface_address \ {NAME [$interface_address]:$interface_port} \ {NAME} }) ## Some abbreviations for ACLs and routers # ACL variable names # # time to delay if the sending host is dodgy ACL_DELAY = acl_c0 # # the client's HELO name was wrong ACL_HELO = acl_c1 # # We are too busy ACL_BUSY = acl_c2 # standard callout timeouts # CALLTIME = 4m,maxwait=4m,connect=30s # check local port is 25 # PORT25 = ${if ={25}{$interface_port} } # Map a Hermes user to their Cyrus store. If the username is invalid, # return an empty string which causes the routers to decline. Otherwise # return the name of the user's Cyrus message store. # HERMES_CYRUS = ${lookup {$local_part} cdb {USERS/hermes_cancelled.cdb} \ {} {${lookup {$local_part} cdb {USERS/cyrus.cdb} }} } ## Domain and host lists. # List of domains handled on PPSW itself # # This list includes ppsw.cam.ac.uk which is $qualify_domain. # It is handled in the same way as normal managed mail domains. # # This list also includes the special domains # cam.ac.uk # hermes.cam.ac.uk # lists.cam.ac.uk # whose special-case aliases are handled as managed mail domains but # which have a lot of additional addresses routed by other means. # domainlist local_domains = \ cdb;DOMAINS/domainlist.cdb :\ cdb;DOMAINS/longshort.cdb # List of domains that PPSW will relay to # domainlist relay_domains = \ cdb;DB/special_routes.cdb :\ partial-cdb;DB/relay_domains.cdb # Lists of all host names which might refer to us. # ppsw.cam.ac.uk aka $qualify_domain is not included. # domainlist our_names = \ cdb;DB/ppswnames.cdb # Special-case domains for handling postmaster email, # including domain literals [IP addresses]. # domainlist postmaster_domains = \ +our_names :\ @[] # List of all domains known to PPSW, # including the local host to make automated postmaster contact possible # domainlist our_domains = \ +local_domains :\ +relay_domains :\ +postmaster_domains # Local parts which should be present in all domains # and which should not be filtered. # localpartlist postmasterish = \ postmaster :\ abuse # We are prepared to relay outgoing email from these hosts, # and we give them favourable MX service. # hostlist relay_hosts = \ TABLES/cudn_nets # We will not deliver email to these hosts, and will reject email with # an envelope-from domain that resolves to one of these hosts. # hostlist bad_hosts = \ TABLES/bad_nets :\ net-cdb;DB/badtlds.cdb ## ## Configuration options. ## ## See Chapter 14 of the Exim specification for the categories. ## ## Exim parameters # to facilitate moving the queue from one machine to another using tar # localhost_number = ${substr_5_1:$primary_hostname} # special spool handling for MailScanner SPOOL = /spool/exim spool_directory = SPOOL split_spool_directory = true ## Privileged users deliver_drop_privilege = true never_users = root trusted_groups = exim ## Logging # log to the same place regardless of spool directory log_file_path = syslog:/spool/exim/log/%slog process_log_path = /spool/exim/exim-process.info syslog_facility = local5 # sensible timestamp handling log_timezone = true syslog_timestamp = false # performance and content sanity message_logs = false print_topbitchars = true syslog_duplication = false # adjust logging detail: don't log no-ops; log interface information # so we can tell the difference between ppsw and smtp.hermes; message # reception confirmation (often includes message-ID); more address # information on each line to reduce the need for exigrep and make the # delays caused by MailScanner less of a readability problem. .ifdef DEBUG log_selector = +all .else log_selector = -retry_defer -skip_delivery -host_lookup_failed \ +incoming_interface +incoming_port +smtp_confirmation \ +sender_on_delivery +return_path_on_delivery +delivery_size \ +received_recipients +all_parents +address_rewrite \ +tls_certificate_verified +tls_peerdn \ +smtp_protocol_error +smtp_syntax_error \ +deliver_time +queue_time \ -lost_incoming_connection .endif ## Resource control # These protections need to take into account MailScanner's need to do # MIME explosion. check_spool_inodes = 1000 check_spool_space = 1000M # ppsw has a generous message size limit, Hermes less so -- # see also the cyrus LMTP limit and the Exim client limit message_size_limit = ${extract {msgsizelim}{PARAM} {$value} {100M} } # Note that there are seven concurrent MailScanner processes, and that # (for SMTP input) we queue_only anyway, so the queue_only_load helpls # mostly with mailing list messages. smtp_accept_max_per_host = 10 deliver_queue_load_max = 20.00 queue_only_load = 10.00 queue_run_max = 20 smtp_accept_max = 400 smtp_accept_reserve = 20 smtp_load_reserve = 15.00 smtp_reserve_hosts = +relay_hosts ## Policy controls # The default ACL name is based on the default NAME of localhost. acl_smtp_connect = acl_conn_${extract {acl}{PARAM} {$value} {local} } acl_smtp_helo = acl_helo_${extract {acl}{PARAM} {$value} {local} } acl_smtp_rcpt = acl_rcpt_${extract {acl}{PARAM} {$value} {local} } acl_smtp_data = acl_data_${extract {acl}{PARAM} {$value} {local} } acl_smtp_vrfy = accept ## TLS # server-side TLS settings tls_advertise_hosts = ${if exists{CERTS/server/NAME} {*} {} } tls_certificate = CERTS/server/NAME tls_dhparam = CERTS/dhparam tls_on_connect_ports = 465 # Eudora/Outlook bug: if we ask it for a client certificate, # it bails out instead of declining gracefully. # For more info see the interoperability section of # http://www.sendmail.org/~ca/email/starttls.html # This makes client TLS authentication hard to support :-( # # We'll have to think more about the interaction with AUTH # advertisement too, since it's currently keyed on the use of # TLS (rather than the use of the submission service) whereas # verify = certificate is more of an smarthost thing. # #tls_try_verify_hosts = * #tls_verify_certificates= CERTS/client ## Incoming SMTP # see also tls_on_connect_ports above daemon_smtp_ports = 25 : 465 : 587 # optionally attempt to confuse ratware smtp_banner = \ FULL_HOSTINFO ESMTP Exim $version_number+ppsw+$compile_number $tod_full\ ${if match{PARAM}{acl=mx} {${run {/usr/bin/fortune -s} {\n$value} }} } # Make ESMTP PIPELINING available in all cases except when in submission mode. # This is an attempt to make the error handling of Outlook better, so that it # reports the response to RCPT instead of the response to DATA when a message # is rejected. We also turn off synchronization checks to allow for crapware # that tries to pipeline anyway. # pipelining_advertise_hosts = ${if match{PARAM}{acl=submit} {:} {*} } # a bit of good cop / bad cop with helo helo_allow_chars = "_" helo_try_verify_hosts = * # reverse DNS information is useful helo_lookup_domains = * host_lookup = * # ident lookups are not and cause firewall problems. rfc1413_hosts = : rfc1413_query_timeout = 0s smtp_return_error_details ## Message processing # only for postmaster allow_domain_literals # never send email to another ppsw machine hosts_treat_as_local = +our_names : $qualify_domain # email domain on locally-generated messages qualify_domain = ppsw.cam.ac.uk remote_sort_domains = *.cam.ac.uk : *.ac.uk : *.uk # tweaked so that it is clear which way the message arrived # for reference, the default is: # # received_header_text = Received: \ # ${if def:sender_rcvhost {from $sender_rcvhost\n\t} \ # {${if def:sender_ident {from $sender_ident } }\ # ${if def:sender_helo_name {(helo=$sender_helo_name)\n\t} }} }\ # by $primary_hostname \ # ${if def:received_protocol {with $received_protocol} } \ # ${if def:tls_cipher {($tls_cipher)\n\t} }\ # (Exim $version_number)\n\t\ # id $message_id\ # ${if def:received_for {\n\tfor $received_for} } # received_header_text = Received: \ from ${if def:sender_rcvhost {$sender_rcvhost\n\t} \ {${if def:sender_ident {$sender_ident } {localhost } }\ ${if def:sender_helo_name {(helo=$sender_helo_name) } }} }\ by FULL_HOSTINFO\n\t\ ${if def:received_protocol {with $received_protocol } }\ ${if def:sender_host_authenticated \ {($sender_host_authenticated:$authenticated_id) } }\ ${if def:tls_cipher {($tls_cipher)\n\t} }\ id $message_id (Exim $version_number)\ ${if def:received_for { for $received_for} }\n\t\ (return-path <$sender_address>) ## Frozen, bounce, and warning messages bounce_return_body bounce_return_size_limit = 10K errors_reply_to = postmaster@cam.ac.uk # single warning after 24h (30d will never be reached) delay_warning = 24h:30d ignore_bounce_errors_after = 24h auto_thaw = 8h ###################################################################### # ACL CONFIGURATION # ###################################################################### begin acl ###################################################################### # # ACLs for messages sent via localhost # acl_conn_local: accept acl_helo_local: accept acl_rcpt_local: # Be secure in case of config cock-up. require message = No SMTP service for unauthorized users hosts = : @[] : # Check all envelope addresses. require verify = sender verify = recipient/callout=use_sender,defer_ok acl = aux_verify_sender accept # end of acl_rcpt_local acl_data_local: accept ###################################################################### # # ACLs for the smarthost service # acl_conn_smart: accept acl_helo_smart: accept acl_rcpt_smart: # This service is only available on port 25. require message = No SMTP service for unauthorized users condition = PORT25 # Make it easy to get help. accept domains = +our_domains local_parts = +postmasterish # Accept email from machines we should be nice to without question. accept condition = ${extract {benice}{SENDER_PARAM} } # The sender must be allowed to relay through us, # or the recipient must be in the smarthost domain. # The latter is so that the smarthost can be its own MX, # to avoid confusion from clients that use the MX instead # of the A record to route outgoing email. deny message = No SMTP service for unauthorized users ! hosts = +relay_hosts ! domains = NAME deny ! hosts = +relay_hosts domains = NAME ! verify = recipient/callout=use_sender,defer_ok # Set up submission mode, in case we accept the message. # We have to fix up partly-formed messages to support # certain clients, but since this service may be relaying # messages we leave the Sender: header alone. require control = submission/sender_retain # Require valid recipient addresses on bounce messages. accept senders = : endpass verify = recipient/callout=CALLTIME # Do return address verification compatible with the mx service. require verify = sender acl = aux_verify_sender accept # end of acl_rcpt_smart acl_data_smart: accept ###################################################################### # # ACLs for the message submission service # acl_conn_submit: # Turn off synchronization checks, in order to be more forgiving to # incompetent SMTP implementations like Outlook, especially when ESMTP # PIPELINING is turned off. See pipelining_advertise_hosts above. require control = no_enforce_sync accept # end of acl_conn_submit acl_helo_submit: accept acl_rcpt_submit: # Make it easy to get help. accept domains = +our_domains local_parts = +postmasterish # The sender must be either allowed to relay or authenticated. deny message = No SMTP service for unauthorized users ! hosts = +relay_hosts ! authenticated = * # Set up submission mode, in case we accept the message. require control = submission/domain=${extract {domain}{PARAM} \ {$value} {$qualify_domain} } # Require valid recipient addresses on bounce messages. accept senders = : endpass verify = recipient/callout=CALLTIME # Do return address verification compatible with the mx service. require verify = sender acl = aux_verify_sender accept # end of acl_rcpt_submit acl_data_submit: accept ###################################################################### # # ACLs for messages from the public Internet # # The delays at the start of the SMTP conversation are to help Exim's # synchronization checks catch pump-and-dump spamware and viruses. # Compare and contrast acl_conn_submit above. acl_conn_mx: # Be nice to friendly machines. accept hosts = +relay_hosts # Assume we won't have to delay. warn set ACL_DELAY = 0s # We delay if the sender is blacklisted. warn dnslists = list.dsbl.org : \ multihop.dsbl.org : \ rbl-plus.mail-abuse.ja.net : \ combined.njabl.org : \ relays.ordb.org : \ dnsbl.sorbs.net : \ sbl-xbl.spamhaus.org set ACL_DELAY = 5s # We delay if the sender has bad DNS. warn ! verify = reverse_host_lookup set ACL_DELAY = 5s # Do whatever delay we worked out. accept delay = $ACL_DELAY # end of acl_conn_mx acl_helo_mx: # Be nice to friendly machines. accept hosts = +relay_hosts # We delay if the sender says the wrong hello domain. warn ! verify = helo set ACL_DELAY = 5s # Do whatever delay we worked out. accept delay = $ACL_DELAY # end of acl_helo_mx acl_rcpt_mx: # This service is only available on port 25. require message = No SMTP service for unauthorized users condition = PORT25 # Make it easy to get help accept domains = +our_domains local_parts = +postmasterish # We accept email only for domains that we know about. # This check is cheap so we do it early to save time. require message = Relaying is not permitted domains = +our_domains # Do some anti-spam checking for non-friendly machines. deny ! hosts = +relay_hosts ! acl = aux_check_spam # Do cheap sender domain verification to avoid further work. require verify = sender # All recipient addresses must be valid, more or less. require message = ${acl_verify_message}\n\ See http://www.cam.ac.uk/cs/email/bounce.html verify = recipient/callout=use_sender,defer_ok # Do more thorough sender address checks. We do this after verifying the # recipient address to reduce the number of sender callouts. require acl = aux_verify_sender # Don't accept email if we are too busy. We keep this check at the end # of the ACLs and ensure we do it only once because it can be expensive. defer message = Sorry, too busy. Try again later. condition = ${if or{{ eq{$ACL_BUSY}{yes} } \ { <{300}{${run {/opt/exim/sbin/exim_incount} }} }} } set ACL_BUSY = yes # Every check has been passed. accept # end of acl_rcpt_mx acl_data_mx: accept ###################################################################### # # Auxiliary ACLs called by the others # aux_verify_sender: # Only do sender callouts if the sender is not known to be incompetent # according to any of the preliminary ACL conditions. We assume that # the caller has already required verify = sender. accept condition = \ ${lookup {${lc:$sender_address_domain}} partial-cdb {DB/nocallout.cdb} \ {yes} {${lookup {${lc:$sender_address}} cdb {DB/nocallout.cdb} \ {yes} {no} }} } accept dnslists = dsn.rfc-ignorant.org/$sender_address_domain require verify = sender/callout=CALLTIME,defer_ok accept # end of aux_verify_sender aux_check_spam: # Check for ratware HELO signatures. We don't use the full strictness of # verify=helo; if it fails we only check for a few choice stupidities. deny message = Please use your name when saying HELO (not $sender_helo_name) ! verify = helo condition = ${if or{{ eq{$ACL_HELO}{bad} } \ { isip{$sender_helo_name} } \ { eq{$sender_helo_name}{$local_part} } \ { match{$sender_helo_name}{\N[.][.]|.{55}\N} } \ { match_domain{$sender_helo_name}{+our_domains} }} } set ACL_HELO = bad # Look up in a few choice blacklists. deny message = ${sender_host_address} is listed at ${dnslist_domain}; \ See ${dnslist_text} dnslists = sbl-xbl.spamhaus.org deny message = ${sender_host_address} is listed at ${dnslist_domain}; \ See http://mail-abuse.com/cgi-bin/lookup?${sender_host_address} dnslists = rbl-plus.mail-abuse.ja.net deny message = ${sender_address_domain} is listed at ${dnslist_domain}; \ ${dnslist_text} dnslists = nomail.rhsbl.sorbs.net/$sender_address_domain # It has passed the tests. accept # end of aux_check_spam ###################################################################### # AUTHENTICATION CONFIGURATION # ###################################################################### # Note that although the authenticators aren't explicitly restricted # to the submission service, they are only used in that case because # only the submission service has a TLS certificate, and the MUA # server only sends messages via the submission service. begin authenticators # We could be vulnerable to password stealing by spammers, so it's # important that the authentication mechanisms are reasonably secure. # We protect passwords from snooping by requiring TLS, and the # password-changing program checks for basic password security. # TLS is only advertised if we have a certificate available, and we # only have certificates for the message submission service. LOGIN: driver = plaintext server_set_id = $1 server_prompts = <| Username: | Password: server_condition = \ ${if crypteq{$2}{${lookup {$1} cdb {USERS/passwd.cdb} }} } server_advertise_condition = ${if !eq{}{$tls_cipher} } PLAIN: driver = plaintext server_set_id = $2 server_prompts = : server_condition = \ ${if crypteq{$3}{${lookup {$2} cdb {USERS/passwd.cdb} }} } server_advertise_condition = ${if !eq{}{$tls_cipher} } # This authenticator is used to communicate authentication from the # central MUA server to us for bounce address tagging. EXTERNAL is a # standard SASL mechanism that uses external information to # authenticate the stated username; in this case the external # information is that we trust the client, i.e. the MUA server. # The mechanism is only advertised to the MUA server. EXTERNAL: driver = plaintext server_set_id = $1 server_prompts = : server_condition = yes server_advertise_condition = ${extract {mua}{SENDER_PARAM} } ###################################################################### # REWRITE CONFIGURATION # ###################################################################### begin rewrite # This is partly handled by the widen_domains in the lookuphost # router, but that doesn't handle the envelope return path and # other addresses in the headers. *@cam $1@cam.ac.uk # Continue to support broken Hermes user configurations. *@*.hermes.cam.ac.uk $1@hermes.cam.ac.uk hF ###################################################################### # ROUTERS CONFIGURATION # ###################################################################### begin routers # A special case for postmaster email directed to the local host, to # allow automated systems to contact postmaster. Although email directed # to specific hosts is in general not kosher and against local policy, # the importance of ppsw means that it's probably best to make it easy # to contact us without any knowledge of email in Cambridge. postmaster: driver = redirect domains = +postmaster_domains local_parts = +postmasterish data = postmaster@${qualify_domain} # Produce a nice error message. Without this router the lookuphost router # will say "Invalid domain part in email address" which isn't correct. postmaster_error: driver = redirect domains = +postmaster_domains data = :fail: \ "${local_part}@${domain}" is not a known user on this system. allow_fail ## ## Remote domains. ## # List of special local routes that override MX information. # If the lookup fails the router declines so the address is # handled by the lookuphost router below. special_routes: driver = manualroute domains = !+local_domains host_find_failed = defer route_data = ${lookup {$domain} cdb {DB/special_routes.cdb} } same_domain_copy_routing transport = smtp # This router routes to remote hosts over SMTP using a DNS lookup. # We refuse to deliver email to hosts in Cambridge unless they are # known email servers, i.e. they have MX records. lookuphost: driver = dnslookup domains = !+local_domains ignore_target_hosts = +bad_hosts mx_domains = *.cam.ac.uk widen_domains = cam.ac.uk : ac.uk same_domain_copy_routing no_more cannot_route_message = Invalid domain part in email address transport = smtp ## ## hermes.cam.ac.uk ## # Verify Hermes addresses that are destined for the Cyrus messages stores # in a separate router in order to avoid callouts. The HERMES_CYRUS mapping # either returns a Cyrus hostname (equivalent to true) or an empty string # (equivalent to false), in which case this router declines and the address # falls through to the managed mail domain routers for special-case and # unknown addresses. hermes_verify: driver = accept local_part_suffix = +* local_part_suffix_optional verify_only domains = hermes.cam.ac.uk condition = HERMES_CYRUS # Deliver most Hermes addresses to the appropriate Cyrus store. # The HERMES_CYRUS mapping either returns a Cyrus hostname, suitable for # use in the route_data, or an empty string, which causes this router to # decline and the address falls through as before. hermes_lmtp: driver = manualroute local_part_suffix = +* local_part_suffix_optional no_verify domains = hermes.cam.ac.uk host_find_failed = defer route_data = HERMES_CYRUS retry_use_local_part transport = ${if ={0}{$body_zerocount} \ {hermes_lmtp} {hermes_lmtp_filter} } ## ## cam.ac.uk ## # A big special-case extension to the managed mail domain system. # As for hermes.cam.ac.uk, we fall through to the routers below # for special-case and unknown addresses. cam_aliases: driver = redirect domains = cam.ac.uk data = ${lookup {$local_part} cdb {USERS/cam_aliases.cdb} } forbid_blackhole forbid_file forbid_include forbid_pipe check_ancestor retry_use_local_part ## ## DOMAINS ## # Redirect long form addresses to their short form equivalents. domain_longshort: driver = redirect domains = +local_domains data = ${lookup {$domain} cdb {DOMAINS/longshort.cdb} \ {${local_part}@${value}} fail } forbid_blackhole forbid_file forbid_include forbid_pipe check_ancestor retry_use_local_part # This includes special-case local parts in cam.ac.uk, hermes.cam.ac.uk, # and lists.cam.ac.uk, and all addresses @ppsw.cam.ac.uk domain_aliases: driver = redirect domains = +local_domains data = ${lookup {$local_part} cdb {DOMAINS/db/${domain}.cdb} } forbid_blackhole forbid_file forbid_include forbid_pipe check_ancestor retry_use_local_part # Ensure postmaster@ always works. domain_postmaster: driver = redirect domains = +local_domains local_parts = +postmasterish file = DOMAINS/managers/${domain} forbid_blackhole forbid_file forbid_include forbid_pipe check_ancestor retry_use_local_part errors_to = postmaster@ppsw.cam.ac.uk # This router produces a nice error message for unknown users in any # local domain other than lists.cam.ac.uk. domain_error: driver = redirect domains = !lists.cam.ac.uk : +local_domains data = :fail: \ "${local_part}@${domain}" is not a known user on this system. allow_fail ## ## lists.cam.ac.uk ## # This router's condition requires that the message is not # submitted over the network. lists_outgoing: driver = redirect local_part_suffix = -outgoing domains = lists.cam.ac.uk condition = ${if eq{}{$sender_host_address} } file = LISTS/members/$local_part forbid_blackhole forbid_file forbid_include forbid_pipe check_ancestor one_time retry_use_local_part errors_to = ${local_part}-request@lists.cam.ac.uk # This router's condition requires that moderators file # is non-zero in size. lists_moderators: driver = redirect local_part_suffix = -moderators domains = lists.cam.ac.uk require_files = LISTS/moderators/$local_part condition = ${extract {size} \ {${stat:LISTS/moderators/$local_part}} } file = LISTS/moderators/$local_part forbid_blackhole forbid_file forbid_include forbid_pipe check_ancestor one_time retry_use_local_part errors_to = ${local_part}-managers@lists.cam.ac.uk lists_no_moderators: driver = redirect local_part_suffix = -moderators domains = lists.cam.ac.uk data = ${local_part}-managers@lists.cam.ac.uk check_ancestor lists_owner: driver = redirect local_part_prefix = owner- domains = lists.cam.ac.uk data = ${local_part}-managers@lists.cam.ac.uk check_ancestor lists_request: driver = redirect local_part_suffix = -request domains = lists.cam.ac.uk data = ${local_part}-managers@lists.cam.ac.uk check_ancestor lists_managers: driver = redirect local_part_suffix = -managers domains = lists.cam.ac.uk file = LISTS/managers/$local_part forbid_blackhole forbid_file forbid_include forbid_pipe check_ancestor one_time retry_use_local_part errors_to = postmaster@lists.cam.ac.uk # Ensure that a list's bounce address will verify # before accepting messages to it. lists_verify: driver = redirect verify_only domains = lists.cam.ac.uk require_files = LISTS/members/$local_part data = ${local_part}-managers@lists.cam.ac.uk check_ancestor # Vanilla list explosion for anything which doesn't match prefix or suffix lists_process: driver = accept domains = lists.cam.ac.uk require_files = LISTS/members/$local_part retry_use_local_part transport = list_pipe lists_error: driver = redirect domains = lists.cam.ac.uk data = :fail: \ "${local_part}" is not a list that is managed on this system. allow_fail ###################################################################### # TRANSPORTS CONFIGURATION # ###################################################################### begin transports # This transport is used for delivering messages over SMTP connections. # We do not use TLS to send email. smtp: driver = smtp hosts_randomize hosts_avoid_tls = * # This transport is used when delivering messages to Hermes by LMTP # The target machines do not appear in the DNS, hence gethostbyname. # (actually appears to be redundant when parent router is manualroute # rather than accept, but useful as documentation none the less.) # We keep any local_part_suffix that was recognised by the router. hermes_lmtp: driver = smtp rcpt_include_affixes = true gethostbyname = true protocol = lmtp # This variant of the hermes_lmtp transport strips out any nul bytes in order # to avoid triggering Cyrus's strict checking. We only use it when necessary # for efficiency reasons. hermes_lmtp_filter: driver = smtp rcpt_include_affixes = true gethostbyname = true transport_filter = /usr/bin/tr -d \\000 protocol = lmtp # Mailing list exploder process list_pipe: driver = pipe command = /opt/exim/sbin/explode_list message_prefix = "" message_suffix = "" return_fail_output ###################################################################### # RETRY CONFIGURATION # ###################################################################### begin retry # Large time out for local mail servers so that problems can be fixed. # This also deals with quota problems on the Hermes LMTP message store. # We have a short time-out for non-local addresses that get routed via # an A record (because they have no MX) because these are usually the # result of fat-fingering. # Address Error Retries # ------- ----- ------- *@+our_domains * F,2h,15m; F,8h,30m; F,7d,60m; F,14d,2h *@* refused_A F,2h,15m; G,16h,30m,1.5 *@* timeout_connect_A F,2h,15m; G,16h,30m,1.5 *@* * F,2h,15m; G,16h,30m,1.5; F,5d,8h # End of Exim 4 configuration