diff --git a/postfix/HISTORY b/postfix/HISTORY index 7d986d0da..5fbfbff68 100644 --- a/postfix/HISTORY +++ b/postfix/HISTORY @@ -19611,15 +19611,26 @@ Apologies for any names omitted. 20140316 Feature: preliminary support to change arbitrary hard - delivery errors into soft errors and vice versa, originally - introduced for sites that want to hard-bounce mail when a - remote SMTP server does not announce TLS support. New main.cf + delivery errors into soft errors and vice versa, or to + replace the descriptive text of non-delivery notifications. + This was originally introduced for sites that want to bounce + mail when no remote SMTP server announces TLS support. New parameters: {default,smtp,pipe,virtual}_bounce_defer_filter. - Support for the local(8) delivery agent is awaiting additional - code to emulate defer_one() support, and support for qmgr(8) - is awaiting further analysis. Files: proto/postconf.proto, - mantools/postlink, global/bounce.[hc], bounce/defer.[hc], - global/ndr_filter.[hc], global/mail_params.[hc], + Files: proto/postconf.proto, mantools/postlink, global/bounce.[hc], + bounce/defer.[hc], global/ndr_filter.[hc], global/mail_params.[hc], master/event_server.c, master/multi_server.c, master/single_server.c, master/trigger_server.c, smtp/smtp.c, pipe/pipe.c, virtual/virtual.c. + +20140317 + + Feature: local_bounce_defer_filter support. Files: + global/bounce.[hc], global/defer.[hc], local/command.c, + local/file.c, local/bounce_workaround.c, local/local.c, + global/mail_params.h. + +20140318 + + Refinement: don't throttle an SMTP destination when the new + smtp_bounce_defer_filter feature turns a soft bounce into + a hard bounce. File: smtp/smtp_trouble.c. diff --git a/postfix/RELEASE_NOTES b/postfix/RELEASE_NOTES index 6a3305bd1..2d4cfb9a4 100644 --- a/postfix/RELEASE_NOTES +++ b/postfix/RELEASE_NOTES @@ -16,17 +16,17 @@ specifies the release date of a stable release or snapshot release. If you upgrade from Postfix 2.10 or earlier, read RELEASE_NOTES-2.11 before proceeding. -Major changes with snapshot 20140316 +Major changes with snapshot 20140318 ==================================== -Preliminary support to change arbitrary hard delivery errors into -soft errors and vice versa, originally implemented for sites that -want to bounce mail when a remote SMTP server does not support -STARTTLS. +Support to change arbitrary hard delivery errors into soft errors +and vice versa, or to replace the descriptive text in non-delivery +notifications. This was originally implemented for sites that want +to bounce mail when no remote SMTP server supports STARTTLS. This feature is implemented as a filter that replaces the three-number enhanced status code and descriptive text in Postfix delivery agent -bounce/defer messages. +bounce/defer messages. Note: this will not override "soft_bounce=yes". The following example turns specific soft TLS errors into hard errors, by overriding the first number in the enhanced status code. @@ -38,15 +38,20 @@ errors, by overriding the first number in the enhanced status code. /^4(\.\d+\.\d+ TLS is required, but host \S+ refused to start TLS: .+)/ 5$1 /^4(\.\d+\.\d+ TLS is required, but was not offered by host .+)/ 5$1 -Support is currently limited to the lmtp(8), pipe(8), smtp(8) and -virtual(8) delivery agents. The new main.cf parameters and default -values are: +This feature is supported in the lmtp(8), local(8), pipe(8), smtp(8) +and virtual(8) delivery agents. That is, all delivery agents that +actually deliver mail. + +This feature will not be supported in the error(8) or retry(8) dummy +delivery agents, because lots of things would break. + +The new main.cf parameters and default values are: default_bounce_defer_filter = lmtp_bounce_defer_filter = $default_bounce_defer_filter + local_bounce_defer_filter = $default_bounce_defer_filter pipe_bounce_defer_filter = $default_bounce_defer_filter smtp_bounce_defer_filter = $default_bounce_defer_filter virtual_bounce_defer_filter = $default_bounce_defer_filter -See the postconf(5) manpage for more details. Support for local(8) -and qmgr(8) will be added as time is available. +See the postconf(5) manpage for more details. diff --git a/postfix/html/lmtp.8.html b/postfix/html/lmtp.8.html index a56176bb1..bbbcc1a26 100644 --- a/postfix/html/lmtp.8.html +++ b/postfix/html/lmtp.8.html @@ -152,10 +152,6 @@ SMTP(8) SMTP(8) smtp_never_send_ehlo (no) Never send EHLO at the start of an SMTP session. - smtp_bounce_defer_filter ($default_bounce_defer_filter) - Optional filter to change arbitrary hard delivery errors into - soft errors and vice versa. - smtp_defer_if_no_mx_address_found (no) Defer mail delivery when no MX record resolves to an IP address. @@ -164,8 +160,8 @@ SMTP(8) SMTP(8) will send via SMTP. smtp_pix_workaround_delay_time (10s) - How long the Postfix SMTP client pauses before sending - ".<CR><LF>" in order to work around the PIX firewall + How long the Postfix SMTP client pauses before sending + ".<CR><LF>" in order to work around the PIX firewall "<CR><LF>.<CR><LF>" bug. smtp_pix_workaround_threshold_time (500s) @@ -174,19 +170,19 @@ SMTP(8) SMTP(8) delivery through firewalls with "smtp fixup" mode turned on. smtp_pix_workarounds (disable_esmtp, delay_dotcrlf) - A list that specifies zero or more workarounds for CISCO PIX + A list that specifies zero or more workarounds for CISCO PIX firewall bugs. smtp_pix_workaround_maps (empty) - Lookup tables, indexed by the remote SMTP server address, with + Lookup tables, indexed by the remote SMTP server address, with per-destination workarounds for CISCO PIX firewall bugs. smtp_quote_rfc821_envelope (yes) - Quote addresses in Postfix SMTP client MAIL FROM and RCPT TO + Quote addresses in Postfix SMTP client MAIL FROM and RCPT TO commands as required by RFC 5321. smtp_reply_filter (empty) - A mechanism to transform replies from remote SMTP servers one + A mechanism to transform replies from remote SMTP servers one line at a time. smtp_skip_5xx_greeting (yes) @@ -198,68 +194,68 @@ SMTP(8) SMTP(8) Available in Postfix version 2.0 and earlier: smtp_skip_4xx_greeting (yes) - Skip SMTP servers that greet with a 4XX status code (go away, + Skip SMTP servers that greet with a 4XX status code (go away, try again later). Available in Postfix version 2.2 and later: smtp_discard_ehlo_keyword_address_maps (empty) - Lookup tables, indexed by the remote SMTP server address, with - case insensitive lists of EHLO keywords (pipelining, starttls, + Lookup tables, indexed by the remote SMTP server address, with + case insensitive lists of EHLO keywords (pipelining, starttls, auth, etc.) that the Postfix SMTP client will ignore in the EHLO response from a remote SMTP server. smtp_discard_ehlo_keywords (empty) - A case insensitive list of EHLO keywords (pipelining, starttls, + A case insensitive list of EHLO keywords (pipelining, starttls, auth, etc.) that the Postfix SMTP client will ignore in the EHLO response from a remote SMTP server. smtp_generic_maps (empty) - Optional lookup tables that perform address rewriting in the - Postfix SMTP client, typically to transform a locally valid - address into a globally valid address when sending mail across + Optional lookup tables that perform address rewriting in the + Postfix SMTP client, typically to transform a locally valid + address into a globally valid address when sending mail across the Internet. Available in Postfix version 2.2.9 and later: smtp_cname_overrides_servername (version dependent) - When the remote SMTP servername is a DNS CNAME, replace the - servername with the result from CNAME expansion for the purpose - of logging, SASL password lookup, TLS policy decisions, or TLS + When the remote SMTP servername is a DNS CNAME, replace the + servername with the result from CNAME expansion for the purpose + of logging, SASL password lookup, TLS policy decisions, or TLS certificate verification. Available in Postfix version 2.3 and later: lmtp_discard_lhlo_keyword_address_maps (empty) - Lookup tables, indexed by the remote LMTP server address, with - case insensitive lists of LHLO keywords (pipelining, starttls, + Lookup tables, indexed by the remote LMTP server address, with + case insensitive lists of LHLO keywords (pipelining, starttls, auth, etc.) that the Postfix LMTP client will ignore in the LHLO response from a remote LMTP server. lmtp_discard_lhlo_keywords (empty) - A case insensitive list of LHLO keywords (pipelining, starttls, + A case insensitive list of LHLO keywords (pipelining, starttls, auth, etc.) that the Postfix LMTP client will ignore in the LHLO response from a remote LMTP server. Available in Postfix version 2.4.4 and later: send_cyrus_sasl_authzid (no) - When authenticating to a remote SMTP or LMTP server with the - default setting "no", send no SASL authoriZation ID (authzid); - send only the SASL authentiCation ID (authcid) plus the auth- + When authenticating to a remote SMTP or LMTP server with the + default setting "no", send no SASL authoriZation ID (authzid); + send only the SASL authentiCation ID (authcid) plus the auth- cid's password. Available in Postfix version 2.5 and later: smtp_header_checks (empty) - Restricted header_checks(5) tables for the Postfix SMTP client. + Restricted header_checks(5) tables for the Postfix SMTP client. smtp_mime_header_checks (empty) - Restricted mime_header_checks(5) tables for the Postfix SMTP + Restricted mime_header_checks(5) tables for the Postfix SMTP client. smtp_nested_header_checks (empty) - Restricted nested_header_checks(5) tables for the Postfix SMTP + Restricted nested_header_checks(5) tables for the Postfix SMTP client. smtp_body_checks (empty) @@ -268,7 +264,7 @@ SMTP(8) SMTP(8) Available in Postfix version 2.6 and later: tcp_windowsize (0) - An optional workaround for routers that break TCP window scal- + An optional workaround for routers that break TCP window scal- ing. Available in Postfix version 2.8 and later: @@ -279,14 +275,14 @@ SMTP(8) SMTP(8) Available in Postfix version 2.9 and later: smtp_per_record_deadline (no) - Change the behavior of the smtp_*_timeout time limits, from a - time limit per read or write system call, to a time limit to - send or receive a complete record (an SMTP command line, SMTP - response line, SMTP message content line, or TLS protocol mes- + Change the behavior of the smtp_*_timeout time limits, from a + time limit per read or write system call, to a time limit to + send or receive a complete record (an SMTP command line, SMTP + response line, SMTP message content line, or TLS protocol mes- sage). smtp_send_dummy_mail_auth (no) - Whether or not to append the "AUTH=<>" option to the MAIL FROM + Whether or not to append the "AUTH=<>" option to the MAIL FROM command in SASL-authenticated SMTP sessions. Available in Postfix version 2.11 and later: @@ -294,6 +290,12 @@ SMTP(8) SMTP(8) smtp_dns_support_level (empty) Level of DNS support in the Postfix SMTP client. + Available in Postfix version 2.12 and later: + + smtp_bounce_defer_filter ($default_bounce_defer_filter) + Optional filter to change arbitrary hard delivery errors into + soft errors and vice versa in the smtp(8) delivery agent. + MIME PROCESSING CONTROLS Available in Postfix version 2.0 and later: diff --git a/postfix/html/local.8.html b/postfix/html/local.8.html index b36306d4c..8d450937f 100644 --- a/postfix/html/local.8.html +++ b/postfix/html/local.8.html @@ -358,39 +358,45 @@ LOCAL(8) LOCAL(8) attribute, when delivering mail to a child alias that does not have its own owner alias. + Available in Postfix version 2.12 and later: + + local_bounce_defer_filter ($default_bounce_defer_filter) + Optional filter to change arbitrary hard delivery errors into + soft errors and vice versa in the local(8) delivery agent. + DELIVERY METHOD CONTROLS - The precedence of local(8) delivery methods from high to low is: + The precedence of local(8) delivery methods from high to low is: aliases, .forward files, mailbox_transport_maps, mailbox_transport, - mailbox_command_maps, mailbox_command, home_mailbox, mail_spool_direc- + mailbox_command_maps, mailbox_command, home_mailbox, mail_spool_direc- tory, fallback_transport_maps, fallback_transport, and luser_relay. alias_maps (see 'postconf -d' output) The alias databases that are used for local(8) delivery. forward_path (see 'postconf -d' output) - The local(8) delivery agent search list for finding a .forward + The local(8) delivery agent search list for finding a .forward file with user-specified delivery methods. mailbox_transport_maps (empty) Optional lookup tables with per-recipient message delivery - transports to use for local(8) mailbox delivery, whether or not + transports to use for local(8) mailbox delivery, whether or not the recipients are found in the UNIX passwd database. mailbox_transport (empty) - Optional message delivery transport that the local(8) delivery - agent should use for mailbox delivery to all local recipients, + Optional message delivery transport that the local(8) delivery + agent should use for mailbox delivery to all local recipients, whether or not they are found in the UNIX passwd database. mailbox_command_maps (empty) - Optional lookup tables with per-recipient external commands to + Optional lookup tables with per-recipient external commands to use for local(8) mailbox delivery. mailbox_command (empty) - Optional external command that the local(8) delivery agent + Optional external command that the local(8) delivery agent should use for mailbox delivery. home_mailbox (empty) - Optional pathname of a mailbox file relative to a local(8) + Optional pathname of a mailbox file relative to a local(8) user's home directory. mail_spool_directory (see 'postconf -d' output) @@ -402,17 +408,17 @@ LOCAL(8) LOCAL(8) not find in the aliases(5) or UNIX password database. fallback_transport (empty) - Optional message delivery transport that the local(8) delivery - agent should use for names that are not found in the aliases(5) + Optional message delivery transport that the local(8) delivery + agent should use for names that are not found in the aliases(5) or UNIX password database. luser_relay (empty) - Optional catch-all destination for unknown local(8) recipients. + Optional catch-all destination for unknown local(8) recipients. Available in Postfix version 2.2 and later: command_execution_directory (empty) - The local(8) delivery agent working directory for delivery to + The local(8) delivery agent working directory for delivery to external command. MAILBOX LOCKING CONTROLS @@ -421,15 +427,15 @@ LOCAL(8) LOCAL(8) mailbox file or bounce(8) logfile. deliver_lock_delay (1s) - The time between attempts to acquire an exclusive lock on a + The time between attempts to acquire an exclusive lock on a mailbox file or bounce(8) logfile. stale_lock_time (500s) - The time after which a stale exclusive mailbox lockfile is + The time after which a stale exclusive mailbox lockfile is removed. mailbox_delivery_lock (see 'postconf -d' output) - How to lock a UNIX-style local(8) mailbox before attempting + How to lock a UNIX-style local(8) mailbox before attempting delivery. RESOURCE AND RATE CONTROLS @@ -442,18 +448,18 @@ LOCAL(8) LOCAL(8) showq(8) queue displays. local_destination_concurrency_limit (2) - The maximal number of parallel deliveries via the local mail - delivery transport to the same recipient (when "local_destina- - tion_recipient_limit = 1") or the maximal number of parallel + The maximal number of parallel deliveries via the local mail + delivery transport to the same recipient (when "local_destina- + tion_recipient_limit = 1") or the maximal number of parallel deliveries to the same local domain (when "local_destina- tion_recipient_limit > 1"). local_destination_recipient_limit (1) - The maximal number of recipients per message delivery via the + The maximal number of recipients per message delivery via the local mail delivery transport. mailbox_size_limit (51200000) - The maximal size of any local(8) individual mailbox or maildir + The maximal size of any local(8) individual mailbox or maildir file, or zero (no limit). SECURITY CONTROLS @@ -464,49 +470,49 @@ LOCAL(8) LOCAL(8) Restrict local(8) mail delivery to external files. command_expansion_filter (see 'postconf -d' output) - Restrict the characters that the local(8) delivery agent allows - in $name expansions of $mailbox_command and $command_execu- + Restrict the characters that the local(8) delivery agent allows + in $name expansions of $mailbox_command and $command_execu- tion_directory. default_privs (nobody) - The default rights used by the local(8) delivery agent for + The default rights used by the local(8) delivery agent for delivery to external file or command. forward_expansion_filter (see 'postconf -d' output) - Restrict the characters that the local(8) delivery agent allows + Restrict the characters that the local(8) delivery agent allows in $name expansions of $forward_path. Available in Postfix version 2.2 and later: execution_directory_expansion_filter (see 'postconf -d' output) - Restrict the characters that the local(8) delivery agent allows + Restrict the characters that the local(8) delivery agent allows in $name expansions of $command_execution_directory. Available in Postfix version 2.5.3 and later: strict_mailbox_ownership (yes) - Defer delivery when a mailbox file is not owned by its recipi- + Defer delivery when a mailbox file is not owned by its recipi- ent. MISCELLANEOUS CONTROLS config_directory (see 'postconf -d' output) - The default location of the Postfix main.cf and master.cf con- + The default location of the Postfix main.cf and master.cf con- figuration files. daemon_timeout (18000s) - How much time a Postfix daemon process may take to handle a + How much time a Postfix daemon process may take to handle a request before it is terminated by a built-in watchdog timer. delay_logging_resolution_limit (2) - The maximal number of digits after the decimal point when log- + The maximal number of digits after the decimal point when log- ging sub-second delay values. export_environment (see 'postconf -d' output) - The list of environment variables that a Postfix process will + The list of environment variables that a Postfix process will export to non-Postfix processes. ipc_timeout (3600s) - The time limit for sending or receiving information over an + The time limit for sending or receiving information over an internal communication channel. local_command_shell (empty) @@ -514,7 +520,7 @@ LOCAL(8) LOCAL(8) mand. max_idle (100s) - The maximum amount of time that an idle Postfix daemon process + The maximum amount of time that an idle Postfix daemon process waits for an incoming connection before terminating voluntarily. max_use (100) @@ -522,8 +528,8 @@ LOCAL(8) LOCAL(8) process will service before terminating voluntarily. prepend_delivered_header (command, file, forward) - The message delivery contexts where the Postfix local(8) deliv- - ery agent prepends a Delivered-To: message header with the + The message delivery contexts where the Postfix local(8) deliv- + ery agent prepends a Delivered-To: message header with the address that the mail was delivered to. process_id (read-only) @@ -533,15 +539,15 @@ LOCAL(8) LOCAL(8) The process name of a Postfix command or daemon process. propagate_unmatched_extensions (canonical, virtual) - What address lookup tables copy an address extension from the + What address lookup tables copy an address extension from the lookup key to the lookup result. queue_directory (see 'postconf -d' output) The location of the Postfix top-level queue directory. recipient_delimiter (empty) - The set of characters that can separate a user name from its - extension (example: user+foo), or a .forward file name from its + The set of characters that can separate a user name from its + extension (example: user+foo), or a .forward file name from its extension (example: .forward+foo). require_home_directory (no) @@ -552,8 +558,8 @@ LOCAL(8) LOCAL(8) The syslog facility of Postfix logging. syslog_name (see 'postconf -d' output) - The mail system name that is prepended to the process name in - syslog records, so that "smtpd" becomes, for example, "post- + The mail system name that is prepended to the process name in + syslog records, so that "smtpd" becomes, for example, "post- fix/smtpd". FILES @@ -576,10 +582,10 @@ LOCAL(8) LOCAL(8) The Secure Mailer license must be distributed with this software. HISTORY - The Delivered-To: message header appears in the qmail system by Daniel + The Delivered-To: message header appears in the qmail system by Daniel Bernstein. - The maildir structure appears in the qmail system by Daniel Bernstein. + The maildir structure appears in the qmail system by Daniel Bernstein. AUTHOR(S) Wietse Venema diff --git a/postfix/html/pipe.8.html b/postfix/html/pipe.8.html index d3db13d00..1ecbcaac1 100644 --- a/postfix/html/pipe.8.html +++ b/postfix/html/pipe.8.html @@ -425,10 +425,6 @@ PIPE(8) PIPE(8) The maximal number of incoming connections that a Postfix daemon process will service before terminating voluntarily. - pipe_bounce_defer_filter ($default_bounce_defer_filter) - Optional filter to change arbitrary hard delivery errors into - soft errors and vice versa. - process_id (read-only) The process ID of a Postfix command or daemon process. @@ -439,18 +435,24 @@ PIPE(8) PIPE(8) The location of the Postfix top-level queue directory. recipient_delimiter (empty) - The set of characters that can separate a user name from its - extension (example: user+foo), or a .forward file name from its + The set of characters that can separate a user name from its + extension (example: user+foo), or a .forward file name from its extension (example: .forward+foo). syslog_facility (mail) The syslog facility of Postfix logging. syslog_name (see 'postconf -d' output) - The mail system name that is prepended to the process name in - syslog records, so that "smtpd" becomes, for example, "post- + The mail system name that is prepended to the process name in + syslog records, so that "smtpd" becomes, for example, "post- fix/smtpd". + Available in Postfix version 2.12 and later: + + pipe_bounce_defer_filter ($default_bounce_defer_filter) + Optional filter to change arbitrary hard delivery errors into + soft errors and vice versa in the pipe(8) delivery agent. + SEE ALSO qmgr(8), queue manager bounce(8), delivery status reports diff --git a/postfix/html/postconf.5.html b/postfix/html/postconf.5.html index a4cf45faa..f6ddb475f 100644 --- a/postfix/html/postconf.5.html +++ b/postfix/html/postconf.5.html @@ -5127,6 +5127,18 @@ This feature is available in Postfix 2.1 and later.

+ + +
local_bounce_defer_filter +(default: $default_bounce_defer_filter)
+ +

Optional filter to change arbitrary hard delivery errors into +soft errors and vice versa in the local(8) delivery agent. See +default_bounce_defer_filter for details.

+ +

This feature is available in Postfix 2.12 and later.

+ +
local_command_shell @@ -7005,8 +7017,8 @@ This feature is available in Postfix 2.0 and later. (default: $default_bounce_defer_filter)

Optional filter to change arbitrary hard delivery errors into -soft errors and vice versa. See default_bounce_defer_filter for -details.

+soft errors and vice versa in the pipe(8) delivery agent. See +default_bounce_defer_filter for details.

This feature is available in Postfix 2.12 and later.

@@ -9582,8 +9594,8 @@ that change the delivery time or destination are not available. (default: $default_bounce_defer_filter)

Optional filter to change arbitrary hard delivery errors into -soft errors and vice versa. See default_bounce_defer_filter for -details.

+soft errors and vice versa in the smtp(8) delivery agent. See +default_bounce_defer_filter for details.

NOTE: This feature modifies error messages that are generated by the Postfix SMTP client, and that may or may not be derived from @@ -18211,8 +18223,8 @@ This feature is available in Postfix 2.1 and later. (default: $default_bounce_defer_filter)

Optional filter to change arbitrary hard delivery errors into -soft errors and vice versa. See default_bounce_defer_filter for -details.

+soft errors and vice versa in the virtual(8) delivery agent. See +default_bounce_defer_filter for details.

This feature is available in Postfix 2.12 and later.

diff --git a/postfix/html/smtp.8.html b/postfix/html/smtp.8.html index a56176bb1..bbbcc1a26 100644 --- a/postfix/html/smtp.8.html +++ b/postfix/html/smtp.8.html @@ -152,10 +152,6 @@ SMTP(8) SMTP(8) smtp_never_send_ehlo (no) Never send EHLO at the start of an SMTP session. - smtp_bounce_defer_filter ($default_bounce_defer_filter) - Optional filter to change arbitrary hard delivery errors into - soft errors and vice versa. - smtp_defer_if_no_mx_address_found (no) Defer mail delivery when no MX record resolves to an IP address. @@ -164,8 +160,8 @@ SMTP(8) SMTP(8) will send via SMTP. smtp_pix_workaround_delay_time (10s) - How long the Postfix SMTP client pauses before sending - ".<CR><LF>" in order to work around the PIX firewall + How long the Postfix SMTP client pauses before sending + ".<CR><LF>" in order to work around the PIX firewall "<CR><LF>.<CR><LF>" bug. smtp_pix_workaround_threshold_time (500s) @@ -174,19 +170,19 @@ SMTP(8) SMTP(8) delivery through firewalls with "smtp fixup" mode turned on. smtp_pix_workarounds (disable_esmtp, delay_dotcrlf) - A list that specifies zero or more workarounds for CISCO PIX + A list that specifies zero or more workarounds for CISCO PIX firewall bugs. smtp_pix_workaround_maps (empty) - Lookup tables, indexed by the remote SMTP server address, with + Lookup tables, indexed by the remote SMTP server address, with per-destination workarounds for CISCO PIX firewall bugs. smtp_quote_rfc821_envelope (yes) - Quote addresses in Postfix SMTP client MAIL FROM and RCPT TO + Quote addresses in Postfix SMTP client MAIL FROM and RCPT TO commands as required by RFC 5321. smtp_reply_filter (empty) - A mechanism to transform replies from remote SMTP servers one + A mechanism to transform replies from remote SMTP servers one line at a time. smtp_skip_5xx_greeting (yes) @@ -198,68 +194,68 @@ SMTP(8) SMTP(8) Available in Postfix version 2.0 and earlier: smtp_skip_4xx_greeting (yes) - Skip SMTP servers that greet with a 4XX status code (go away, + Skip SMTP servers that greet with a 4XX status code (go away, try again later). Available in Postfix version 2.2 and later: smtp_discard_ehlo_keyword_address_maps (empty) - Lookup tables, indexed by the remote SMTP server address, with - case insensitive lists of EHLO keywords (pipelining, starttls, + Lookup tables, indexed by the remote SMTP server address, with + case insensitive lists of EHLO keywords (pipelining, starttls, auth, etc.) that the Postfix SMTP client will ignore in the EHLO response from a remote SMTP server. smtp_discard_ehlo_keywords (empty) - A case insensitive list of EHLO keywords (pipelining, starttls, + A case insensitive list of EHLO keywords (pipelining, starttls, auth, etc.) that the Postfix SMTP client will ignore in the EHLO response from a remote SMTP server. smtp_generic_maps (empty) - Optional lookup tables that perform address rewriting in the - Postfix SMTP client, typically to transform a locally valid - address into a globally valid address when sending mail across + Optional lookup tables that perform address rewriting in the + Postfix SMTP client, typically to transform a locally valid + address into a globally valid address when sending mail across the Internet. Available in Postfix version 2.2.9 and later: smtp_cname_overrides_servername (version dependent) - When the remote SMTP servername is a DNS CNAME, replace the - servername with the result from CNAME expansion for the purpose - of logging, SASL password lookup, TLS policy decisions, or TLS + When the remote SMTP servername is a DNS CNAME, replace the + servername with the result from CNAME expansion for the purpose + of logging, SASL password lookup, TLS policy decisions, or TLS certificate verification. Available in Postfix version 2.3 and later: lmtp_discard_lhlo_keyword_address_maps (empty) - Lookup tables, indexed by the remote LMTP server address, with - case insensitive lists of LHLO keywords (pipelining, starttls, + Lookup tables, indexed by the remote LMTP server address, with + case insensitive lists of LHLO keywords (pipelining, starttls, auth, etc.) that the Postfix LMTP client will ignore in the LHLO response from a remote LMTP server. lmtp_discard_lhlo_keywords (empty) - A case insensitive list of LHLO keywords (pipelining, starttls, + A case insensitive list of LHLO keywords (pipelining, starttls, auth, etc.) that the Postfix LMTP client will ignore in the LHLO response from a remote LMTP server. Available in Postfix version 2.4.4 and later: send_cyrus_sasl_authzid (no) - When authenticating to a remote SMTP or LMTP server with the - default setting "no", send no SASL authoriZation ID (authzid); - send only the SASL authentiCation ID (authcid) plus the auth- + When authenticating to a remote SMTP or LMTP server with the + default setting "no", send no SASL authoriZation ID (authzid); + send only the SASL authentiCation ID (authcid) plus the auth- cid's password. Available in Postfix version 2.5 and later: smtp_header_checks (empty) - Restricted header_checks(5) tables for the Postfix SMTP client. + Restricted header_checks(5) tables for the Postfix SMTP client. smtp_mime_header_checks (empty) - Restricted mime_header_checks(5) tables for the Postfix SMTP + Restricted mime_header_checks(5) tables for the Postfix SMTP client. smtp_nested_header_checks (empty) - Restricted nested_header_checks(5) tables for the Postfix SMTP + Restricted nested_header_checks(5) tables for the Postfix SMTP client. smtp_body_checks (empty) @@ -268,7 +264,7 @@ SMTP(8) SMTP(8) Available in Postfix version 2.6 and later: tcp_windowsize (0) - An optional workaround for routers that break TCP window scal- + An optional workaround for routers that break TCP window scal- ing. Available in Postfix version 2.8 and later: @@ -279,14 +275,14 @@ SMTP(8) SMTP(8) Available in Postfix version 2.9 and later: smtp_per_record_deadline (no) - Change the behavior of the smtp_*_timeout time limits, from a - time limit per read or write system call, to a time limit to - send or receive a complete record (an SMTP command line, SMTP - response line, SMTP message content line, or TLS protocol mes- + Change the behavior of the smtp_*_timeout time limits, from a + time limit per read or write system call, to a time limit to + send or receive a complete record (an SMTP command line, SMTP + response line, SMTP message content line, or TLS protocol mes- sage). smtp_send_dummy_mail_auth (no) - Whether or not to append the "AUTH=<>" option to the MAIL FROM + Whether or not to append the "AUTH=<>" option to the MAIL FROM command in SASL-authenticated SMTP sessions. Available in Postfix version 2.11 and later: @@ -294,6 +290,12 @@ SMTP(8) SMTP(8) smtp_dns_support_level (empty) Level of DNS support in the Postfix SMTP client. + Available in Postfix version 2.12 and later: + + smtp_bounce_defer_filter ($default_bounce_defer_filter) + Optional filter to change arbitrary hard delivery errors into + soft errors and vice versa in the smtp(8) delivery agent. + MIME PROCESSING CONTROLS Available in Postfix version 2.0 and later: diff --git a/postfix/html/virtual.8.html b/postfix/html/virtual.8.html index d290a2cfd..fd1c83ed4 100644 --- a/postfix/html/virtual.8.html +++ b/postfix/html/virtual.8.html @@ -261,9 +261,11 @@ VIRTUAL(8) VIRTUAL(8) syslog records, so that "smtpd" becomes, for example, "post- fix/smtpd". + Available in Postfix version 2.12 and later: + virtual_bounce_defer_filter ($default_bounce_defer_filter) Optional filter to change arbitrary hard delivery errors into - soft errors and vice versa. + soft errors and vice versa in the virtual(8) delivery agent. SEE ALSO qmgr(8), queue manager diff --git a/postfix/man/man5/postconf.5 b/postfix/man/man5/postconf.5 index 90024f6b1..6a989d565 100644 --- a/postfix/man/man5/postconf.5 +++ b/postfix/man/man5/postconf.5 @@ -2929,6 +2929,12 @@ Time units: s (seconds), m (minutes), h (hours), d (days), w (weeks). The default time unit is s (seconds). .PP This feature is available in Postfix 2.1 and later. +.SH local_bounce_defer_filter (default: $default_bounce_defer_filter) +Optional filter to change arbitrary hard delivery errors into +soft errors and vice versa in the \fBlocal\fR(8) delivery agent. See +default_bounce_defer_filter for details. +.PP +This feature is available in Postfix 2.12 and later. .SH local_command_shell (default: empty) Optional shell program for \fBlocal\fR(8) delivery to non-Postfix command. By default, non-Postfix commands are executed directly; commands @@ -4169,8 +4175,8 @@ submissions from the Postfix maildrop queue. This feature is available in Postfix 2.0 and later. .SH pipe_bounce_defer_filter (default: $default_bounce_defer_filter) Optional filter to change arbitrary hard delivery errors into -soft errors and vice versa. See default_bounce_defer_filter for -details. +soft errors and vice versa in the \fBpipe\fR(8) delivery agent. See +default_bounce_defer_filter for details. .PP This feature is available in Postfix 2.12 and later. .SH plaintext_reject_code (default: 450) @@ -5848,8 +5854,8 @@ that change the delivery time or destination are not available. This feature is available in Postfix 2.5 and later. .SH smtp_bounce_defer_filter (default: $default_bounce_defer_filter) Optional filter to change arbitrary hard delivery errors into -soft errors and vice versa. See default_bounce_defer_filter for -details. +soft errors and vice versa in the \fBsmtp\fR(8) delivery agent. See +default_bounce_defer_filter for details. .PP NOTE: This feature modifies error messages that are generated by the Postfix SMTP client, and that may or may not be derived from @@ -12334,8 +12340,8 @@ change in the future. This feature is available in Postfix 2.1 and later. .SH virtual_bounce_defer_filter (default: $default_bounce_defer_filter) Optional filter to change arbitrary hard delivery errors into -soft errors and vice versa. See default_bounce_defer_filter for -details. +soft errors and vice versa in the \fBvirtual\fR(8) delivery agent. See +default_bounce_defer_filter for details. .PP This feature is available in Postfix 2.12 and later. .SH virtual_destination_concurrency_limit (default: $default_destination_concurrency_limit) diff --git a/postfix/man/man8/local.8 b/postfix/man/man8/local.8 index fb50757e3..b8d780b39 100644 --- a/postfix/man/man8/local.8 +++ b/postfix/man/man8/local.8 @@ -419,6 +419,11 @@ Defer delivery when a mailbox file is not owned by its recipient. Reset the \fBlocal\fR(8) delivery agent's idea of the owner-alias attribute, when delivering mail to a child alias that does not have its own owner alias. +.PP +Available in Postfix version 2.12 and later: +.IP "\fBlocal_bounce_defer_filter ($default_bounce_defer_filter)\fR" +Optional filter to change arbitrary hard delivery errors into +soft errors and vice versa in the \fBlocal\fR(8) delivery agent. .SH "DELIVERY METHOD CONTROLS" .na .nf diff --git a/postfix/man/man8/pipe.8 b/postfix/man/man8/pipe.8 index e30f1c8d1..578628e23 100644 --- a/postfix/man/man8/pipe.8 +++ b/postfix/man/man8/pipe.8 @@ -409,9 +409,6 @@ for an incoming connection before terminating voluntarily. .IP "\fBmax_use (100)\fR" The maximal number of incoming connections that a Postfix daemon process will service before terminating voluntarily. -.IP "\fBpipe_bounce_defer_filter ($default_bounce_defer_filter)\fR" -Optional filter to change arbitrary hard delivery errors into -soft errors and vice versa. .IP "\fBprocess_id (read-only)\fR" The process ID of a Postfix command or daemon process. .IP "\fBprocess_name (read-only)\fR" @@ -427,6 +424,11 @@ The syslog facility of Postfix logging. .IP "\fBsyslog_name (see 'postconf -d' output)\fR" The mail system name that is prepended to the process name in syslog records, so that "smtpd" becomes, for example, "postfix/smtpd". +.PP +Available in Postfix version 2.12 and later: +.IP "\fBpipe_bounce_defer_filter ($default_bounce_defer_filter)\fR" +Optional filter to change arbitrary hard delivery errors into +soft errors and vice versa in the \fBpipe\fR(8) delivery agent. .SH "SEE ALSO" .na .nf diff --git a/postfix/man/man8/smtp.8 b/postfix/man/man8/smtp.8 index 77292a460..1f257b275 100644 --- a/postfix/man/man8/smtp.8 +++ b/postfix/man/man8/smtp.8 @@ -163,9 +163,6 @@ Ignore DNS MX lookups that produce no response. Always send EHLO at the start of an SMTP session. .IP "\fBsmtp_never_send_ehlo (no)\fR" Never send EHLO at the start of an SMTP session. -.IP "\fBsmtp_bounce_defer_filter ($default_bounce_defer_filter)\fR" -Optional filter to change arbitrary hard delivery errors into -soft errors and vice versa. .IP "\fBsmtp_defer_if_no_mx_address_found (no)\fR" Defer mail delivery when no MX record resolves to an IP address. .IP "\fBsmtp_line_length_limit (998)\fR" @@ -277,6 +274,11 @@ FROM command in SASL-authenticated SMTP sessions. Available in Postfix version 2.11 and later: .IP "\fBsmtp_dns_support_level (empty)\fR" Level of DNS support in the Postfix SMTP client. +.PP +Available in Postfix version 2.12 and later: +.IP "\fBsmtp_bounce_defer_filter ($default_bounce_defer_filter)\fR" +Optional filter to change arbitrary hard delivery errors into +soft errors and vice versa in the \fBsmtp\fR(8) delivery agent. .SH "MIME PROCESSING CONTROLS" .na .nf diff --git a/postfix/man/man8/virtual.8 b/postfix/man/man8/virtual.8 index c242e6d81..a61cffe66 100644 --- a/postfix/man/man8/virtual.8 +++ b/postfix/man/man8/virtual.8 @@ -281,9 +281,11 @@ The syslog facility of Postfix logging. .IP "\fBsyslog_name (see 'postconf -d' output)\fR" The mail system name that is prepended to the process name in syslog records, so that "smtpd" becomes, for example, "postfix/smtpd". +.PP +Available in Postfix version 2.12 and later: .IP "\fBvirtual_bounce_defer_filter ($default_bounce_defer_filter)\fR" Optional filter to change arbitrary hard delivery errors into -soft errors and vice versa. +soft errors and vice versa in the \fBvirtual\fR(8) delivery agent. .SH "SEE ALSO" .na .nf diff --git a/postfix/mantools/postlink b/postfix/mantools/postlink index edc761376..ff86a8ffe 100755 --- a/postfix/mantools/postlink +++ b/postfix/mantools/postlink @@ -307,6 +307,7 @@ while (<>) { s;\blmtp_skip_quit_response\b;$&;g; s;\blmtp_tcp_port\b;$&;g; s;\blmtp_xforward_timeout\b;$&;g; + s;\blocal_bounce_defer_filter\b;$&;g; s;\blocal_command_shell\b;$&;g; s;\blocal_destina[-]*\n* *[]*tion_concurrency_limit\b;$&;g; s;\blocal_destina[-]*\n* *[]*tion_recip[-]*\n* *[]*ient_limit\b;$&;g; diff --git a/postfix/proto/postconf.proto b/postfix/proto/postconf.proto index c27a5c463..effee2c84 100644 --- a/postfix/proto/postconf.proto +++ b/postfix/proto/postconf.proto @@ -15683,8 +15683,8 @@ sender.

%PARAM smtp_bounce_defer_filter $default_bounce_defer_filter

Optional filter to change arbitrary hard delivery errors into -soft errors and vice versa. See default_bounce_defer_filter for -details.

+soft errors and vice versa in the smtp(8) delivery agent. See +default_bounce_defer_filter for details.

NOTE: This feature modifies error messages that are generated by the Postfix SMTP client, and that may or may not be derived from @@ -15702,15 +15702,23 @@ configuration parameter. See there for details.

%PARAM pipe_bounce_defer_filter $default_bounce_defer_filter

Optional filter to change arbitrary hard delivery errors into -soft errors and vice versa. See default_bounce_defer_filter for -details.

+soft errors and vice versa in the pipe(8) delivery agent. See +default_bounce_defer_filter for details.

This feature is available in Postfix 2.12 and later.

%PARAM virtual_bounce_defer_filter $default_bounce_defer_filter

Optional filter to change arbitrary hard delivery errors into -soft errors and vice versa. See default_bounce_defer_filter for -details.

+soft errors and vice versa in the virtual(8) delivery agent. See +default_bounce_defer_filter for details.

+ +

This feature is available in Postfix 2.12 and later.

+ +%PARAM local_bounce_defer_filter $default_bounce_defer_filter + +

Optional filter to change arbitrary hard delivery errors into +soft errors and vice versa in the local(8) delivery agent. See +default_bounce_defer_filter for details.

This feature is available in Postfix 2.12 and later.

diff --git a/postfix/src/global/bounce.c b/postfix/src/global/bounce.c index fe14c4dbb..77496ef37 100644 --- a/postfix/src/global/bounce.c +++ b/postfix/src/global/bounce.c @@ -90,8 +90,8 @@ /* /* bounce_client_init() initializes an optional DSN filter. /* -/* bounce_append_intern() is for use after the DSN filter. DSN -/* filtering is not yet supported for bounce_one(). +/* bounce_append_intern() and bounce_one_intern() are for use +/* after the DSN filter. /* /* Arguments: /* .IP flags @@ -393,7 +393,7 @@ int bounce_one(int flags, const char *queue, const char *id, const char *relay, DSN *dsn) { DSN my_dsn = *dsn; - int status; + DSN *dsn_res; /* * Sanity check. @@ -403,6 +403,30 @@ int bounce_one(int flags, const char *queue, const char *id, my_dsn.status = "5.0.0"; } + /* + * DSN filter (Postfix 2.12). + */ + if (bounce_defer_filter != 0 + && (dsn_res = ndr_filter_lookup(bounce_defer_filter, &my_dsn)) != 0) { + if (dsn_res->status[0] == '4') + return (defer_append_intern(flags, id, stats, rcpt, relay, dsn_res)); + my_dsn = *dsn_res; + } + return (bounce_one_intern(flags, queue, id, encoding, sender, dsn_envid, + dsn_ret, stats, rcpt, relay, &my_dsn)); +} + +/* bounce_one_intern - send notice for one recipient */ + +int bounce_one_intern(int flags, const char *queue, const char *id, + const char *encoding, const char *sender, + const char *dsn_envid, int dsn_ret, + MSG_STATS *stats, RECIPIENT *rcpt, + const char *relay, DSN *dsn) +{ + DSN my_dsn = *dsn; + int status; + /* * MTA-requested address verification information is stored in the verify * service database. @@ -429,7 +453,7 @@ int bounce_one(int flags, const char *queue, const char *id, * based procedure. */ else if (var_soft_bounce) { - return (bounce_append(flags, id, stats, rcpt, relay, &my_dsn)); + return (bounce_append_intern(flags, id, stats, rcpt, relay, &my_dsn)); } /* @@ -469,7 +493,7 @@ int bounce_one(int flags, const char *queue, const char *id, vstring_sprintf(junk, "%s or %s service failure", var_bounce_service, var_trace_service); my_dsn.reason = vstring_str(junk); - status = defer_append(flags, id, stats, rcpt, relay, &my_dsn); + status = defer_append_intern(flags, id, stats, rcpt, relay, &my_dsn); vstring_free(junk); } else { status = -1; diff --git a/postfix/src/global/defer.c b/postfix/src/global/defer.c index a05b8bf59..d4aab325f 100644 --- a/postfix/src/global/defer.c +++ b/postfix/src/global/defer.c @@ -31,6 +31,20 @@ /* const char *sender; /* const char *dsn_envid; /* int dsn_ret; +/* +/* int defer_one(flags, queue, id, encoding, sender, envid, ret, +/* stats, recipient, relay, dsn) +/* int flags; +/* const char *queue; +/* const char *id; +/* const char *encoding; +/* const char *sender; +/* const char *dsn_envid; +/* int dsn_ret; +/* MSG_STATS *stats; +/* RECIPIENT *rcpt; +/* const char *relay; +/* DSN *dsn; /* INTERNAL API /* int defer_append_intern(flags, id, stats, rcpt, relay, dsn) /* int flags; @@ -63,6 +77,9 @@ /* question has been deferred. The defer log is not deleted, /* and no recipients are deleted from the original queue file. /* +/* defer_one() implements ndr_filter(3) compatibility for the +/* bounce_one() routine. +/* /* defer_append_intern() is for use after the DSN filter. /* /* Arguments: @@ -311,3 +328,36 @@ int defer_warn(int flags, const char *queue, const char *id, return (-1); } } + +/* defer_one - defer mail for one recipient */ + +int defer_one(int flags, const char *queue, const char *id, + const char *encoding, const char *sender, + const char *dsn_envid, int dsn_ret, + MSG_STATS *stats, RECIPIENT *rcpt, + const char *relay, DSN *dsn) +{ + DSN my_dsn = *dsn; + DSN *dsn_res; + + /* + * Sanity check. + */ + if (my_dsn.status[0] != '4' || !dsn_valid(my_dsn.status)) { + msg_warn("defer_one: ignoring dsn code \"%s\"", my_dsn.status); + my_dsn.status = "4.0.0"; + } + + /* + * DSN filter (Postfix 2.12). + */ + if (bounce_defer_filter != 0 + && (dsn_res = ndr_filter_lookup(bounce_defer_filter, &my_dsn)) != 0) { + if (dsn_res->status[0] == '5') + return (bounce_one_intern(flags, queue, id, encoding, sender, + dsn_envid, dsn_ret, stats, rcpt, + relay, dsn_res)); + my_dsn = *dsn_res; + } + return (defer_append_intern(flags, id, stats, rcpt, relay, &my_dsn)); +} diff --git a/postfix/src/global/defer.h b/postfix/src/global/defer.h index 55f98034d..45f878435 100644 --- a/postfix/src/global/defer.h +++ b/postfix/src/global/defer.h @@ -25,6 +25,10 @@ extern int defer_flush(int, const char *, const char *, const char *, const char *, const char *, int); extern int defer_warn(int, const char *, const char *, const char *, const char *, int); +extern int defer_one(int, const char *, const char *, const char *, + const char *, const char *, + int, MSG_STATS *, RECIPIENT *, + const char *, DSN *); /* * Start of private API. diff --git a/postfix/src/global/mail_params.h b/postfix/src/global/mail_params.h index 07d89471c..0069c4d2b 100644 --- a/postfix/src/global/mail_params.h +++ b/postfix/src/global/mail_params.h @@ -3765,6 +3765,10 @@ extern char *var_pipe_ndr_filter; #define DEF_VIRT_NDR_FILTER "$" VAR_NDR_FILTER extern char *var_virt_ndr_filter; +#define VAR_LOCAL_NDR_FILTER "local_bounce_defer_filter" +#define DEF_LOCAL_NDR_FILTER "$" VAR_NDR_FILTER +extern char *var_local_ndr_filter; + /* LICENSE /* .ad /* .fi diff --git a/postfix/src/global/mail_version.h b/postfix/src/global/mail_version.h index e4d4282ba..8923bab87 100644 --- a/postfix/src/global/mail_version.h +++ b/postfix/src/global/mail_version.h @@ -20,7 +20,7 @@ * Patches change both the patchlevel and the release date. Snapshots have no * patchlevel; they change the release date only. */ -#define MAIL_RELEASE_DATE "20140316" +#define MAIL_RELEASE_DATE "20140318" #define MAIL_VERSION_NUMBER "2.12" #ifdef SNAPSHOT diff --git a/postfix/src/global/ndr_filter.c b/postfix/src/global/ndr_filter.c index b0e216c32..105c21aa6 100644 --- a/postfix/src/global/ndr_filter.c +++ b/postfix/src/global/ndr_filter.c @@ -12,7 +12,7 @@ /* /* DSN *ndr_filter_lookup( /* NDR_FILTER *fp, -/* DSN dsn) +/* DSN *dsn) /* /* void dsn_free( /* NDR_FILTER *fp) @@ -125,8 +125,12 @@ DSN *ndr_filter_lookup(NDR_FILTER *fp, DSN *dsn) if (msg_verbose) msg_info("%s: %s %s", myname, dsn->status, dsn->reason); + /* + * XXX Instead of hard-coded '4' or '5', use some form of encapsulation + * to read or update the class field. + */ #define IS_NDR_DSN(s) \ - (dsn_valid(s) && (s)[1] == '.' && ((s)[0] == '4' || (s)[0] == '5')) + (dsn_valid(s) && ((s)[0] == '4' || (s)[0] == '5')) /* * Sanity check. We filter only bounce/defer DSNs. diff --git a/postfix/src/local/bounce_workaround.c b/postfix/src/local/bounce_workaround.c index e7211ec55..7fe4aaa14 100644 --- a/postfix/src/local/bounce_workaround.c +++ b/postfix/src/local/bounce_workaround.c @@ -37,6 +37,7 @@ /* Attributes describing alias, include or forward expansion. /* A table with the results from expanding aliases or lists. /* A table with delivered-to: addresses taken from the message. +/* The non-delivery status must be either 4.X.X or 5.X.X. /* DIAGNOSTICS /* Fatal errors: out of memory. The result is non-zero when /* the operation should be tried again. Warnings: malformed @@ -121,10 +122,13 @@ int bounce_workaround(LOCAL_STATE state) SET_OWNER_ATTR(state.msg_attr, STR(canon_owner), state.level); } myfree(owner_alias); - if (alias_maps->error != 0) + if (alias_maps->error != 0) { /* At this point, canon_owner == 0. */ + dsb_simple(state.msg_attr.why, "4.3.0", + "alias database unavailable"); return (defer_append(BOUNCE_FLAGS(state.request), BOUNCE_ATTR(state.msg_attr))); + } } /* @@ -132,8 +136,11 @@ int bounce_workaround(LOCAL_STATE state) * substitute sender address, before completion of the delivery request. */ if (canon_owner) { - rcpt_stat = bounce_one(BOUNCE_FLAGS(state.request), - BOUNCE_ONE_ATTR(state.msg_attr)); + rcpt_stat = + (STR(state.msg_attr.why->status)[0] == '4' ? + defer_one : bounce_one) + (BOUNCE_FLAGS(state.request), + BOUNCE_ONE_ATTR(state.msg_attr)); vstring_free(canon_owner); } @@ -142,8 +149,11 @@ int bounce_workaround(LOCAL_STATE state) * delivery request. */ else { - rcpt_stat = bounce_append(BOUNCE_FLAGS(state.request), - BOUNCE_ATTR(state.msg_attr)); + rcpt_stat = + (STR(state.msg_attr.why->status)[0] == '4' ? + defer_append : bounce_append) + (BOUNCE_FLAGS(state.request), + BOUNCE_ATTR(state.msg_attr)); } return (rcpt_stat); } diff --git a/postfix/src/local/command.c b/postfix/src/local/command.c index 707cec6c9..b27556799 100644 --- a/postfix/src/local/command.c +++ b/postfix/src/local/command.c @@ -235,13 +235,8 @@ int deliver_command(LOCAL_STATE state, USER_ATTR usr_attr, const char *comma break; case PIPE_STAT_BOUNCE: case PIPE_STAT_DEFER: - if (STR(why->status)[0] == '4') - deliver_status = - defer_append(BOUNCE_FLAGS(state.request), - BOUNCE_ATTR(state.msg_attr)); - else - /* Account for possible owner- sender address override. */ - deliver_status = bounce_workaround(state); + /* Account for possible owner- sender address override. */ + deliver_status = bounce_workaround(state); break; case PIPE_STAT_CORRUPT: deliver_status = DEL_STAT_DEFER; diff --git a/postfix/src/local/file.c b/postfix/src/local/file.c index 4adfdf819..0cc4c1828 100644 --- a/postfix/src/local/file.c +++ b/postfix/src/local/file.c @@ -184,13 +184,8 @@ int deliver_file(LOCAL_STATE state, USER_ATTR usr_attr, char *path) } else if (mail_copy_status != 0) { vstring_sprintf_prepend(why->reason, "cannot append message to file %s: ", path); - if (STR(why->status)[0] == '4') - deliver_status = - defer_append(BOUNCE_FLAGS(state.request), - BOUNCE_ATTR(state.msg_attr)); - else - /* Account for possible owner- sender address override. */ - deliver_status = bounce_workaround(state); + /* Account for possible owner- sender address override. */ + deliver_status = bounce_workaround(state); } else { dsb_simple(why, "2.0.0", "delivered to file: %s", path); deliver_status = sent(BOUNCE_FLAGS(state.request), diff --git a/postfix/src/local/local.c b/postfix/src/local/local.c index 4b69a3032..b28a759ce 100644 --- a/postfix/src/local/local.c +++ b/postfix/src/local/local.c @@ -385,6 +385,11 @@ /* Reset the \fBlocal\fR(8) delivery agent's idea of the owner-alias /* attribute, when delivering mail to a child alias that does not have /* its own owner alias. +/* .PP +/* Available in Postfix version 2.12 and later: +/* .IP "\fBlocal_bounce_defer_filter ($default_bounce_defer_filter)\fR" +/* Optional filter to change arbitrary hard delivery errors into +/* soft errors and vice versa in the \fBlocal\fR(8) delivery agent. /* DELIVERY METHOD CONTROLS /* .ad /* .fi @@ -663,6 +668,7 @@ int local_ext_prop_mask; int local_deliver_hdr_mask; int local_mbox_lock_mask; MAPS *alias_maps; +char *var_local_ndr_filter; /* local_deliver - deliver message with extreme prejudice */ @@ -898,6 +904,7 @@ int main(int argc, char **argv) VAR_DELIVER_HDR, DEF_DELIVER_HDR, &var_deliver_hdr, 0, 0, VAR_MAILBOX_LOCK, DEF_MAILBOX_LOCK, &var_mailbox_lock, 1, 0, VAR_MAILBOX_CMD_MAPS, DEF_MAILBOX_CMD_MAPS, &var_mailbox_cmd_maps, 0, 0, + VAR_LOCAL_NDR_FILTER, DEF_LOCAL_NDR_FILTER, &var_local_ndr_filter, 0, 0, 0, }; static const CONFIG_BOOL_TABLE bool_table[] = { @@ -936,5 +943,7 @@ int main(int argc, char **argv) MAIL_SERVER_POST_INIT, post_init, MAIL_SERVER_PRE_ACCEPT, pre_accept, MAIL_SERVER_PRIVILEGED, + MAIL_SERVER_BOUNCE_INIT, VAR_LOCAL_NDR_FILTER, + &var_local_ndr_filter, 0); } diff --git a/postfix/src/pipe/pipe.c b/postfix/src/pipe/pipe.c index 35a9a3e79..e7737a07f 100644 --- a/postfix/src/pipe/pipe.c +++ b/postfix/src/pipe/pipe.c @@ -387,9 +387,6 @@ /* .IP "\fBmax_use (100)\fR" /* The maximal number of incoming connections that a Postfix daemon /* process will service before terminating voluntarily. -/* .IP "\fBpipe_bounce_defer_filter ($default_bounce_defer_filter)\fR" -/* Optional filter to change arbitrary hard delivery errors into -/* soft errors and vice versa. /* .IP "\fBprocess_id (read-only)\fR" /* The process ID of a Postfix command or daemon process. /* .IP "\fBprocess_name (read-only)\fR" @@ -405,6 +402,11 @@ /* .IP "\fBsyslog_name (see 'postconf -d' output)\fR" /* The mail system name that is prepended to the process name in syslog /* records, so that "smtpd" becomes, for example, "postfix/smtpd". +/* .PP +/* Available in Postfix version 2.12 and later: +/* .IP "\fBpipe_bounce_defer_filter ($default_bounce_defer_filter)\fR" +/* Optional filter to change arbitrary hard delivery errors into +/* soft errors and vice versa in the \fBpipe\fR(8) delivery agent. /* SEE ALSO /* qmgr(8), queue manager /* bounce(8), delivery status reports diff --git a/postfix/src/smtp/smtp.c b/postfix/src/smtp/smtp.c index 1fe10044c..52456f624 100644 --- a/postfix/src/smtp/smtp.c +++ b/postfix/src/smtp/smtp.c @@ -141,9 +141,6 @@ /* Always send EHLO at the start of an SMTP session. /* .IP "\fBsmtp_never_send_ehlo (no)\fR" /* Never send EHLO at the start of an SMTP session. -/* .IP "\fBsmtp_bounce_defer_filter ($default_bounce_defer_filter)\fR" -/* Optional filter to change arbitrary hard delivery errors into -/* soft errors and vice versa. /* .IP "\fBsmtp_defer_if_no_mx_address_found (no)\fR" /* Defer mail delivery when no MX record resolves to an IP address. /* .IP "\fBsmtp_line_length_limit (998)\fR" @@ -255,6 +252,11 @@ /* Available in Postfix version 2.11 and later: /* .IP "\fBsmtp_dns_support_level (empty)\fR" /* Level of DNS support in the Postfix SMTP client. +/* .PP +/* Available in Postfix version 2.12 and later: +/* .IP "\fBsmtp_bounce_defer_filter ($default_bounce_defer_filter)\fR" +/* Optional filter to change arbitrary hard delivery errors into +/* soft errors and vice versa in the \fBsmtp\fR(8) delivery agent. /* MIME PROCESSING CONTROLS /* .ad /* .fi diff --git a/postfix/src/smtp/smtp_trouble.c b/postfix/src/smtp/smtp_trouble.c index b976b7bfc..b3b4aacc5 100644 --- a/postfix/src/smtp/smtp_trouble.c +++ b/postfix/src/smtp/smtp_trouble.c @@ -195,6 +195,7 @@ static int smtp_bulk_fail(SMTP_STATE *state, int throttle_queue) DSN_BUF *why = state->why; RECIPIENT *rcpt; int status; + int aggregate_status; int soft_error = (STR(why->status)[0] == '4'); int soft_bounce_error = (STR(why->status)[0] == '5' && var_soft_bounce); int nrcpt; @@ -239,6 +240,7 @@ static int smtp_bulk_fail(SMTP_STATE *state, int throttle_queue) GETTIMEOFDAY(&request->msg_stats.deliver_done); (void) DSN_FROM_DSN_BUF(why); + aggregate_status = 0; for (nrcpt = 0; nrcpt < SMTP_RCPT_LEFT(state); nrcpt++) { rcpt = request->rcpt_list.info + nrcpt; if (SMTP_RCPT_ISMARKED(rcpt)) @@ -250,10 +252,11 @@ static int smtp_bulk_fail(SMTP_STATE *state, int throttle_queue) if (status == 0) deliver_completed(state->src, rcpt->offset); SMTP_RCPT_DROP(state, rcpt); - state->status |= status; + aggregate_status |= status; } + state->status |= aggregate_status; if ((state->misc_flags & SMTP_MISC_FLAG_COMPLETE_SESSION) == 0 - && throttle_queue && (soft_error || soft_bounce_error) + && throttle_queue && aggregate_status && request->hop_status == 0) request->hop_status = DSN_COPY(&why->dsn); } diff --git a/postfix/src/virtual/virtual.c b/postfix/src/virtual/virtual.c index 106ad7804..c66431d23 100644 --- a/postfix/src/virtual/virtual.c +++ b/postfix/src/virtual/virtual.c @@ -245,9 +245,11 @@ /* .IP "\fBsyslog_name (see 'postconf -d' output)\fR" /* The mail system name that is prepended to the process name in syslog /* records, so that "smtpd" becomes, for example, "postfix/smtpd". +/* .PP +/* Available in Postfix version 2.12 and later: /* .IP "\fBvirtual_bounce_defer_filter ($default_bounce_defer_filter)\fR" /* Optional filter to change arbitrary hard delivery errors into -/* soft errors and vice versa. +/* soft errors and vice versa in the \fBvirtual\fR(8) delivery agent. /* SEE ALSO /* qmgr(8), queue manager /* bounce(8), delivery status reports