X-Git-Url: https://git.adam-barratt.org.uk/?p=mirror%2Fdsa-puppet.git;a=blobdiff_plain;f=modules%2Fexim%2Ftemplates%2Feximconf.erb;h=6b055f9f1cb513f35443944c902bbec05cbfd6c8;hp=26ac9778c6e854aa3d7ad57f64bdabc4ee475310;hb=e9b0dc298740c07aff9b54bb93d40c453a9c23b7;hpb=cedc6e5894d81ba4b8ede802acb3ec84e5c85d6d diff --git a/modules/exim/templates/eximconf.erb b/modules/exim/templates/eximconf.erb index 26ac9778c..6b055f9f1 100644 --- a/modules/exim/templates/eximconf.erb +++ b/modules/exim/templates/eximconf.erb @@ -45,8 +45,12 @@ # From /var/lib/misc / UD: # -# mail-forward.cdb - aliases for @d.o -# user-forward.cdb - aliases for @thishost.d.o +# mail-forward.db - aliases for @d.o +# user-forward.db - aliases for @thishost.d.o +# +# Note that the BDB files generated by ud-ldap use keys that are not +# null-terminated, so Exim needs to use the "dbmnz" lookup type, rather +# than "dbm". # Exim's wildcard mechanism is a bit odd in that to say "any address in # debian.org including debian.org" you must use two patterns, @@ -136,6 +140,7 @@ domainlist google_mxen = aspmx.l.google.com : gmail-smtp-in.l.google.com : \ *.aspmx.l.google.com : *.gmail-smtp-in.l.google.com domainlist single_domain_mx = +google_mxen +domainlist ipv4_only_domain_mx = +google_mxen <%- if @is_mailrelay -%> # Domains we relay for; that is domains that aren't considered local but we @@ -154,7 +159,6 @@ tls_crl = /etc/exim4/ssl/ca.crl # expensive, you can specify the networks for which a lookup is done, or # remove the setting entirely. host_lookup = * -dns_ipv4_lookup = +google_mxen # If this option is set, then any process that is running as one of the # listed users may pass a message to Exim and specify the sender's @@ -179,7 +183,7 @@ gecos_pattern = ^([^,:]*) gecos_name = $1 # Do *not* include the body of the original message in a bounce -# The combinaton of bounce_return_message and bounce_return_body +# The combination of bounce_return_message and bounce_return_body # allows us to return only the headers within a bounce bounce_return_message = true @@ -268,6 +272,9 @@ log_selector = \ +queue_time_overall \ +deliver_time \ +received_recipients \ + +sender_on_delivery \ + +return_path_on_delivery \ + +incoming_port \ +unknown_in_list \ +smtp_connection \ +smtp_incomplete_transaction \ @@ -299,7 +306,14 @@ GREYLIST_LOCAL_PARTS = ${if match_domain{$domain}{+virtual_domains}\ {${lookup{$local_part}lsearch*{${extract{directory}{VDOMAINDATA}{${value}/grey_users}}}{$local_part}{}}}{}}}\ {${lookup{$local_part}lsearch{/etc/exim4/grey_users}{$local_part}{}}}} : \ ${lookup{$local_part}lsearch{/var/lib/misc/$primary_hostname/mail-greylist}{$local_part}{}} +HAS_DEFAULT_OPTIONS = ${if eq{${lookup{$local_part}dbmnz{/var/lib/misc/$primary_hostname/default-mail-options.db}{$value}{TRUE}}}{TRUE}} <%- if @is_rtmaster -%> +# This subject rewrite is embedded in double-quoted strings. As such, some of +# the items need more escaping than usual, otherwise \N becomes simply "N" and +# the following "\[" a literal "[". +# Note that the lack of space in "Subject:${" is intentional, as the raw Subject +# header will include the leading space, if present. +RT_SUBJECT = Subject:${if and {{first_delivery}{match {${sg {$rh_Subject:}{\\n([ \\t])}{ }}}{\\N(?i)(.*?)\\[?debian rt\\]?[:\\t ]*(.*)\\N}}}{$1$2}{$h_subject:}} RT_QUEUE_MAP = /srv/rt.debian.org/mail/rt_queue_map <%- end -%> @@ -405,27 +419,27 @@ acl_getprofile: accept condition = ${if !eq {$acl_m_rprf}{}} warn domains = +virtual_domains - condition = ${if exists {${extract{directory}{VDOMAINDATA}{${value}/contentinspectionaction.cdb}}}} - condition = ${if eq{${lookup{$local_part}cdb{${extract{directory}{VDOMAINDATA}{${value}/contentinspectionaction.cdb}}}{$value}{}}}{markup}} + condition = ${if exists {${extract{directory}{VDOMAINDATA}{${value}/contentinspectionaction.db}}}} + condition = ${if eq{${lookup{$local_part}dbmnz{${extract{directory}{VDOMAINDATA}{${value}/contentinspectionaction.db}}}{$value}{}}}{markup}} set acl_m_rprf = markup accept condition = ${if !eq {$acl_m_rprf}{}} warn domains = +virtual_domains - condition = ${if exists {${extract{directory}{VDOMAINDATA}{${value}/contentinspectionaction.cdb}}}} - condition = ${if eq{${lookup{$local_part}cdb{${extract{directory}{VDOMAINDATA}{${value}/contentinspectionaction.cdb}}}{$value}{}}}{blackhole}} + condition = ${if exists {${extract{directory}{VDOMAINDATA}{${value}/contentinspectionaction.db}}}} + condition = ${if eq{${lookup{$local_part}dbmnz{${extract{directory}{VDOMAINDATA}{${value}/contentinspectionaction.db}}}{$value}{}}}{blackhole}} set acl_m_rprf = blackhole accept condition = ${if !eq {$acl_m_rprf}{}} warn domains = +local_domains - condition = ${if eq{${lookup{$local_part}cdb{/var/lib/misc/${primary_hostname}/mail-contentinspectionaction.cdb}{$value}{}}}{markup}} + condition = ${if eq{${lookup{$local_part}dbmnz{/var/lib/misc/${primary_hostname}/mail-contentinspectionaction.db}{$value}{}}}{markup}} set acl_m_rprf = markup accept condition = ${if !eq {$acl_m_rprf}{}} warn domains = +local_domains - condition = ${if eq{${lookup{$local_part}cdb{/var/lib/misc/${primary_hostname}/mail-contentinspectionaction.cdb}{$value}{}}}{blackhole}} + condition = ${if eq{${lookup{$local_part}dbmnz{/var/lib/misc/${primary_hostname}/mail-contentinspectionaction.db}{$value}{}}}{blackhole}} set acl_m_rprf = blackhole accept condition = ${if !eq {$acl_m_rprf}{}} @@ -446,14 +460,17 @@ check_helo: # These are in HELO acl so that they are only run once. They increment a counter, # so we don't want it to increment per rcpt to. + # high trust warn dnslists = list.dnswl.org&0.0.0.3 log_message = Hit on list.dnswl.org for $sender_host_address set acl_c_scr = ${eval:$acl_c_scr-30} + # >= medium trust warn dnslists = list.dnswl.org&0.0.0.2 log_message = Hit on list.dnswl.org for $sender_host_address set acl_c_scr = ${eval:$acl_c_scr-20} + # any form of listing warn dnslists = list.dnswl.org log_message = Hit on list.dnswl.org for $sender_host_address set acl_c_scr = ${eval:$acl_c_scr-10} @@ -466,15 +483,18 @@ check_helo: condition = ${if eq{$host_lookup_failed}{1}} set acl_c_scr = ${eval:$acl_c_scr+20} + # HELO looks like a dynamic address (with RDNS match) warn !hosts = +debianhosts condition = ${if eq{$host_lookup_failed}{0}} condition = ${if match{$sender_host_name}{\N(^[^\.]*[0-9]\-+[0-9]|^[^\.]*[0-9]{5,}[^\.]|^([^\.]+\.)?[0-9][^ \.]*\.[^\.]+\..+\.[a-z]|^[^\.]*[0-9]\.[^\.]*[0-9]-[0-9]|^(dyn|cable|dhcp|dialup|ppp|adsl)[^\.]*[0-9])\N}} set acl_c_scr = ${eval:$acl_c_scr+20} + # HELO looks like a dynamic address warn !hosts = +debianhosts condition = ${if match{$sender_helo_name}{\N(^[^\.]*[0-9]\-+[0-9]|^[^\.]*[0-9]{5,}[^\.]|^([^\.]+\.)?[0-9][^ \.]*\.[^\.]+\..+\.[a-z]|^[^\.]*[0-9]\.[^\.]*[0-9]-[0-9]|^(dyn|cable|dhcp|dialup|ppp|adsl)[^\.]*[0-9])\N}} set acl_c_scr = ${eval:$acl_c_scr+20} + # mail from a dynamic IP address range warn !hosts = +debianhosts dnslists = dul.dnsbl.sorbs.net set acl_c_scr = ${eval:$acl_c_scr+15} @@ -581,6 +601,14 @@ check_recipient: message = Different profile, please retry log_message = Only one profile at a time, please + # Set a flag to indicate whether the current recipient + # has explicitly requested greylisting + warn set acl_m_grey_recip = 0 + + warn local_parts = GREYLIST_LOCAL_PARTS + domains = +handled_domains + set acl_m_grey_recip = 1 + # Defer after too many bad RCPT TO's. Legit MTAs will retry later. # This is a rough pass at preventing address harvesting or other mail blasts. @@ -667,11 +695,17 @@ check_recipient: hosts = !+debianhosts message = mail from <$sender_address> not allowed externally - deny condition = ${if match_domain{$sender_address_domain}{+virtual_domains}} + deny sender_domains= +virtual_domains condition = ${if exists {${extract{directory}{VSENDERDOMAINDATA}{${value}/neversenders}}}} condition = ${lookup{$sender_address_local_part}lsearch{${extract{directory}{VSENDERDOMAINDATA}{${value}/neversenders}}}{true}} message = no mail should ever come from <$sender_address> + deny domains = +virtual_domains + senders = : + condition = ${if exists {${extract{directory}{VDOMAINDATA}{${value}/neversenders}}}} + condition = ${lookup{$local_part}lsearch{${extract{directory}{VDOMAINDATA}{${value}/neversenders}}}{true}} + message = <$local_part@$domain> does not send mail; rejecting bogus NDR + warn condition = ${if eq{$acl_m_prf}{localonly}} set acl_m_lrc = ${if eq{$acl_m_lrc}{}{$local_part@$domain}{$acl_m_lrc, $local_part@$domain}} @@ -684,6 +718,12 @@ check_recipient: deny condition = ${if !eq {$acl_m_prf}{PopconMail}} !verify = sender + warn !hosts = +debianhosts + condition = ${if !eq {$acl_m_prf}{PopconMail}} + condition = ${if >{${eval:$acl_c_scr+0}}{0}} + ratelimit = 10 / 60m / per_rcpt / strict / $sender_host_address + log_message = Sender rate $sender_rate / $sender_rate_period (limit: $sender_rate_limit) + defer !hosts = +debianhosts condition = ${if !eq {$acl_m_prf}{PopconMail}} condition = ${if >{${eval:$acl_c_scr+0}}{0}} @@ -748,27 +788,25 @@ check_recipient: <%- end -%> <%- if @is_rtmaster -%> warn condition = ${if eq{$acl_m_prf}{RTMail}} - set acl_m12 = ${if def:acl_m12 {$acl_m12} {${if or{{match{$local_part}{\N[^+]+\+\d+\N}}{match{$local_part}{\N[^+]+\+new\N}}{match{$local_part}{3520}}{match{$local_part}{3645}}} {RTMailRecipientHasSubaddress}}}} - # temporary hack because weasel screwed up and gave people an rt-3520@ address, which doesn't really work normally. and rt-3645 - #set acl_m12 = ${if def:acl_m12 {$acl_m12} {${if or{{match{$local_part}{\N[^+]+\+\d+\N}}{match{$local_part}{\N[^+]+\+new\N}}} {RTMailRecipientHasSubaddress}}}} - + set acl_m12 = ${if def:acl_m12 {$acl_m12} {${if or{{match{$local_part}{\N[^+]+\+\d+\N}}{match{$local_part}{\N[^+]+\+new\N}}} {RTMailRecipientHasSubaddress}}}} <%- end -%> <%- if has_variable?("greylistd") && @greylistd -%> defer message = $sender_host_address is not yet authorized to deliver mail from <$sender_address> to <$local_part@$domain>. log_message = greylisted. - local_parts = ${if match_domain{$domain}{+virtual_domains}\ - {${if exists {${extract{directory}{VDOMAINDATA}{${value}/grey_users}}}\ - {${lookup{$local_part}lsearch*{${extract{directory}{VDOMAINDATA}{${value}/grey_users}}}{$local_part}{}}}{}}}\ - {${lookup{$local_part}lsearch{/etc/exim4/grey_users}{$local_part}{}} : \ - ${lookup{$local_part}lsearch{/var/lib/misc/$primary_hostname/mail-greylist}{$local_part}{}}}} + condition = ${if or { \ + {eq{$acl_m_grey_recip}{1}} \ + {bool_lax{HAS_DEFAULT_OPTIONS}} \ + } \ + } !senders = : !hosts = : +debianhosts : WHITELIST : \ ${if exists {/etc/greylistd/whitelist-hosts}\ {/etc/greylistd/whitelist-hosts}{}} : \ ${if exists {/var/lib/greylistd/whitelist-hosts}\ {/var/lib/greylistd/whitelist-hosts}{}} + !dnslists = list.dnswl.org&0.0.0.3 condition = ${if !eq {$acl_m_prf}{PopconMail}} !authenticated = * domains = +handled_domains @@ -785,6 +823,7 @@ check_recipient: warn !senders = : !hosts = : +debianhosts : WHITELIST + !dnslists = list.dnswl.org&0.0.0.3 condition = ${if !eq {$acl_m_prf}{PopconMail}} condition = ${if ! def:acl_m_grey} set acl_m_grey = $pid.$tod_epoch.$sender_host_port @@ -793,20 +832,21 @@ check_recipient: defer !senders = : !hosts = : +debianhosts : WHITELIST + !dnslists = list.dnswl.org&0.0.0.3 condition = ${if !eq {$acl_m_prf}{PopconMail}} !authenticated = * domains = +handled_domains - local_parts = GREYLIST_LOCAL_PARTS + condition = ${if or { \ + {eq{$acl_m_grey_recip}{1}} \ + {bool_lax{HAS_DEFAULT_OPTIONS}} \ + } \ + } set acl_m_pgr = request=smtpd_access_policy\n\ protocol_state=RCPT\n\ protocol_name=${uc:$received_protocol}\n\ instance=${acl_m_grey}\n\ helo_name=${sender_helo_name}\n\ -<%- if scope.call_function('versioncmp', [@lsbmajdistrelease, '8']) <= 0 -%> - client_address=${substr_-3:${mask:$sender_host_address/24}}\n\ -<%- else -%> client_address=${sender_host_address}\n\ -<%- end -%> client_name=${sender_host_name}\n\ sender=${sender_address}\n\ recipient=$local_part@$domain\n\n @@ -814,7 +854,7 @@ check_recipient: ${readsocket{/var/run/postgrey/socket}{$acl_m_pgr}\ {5s}{}{action=DUNNO}}\ }{action=}{}} - message = ${sg{$acl_m_pgr}{^\\w+\\s*}{}} + message = ${sg{$acl_m_pgr}{\N^\w+\s*\N}{}} log_message = greylisted. condition = ${if eq{${uc:${substr{0}{5}{$acl_m_pgr}}}}{DEFER}} @@ -822,12 +862,17 @@ check_recipient: warn !senders = : !hosts = : +debianhosts : WHITELIST + !dnslists = list.dnswl.org&0.0.0.3 condition = ${if !eq {$acl_m_prf}{PopconMail}} !authenticated = * domains = +handled_domains - local_parts = GREYLIST_LOCAL_PARTS + condition = ${if or { \ + {eq{$acl_m_grey_recip}{1}} \ + {bool_lax{HAS_DEFAULT_OPTIONS}} \ + } \ + } condition = ${if eq{${uc:${substr_0_7:$acl_m_pgr}}}{PREPEND}} - message = ${sg{$acl_m_pgr}{^\\w+\\s*}{}} + message = ${sg{$acl_m_pgr}{\N^\w+\s*\N}{}} <%- end -%> deny hosts = ${if exists{/etc/exim4/host_blacklist}{/etc/exim4/host_blacklist}{}} @@ -851,6 +896,17 @@ check_recipient: domains = +handled_domains !hosts = +debianhosts : WHITELIST + deny message = host $sender_host_address is listed in $dnslist_domain; see $dnslist_text + dnslists = noserver.dnsbl.sorbs.net + domains = +handled_domains + !hosts = +debianhosts : WHITELIST + + deny message = host $sender_host_address is listed in $dnslist_domain; see $dnslist_text + condition = ${if bool_lax{HAS_DEFAULT_OPTIONS}} + dnslists = relays.dnsbl.sorbs.net : xbl.spamhaus.org + domains = +handled_domains + !hosts = +debianhosts : WHITELIST + <%- end -%> deny message = domain $sender_address_domain is listed in $dnslist_domain; see $dnslist_text dnslists = ${if match_domain{$domain}{+virtual_domains}\ @@ -861,6 +917,17 @@ check_recipient: domains = +handled_domains !hosts = +debianhosts : WHITELIST + deny message = domain $sender_address_domain is listed in $dnslist_domain; see $dnslist_text + dnslists = nomail.rhsbl.sorbs.net/$sender_address_domain + domains = +handled_domains + !hosts = +debianhosts : WHITELIST + + deny message = domain $sender_address_domain is listed in $dnslist_domain; see $dnslist_text + condition = ${if bool_lax{HAS_DEFAULT_OPTIONS}} + dnslists = dbl.spamhaus.org/$sender_address_domain + domains = +handled_domains + !hosts = +debianhosts : WHITELIST + <%- unless @use_smarthost -%> deny domains = +handled_domains local_parts = ${if match_domain{$domain}{+virtual_domains}\ @@ -915,6 +982,14 @@ acl_check_mime: condition = ${if !eq{$acl_m_srb}{false}} message = X-Surbl-Hit: $primary_hostname: $acl_m_srb + # Dump MIME parts to disk. "default" creates sequentially-named files + # in /scan// which should then be + # automagically unlinked after processing. + warn decode = default + + # Log some information about attachments for debugging + warn log_message = MIME part [$mime_part_count] -> [${extract{-1}{.}{${lc:$mime_filename}}}] [$mime_content_type] + accept <%- end -%> @@ -982,24 +1057,15 @@ check_message: <%- if has_variable?("clamd") && @clamd -%> discard condition = ${if eq {$acl_m_prf}{blackhole}} - <%- if scope.call_function('versioncmp', [@lsbmajdistrelease, '8']) <= 0 -%> - demime = * - <%- end -%> malware = */defer_ok log_message = discarded malware message for $recipients deny condition = ${if !eq {$acl_m_prf}{markup}} condition = ${if !eq {$acl_m_prf}{PopconMail}} - <%- if scope.call_function('versioncmp', [@lsbmajdistrelease, '8']) <= 0 -%> - demime = * - <%- end -%> malware = */defer_ok message = malware detected: $malware_name: message rejected warn condition = ${if eq {$acl_m_prf}{markup}} - <%- if scope.call_function('versioncmp', [@lsbmajdistrelease, '8']) <= 0 -%> - demime = * - <%- end -%> malware = */defer_ok message = X-malware detected: $malware_name @@ -1056,8 +1122,8 @@ check_message: begin rewrite \N^buildd_(.*)@fasolo\.debian\.org$\N buildd_$1@buildd.debian.org T -*@debian.org ${lookup{$1}cdb{/var/lib/misc/${primary_hostname}/mail-forward.cdb}{$value}fail} T -*@people.debian.org ${lookup{$1}cdb{/var/lib/misc/${primary_hostname}/mail-forward.cdb}{$value}fail} T +*@debian.org ${lookup{$1}dbmnz{/var/lib/misc/${primary_hostname}/mail-forward.db}{$value}fail} T +*@people.debian.org ${lookup{$1}dbmnz{/var/lib/misc/${primary_hostname}/mail-forward.db}{$value}fail} T #*@${primary_hostname} "${if exists{/etc/exim4/email-addresses}{${lookup{$1}lsearch{/etc/exim4/email-addresses}{$value}fail}}fail}" fFs @@ -1133,7 +1199,11 @@ dnslookup: {match_domain{$item}{+single_domain_mx}}\ {remote_smtp_single_domain}{remote_smtp}\ } - ignore_target_hosts = +reservedaddrs + ignore_target_hosts = +reservedaddrs : \ + ${if forany{${lookup dnsdb{>: mxh=$domain}}}\ + {match_domain{$item}{+ipv4_only_domain_mx}}\ + {::::/0}{}\ + } no_more postmasterish: @@ -1308,9 +1378,9 @@ ldap_aliases: driver = redirect allow_defer allow_fail - data = ${if exists{/var/lib/misc/$primary_hostname/user-forward.cdb}\ - {${lookup{$local_part}cdb\ - {/var/lib/misc/$primary_hostname/user-forward.cdb}}}} + data = ${if exists{/var/lib/misc/$primary_hostname/user-forward.db}\ + {${lookup{$local_part}dbmnz\ + {/var/lib/misc/$primary_hostname/user-forward.db}}}} domains = +local_domains file_transport = address_file local_part_suffix = -* @@ -1367,7 +1437,7 @@ rt_force_new_verbose: pipe_transport = rt_pipe data = "|/usr/bin/rt-mailgate --queue '${lookup{${sg{$local_part}{-comment}{}}}lsearch{RT_QUEUE_MAP}}' --url https://rt.debian.org/ --ca-file /etc/ssl/ca-debian/ca-certificates.crt --action ${if match{$local_part}{.*-comment.*}{comment}{correspond}}" headers_remove = Subject - headers_add = "Delivered-To: ${local_part}${local_part_suffix}@${domain}\nSubject: ${if and {{first_delivery}{match {$h_subject:}{(?is)(.*?)\\\\[?debian rt\\\\]?[:\\s]*(.*)}}} {$1$2}{$h_subject:}}" + headers_add = "Delivered-To: ${local_part}${local_part_suffix}@${domain}\nRT_SUBJECT" # FIXME: figure out how to generalize this approach so that all of the following would work # - rt+NNNN@rt.debian.org : attach correspondence to ticket (verbose) @@ -1384,7 +1454,7 @@ rt_force_new_quiesce: pipe_transport = rt_pipe data = "|/usr/bin/rt-mailgate --queue '${lookup{${sg{$local_part}{-comment}{}}}lsearch{RT_QUEUE_MAP}}' --url https://rt.debian.org/ --ca-file /etc/ssl/ca-debian/ca-certificates.crt --action ${if match{$local_part}{.*-comment.*}{comment}{correspond}}" headers_remove = Subject - headers_add = "Delivered-To: ${local_part}${local_part_suffix}@${domain}\nX-RT-Mode: quiesce\nSubject: ${if and {{first_delivery}{match {$h_subject:}{(?is)(.*?)\\\\[?debian rt\\\\]?[:\\s]*(.*)}}} {$1$2}{$h_subject:}}" + headers_add = "Delivered-To: ${local_part}${local_part_suffix}@${domain}\nX-RT-Mode: quiesce\nRT_SUBJECT" rt_otherwise: debug_print = "R: rt for $local_part@$domain" @@ -1397,7 +1467,7 @@ rt_otherwise: pipe_transport = rt_pipe data = "|/usr/bin/rt-mailgate --queue '${lookup{${sg{$local_part}{-(comment|done)}{}}}lsearch{RT_QUEUE_MAP}}' --url https://rt.debian.org/ --ca-file /etc/ssl/ca-debian/ca-certificates.crt --extension ticket --action ${if match{$local_part}{.*-comment.*}{comment}{${if match{$local_part}{.*-done.*}{correspond-resolve}{correspond}}}}" headers_remove = Subject - headers_add = "Delivered-To: ${local_part}${local_part_suffix}@${domain}\nSubject: ${if and {{first_delivery}{match {$h_subject:}{(?i)(.*?)\\\\[?debian rt\\\\]?[:\\s]*(.*)}}} {$1$2}{$h_subject:}}" + headers_add = "Delivered-To: ${local_part}${local_part_suffix}@${domain}\nRT_SUBJECT" <%- end -%> # Exim fails the router if it can't change to the user/group for delivery @@ -1467,17 +1537,17 @@ virt_users: group = ${extract{group}{VDOMAINDATA}} # Manually construct the forwarding address, preserving the # local_part_suffix if the remote host is master. - data = ${if and {{exists{${extract{directory}{VDOMAINDATA}{${value}/mail-forward.cdb}}}}\ - {! eq {${lookup{$local_part}cdb\ - {${extract{directory}{VDOMAINDATA}{${value}/mail-forward.cdb}}}}}\ + data = ${if and {{exists{${extract{directory}{VDOMAINDATA}{${value}/mail-forward.db}}}}\ + {! eq {${lookup{$local_part}dbmnz\ + {${extract{directory}{VDOMAINDATA}{${value}/mail-forward.db}}}}}\ {}}}\ - {${local_part:${lookup{$local_part}cdb\ - {${extract{directory}{VDOMAINDATA}{${value}/mail-forward.cdb}}}}}\ - ${if eq {${domain:${lookup{$local_part}cdb\ - {${extract{directory}{VDOMAINDATA}{${value}/mail-forward.cdb}}}}}}{master.debian.org}{$local_part_suffix} {}}\ + {${local_part:${lookup{$local_part}dbmnz\ + {${extract{directory}{VDOMAINDATA}{${value}/mail-forward.db}}}}}\ + ${if eq {${domain:${lookup{$local_part}dbmnz\ + {${extract{directory}{VDOMAINDATA}{${value}/mail-forward.db}}}}}}{master.debian.org}{$local_part_suffix} {}}\ @\ - ${domain:${lookup{$local_part}cdb\ - {${extract{directory}{VDOMAINDATA}{${value}/mail-forward.cdb}}}}}}} + ${domain:${lookup{$local_part}dbmnz\ + {${extract{directory}{VDOMAINDATA}{${value}/mail-forward.db}}}}}}} domains = +virtual_domains file_transport = address_file headers_add = "Delivered-To: ${local_part}${local_part_suffix}@${domain}" @@ -1671,21 +1741,37 @@ rt_pipe: # RETRY CONFIGURATION # ###################################################################### -# This single retry rule applies to all domains and all errors. It specifies -# retries every 15 minutes for 2 hours, then increasing retry intervals, -# starting at 2 hours and increasing each time by a factor of 1.5, up to 16 -# hours, then retries every 8 hours until 4 days have passed since the first -# failed delivery. - # Domain Error Retries # ------ ----- ------- - begin retry +## Note that retry rules specify when an address / host / mail should +## become eligible for retrying. They do not specify when the retry +## attempt will actually occur, as this is dependent on queue run +## frequency and timing. + +# For mail to debian.org addresses, this rule starts with +# retries every 10 minutes for 2 hours, then increasing retry intervals, +# starting at 2 hours and increasing each time by a factor of 1.5, up to 16 +# hours, then retries every 8 hours until 14 days have passed since the first +# failed delivery. debian.org * F,2h,10m; G,16h,2h,1.5; F,14d,8h + +# Bounces should get retried every 10 minutes for up to 2 hours * * senders=: F,2h,10m + +# Temporary errors at RCPT TO get retried at 5 minute intervals for +# 2 hours, then 10 minute intervals for 4 hours, and finally at 15 +# minute intervals for 4 days. This assumes that the cause of the +# error will get resolved quickly in most cases. * rcpt_4xx F,2h,5m; F,4h,10m; F,4d,15m + +# For all remaining mails, addresses and hosts, this rule starts with +# retries every 15 minutes for 2 hours, then increasing retry intervals, +# starting at 2 hours and increasing each time by a factor of 1.5, up to 16 +# hours, then retries every 8 hours until 4 days have passed since the first +# failed delivery. * * F,2h,15m; G,16h,2h,1.5; F,4d,8h # End of Exim 4 configuration