From 48a0b6fc2350ba76ecc548563119ae9b40c6719c Mon Sep 17 00:00:00 2001
From: Wietse Venema
Date: Fri, 21 Mar 2014 00:00:00 -0500
Subject: [PATCH] postfix-2.12-20140321
---
postfix/HISTORY | 17 +-
postfix/RELEASE_NOTES | 47 ++--
postfix/html/lmtp.8.html | 201 +++++++-------
postfix/html/local.8.html | 91 +++----
postfix/html/pipe.8.html | 7 +-
postfix/html/postconf.5.html | 252 ++++++++++--------
postfix/html/smtp.8.html | 201 +++++++-------
postfix/html/virtual.8.html | 15 +-
postfix/man/man5/postconf.5 | 214 ++++++++-------
postfix/man/man8/local.8 | 7 +-
postfix/man/man8/pipe.8 | 7 +-
postfix/man/man8/smtp.8 | 7 +-
postfix/man/man8/virtual.8 | 7 +-
postfix/mantools/postlink | 12 +-
postfix/proto/postconf.proto | 98 ++++---
postfix/src/global/Makefile.in | 38 +--
postfix/src/global/bounce.c | 18 +-
postfix/src/global/bounce.h | 6 +-
postfix/src/global/defer.c | 12 +-
postfix/src/global/defer.h | 2 +-
postfix/src/global/dsn_filter.c | 192 +++++++++++++
.../src/global/{ndr_filter.h => dsn_filter.h} | 16 +-
postfix/src/global/mail_params.c | 6 +-
postfix/src/global/mail_params.h | 34 +--
postfix/src/global/mail_version.h | 2 +-
postfix/src/global/ndr_filter.c | 182 -------------
postfix/src/global/sent.c | 13 +-
postfix/src/local/local.c | 11 +-
postfix/src/master/Makefile.in | 8 +-
postfix/src/master/event_server.c | 10 +-
postfix/src/master/multi_server.c | 10 +-
postfix/src/master/single_server.c | 10 +-
postfix/src/master/trigger_server.c | 10 +-
postfix/src/pipe/pipe.c | 11 +-
postfix/src/smtp/lmtp_params.c | 2 +-
postfix/src/smtp/smtp.c | 9 +-
postfix/src/smtp/smtp_params.c | 2 +-
postfix/src/virtual/virtual.c | 11 +-
38 files changed, 958 insertions(+), 840 deletions(-)
create mode 100644 postfix/src/global/dsn_filter.c
rename postfix/src/global/{ndr_filter.h => dsn_filter.h} (52%)
delete mode 100644 postfix/src/global/ndr_filter.c
diff --git a/postfix/HISTORY b/postfix/HISTORY
index 5fbfbff68..c502ba6a9 100644
--- a/postfix/HISTORY
+++ b/postfix/HISTORY
@@ -19627,10 +19627,25 @@ Apologies for any names omitted.
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.
+ global/mail_params.h, mantools/postlink.
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.
+
+20140320
+
+ Feature: support to replace successful delivery status code
+ and explanatory text. This can be used to to hide local
+ details such as destination commands or file names when a
+ remote sender requests confirmation of delivery. As of now
+ *_bounce_defer_filter is renamed into *_delivery_status_filter.
+ Files: global/bounce.c, global/bounce.h, global/defer.c,
+ global/defer.h, global/dsn_filter.c, global/dsn_filter.h,
+ global/mail_params.c, global/mail_params.h, global/sent.c,
+ local/local.c, master/event_server.c, master/multi_server.c,
+ master/single_server.c, master/trigger_server.c, pipe/pipe.c,
+ smtp/lmtp_params.c, smtp/smtp.c, smtp/smtp_params.c,
+ virtual/virtual.c, mantools/postlink.
diff --git a/postfix/RELEASE_NOTES b/postfix/RELEASE_NOTES
index 2d4cfb9a4..e56c6dc7a 100644
--- a/postfix/RELEASE_NOTES
+++ b/postfix/RELEASE_NOTES
@@ -16,42 +16,53 @@ 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 20140318
+Major changes with snapshot 20140321
====================================
-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.
+Delivery status filter support, to replace the delivery status codes
+and explanatory text of successful or unsuccessful deliveries. This
+was originally implemented for sites that want to turn certain soft
+delivery errors into hard delivery errors, but it can also be used
+to censor out information from delivery confirmation reports.
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. Note: this will not override "soft_bounce=yes".
+success, bounce, or defer messages. Note: this will not override
+"soft_bounce=yes", and this will not change a successful delivery
+status into an unsuccessful status or vice versa.
-The following example turns specific soft TLS errors into hard
+The first example turns specific soft TLS errors into hard
errors, by overriding the first number in the enhanced status code.
/etc/postfix/main.cf:
- smtp_bounce_defer_filter = pcre:/etc/postfix/smtp_ndr_filter
+ smtp_delivery_status_filter = pcre:/etc/postfix/smtp_dsn_filter
-/etc/postfix/smtp_ndr_filter:
+/etc/postfix/smtp_dsn_filter:
/^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
+The second example removes the destination command name and file
+name from local(8) successful delivery reports, so that they will
+not be reported when a sender requests confirmation of delivery.
+
+/etc/postfix/main.cf:
+ local_delivery_status_filter = pcre:/etc/postfix/local_dsn_filter
+
+/etc/postfix/local_dsn_filter:
+ /^(2\S+ delivered to file).+/ $1
+ /^(2\S+ delivered to command).+/ $1
+
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
+ default_delivery_status_filter =
+ lmtp_delivery_status_filter = $default_delivery_status_filter
+ local_delivery_status_filter = $default_delivery_status_filter
+ pipe_delivery_status_filter = $default_delivery_status_filter
+ smtp_delivery_status_filter = $default_delivery_status_filter
+ virtual_delivery_status_filter = $default_delivery_status_filter
See the postconf(5) manpage for more details.
diff --git a/postfix/html/lmtp.8.html b/postfix/html/lmtp.8.html
index bbbcc1a26..6a85843d1 100644
--- a/postfix/html/lmtp.8.html
+++ b/postfix/html/lmtp.8.html
@@ -292,9 +292,10 @@ SMTP(8) SMTP(8)
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.
+ smtp_delivery_status_filter ($default_delivery_status_filter)
+ Optional filter for the smtp(8) delivery agent to change the
+ delivery status code or explanatory text of successful or unsuc-
+ cessful deliveries.
MIME PROCESSING CONTROLS
Available in Postfix version 2.0 and later:
@@ -312,7 +313,7 @@ SMTP(8) SMTP(8)
Available in Postfix version 2.1 and later:
smtp_send_xforward_command (no)
- Send the non-standard XFORWARD command when the Postfix SMTP
+ Send the non-standard XFORWARD command when the Postfix SMTP
server EHLO response announces XFORWARD support.
SASL AUTHENTICATION CONTROLS
@@ -320,62 +321,62 @@ SMTP(8) SMTP(8)
Enable SASL authentication in the Postfix SMTP client.
smtp_sasl_password_maps (empty)
- Optional Postfix SMTP client lookup tables with one user-
- name:password entry per remote hostname or domain, or sender
+ Optional Postfix SMTP client lookup tables with one user-
+ name:password entry per remote hostname or domain, or sender
address when sender-dependent authentication is enabled.
smtp_sasl_security_options (noplaintext, noanonymous)
Postfix SMTP client SASL security options; as of Postfix 2.3 the
- list of available features depends on the SASL client implemen-
+ list of available features depends on the SASL client implemen-
tation that is selected with smtp_sasl_type.
Available in Postfix version 2.2 and later:
smtp_sasl_mechanism_filter (empty)
- If non-empty, a Postfix SMTP client filter for the remote SMTP
+ If non-empty, a Postfix SMTP client filter for the remote SMTP
server's list of offered SASL mechanisms.
Available in Postfix version 2.3 and later:
smtp_sender_dependent_authentication (no)
Enable sender-dependent authentication in the Postfix SMTP
- client; this is available only with SASL authentication, and
- disables SMTP connection caching to ensure that mail from dif-
+ client; this is available only with SASL authentication, and
+ disables SMTP connection caching to ensure that mail from dif-
ferent senders will use the appropriate credentials.
smtp_sasl_path (empty)
Implementation-specific information that the Postfix SMTP client
- passes through to the SASL plug-in implementation that is
+ passes through to the SASL plug-in implementation that is
selected with smtp_sasl_type.
smtp_sasl_type (cyrus)
- The SASL plug-in type that the Postfix SMTP client should use
+ The SASL plug-in type that the Postfix SMTP client should use
for authentication.
Available in Postfix version 2.5 and later:
smtp_sasl_auth_cache_name (empty)
- An optional table to prevent repeated SASL authentication fail-
- ures with the same remote SMTP server hostname, username and
+ An optional table to prevent repeated SASL authentication fail-
+ ures with the same remote SMTP server hostname, username and
password.
smtp_sasl_auth_cache_time (90d)
- The maximal age of an smtp_sasl_auth_cache_name entry before it
+ The maximal age of an smtp_sasl_auth_cache_name entry before it
is removed.
smtp_sasl_auth_soft_bounce (yes)
- When a remote SMTP server rejects a SASL authentication request
- with a 535 reply code, defer mail delivery instead of returning
+ When a remote SMTP server rejects a SASL authentication request
+ with a 535 reply code, defer mail delivery instead of returning
mail as undeliverable.
Available in Postfix version 2.9 and later:
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.
STARTTLS SUPPORT CONTROLS
- Detailed information about STARTTLS configuration may be found in the
+ Detailed information about STARTTLS configuration may be found in the
TLS_README document.
smtp_tls_security_level (empty)
@@ -385,20 +386,20 @@ SMTP(8) SMTP(8)
smtp_tls_enforce_peername.
smtp_sasl_tls_security_options ($smtp_sasl_security_options)
- The SASL authentication security options that the Postfix SMTP
+ The SASL authentication security options that the Postfix SMTP
client uses for TLS encrypted SMTP sessions.
smtp_starttls_timeout (300s)
- Time limit for Postfix SMTP client write and read operations
+ Time limit for Postfix SMTP client write and read operations
during TLS startup and shutdown handshake procedures.
smtp_tls_CAfile (empty)
- A file containing CA certificates of root CAs trusted to sign
- either remote SMTP server certificates or intermediate CA cer-
+ A file containing CA certificates of root CAs trusted to sign
+ either remote SMTP server certificates or intermediate CA cer-
tificates.
smtp_tls_CApath (empty)
- Directory with PEM format certificate authority certificates
+ Directory with PEM format certificate authority certificates
that the Postfix SMTP client uses to verify a remote SMTP server
certificate.
@@ -406,7 +407,7 @@ SMTP(8) SMTP(8)
File with the Postfix SMTP client RSA certificate in PEM format.
smtp_tls_mandatory_ciphers (medium)
- The minimum TLS cipher grade that the Postfix SMTP client will
+ The minimum TLS cipher grade that the Postfix SMTP client will
use with mandatory TLS encryption.
smtp_tls_exclude_ciphers (empty)
@@ -414,8 +415,8 @@ SMTP(8) SMTP(8)
client cipher list at all TLS security levels.
smtp_tls_mandatory_exclude_ciphers (empty)
- Additional list of ciphers or cipher types to exclude from the
- Postfix SMTP client cipher list at mandatory TLS security lev-
+ Additional list of ciphers or cipher types to exclude from the
+ Postfix SMTP client cipher list at mandatory TLS security lev-
els.
smtp_tls_dcert_file (empty)
@@ -431,7 +432,7 @@ SMTP(8) SMTP(8)
Enable additional Postfix SMTP client logging of TLS activity.
smtp_tls_note_starttls_offer (no)
- Log the hostname of a remote SMTP server that offers STARTTLS,
+ Log the hostname of a remote SMTP server that offers STARTTLS,
when TLS is not already enabled for that server.
smtp_tls_policy_maps (empty)
@@ -440,14 +441,14 @@ SMTP(8) SMTP(8)
fied, this overrides the obsolete smtp_tls_per_site parameter.
smtp_tls_mandatory_protocols (!SSLv2)
- List of SSL/TLS protocols that the Postfix SMTP client will use
+ List of SSL/TLS protocols that the Postfix SMTP client will use
with mandatory TLS encryption.
smtp_tls_scert_verifydepth (9)
The verification depth for remote SMTP server certificates.
smtp_tls_secure_cert_match (nexthop, dot-nexthop)
- How the Postfix SMTP client verifies the server certificate
+ How the Postfix SMTP client verifies the server certificate
peername for the "secure" TLS security level.
smtp_tls_session_cache_database (empty)
@@ -455,16 +456,16 @@ SMTP(8) SMTP(8)
session cache.
smtp_tls_session_cache_timeout (3600s)
- The expiration time of Postfix SMTP client TLS session cache
+ The expiration time of Postfix SMTP client TLS session cache
information.
smtp_tls_verify_cert_match (hostname)
- How the Postfix SMTP client verifies the server certificate
+ How the Postfix SMTP client verifies the server certificate
peername for the "verify" TLS security level.
tls_daemon_random_bytes (32)
- The number of pseudo-random bytes that an smtp(8) or smtpd(8)
- process requests from the tlsmgr(8) server in order to seed its
+ The number of pseudo-random bytes that an smtp(8) or smtpd(8)
+ process requests from the tlsmgr(8) server in order to seed its
internal pseudo random number generator (PRNG).
tls_high_cipherlist (ALL:!EXPORT:!LOW:!MEDIUM:+RC4:@STRENGTH)
@@ -480,52 +481,52 @@ SMTP(8) SMTP(8)
The OpenSSL cipherlist for "EXPORT" or higher grade ciphers.
tls_null_cipherlist (eNULL:!aNULL)
- The OpenSSL cipherlist for "NULL" grade ciphers that provide
+ The OpenSSL cipherlist for "NULL" grade ciphers that provide
authentication without encryption.
Available in Postfix version 2.4 and later:
smtp_sasl_tls_verified_security_options ($smtp_sasl_tls_secu-
rity_options)
- The SASL authentication security options that the Postfix SMTP
- client uses for TLS encrypted SMTP sessions with a verified
+ The SASL authentication security options that the Postfix SMTP
+ client uses for TLS encrypted SMTP sessions with a verified
server certificate.
Available in Postfix version 2.5 and later:
smtp_tls_fingerprint_cert_match (empty)
- List of acceptable remote SMTP server certificate fingerprints
- for the "fingerprint" TLS security level (smtp_tls_secu-
+ List of acceptable remote SMTP server certificate fingerprints
+ for the "fingerprint" TLS security level (smtp_tls_secu-
rity_level = fingerprint).
smtp_tls_fingerprint_digest (md5)
- The message digest algorithm used to construct remote SMTP
+ The message digest algorithm used to construct remote SMTP
server certificate fingerprints.
Available in Postfix version 2.6 and later:
smtp_tls_protocols (!SSLv2)
- List of TLS protocols that the Postfix SMTP client will exclude
+ List of TLS protocols that the Postfix SMTP client will exclude
or include with opportunistic TLS encryption.
smtp_tls_ciphers (export)
- The minimum TLS cipher grade that the Postfix SMTP client will
+ The minimum TLS cipher grade that the Postfix SMTP client will
use with opportunistic TLS encryption.
smtp_tls_eccert_file (empty)
- File with the Postfix SMTP client ECDSA certificate in PEM for-
+ File with the Postfix SMTP client ECDSA certificate in PEM for-
mat.
smtp_tls_eckey_file ($smtp_tls_eccert_file)
- File with the Postfix SMTP client ECDSA private key in PEM for-
+ File with the Postfix SMTP client ECDSA private key in PEM for-
mat.
Available in Postfix version 2.7 and later:
smtp_tls_block_early_mail_reply (no)
- Try to detect a mail hijacking attack based on a TLS protocol
- vulnerability (CVE-2009-3555), where an attacker prepends mali-
- cious HELO, MAIL, RCPT, DATA commands to a Postfix SMTP client
+ Try to detect a mail hijacking attack based on a TLS protocol
+ vulnerability (CVE-2009-3555), where an attacker prepends mali-
+ cious HELO, MAIL, RCPT, DATA commands to a Postfix SMTP client
TLS session.
Available in Postfix version 2.8 and later:
@@ -536,11 +537,11 @@ SMTP(8) SMTP(8)
Available in Postfix version 2.11 and later:
smtp_tls_trust_anchor_file (empty)
- Zero or more PEM-format files with trust-anchor certificates
+ Zero or more PEM-format files with trust-anchor certificates
and/or public keys.
smtp_tls_force_insecure_host_tlsa_lookup (no)
- Lookup the associated DANE TLSA RRset even when a hostname is
+ Lookup the associated DANE TLSA RRset even when a hostname is
not an alias and its address records lie in an unsigned zone.
tls_dane_trust_anchor_digest_enable (yes)
@@ -550,49 +551,49 @@ SMTP(8) SMTP(8)
The name of the tlsmgr(8) service entry in master.cf.
OBSOLETE STARTTLS CONTROLS
- The following configuration parameters exist for compatibility with
- Postfix versions before 2.3. Support for these will be removed in a
+ The following configuration parameters exist for compatibility with
+ Postfix versions before 2.3. Support for these will be removed in a
future release.
smtp_use_tls (no)
- Opportunistic mode: use TLS when a remote SMTP server announces
+ Opportunistic mode: use TLS when a remote SMTP server announces
STARTTLS support, otherwise send the mail in the clear.
smtp_enforce_tls (no)
- Enforcement mode: require that remote SMTP servers use TLS
+ Enforcement mode: require that remote SMTP servers use TLS
encryption, and never send mail in the clear.
smtp_tls_enforce_peername (yes)
- With mandatory TLS encryption, require that the remote SMTP
- server hostname matches the information in the remote SMTP
+ With mandatory TLS encryption, require that the remote SMTP
+ server hostname matches the information in the remote SMTP
server certificate.
smtp_tls_per_site (empty)
- Optional lookup tables with the Postfix SMTP client TLS usage
- policy by next-hop destination and by remote SMTP server host-
+ Optional lookup tables with the Postfix SMTP client TLS usage
+ policy by next-hop destination and by remote SMTP server host-
name.
smtp_tls_cipherlist (empty)
- Obsolete Postfix < 2.3 control for the Postfix SMTP client TLS
+ Obsolete Postfix < 2.3 control for the Postfix SMTP client TLS
cipher list.
RESOURCE AND RATE CONTROLS
smtp_destination_concurrency_limit ($default_destination_concur-
rency_limit)
- The maximal number of parallel deliveries to the same destina-
+ The maximal number of parallel deliveries to the same destina-
tion via the smtp message delivery transport.
smtp_destination_recipient_limit ($default_destination_recipient_limit)
- The maximal number of recipients per message for the smtp mes-
+ The maximal number of recipients per message for the smtp mes-
sage delivery transport.
smtp_connect_timeout (30s)
- The Postfix SMTP client time limit for completing a TCP connec-
+ The Postfix SMTP client time limit for completing a TCP connec-
tion, or zero (use the operating system built-in time limit).
smtp_helo_timeout (300s)
- The Postfix SMTP client time limit for sending the HELO or EHLO
- command, and for receiving the initial remote SMTP server
+ The Postfix SMTP client time limit for sending the HELO or EHLO
+ command, and for receiving the initial remote SMTP server
response.
lmtp_lhlo_timeout (300s)
@@ -604,19 +605,19 @@ SMTP(8) SMTP(8)
mand, and for receiving the remote SMTP server response.
smtp_mail_timeout (300s)
- The Postfix SMTP client time limit for sending the MAIL FROM
+ The Postfix SMTP client time limit for sending the MAIL FROM
command, and for receiving the remote SMTP server response.
smtp_rcpt_timeout (300s)
- The Postfix SMTP client time limit for sending the SMTP RCPT TO
+ The Postfix SMTP client time limit for sending the SMTP RCPT TO
command, and for receiving the remote SMTP server response.
smtp_data_init_timeout (120s)
- The Postfix SMTP client time limit for sending the SMTP DATA
+ The Postfix SMTP client time limit for sending the SMTP DATA
command, and for receiving the remote SMTP server response.
smtp_data_xfer_timeout (180s)
- The Postfix SMTP client time limit for sending the SMTP message
+ The Postfix SMTP client time limit for sending the SMTP message
content.
smtp_data_done_timeout (600s)
@@ -630,13 +631,13 @@ SMTP(8) SMTP(8)
Available in Postfix version 2.1 and later:
smtp_mx_address_limit (5)
- The maximal number of MX (mail exchanger) IP addresses that can
- result from Postfix SMTP client mail exchanger lookups, or zero
+ The maximal number of MX (mail exchanger) IP addresses that can
+ result from Postfix SMTP client mail exchanger lookups, or zero
(no limit).
smtp_mx_session_limit (2)
- The maximal number of SMTP sessions per delivery request before
- the Postfix SMTP client gives up or delivers to a fall-back
+ The maximal number of SMTP sessions per delivery request before
+ the Postfix SMTP client gives up or delivers to a fall-back
relay host, or zero (no limit).
smtp_rset_timeout (20s)
@@ -646,17 +647,17 @@ SMTP(8) SMTP(8)
Available in Postfix version 2.2 and earlier:
lmtp_cache_connection (yes)
- Keep Postfix LMTP client connections open for up to $max_idle
+ Keep Postfix LMTP client connections open for up to $max_idle
seconds.
Available in Postfix version 2.2 and later:
smtp_connection_cache_destinations (empty)
- Permanently enable SMTP connection caching for the specified
+ Permanently enable SMTP connection caching for the specified
destinations.
smtp_connection_cache_on_demand (yes)
- Temporarily enable SMTP connection caching while a destination
+ Temporarily enable SMTP connection caching while a destination
has a high volume of mail in the active queue.
smtp_connection_reuse_time_limit (300s)
@@ -670,37 +671,37 @@ SMTP(8) SMTP(8)
Available in Postfix version 2.3 and later:
connection_cache_protocol_timeout (5s)
- Time limit for connection cache connect, send or receive opera-
+ Time limit for connection cache connect, send or receive opera-
tions.
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).
Available in Postfix version 2.11 and later:
smtp_connection_reuse_count_limit (0)
- When SMTP connection caching is enabled, the number of times
- that an SMTP session may be reused before it is closed, or zero
+ When SMTP connection caching is enabled, the number of times
+ that an SMTP session may be reused before it is closed, or zero
(no limit).
TROUBLE SHOOTING CONTROLS
debug_peer_level (2)
- The increment in verbose logging level when a remote client or
+ The increment in verbose logging level when a remote client or
server matches a pattern in the debug_peer_list parameter.
debug_peer_list (empty)
- Optional list of remote client or server hostname or network
+ Optional list of remote client or server hostname or network
address patterns that cause the verbose logging level to
increase by the amount specified in $debug_peer_level.
error_notice_recipient (postmaster)
- The recipient of postmaster notifications about mail delivery
+ The recipient of postmaster notifications about mail delivery
problems that are caused by policy, resource, software or proto-
col errors.
@@ -714,46 +715,46 @@ SMTP(8) SMTP(8)
MISCELLANEOUS CONTROLS
best_mx_transport (empty)
- Where the Postfix SMTP client should deliver mail when it
+ Where the Postfix SMTP client should deliver mail when it
detects a "mail loops back to myself" error condition.
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.
disable_dns_lookups (no)
Disable DNS lookups in the Postfix SMTP and LMTP clients.
inet_interfaces (all)
- The network interface addresses that this mail system receives
+ The network interface addresses that this mail system receives
mail on.
inet_protocols (all)
- The Internet protocols Postfix will attempt to use when making
+ The Internet protocols Postfix will attempt to use when making
or accepting connections.
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.
lmtp_assume_final (no)
- When a remote LMTP server announces no DSN support, assume that
- the server performs final delivery, and send "delivered" deliv-
+ When a remote LMTP server announces no DSN support, assume that
+ the server performs final delivery, and send "delivered" deliv-
ery status notifications instead of "relayed".
lmtp_tcp_port (24)
The default TCP port that the Postfix LMTP client connects to.
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)
@@ -767,20 +768,20 @@ SMTP(8) SMTP(8)
The process name of a Postfix command or daemon process.
proxy_interfaces (empty)
- The network interface addresses that this mail system receives
+ The network interface addresses that this mail system receives
mail on by way of a proxy or network address translation unit.
smtp_address_preference (any)
The address type ("ipv6", "ipv4" or "any") that the Postfix SMTP
- client will try first, when a destination has IPv6 and IPv4
+ client will try first, when a destination has IPv6 and IPv4
addresses with equal MX preference.
smtp_bind_address (empty)
- An optional numerical network address that the Postfix SMTP
+ An optional numerical network address that the Postfix SMTP
client should bind to when making an IPv4 connection.
smtp_bind_address6 (empty)
- An optional numerical network address that the Postfix SMTP
+ An optional numerical network address that the Postfix SMTP
client should bind to when making an IPv6 connection.
smtp_helo_name ($myhostname)
@@ -800,8 +801,8 @@ SMTP(8) SMTP(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".
Available with Postfix 2.2 and earlier:
diff --git a/postfix/html/local.8.html b/postfix/html/local.8.html
index 8d450937f..67245eb16 100644
--- a/postfix/html/local.8.html
+++ b/postfix/html/local.8.html
@@ -360,43 +360,44 @@ LOCAL(8) LOCAL(8)
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.
+ local_delivery_status_filter ($default_delivery_status_filter)
+ Optional filter for the local(8) delivery agent to change the
+ status code or explanatory text of successful or unsuccessful
+ deliveries.
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)
@@ -408,17 +409,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
@@ -427,15 +428,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
@@ -448,18 +449,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
@@ -470,49 +471,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)
@@ -520,7 +521,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)
@@ -528,8 +529,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)
@@ -539,15 +540,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)
@@ -558,8 +559,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
@@ -582,10 +583,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 1ecbcaac1..8c21f4c7e 100644
--- a/postfix/html/pipe.8.html
+++ b/postfix/html/pipe.8.html
@@ -449,9 +449,10 @@ PIPE(8) PIPE(8)
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.
+ pipe_delivery_status_filter ($default_delivery_status_filter)
+ Optional filter for the pipe(8) delivery agent to change the
+ delivery status code or explanatory text of successful or unsuc-
+ cessful deliveries.
SEE ALSO
qmgr(8), queue manager
diff --git a/postfix/html/postconf.5.html b/postfix/html/postconf.5.html
index f6ddb475f..316f0fb12 100644
--- a/postfix/html/postconf.5.html
+++ b/postfix/html/postconf.5.html
@@ -1756,74 +1756,6 @@ Example:
-
-
-default_bounce_defer_filter
-(default: empty)
-
- Optional filter to change arbitrary hard delivery errors into
-soft errors and vice versa. This is implemented by rewriting the
-three-number enhanced status code and the explanatory text in a
-Postfix delivery agent bounce/defer message.
-
- Specify zero or more "type:table" lookup table names, separated
-by comma or whitespace. With each bounce or defer request, the
-tables are queried in the specified order with one line of text
-that is structured as follows:
-
-
-enhanced-status-code SPACE explanatory-text
-
-
- The first table match wins. The lookup result must have the
-same structure as the query: enhanced status codes must have a
-first numerical field of 4 (defer) or 5 (bounce), and the explanatory
-text field must be non-empty. Other results will result in a warning.
-
-
- Example:
-
- The following example turns specific soft TLS errors into hard
-errors, by overriding the first number in the enhanced status code.
-
-
-
-
-/etc/postfix/main.cf:
- smtp_bounce_defer_filter = pcre:/etc/postfix/smtp_ndr_filter
-
-
-
-
-
-/etc/postfix/smtp_ndr_filter:
- /^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
- # Do not change the following into hard bounces. They may
- # result from a local configuration problem.
- # 4.\d+.\d+ TLS is required, but our TLS engine is unavailable
- # 4.\d+.\d+ TLS is required, but unavailable
- # 4.\d+.\d+ Cannot start TLS: handshake failure
-
-
-
- Notes:
-
-
-
--
This feature will NOT override the soft_bounce safety net.
-
- -
This feature will change the enhanced status code and text
-that is logged to the maillog file, and that is reported to the
-sender.
-
-
-
- This feature is available in Postfix 2.12 and later.
-
-
default_database_type
@@ -1952,6 +1884,93 @@ name of the message delivery transport.
+
+
+default_delivery_status_filter
+(default: empty)
+
+ Optional filter to replace the delivery status code or explanatory
+text of successful or unsuccessful deliveries. This does, however,
+not allow the replacement of a successful status code (2.X.X) with
+an unsuccessful status code (4.X.X or 5.X.X) or vice versa.
+
+ Specify zero or more "type:table" lookup table names, separated
+by comma or whitespace. With each bounce or defer request, the
+tables are queried in the specified order with one line of text
+that is structured as follows:
+
+
+enhanced-status-code SPACE explanatory-text
+
+
+ The first table match wins. The lookup result must have the
+same structure as the query, a successful status code (2.X.X) must
+be replaced with a successful status code, an unsuccessful status
+code (4.X.X or 5.X.X) must be replaced with an unsuccessful status
+code, and the explanatory text field must be non-empty. Other results
+will result in a warning.
+
+ Example 1: convert specific soft TLS errors into hard errors,
+by overriding the first number in the enhanced status code.
+
+
+
+/etc/postfix/main.cf:
+ smtp_delivery_status_filter = pcre:/etc/postfix/smtp_dsn_filter
+
+
+
+
+
+/etc/postfix/smtp_dsn_filter:
+ /^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
+ # Do not change the following into hard bounces. They may
+ # result from a local configuration problem.
+ # 4.\d+.\d+ TLS is required, but our TLS engine is unavailable
+ # 4.\d+.\d+ TLS is required, but unavailable
+ # 4.\d+.\d+ Cannot start TLS: handshake failure
+
+
+
+ Example 2: censor the per-recipient delivery status text so
+that it does not not reveal the destination command or filename
+when a remote sender requests confirmation of successful delivery.
+
+
+
+
+/etc/postfix/main.cf:
+ local_delivery_status_filter = pcre:/etc/postfix/local_dsn_filter
+
+
+
+
+
+/etc/postfix/local_dsn_filter:
+ /^(2\S+ delivered to file).+/ $1
+ /^(2\S+ delivered to command).+/ $1
+
+
+
+ Notes:
+
+
+
+-
This feature will NOT override the soft_bounce safety net.
+
+ -
This feature will change the enhanced status code and text
+that is logged to the maillog file, and that is reported to the
+sender in delivery confirmation or non-delivery notifications.
+
+
+
+
+ This feature is available in Postfix 2.12 and later.
+
+
default_destination_concurrency_failed_cohort_limit
@@ -3920,17 +3939,6 @@ parameter. See there for details.
This feature is available in Postfix 2.5 and later.
-
-
-lmtp_bounce_defer_filter
-(default: empty)
-
- The LMTP-specific version of the smtp_bounce_defer_filter
-configuration parameter. See there for details.
-
- This feature is available in Postfix 2.12 and later.
-
-
lmtp_cache_connection
@@ -4132,6 +4140,17 @@ configuration parameter. See there for details.
This feature is available in Postfix 2.3 and later.
+
+
+lmtp_delivery_status_filter
+(default: empty)
+
+ The LMTP-specific version of the smtp_delivery_status_filter
+configuration parameter. See there for details.
+
+ This feature is available in Postfix 2.12 and later.
+
+
lmtp_destination_concurrency_limit
@@ -5127,18 +5146,6 @@ 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
@@ -5169,6 +5176,18 @@ Example:
+
+
+local_delivery_status_filter
+(default: $default_delivery_status_filter)
+
+ Optional filter for the local(8) delivery agent to change the
+status code or explanatory text of successful or unsuccessful
+deliveries. See default_delivery_status_filter for details.
+
+ This feature is available in Postfix 2.12 and later.
+
+
local_destination_concurrency_limit
@@ -7013,12 +7032,12 @@ This feature is available in Postfix 2.0 and later.
-pipe_bounce_defer_filter
-(default: $default_bounce_defer_filter)
+pipe_delivery_status_filter
+(default: $default_delivery_status_filter)
- Optional filter to change arbitrary hard delivery errors into
-soft errors and vice versa in the pipe(8) delivery agent. See
-default_bounce_defer_filter for details.
+ Optional filter for the pipe(8) delivery agent to change the
+delivery status code or explanatory text of successful or unsuccessful
+deliveries. See default_delivery_status_filter for details.
This feature is available in Postfix 2.12 and later.
@@ -9588,22 +9607,6 @@ that change the delivery time or destination are not available.
This feature is available in Postfix 2.5 and later.
-
-
-smtp_bounce_defer_filter
-(default: $default_bounce_defer_filter)
-
- Optional filter to change arbitrary hard delivery errors into
-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
-remote SMTP server responses. In contrast, the smtp_reply_filter
-feature modifies remote SMTP server responses that may result in
-email non-delivery or delivery.
-
-
smtp_cname_overrides_servername
@@ -9868,6 +9871,21 @@ This feature is available in Postfix 2.1 and later.
+
+
+smtp_delivery_status_filter
+(default: $default_delivery_status_filter)
+
+ Optional filter for the smtp(8) delivery agent to change the
+delivery status code or explanatory text of successful or unsuccessful
+deliveries. See default_delivery_status_filter for details.
+
+ NOTE: This feature modifies Postfix SMTP client error or non-error
+messages that may or may not be derived from remote SMTP server
+responses. In contrast, the smtp_reply_filter feature modifies
+remote SMTP server responses only.
+
+
smtp_destination_concurrency_limit
@@ -18219,12 +18237,12 @@ This feature is available in Postfix 2.1 and later.
-virtual_bounce_defer_filter
-(default: $default_bounce_defer_filter)
+virtual_delivery_status_filter
+(default: $default_delivery_status_filter)
- Optional filter to change arbitrary hard delivery errors into
-soft errors and vice versa in the virtual(8) delivery agent. See
-default_bounce_defer_filter for details.
+ Optional filter for the virtual(8) delivery agent to change the
+delivery status code or explanatory text of successful or unsuccessful
+deliveries. See default_delivery_status_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 bbbcc1a26..6a85843d1 100644
--- a/postfix/html/smtp.8.html
+++ b/postfix/html/smtp.8.html
@@ -292,9 +292,10 @@ SMTP(8) SMTP(8)
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.
+ smtp_delivery_status_filter ($default_delivery_status_filter)
+ Optional filter for the smtp(8) delivery agent to change the
+ delivery status code or explanatory text of successful or unsuc-
+ cessful deliveries.
MIME PROCESSING CONTROLS
Available in Postfix version 2.0 and later:
@@ -312,7 +313,7 @@ SMTP(8) SMTP(8)
Available in Postfix version 2.1 and later:
smtp_send_xforward_command (no)
- Send the non-standard XFORWARD command when the Postfix SMTP
+ Send the non-standard XFORWARD command when the Postfix SMTP
server EHLO response announces XFORWARD support.
SASL AUTHENTICATION CONTROLS
@@ -320,62 +321,62 @@ SMTP(8) SMTP(8)
Enable SASL authentication in the Postfix SMTP client.
smtp_sasl_password_maps (empty)
- Optional Postfix SMTP client lookup tables with one user-
- name:password entry per remote hostname or domain, or sender
+ Optional Postfix SMTP client lookup tables with one user-
+ name:password entry per remote hostname or domain, or sender
address when sender-dependent authentication is enabled.
smtp_sasl_security_options (noplaintext, noanonymous)
Postfix SMTP client SASL security options; as of Postfix 2.3 the
- list of available features depends on the SASL client implemen-
+ list of available features depends on the SASL client implemen-
tation that is selected with smtp_sasl_type.
Available in Postfix version 2.2 and later:
smtp_sasl_mechanism_filter (empty)
- If non-empty, a Postfix SMTP client filter for the remote SMTP
+ If non-empty, a Postfix SMTP client filter for the remote SMTP
server's list of offered SASL mechanisms.
Available in Postfix version 2.3 and later:
smtp_sender_dependent_authentication (no)
Enable sender-dependent authentication in the Postfix SMTP
- client; this is available only with SASL authentication, and
- disables SMTP connection caching to ensure that mail from dif-
+ client; this is available only with SASL authentication, and
+ disables SMTP connection caching to ensure that mail from dif-
ferent senders will use the appropriate credentials.
smtp_sasl_path (empty)
Implementation-specific information that the Postfix SMTP client
- passes through to the SASL plug-in implementation that is
+ passes through to the SASL plug-in implementation that is
selected with smtp_sasl_type.
smtp_sasl_type (cyrus)
- The SASL plug-in type that the Postfix SMTP client should use
+ The SASL plug-in type that the Postfix SMTP client should use
for authentication.
Available in Postfix version 2.5 and later:
smtp_sasl_auth_cache_name (empty)
- An optional table to prevent repeated SASL authentication fail-
- ures with the same remote SMTP server hostname, username and
+ An optional table to prevent repeated SASL authentication fail-
+ ures with the same remote SMTP server hostname, username and
password.
smtp_sasl_auth_cache_time (90d)
- The maximal age of an smtp_sasl_auth_cache_name entry before it
+ The maximal age of an smtp_sasl_auth_cache_name entry before it
is removed.
smtp_sasl_auth_soft_bounce (yes)
- When a remote SMTP server rejects a SASL authentication request
- with a 535 reply code, defer mail delivery instead of returning
+ When a remote SMTP server rejects a SASL authentication request
+ with a 535 reply code, defer mail delivery instead of returning
mail as undeliverable.
Available in Postfix version 2.9 and later:
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.
STARTTLS SUPPORT CONTROLS
- Detailed information about STARTTLS configuration may be found in the
+ Detailed information about STARTTLS configuration may be found in the
TLS_README document.
smtp_tls_security_level (empty)
@@ -385,20 +386,20 @@ SMTP(8) SMTP(8)
smtp_tls_enforce_peername.
smtp_sasl_tls_security_options ($smtp_sasl_security_options)
- The SASL authentication security options that the Postfix SMTP
+ The SASL authentication security options that the Postfix SMTP
client uses for TLS encrypted SMTP sessions.
smtp_starttls_timeout (300s)
- Time limit for Postfix SMTP client write and read operations
+ Time limit for Postfix SMTP client write and read operations
during TLS startup and shutdown handshake procedures.
smtp_tls_CAfile (empty)
- A file containing CA certificates of root CAs trusted to sign
- either remote SMTP server certificates or intermediate CA cer-
+ A file containing CA certificates of root CAs trusted to sign
+ either remote SMTP server certificates or intermediate CA cer-
tificates.
smtp_tls_CApath (empty)
- Directory with PEM format certificate authority certificates
+ Directory with PEM format certificate authority certificates
that the Postfix SMTP client uses to verify a remote SMTP server
certificate.
@@ -406,7 +407,7 @@ SMTP(8) SMTP(8)
File with the Postfix SMTP client RSA certificate in PEM format.
smtp_tls_mandatory_ciphers (medium)
- The minimum TLS cipher grade that the Postfix SMTP client will
+ The minimum TLS cipher grade that the Postfix SMTP client will
use with mandatory TLS encryption.
smtp_tls_exclude_ciphers (empty)
@@ -414,8 +415,8 @@ SMTP(8) SMTP(8)
client cipher list at all TLS security levels.
smtp_tls_mandatory_exclude_ciphers (empty)
- Additional list of ciphers or cipher types to exclude from the
- Postfix SMTP client cipher list at mandatory TLS security lev-
+ Additional list of ciphers or cipher types to exclude from the
+ Postfix SMTP client cipher list at mandatory TLS security lev-
els.
smtp_tls_dcert_file (empty)
@@ -431,7 +432,7 @@ SMTP(8) SMTP(8)
Enable additional Postfix SMTP client logging of TLS activity.
smtp_tls_note_starttls_offer (no)
- Log the hostname of a remote SMTP server that offers STARTTLS,
+ Log the hostname of a remote SMTP server that offers STARTTLS,
when TLS is not already enabled for that server.
smtp_tls_policy_maps (empty)
@@ -440,14 +441,14 @@ SMTP(8) SMTP(8)
fied, this overrides the obsolete smtp_tls_per_site parameter.
smtp_tls_mandatory_protocols (!SSLv2)
- List of SSL/TLS protocols that the Postfix SMTP client will use
+ List of SSL/TLS protocols that the Postfix SMTP client will use
with mandatory TLS encryption.
smtp_tls_scert_verifydepth (9)
The verification depth for remote SMTP server certificates.
smtp_tls_secure_cert_match (nexthop, dot-nexthop)
- How the Postfix SMTP client verifies the server certificate
+ How the Postfix SMTP client verifies the server certificate
peername for the "secure" TLS security level.
smtp_tls_session_cache_database (empty)
@@ -455,16 +456,16 @@ SMTP(8) SMTP(8)
session cache.
smtp_tls_session_cache_timeout (3600s)
- The expiration time of Postfix SMTP client TLS session cache
+ The expiration time of Postfix SMTP client TLS session cache
information.
smtp_tls_verify_cert_match (hostname)
- How the Postfix SMTP client verifies the server certificate
+ How the Postfix SMTP client verifies the server certificate
peername for the "verify" TLS security level.
tls_daemon_random_bytes (32)
- The number of pseudo-random bytes that an smtp(8) or smtpd(8)
- process requests from the tlsmgr(8) server in order to seed its
+ The number of pseudo-random bytes that an smtp(8) or smtpd(8)
+ process requests from the tlsmgr(8) server in order to seed its
internal pseudo random number generator (PRNG).
tls_high_cipherlist (ALL:!EXPORT:!LOW:!MEDIUM:+RC4:@STRENGTH)
@@ -480,52 +481,52 @@ SMTP(8) SMTP(8)
The OpenSSL cipherlist for "EXPORT" or higher grade ciphers.
tls_null_cipherlist (eNULL:!aNULL)
- The OpenSSL cipherlist for "NULL" grade ciphers that provide
+ The OpenSSL cipherlist for "NULL" grade ciphers that provide
authentication without encryption.
Available in Postfix version 2.4 and later:
smtp_sasl_tls_verified_security_options ($smtp_sasl_tls_secu-
rity_options)
- The SASL authentication security options that the Postfix SMTP
- client uses for TLS encrypted SMTP sessions with a verified
+ The SASL authentication security options that the Postfix SMTP
+ client uses for TLS encrypted SMTP sessions with a verified
server certificate.
Available in Postfix version 2.5 and later:
smtp_tls_fingerprint_cert_match (empty)
- List of acceptable remote SMTP server certificate fingerprints
- for the "fingerprint" TLS security level (smtp_tls_secu-
+ List of acceptable remote SMTP server certificate fingerprints
+ for the "fingerprint" TLS security level (smtp_tls_secu-
rity_level = fingerprint).
smtp_tls_fingerprint_digest (md5)
- The message digest algorithm used to construct remote SMTP
+ The message digest algorithm used to construct remote SMTP
server certificate fingerprints.
Available in Postfix version 2.6 and later:
smtp_tls_protocols (!SSLv2)
- List of TLS protocols that the Postfix SMTP client will exclude
+ List of TLS protocols that the Postfix SMTP client will exclude
or include with opportunistic TLS encryption.
smtp_tls_ciphers (export)
- The minimum TLS cipher grade that the Postfix SMTP client will
+ The minimum TLS cipher grade that the Postfix SMTP client will
use with opportunistic TLS encryption.
smtp_tls_eccert_file (empty)
- File with the Postfix SMTP client ECDSA certificate in PEM for-
+ File with the Postfix SMTP client ECDSA certificate in PEM for-
mat.
smtp_tls_eckey_file ($smtp_tls_eccert_file)
- File with the Postfix SMTP client ECDSA private key in PEM for-
+ File with the Postfix SMTP client ECDSA private key in PEM for-
mat.
Available in Postfix version 2.7 and later:
smtp_tls_block_early_mail_reply (no)
- Try to detect a mail hijacking attack based on a TLS protocol
- vulnerability (CVE-2009-3555), where an attacker prepends mali-
- cious HELO, MAIL, RCPT, DATA commands to a Postfix SMTP client
+ Try to detect a mail hijacking attack based on a TLS protocol
+ vulnerability (CVE-2009-3555), where an attacker prepends mali-
+ cious HELO, MAIL, RCPT, DATA commands to a Postfix SMTP client
TLS session.
Available in Postfix version 2.8 and later:
@@ -536,11 +537,11 @@ SMTP(8) SMTP(8)
Available in Postfix version 2.11 and later:
smtp_tls_trust_anchor_file (empty)
- Zero or more PEM-format files with trust-anchor certificates
+ Zero or more PEM-format files with trust-anchor certificates
and/or public keys.
smtp_tls_force_insecure_host_tlsa_lookup (no)
- Lookup the associated DANE TLSA RRset even when a hostname is
+ Lookup the associated DANE TLSA RRset even when a hostname is
not an alias and its address records lie in an unsigned zone.
tls_dane_trust_anchor_digest_enable (yes)
@@ -550,49 +551,49 @@ SMTP(8) SMTP(8)
The name of the tlsmgr(8) service entry in master.cf.
OBSOLETE STARTTLS CONTROLS
- The following configuration parameters exist for compatibility with
- Postfix versions before 2.3. Support for these will be removed in a
+ The following configuration parameters exist for compatibility with
+ Postfix versions before 2.3. Support for these will be removed in a
future release.
smtp_use_tls (no)
- Opportunistic mode: use TLS when a remote SMTP server announces
+ Opportunistic mode: use TLS when a remote SMTP server announces
STARTTLS support, otherwise send the mail in the clear.
smtp_enforce_tls (no)
- Enforcement mode: require that remote SMTP servers use TLS
+ Enforcement mode: require that remote SMTP servers use TLS
encryption, and never send mail in the clear.
smtp_tls_enforce_peername (yes)
- With mandatory TLS encryption, require that the remote SMTP
- server hostname matches the information in the remote SMTP
+ With mandatory TLS encryption, require that the remote SMTP
+ server hostname matches the information in the remote SMTP
server certificate.
smtp_tls_per_site (empty)
- Optional lookup tables with the Postfix SMTP client TLS usage
- policy by next-hop destination and by remote SMTP server host-
+ Optional lookup tables with the Postfix SMTP client TLS usage
+ policy by next-hop destination and by remote SMTP server host-
name.
smtp_tls_cipherlist (empty)
- Obsolete Postfix < 2.3 control for the Postfix SMTP client TLS
+ Obsolete Postfix < 2.3 control for the Postfix SMTP client TLS
cipher list.
RESOURCE AND RATE CONTROLS
smtp_destination_concurrency_limit ($default_destination_concur-
rency_limit)
- The maximal number of parallel deliveries to the same destina-
+ The maximal number of parallel deliveries to the same destina-
tion via the smtp message delivery transport.
smtp_destination_recipient_limit ($default_destination_recipient_limit)
- The maximal number of recipients per message for the smtp mes-
+ The maximal number of recipients per message for the smtp mes-
sage delivery transport.
smtp_connect_timeout (30s)
- The Postfix SMTP client time limit for completing a TCP connec-
+ The Postfix SMTP client time limit for completing a TCP connec-
tion, or zero (use the operating system built-in time limit).
smtp_helo_timeout (300s)
- The Postfix SMTP client time limit for sending the HELO or EHLO
- command, and for receiving the initial remote SMTP server
+ The Postfix SMTP client time limit for sending the HELO or EHLO
+ command, and for receiving the initial remote SMTP server
response.
lmtp_lhlo_timeout (300s)
@@ -604,19 +605,19 @@ SMTP(8) SMTP(8)
mand, and for receiving the remote SMTP server response.
smtp_mail_timeout (300s)
- The Postfix SMTP client time limit for sending the MAIL FROM
+ The Postfix SMTP client time limit for sending the MAIL FROM
command, and for receiving the remote SMTP server response.
smtp_rcpt_timeout (300s)
- The Postfix SMTP client time limit for sending the SMTP RCPT TO
+ The Postfix SMTP client time limit for sending the SMTP RCPT TO
command, and for receiving the remote SMTP server response.
smtp_data_init_timeout (120s)
- The Postfix SMTP client time limit for sending the SMTP DATA
+ The Postfix SMTP client time limit for sending the SMTP DATA
command, and for receiving the remote SMTP server response.
smtp_data_xfer_timeout (180s)
- The Postfix SMTP client time limit for sending the SMTP message
+ The Postfix SMTP client time limit for sending the SMTP message
content.
smtp_data_done_timeout (600s)
@@ -630,13 +631,13 @@ SMTP(8) SMTP(8)
Available in Postfix version 2.1 and later:
smtp_mx_address_limit (5)
- The maximal number of MX (mail exchanger) IP addresses that can
- result from Postfix SMTP client mail exchanger lookups, or zero
+ The maximal number of MX (mail exchanger) IP addresses that can
+ result from Postfix SMTP client mail exchanger lookups, or zero
(no limit).
smtp_mx_session_limit (2)
- The maximal number of SMTP sessions per delivery request before
- the Postfix SMTP client gives up or delivers to a fall-back
+ The maximal number of SMTP sessions per delivery request before
+ the Postfix SMTP client gives up or delivers to a fall-back
relay host, or zero (no limit).
smtp_rset_timeout (20s)
@@ -646,17 +647,17 @@ SMTP(8) SMTP(8)
Available in Postfix version 2.2 and earlier:
lmtp_cache_connection (yes)
- Keep Postfix LMTP client connections open for up to $max_idle
+ Keep Postfix LMTP client connections open for up to $max_idle
seconds.
Available in Postfix version 2.2 and later:
smtp_connection_cache_destinations (empty)
- Permanently enable SMTP connection caching for the specified
+ Permanently enable SMTP connection caching for the specified
destinations.
smtp_connection_cache_on_demand (yes)
- Temporarily enable SMTP connection caching while a destination
+ Temporarily enable SMTP connection caching while a destination
has a high volume of mail in the active queue.
smtp_connection_reuse_time_limit (300s)
@@ -670,37 +671,37 @@ SMTP(8) SMTP(8)
Available in Postfix version 2.3 and later:
connection_cache_protocol_timeout (5s)
- Time limit for connection cache connect, send or receive opera-
+ Time limit for connection cache connect, send or receive opera-
tions.
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).
Available in Postfix version 2.11 and later:
smtp_connection_reuse_count_limit (0)
- When SMTP connection caching is enabled, the number of times
- that an SMTP session may be reused before it is closed, or zero
+ When SMTP connection caching is enabled, the number of times
+ that an SMTP session may be reused before it is closed, or zero
(no limit).
TROUBLE SHOOTING CONTROLS
debug_peer_level (2)
- The increment in verbose logging level when a remote client or
+ The increment in verbose logging level when a remote client or
server matches a pattern in the debug_peer_list parameter.
debug_peer_list (empty)
- Optional list of remote client or server hostname or network
+ Optional list of remote client or server hostname or network
address patterns that cause the verbose logging level to
increase by the amount specified in $debug_peer_level.
error_notice_recipient (postmaster)
- The recipient of postmaster notifications about mail delivery
+ The recipient of postmaster notifications about mail delivery
problems that are caused by policy, resource, software or proto-
col errors.
@@ -714,46 +715,46 @@ SMTP(8) SMTP(8)
MISCELLANEOUS CONTROLS
best_mx_transport (empty)
- Where the Postfix SMTP client should deliver mail when it
+ Where the Postfix SMTP client should deliver mail when it
detects a "mail loops back to myself" error condition.
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.
disable_dns_lookups (no)
Disable DNS lookups in the Postfix SMTP and LMTP clients.
inet_interfaces (all)
- The network interface addresses that this mail system receives
+ The network interface addresses that this mail system receives
mail on.
inet_protocols (all)
- The Internet protocols Postfix will attempt to use when making
+ The Internet protocols Postfix will attempt to use when making
or accepting connections.
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.
lmtp_assume_final (no)
- When a remote LMTP server announces no DSN support, assume that
- the server performs final delivery, and send "delivered" deliv-
+ When a remote LMTP server announces no DSN support, assume that
+ the server performs final delivery, and send "delivered" deliv-
ery status notifications instead of "relayed".
lmtp_tcp_port (24)
The default TCP port that the Postfix LMTP client connects to.
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)
@@ -767,20 +768,20 @@ SMTP(8) SMTP(8)
The process name of a Postfix command or daemon process.
proxy_interfaces (empty)
- The network interface addresses that this mail system receives
+ The network interface addresses that this mail system receives
mail on by way of a proxy or network address translation unit.
smtp_address_preference (any)
The address type ("ipv6", "ipv4" or "any") that the Postfix SMTP
- client will try first, when a destination has IPv6 and IPv4
+ client will try first, when a destination has IPv6 and IPv4
addresses with equal MX preference.
smtp_bind_address (empty)
- An optional numerical network address that the Postfix SMTP
+ An optional numerical network address that the Postfix SMTP
client should bind to when making an IPv4 connection.
smtp_bind_address6 (empty)
- An optional numerical network address that the Postfix SMTP
+ An optional numerical network address that the Postfix SMTP
client should bind to when making an IPv6 connection.
smtp_helo_name ($myhostname)
@@ -800,8 +801,8 @@ SMTP(8) SMTP(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".
Available with Postfix 2.2 and earlier:
diff --git a/postfix/html/virtual.8.html b/postfix/html/virtual.8.html
index fd1c83ed4..4b0635432 100644
--- a/postfix/html/virtual.8.html
+++ b/postfix/html/virtual.8.html
@@ -263,9 +263,10 @@ VIRTUAL(8) VIRTUAL(8)
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 in the virtual(8) delivery agent.
+ virtual_delivery_status_filter ($default_delivery_status_filter)
+ Optional filter for the virtual(8) delivery agent to change the
+ delivery status code or explanatory text of successful or unsuc-
+ cessful deliveries.
SEE ALSO
qmgr(8), queue manager
@@ -282,15 +283,15 @@ VIRTUAL(8) VIRTUAL(8)
The Secure Mailer license must be distributed with this software.
HISTORY
- This delivery agent was originally based on the Postfix local delivery
- agent. Modifications mainly consisted of removing code that either was
+ This delivery agent was originally based on the Postfix local delivery
+ agent. Modifications mainly consisted of removing code that either was
not applicable or that was not safe in this context: aliases,
~user/.forward files, delivery to "|command" or to /file/name.
- 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/man/man5/postconf.5 b/postfix/man/man5/postconf.5
index 6a989d565..43dfa2d9b 100644
--- a/postfix/man/man5/postconf.5
+++ b/postfix/man/man5/postconf.5
@@ -1021,71 +1021,6 @@ debugger_command =
.fi
.ad
.ft R
-.SH default_bounce_defer_filter (default: empty)
-Optional filter to change arbitrary hard delivery errors into
-soft errors and vice versa. This is implemented by rewriting the
-three-number enhanced status code and the explanatory text in a
-Postfix delivery agent bounce/defer message.
-.PP
-Specify zero or more "type:table" lookup table names, separated
-by comma or whitespace. With each bounce or defer request, the
-tables are queried in the specified order with one line of text
-that is structured as follows:
-.sp
-.in +4
-enhanced-status-code SPACE explanatory-text
-.in -4
-.PP
-The first table match wins. The lookup result must have the
-same structure as the query: enhanced status codes must have a
-first numerical field of 4 (defer) or 5 (bounce), and the explanatory
-text field must be non-empty. Other results will result in a warning.
-.PP
-Example:
-.PP
-The following example turns specific soft TLS errors into hard
-errors, by overriding the first number in the enhanced status code.
-.sp
-.in +4
-.nf
-.na
-.ft C
-/etc/postfix/main.cf:
- smtp_bounce_defer_filter = pcre:/etc/postfix/smtp_ndr_filter
-.fi
-.ad
-.ft R
-.in -4
-.sp
-.in +4
-.nf
-.na
-.ft C
-/etc/postfix/smtp_ndr_filter:
- /^4(\e.\ed+\e.\ed+ TLS is required, but host \eS+ refused to start TLS: .+)/
- 5$1
- /^4(\e.\ed+\e.\ed+ TLS is required, but was not offered by host .+)/
- 5$1
- # Do not change the following into hard bounces. They may
- # result from a local configuration problem.
- # 4.\ed+.\ed+ TLS is required, but our TLS engine is unavailable
- # 4.\ed+.\ed+ TLS is required, but unavailable
- # 4.\ed+.\ed+ Cannot start TLS: handshake failure
-.fi
-.ad
-.ft R
-.in -4
-.PP
-Notes:
-.IP \(bu
-This feature will NOT override the soft_bounce safety net.
-.IP \(bu
-This feature will change the enhanced status code and text
-that is logged to the maillog file, and that is reported to the
-sender.
-.br
-.PP
-This feature is available in Postfix 2.12 and later.
.SH default_database_type (default: see "postconf -d" output)
The default database type for use in \fBnewaliases\fR(1), \fBpostalias\fR(1)
and \fBpostmap\fR(1) commands. On many UNIX systems the default type is
@@ -1173,6 +1108,98 @@ another preemption can take place later.
Use \fItransport\fR_delivery_slot_loan to specify a
transport-specific override, where \fItransport\fR is the master.cf
name of the message delivery transport.
+.SH default_delivery_status_filter (default: empty)
+Optional filter to replace the delivery status code or explanatory
+text of successful or unsuccessful deliveries. This does, however,
+not allow the replacement of a successful status code (2.X.X) with
+an unsuccessful status code (4.X.X or 5.X.X) or vice versa.
+.PP
+Specify zero or more "type:table" lookup table names, separated
+by comma or whitespace. With each bounce or defer request, the
+tables are queried in the specified order with one line of text
+that is structured as follows:
+.sp
+.in +4
+enhanced-status-code SPACE explanatory-text
+.in -4
+.PP
+The first table match wins. The lookup result must have the
+same structure as the query, a successful status code (2.X.X) must
+be replaced with a successful status code, an unsuccessful status
+code (4.X.X or 5.X.X) must be replaced with an unsuccessful status
+code, and the explanatory text field must be non-empty. Other results
+will result in a warning.
+.PP
+Example 1: convert specific soft TLS errors into hard errors,
+by overriding the first number in the enhanced status code.
+.sp
+.in +4
+.nf
+.na
+.ft C
+/etc/postfix/main.cf:
+ smtp_delivery_status_filter = pcre:/etc/postfix/smtp_dsn_filter
+.fi
+.ad
+.ft R
+.in -4
+.sp
+.in +4
+.nf
+.na
+.ft C
+/etc/postfix/smtp_dsn_filter:
+ /^4(\e.\ed+\e.\ed+ TLS is required, but host \eS+ refused to start TLS: .+)/
+ 5$1
+ /^4(\e.\ed+\e.\ed+ TLS is required, but was not offered by host .+)/
+ 5$1
+ # Do not change the following into hard bounces. They may
+ # result from a local configuration problem.
+ # 4.\ed+.\ed+ TLS is required, but our TLS engine is unavailable
+ # 4.\ed+.\ed+ TLS is required, but unavailable
+ # 4.\ed+.\ed+ Cannot start TLS: handshake failure
+.fi
+.ad
+.ft R
+.in -4
+.PP
+Example 2: censor the per-recipient delivery status text so
+that it does not not reveal the destination command or filename
+when a remote sender requests confirmation of successful delivery.
+.sp
+.in +4
+.nf
+.na
+.ft C
+/etc/postfix/main.cf:
+ local_delivery_status_filter = pcre:/etc/postfix/local_dsn_filter
+.fi
+.ad
+.ft R
+.in -4
+.sp
+.in +4
+.nf
+.na
+.ft C
+/etc/postfix/local_dsn_filter:
+ /^(2\eS+ delivered to file).+/ $1
+ /^(2\eS+ delivered to command).+/ $1
+.fi
+.ad
+.ft R
+.in -4
+.PP
+Notes:
+.IP \(bu
+This feature will NOT override the soft_bounce safety net.
+.IP \(bu
+This feature will change the enhanced status code and text
+that is logged to the maillog file, and that is reported to the
+sender in delivery confirmation or non-delivery notifications.
+.br
+.PP
+This feature is available in Postfix 2.12 and later.
.SH default_destination_concurrency_failed_cohort_limit (default: 1)
How many pseudo-cohorts must suffer connection or handshake
failure before a specific destination is considered unavailable
@@ -2340,11 +2367,6 @@ The LMTP-specific version of the smtp_body_checks configuration
parameter. See there for details.
.PP
This feature is available in Postfix 2.5 and later.
-.SH lmtp_bounce_defer_filter (default: empty)
-The LMTP-specific version of the smtp_bounce_defer_filter
-configuration parameter. See there for details.
-.PP
-This feature is available in Postfix 2.12 and later.
.SH lmtp_cache_connection (default: yes)
Keep Postfix LMTP client connections open for up to $max_idle
seconds. When the LMTP client receives a request for the same
@@ -2454,6 +2476,11 @@ The LMTP-specific version of the smtp_defer_if_no_mx_address_found
configuration parameter. See there for details.
.PP
This feature is available in Postfix 2.3 and later.
+.SH lmtp_delivery_status_filter (default: empty)
+The LMTP-specific version of the smtp_delivery_status_filter
+configuration parameter. See there for details.
+.PP
+This feature is available in Postfix 2.12 and later.
.SH lmtp_destination_concurrency_limit (default: $default_destination_concurrency_limit)
The maximal number of parallel deliveries to the same destination
via the lmtp message delivery transport. This limit is enforced by
@@ -2929,12 +2956,6 @@ 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
@@ -2959,6 +2980,12 @@ local_command_shell = /bin/bash -c
.fi
.ad
.ft R
+.SH local_delivery_status_filter (default: $default_delivery_status_filter)
+Optional filter for the \fBlocal\fR(8) delivery agent to change the
+status code or explanatory text of successful or unsuccessful
+deliveries. See default_delivery_status_filter for details.
+.PP
+This feature is available in Postfix 2.12 and later.
.SH local_destination_concurrency_limit (default: 2)
The maximal number of parallel deliveries via the local mail
delivery transport to the same recipient (when
@@ -4173,10 +4200,10 @@ The name of the \fBpickup\fR(8) service. This service picks up local mail
submissions from the Postfix maildrop queue.
.PP
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 in the \fBpipe\fR(8) delivery agent. See
-default_bounce_defer_filter for details.
+.SH pipe_delivery_status_filter (default: $default_delivery_status_filter)
+Optional filter for the \fBpipe\fR(8) delivery agent to change the
+delivery status code or explanatory text of successful or unsuccessful
+deliveries. See default_delivery_status_filter for details.
.PP
This feature is available in Postfix 2.12 and later.
.SH plaintext_reject_code (default: 450)
@@ -5852,16 +5879,6 @@ These tables are searched while mail is being delivered. Actions
that change the delivery time or destination are not available.
.PP
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 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
-remote SMTP server responses. In contrast, the smtp_reply_filter
-feature modifies remote SMTP server responses that may result in
-email non-delivery or delivery.
.SH smtp_cname_overrides_servername (default: version dependent)
When the remote SMTP servername is a DNS CNAME, replace the
servername with the result from CNAME expansion for the purpose of
@@ -6027,6 +6044,15 @@ or worse preference
than the local MTA itself.
.PP
This feature is available in Postfix 2.1 and later.
+.SH smtp_delivery_status_filter (default: $default_delivery_status_filter)
+Optional filter for the \fBsmtp\fR(8) delivery agent to change the
+delivery status code or explanatory text of successful or unsuccessful
+deliveries. See default_delivery_status_filter for details.
+.PP
+NOTE: This feature modifies Postfix SMTP client error or non-error
+messages that may or may not be derived from remote SMTP server
+responses. In contrast, the smtp_reply_filter feature modifies
+remote SMTP server responses only.
.SH smtp_destination_concurrency_limit (default: $default_destination_concurrency_limit)
The maximal number of parallel deliveries to the same destination
via the smtp message delivery transport. This limit is enforced by
@@ -12338,10 +12364,10 @@ reach the sum of the expansion and recursion limits. This may
change in the future.
.PP
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 in the \fBvirtual\fR(8) delivery agent. See
-default_bounce_defer_filter for details.
+.SH virtual_delivery_status_filter (default: $default_delivery_status_filter)
+Optional filter for the \fBvirtual\fR(8) delivery agent to change the
+delivery status code or explanatory text of successful or unsuccessful
+deliveries. See default_delivery_status_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 b8d780b39..9feeaa01b 100644
--- a/postfix/man/man8/local.8
+++ b/postfix/man/man8/local.8
@@ -421,9 +421,10 @@ 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.
+.IP "\fBlocal_delivery_status_filter ($default_delivery_status_filter)\fR"
+Optional filter for the \fBlocal\fR(8) delivery agent to change the
+status code or explanatory text of successful or unsuccessful
+deliveries.
.SH "DELIVERY METHOD CONTROLS"
.na
.nf
diff --git a/postfix/man/man8/pipe.8 b/postfix/man/man8/pipe.8
index 578628e23..a3754d291 100644
--- a/postfix/man/man8/pipe.8
+++ b/postfix/man/man8/pipe.8
@@ -426,9 +426,10 @@ 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.
+.IP "\fBpipe_delivery_status_filter ($default_delivery_status_filter)\fR"
+Optional filter for the \fBpipe\fR(8) delivery agent to change the
+delivery status code or explanatory text of successful or unsuccessful
+deliveries.
.SH "SEE ALSO"
.na
.nf
diff --git a/postfix/man/man8/smtp.8 b/postfix/man/man8/smtp.8
index 1f257b275..f723f1be9 100644
--- a/postfix/man/man8/smtp.8
+++ b/postfix/man/man8/smtp.8
@@ -276,9 +276,10 @@ Available in Postfix version 2.11 and later:
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.
+.IP "\fBsmtp_delivery_status_filter ($default_delivery_status_filter)\fR"
+Optional filter for the \fBsmtp\fR(8) delivery agent to change the
+delivery status code or explanatory text of successful or unsuccessful
+deliveries.
.SH "MIME PROCESSING CONTROLS"
.na
.nf
diff --git a/postfix/man/man8/virtual.8 b/postfix/man/man8/virtual.8
index a61cffe66..743992c28 100644
--- a/postfix/man/man8/virtual.8
+++ b/postfix/man/man8/virtual.8
@@ -283,9 +283,10 @@ 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 in the \fBvirtual\fR(8) delivery agent.
+.IP "\fBvirtual_delivery_status_filter ($default_delivery_status_filter)\fR"
+Optional filter for the \fBvirtual\fR(8) delivery agent to change the
+delivery status code or explanatory text of successful or unsuccessful
+deliveries.
.SH "SEE ALSO"
.na
.nf
diff --git a/postfix/mantools/postlink b/postfix/mantools/postlink
index ff86a8ffe..73e69278d 100755
--- a/postfix/mantools/postlink
+++ b/postfix/mantools/postlink
@@ -133,7 +133,7 @@ while (<>) {
s;\bdaemon_timeout\b;$&;g;
s;\bdebug_peer_level\b;$&;g;
s;\bdebug_peer_list\b;$&;g;
- s;\bdefault_bounce_defer_filter\b;$&;g;
+ s;\bdefault_delivery_status_filter\b;$&;g;
s;\bdefault_data[-]*\n* *[]*base_type\b;$&;g;
s;\bdefault_deliv[-]*\n* *[]*ery_slot_cost\b;$&;g;
s;\bdefault_deliv[-]*\n* *[]*ery_slot_discount\b;$&;g;
@@ -213,7 +213,7 @@ while (<>) {
s;\blmtp_address_preference\b;$&;g;
s;\blmtp_body_checks\b;$&;g;
s;\blmtp_cname_overrides_servername\b;$&;g;
- s;\blmtp_bounce_defer_filter\b;$&;g;
+ s;\blmtp_delivery_status_filter\b;$&;g;
s;\blmtp_dns_resolver_options\b;$&;g;
s;\blmtp_dns_support_level\b;$&;g;
s;\blmtp_header_checks\b;$&;g;
@@ -307,7 +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_delivery_status_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;
@@ -360,7 +360,7 @@ while (<>) {
s;\bpar[-]*\n* *[]*ent_domain_matches_subdomains\b;$&;g;
s;\bpermit_mx_backup_networks\b;$&;g;
s;\bpickup_service_name\b;$&;g;
- s;\bpipe_bounce_defer_filter\b;$&;g;
+ s;\bpipe_delivery_status_filter\b;$&;g;
s;\bplaintext_reject_code\b;$&;g;
s;\bpost[-]*\n* *[]*multi_start_commands\b;$&;g;
s;\bpost[-]*\n* *[]*multi_stop_commands\b;$&;g;
@@ -455,7 +455,7 @@ while (<>) {
s;\bsmtp_connection_cache_time_limit\b;$&;g;
s;\bsmtp_connection_cache_destinations\b;$&;g;
- s;\bsmtp_bounce_defer_filter\b;$&;g;
+ s;\bsmtp_delivery_status_filter\b;$&;g;
s;\bsmtp_data_done_timeout\b;$&;g;
s;\bsmtp_data_init_timeout\b;$&;g;
s;\bsmtp_data_xfer_timeout\b;$&;g;
@@ -606,7 +606,7 @@ while (<>) {
s;\bvir[-]*\n*[ ]*tual_alias_maps\b;$&;g;
s;\bvir[-]*\n*[ ]*tual_maps\b;$&;g;
s;\bvir[-]*\n*[ ]*tual_alias_recursion_limit\b;$&;g;
- s;\bvir[-]*\n*[ ]*tual_bounce_defer_filter\b;$&;g;
+ s;\bvir[-]*\n*[ ]*tual_delivery_status_filter\b;$&;g;
s;\bvir[-]*\n*[ ]*tual_gid_maps\b;$&;g;
s;\bvir[-]*\n*[ ]*tual_mail[-]*\n* *[]*box_base\b;$&;g;
s;\bvir[-]*\n*[ ]*tual_mail[-]*\n* *[]*box_domains\b;$&;g;
diff --git a/postfix/proto/postconf.proto b/postfix/proto/postconf.proto
index effee2c84..e621cbb8c 100644
--- a/postfix/proto/postconf.proto
+++ b/postfix/proto/postconf.proto
@@ -15616,12 +15616,12 @@ anchor assertion) TLSA records.
This feature is available in Postfix 2.11 and later.
-%PARAM default_bounce_defer_filter
+%PARAM default_delivery_status_filter
- Optional filter to change arbitrary hard delivery errors into
-soft errors and vice versa. This is implemented by rewriting the
-three-number enhanced status code and the explanatory text in a
-Postfix delivery agent bounce/defer message.
+ Optional filter to replace the delivery status code or explanatory
+text of successful or unsuccessful deliveries. This does, however,
+not allow the replacement of a successful status code (2.X.X) with
+an unsuccessful status code (4.X.X or 5.X.X) or vice versa.
Specify zero or more "type:table" lookup table names, separated
by comma or whitespace. With each bounce or defer request, the
@@ -15633,27 +15633,25 @@ enhanced-status-code SPACE explanatory-text
The first table match wins. The lookup result must have the
-same structure as the query: enhanced status codes must have a
-first numerical field of 4 (defer) or 5 (bounce), and the explanatory
-text field must be non-empty. Other results will result in a warning.
-
+same structure as the query, a successful status code (2.X.X) must
+be replaced with a successful status code, an unsuccessful status
+code (4.X.X or 5.X.X) must be replaced with an unsuccessful status
+code, and the explanatory text field must be non-empty. Other results
+will result in a warning.
- Example:
-
- The following example turns specific soft TLS errors into hard
-errors, by overriding the first number in the enhanced status code.
-
+ Example 1: convert specific soft TLS errors into hard errors,
+by overriding the first number in the enhanced status code.
/etc/postfix/main.cf:
- smtp_bounce_defer_filter = pcre:/etc/postfix/smtp_ndr_filter
+ smtp_delivery_status_filter = pcre:/etc/postfix/smtp_dsn_filter
-/etc/postfix/smtp_ndr_filter:
+/etc/postfix/smtp_dsn_filter:
/^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 .+)/
@@ -15666,6 +15664,26 @@ errors, by overriding the first number in the enhanced status code.
+ Example 2: censor the per-recipient delivery status text so
+that it does not not reveal the destination command or filename
+when a remote sender requests confirmation of successful delivery.
+
+
+
+
+/etc/postfix/main.cf:
+ local_delivery_status_filter = pcre:/etc/postfix/local_dsn_filter
+
+
+
+
+
+/etc/postfix/local_dsn_filter:
+ /^(2\S+ delivered to file).+/ $1
+ /^(2\S+ delivered to command).+/ $1
+
+
+
Notes:
This feature is available in Postfix 2.12 and later.
-%PARAM smtp_bounce_defer_filter $default_bounce_defer_filter
+%PARAM smtp_delivery_status_filter $default_delivery_status_filter
- Optional filter to change arbitrary hard delivery errors into
-soft errors and vice versa in the smtp(8) delivery agent. See
-default_bounce_defer_filter for details.
+ Optional filter for the smtp(8) delivery agent to change the
+delivery status code or explanatory text of successful or unsuccessful
+deliveries. See default_delivery_status_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
-remote SMTP server responses. In contrast, the smtp_reply_filter
-feature modifies remote SMTP server responses that may result in
-email non-delivery or delivery.
+ NOTE: This feature modifies Postfix SMTP client error or non-error
+messages that may or may not be derived from remote SMTP server
+responses. In contrast, the smtp_reply_filter feature modifies
+remote SMTP server responses only.
-%PARAM lmtp_bounce_defer_filter
+%PARAM lmtp_delivery_status_filter
- The LMTP-specific version of the smtp_bounce_defer_filter
+
The LMTP-specific version of the smtp_delivery_status_filter
configuration parameter. See there for details.
This feature is available in Postfix 2.12 and later.
-%PARAM pipe_bounce_defer_filter $default_bounce_defer_filter
+%PARAM pipe_delivery_status_filter $default_delivery_status_filter
- Optional filter to change arbitrary hard delivery errors into
-soft errors and vice versa in the pipe(8) delivery agent. See
-default_bounce_defer_filter for details.
+ Optional filter for the pipe(8) delivery agent to change the
+delivery status code or explanatory text of successful or unsuccessful
+deliveries. See default_delivery_status_filter for details.
This feature is available in Postfix 2.12 and later.
-%PARAM virtual_bounce_defer_filter $default_bounce_defer_filter
+%PARAM virtual_delivery_status_filter $default_delivery_status_filter
- Optional filter to change arbitrary hard delivery errors into
-soft errors and vice versa in the virtual(8) delivery agent. See
-default_bounce_defer_filter for details.
+ Optional filter for the virtual(8) delivery agent to change the
+delivery status code or explanatory text of successful or unsuccessful
+deliveries. See default_delivery_status_filter for details.
This feature is available in Postfix 2.12 and later.
-%PARAM local_bounce_defer_filter $default_bounce_defer_filter
+%PARAM local_delivery_status_filter $default_delivery_status_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.
+ Optional filter for the local(8) delivery agent to change the
+status code or explanatory text of successful or unsuccessful
+deliveries. See default_delivery_status_filter for details.
This feature is available in Postfix 2.12 and later.
diff --git a/postfix/src/global/Makefile.in b/postfix/src/global/Makefile.in
index f5799eb0e..355465c1a 100644
--- a/postfix/src/global/Makefile.in
+++ b/postfix/src/global/Makefile.in
@@ -32,7 +32,7 @@ SRCS = abounce.c anvil_clnt.c been_here.c bounce.c bounce_log.c \
match_service.c mail_conf_nint.c addr_match_list.c mail_conf_nbool.c \
smtp_reply_footer.c safe_ultostr.c verify_sender_addr.c \
dict_memcache.c mail_version.c memcache_proto.c server_acl.c \
- mkmap_fail.c haproxy_srvr.c ndr_filter.c
+ mkmap_fail.c haproxy_srvr.c dsn_filter.c
OBJS = abounce.o anvil_clnt.o been_here.o bounce.o bounce_log.o \
canon_addr.o cfg_parser.o cleanup_strerror.o cleanup_strflags.o \
clnt_stream.o conv_time.o db_common.o debug_peer.o debug_process.o \
@@ -66,7 +66,7 @@ OBJS = abounce.o anvil_clnt.o been_here.o bounce.o bounce_log.o \
match_service.o mail_conf_nint.o addr_match_list.o mail_conf_nbool.o \
smtp_reply_footer.o safe_ultostr.o verify_sender_addr.o \
dict_memcache.o mail_version.o memcache_proto.o server_acl.o \
- mkmap_fail.o haproxy_srvr.o ndr_filter.o
+ mkmap_fail.o haproxy_srvr.o dsn_filter.o
HDRS = abounce.h anvil_clnt.h been_here.h bounce.h bounce_log.h \
canon_addr.h cfg_parser.h cleanup_user.h clnt_stream.h config.h \
conv_time.h db_common.h debug_peer.h debug_process.h defer.h \
@@ -93,7 +93,7 @@ HDRS = abounce.h anvil_clnt.h been_here.h bounce.h bounce_log.h \
fold_addr.h header_body_checks.h data_redirect.h match_service.h \
addr_match_list.h smtp_reply_footer.h safe_ultostr.h \
verify_sender_addr.h dict_memcache.h memcache_proto.h server_acl.h \
- haproxy_srvr.h ndr_filter.h
+ haproxy_srvr.h dsn_filter.h
TESTSRC = rec2stream.c stream2rec.c recdump.c
DEFS = -I. -I$(INC_DIR) -D$(SYSTYPE)
CFLAGS = $(DEBUG) $(OPT) $(DEFS)
@@ -666,7 +666,7 @@ bounce.o: log_adhoc.h
bounce.o: mail_params.h
bounce.o: mail_proto.h
bounce.o: msg_stats.h
-bounce.o: ndr_filter.h
+bounce.o: dsn_filter.h
bounce.o: rcpt_print.h
bounce.o: recipient_list.h
bounce.o: trace.h
@@ -812,7 +812,7 @@ defer.o: mail_params.h
defer.o: mail_proto.h
defer.o: mail_queue.h
defer.o: msg_stats.h
-defer.o: ndr_filter.h
+defer.o: dsn_filter.h
defer.o: rcpt_print.h
defer.o: recipient_list.h
defer.o: trace.h
@@ -1806,20 +1806,20 @@ namadr_list.o: ../../include/match_list.h
namadr_list.o: ../../include/sys_defs.h
namadr_list.o: namadr_list.c
namadr_list.o: namadr_list.h
-ndr_filter.o: ../../include/argv.h
-ndr_filter.o: ../../include/dict.h
-ndr_filter.o: ../../include/msg.h
-ndr_filter.o: ../../include/myflock.h
-ndr_filter.o: ../../include/mymalloc.h
-ndr_filter.o: ../../include/sys_defs.h
-ndr_filter.o: ../../include/vbuf.h
-ndr_filter.o: ../../include/vstream.h
-ndr_filter.o: ../../include/vstring.h
-ndr_filter.o: dsn.h
-ndr_filter.o: dsn_util.h
-ndr_filter.o: maps.h
-ndr_filter.o: ndr_filter.c
-ndr_filter.o: ndr_filter.h
+dsn_filter.o: ../../include/argv.h
+dsn_filter.o: ../../include/dict.h
+dsn_filter.o: ../../include/msg.h
+dsn_filter.o: ../../include/myflock.h
+dsn_filter.o: ../../include/mymalloc.h
+dsn_filter.o: ../../include/sys_defs.h
+dsn_filter.o: ../../include/vbuf.h
+dsn_filter.o: ../../include/vstream.h
+dsn_filter.o: ../../include/vstring.h
+dsn_filter.o: dsn.h
+dsn_filter.o: dsn_util.h
+dsn_filter.o: maps.h
+dsn_filter.o: dsn_filter.c
+dsn_filter.o: dsn_filter.h
off_cvt.o: ../../include/msg.h
off_cvt.o: ../../include/sys_defs.h
off_cvt.o: ../../include/vbuf.h
diff --git a/postfix/src/global/bounce.c b/postfix/src/global/bounce.c
index 77496ef37..4e6a305f0 100644
--- a/postfix/src/global/bounce.c
+++ b/postfix/src/global/bounce.c
@@ -53,7 +53,7 @@
/* const char *title;
/* const char *maps;
/* INTERNAL API
-/* NDR_FILTER *bounce_defer_filter;
+/* DSN_FILTER *delivery_status_filter;
/*
/* int bounce_append_intern(flags, id, stats, recipient, relay, dsn)
/* int flags;
@@ -181,7 +181,7 @@
/* Global library. */
-#define BOUNCE_DEFER_INTERN
+#define DSN_INTERN
#include
#include
#include
@@ -195,7 +195,7 @@
/* Shared internally, between bounce and defer clients. */
-NDR_FILTER *bounce_defer_filter;
+DSN_FILTER *delivery_status_filter;
/* bounce_append - append delivery status to per-message bounce log */
@@ -218,8 +218,8 @@ int bounce_append(int flags, const char *id, MSG_STATS *stats,
/*
* DSN filter (Postfix 2.12).
*/
- if (bounce_defer_filter != 0
- && (dsn_res = ndr_filter_lookup(bounce_defer_filter, &my_dsn)) != 0) {
+ if (delivery_status_filter != 0
+ && (dsn_res = dsn_filter_lookup(delivery_status_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;
@@ -406,8 +406,8 @@ int bounce_one(int flags, const char *queue, const char *id,
/*
* DSN filter (Postfix 2.12).
*/
- if (bounce_defer_filter != 0
- && (dsn_res = ndr_filter_lookup(bounce_defer_filter, &my_dsn)) != 0) {
+ if (delivery_status_filter != 0
+ && (dsn_res = dsn_filter_lookup(delivery_status_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;
@@ -508,8 +508,8 @@ void bounce_client_init(const char *title, const char *maps)
{
const char myname[] = "bounce_client_init";
- if (bounce_defer_filter != 0)
+ if (delivery_status_filter != 0)
msg_panic("%s: duplicate initialization", myname);
if (*maps)
- bounce_defer_filter = ndr_filter_create(title, maps);
+ delivery_status_filter = dsn_filter_create(title, maps);
}
diff --git a/postfix/src/global/bounce.h b/postfix/src/global/bounce.h
index bb7127841..b72503edb 100644
--- a/postfix/src/global/bounce.h
+++ b/postfix/src/global/bounce.h
@@ -70,11 +70,11 @@ extern void bounce_client_init(const char *, const char *);
* Start of private API.
*/
-#ifdef BOUNCE_DEFER_INTERN
+#ifdef DSN_INTERN
-#include
+#include
-extern NDR_FILTER *bounce_defer_filter;
+extern DSN_FILTER *delivery_status_filter;
extern int bounce_append_intern(int, const char *, MSG_STATS *, RECIPIENT *,
const char *, DSN *);
diff --git a/postfix/src/global/defer.c b/postfix/src/global/defer.c
index d4aab325f..17eea9a5c 100644
--- a/postfix/src/global/defer.c
+++ b/postfix/src/global/defer.c
@@ -77,7 +77,7 @@
/* 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
+/* defer_one() implements dsn_filter(3) compatibility for the
/* bounce_one() routine.
/*
/* defer_append_intern() is for use after the DSN filter.
@@ -160,7 +160,7 @@
/* Global library. */
-#define BOUNCE_DEFER_INTERN
+#define DSN_INTERN
#include
#include
#include
@@ -195,8 +195,8 @@ int defer_append(int flags, const char *id, MSG_STATS *stats,
/*
* DSN filter (Postfix 2.12).
*/
- if (bounce_defer_filter != 0
- && (dsn_res = ndr_filter_lookup(bounce_defer_filter, &my_dsn)) != 0) {
+ if (delivery_status_filter != 0
+ && (dsn_res = dsn_filter_lookup(delivery_status_filter, &my_dsn)) != 0) {
if (dsn_res->status[0] == '5')
return (bounce_append_intern(flags, id, stats, rcpt, relay, dsn_res));
my_dsn = *dsn_res;
@@ -351,8 +351,8 @@ int defer_one(int flags, const char *queue, const char *id,
/*
* DSN filter (Postfix 2.12).
*/
- if (bounce_defer_filter != 0
- && (dsn_res = ndr_filter_lookup(bounce_defer_filter, &my_dsn)) != 0) {
+ if (delivery_status_filter != 0
+ && (dsn_res = dsn_filter_lookup(delivery_status_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,
diff --git a/postfix/src/global/defer.h b/postfix/src/global/defer.h
index 45f878435..0b6ea4d2f 100644
--- a/postfix/src/global/defer.h
+++ b/postfix/src/global/defer.h
@@ -33,7 +33,7 @@ extern int defer_one(int, const char *, const char *, const char *,
/*
* Start of private API.
*/
-#ifdef BOUNCE_DEFER_INTERN
+#ifdef DSN_INTERN
extern int defer_append_intern(int, const char *, MSG_STATS *, RECIPIENT *,
const char *, DSN *);
diff --git a/postfix/src/global/dsn_filter.c b/postfix/src/global/dsn_filter.c
new file mode 100644
index 000000000..ff5586a98
--- /dev/null
+++ b/postfix/src/global/dsn_filter.c
@@ -0,0 +1,192 @@
+/*++
+/* NAME
+/* dsn_filter 3
+/* SUMMARY
+/* filter DSN status or text
+/* SYNOPSIS
+/* #include
+/*
+/* DSN_FILTER *dsn_filter_create(
+/* const char *title,
+/* const char *map_names)
+/*
+/* DSN *dsn_filter_lookup(
+/* DSN_FILTER *fp,
+/* DSN *dsn)
+/*
+/* void dsn_free(
+/* DSN_FILTER *fp)
+/* DESCRIPTION
+/* This module maps (bounce or defer non-delivery status code
+/* and text) into replacement (bounce or defer non-delivery
+/* status code and text), or maps (success status code and
+/* text) into replacement (success status code and text). Other
+/* DSN attributes are passed through without modification.
+/*
+/* dsn_filter_create() instantiates a DSN filter.
+/*
+/* dsn_filter_lookup() queries the specified filter. The input
+/* DSN must be a success, bounce or defer DSN. If a match is
+/* found a non-delivery status must map to a non-delivery
+/* status, a success status must map to a success status, and
+/* the text must be non-empty. The result is a null pointer
+/* when no valid match is found. Otherwise, the result is
+/* overwritten upon each call. This function must not be
+/* called with the result from a dsn_filter_lookup() call.
+/*
+/* dsn_free() destroys the specified DSN filter.
+/*
+/* Arguments:
+/* .IP title
+/* Origin of the mapnames argument, typically a configuration
+/* parameter name. This is reported in diagnostics.
+/* .IP mapnames
+/* List of lookup tables, separated by whitespace or comma.
+/* .IP fp
+/* filter created with dsn_filter_create()
+/* .IP dsn
+/* A success, bounce or defer DSN data structure. The
+/* dsn_filter_lookup() result value is in part a shallow copy
+/* of this argument.
+/* SEE ALSO
+/* maps(3) multi-table search
+/* DIAGNOSTICS
+/* Panic: invalid dsn argument; recursive call. Fatal error:
+/* memory allocation problem. Warning: invalid DSN lookup
+/* result.
+/* LICENSE
+/* .ad
+/* .fi
+/* The Secure Mailer license must be distributed with this software.
+/* AUTHOR(S)
+/* Wietse Venema
+/* IBM T.J. Watson Research
+/* P.O. Box 704
+/* Yorktown Heights, NY 10598, USA
+/*--*/
+
+ /*
+ * System libraries.
+ */
+#include
+
+ /*
+ * Utility library.
+ */
+#include
+#include
+#include
+
+ /*
+ * Global library.
+ */
+#include
+#include
+#include
+#include
+#include
+
+ /*
+ * Private data structure.
+ */
+struct DSN_FILTER {
+ MAPS *maps; /* Replacement (status, text) */
+ VSTRING *buffer; /* Status code and text */
+ DSN_SPLIT dp; /* Parsing aid */
+ DSN dsn; /* Shallow copy */
+};
+
+ /*
+ * SLMs.
+ */
+#define STR(x) vstring_str(x)
+
+/* dsn_filter_create - create bounce/defer NDR filter */
+
+DSN_FILTER *dsn_filter_create(const char *title, const char *map_names)
+{
+ const char myname[] = "dsn_filter_create";
+ DSN_FILTER *fp;
+
+ if (msg_verbose)
+ msg_info("%s: %s %s", myname, title, map_names);
+
+ fp = (DSN_FILTER *) mymalloc(sizeof(*fp));
+ fp->buffer = vstring_alloc(100);
+ fp->maps = maps_create(title, map_names, DICT_FLAG_LOCK);
+ return (fp);
+}
+
+/* dsn_filter_lookup - apply bounce/defer NDR filter */
+
+DSN *dsn_filter_lookup(DSN_FILTER *fp, DSN *dsn)
+{
+ const char myname[] = "dsn_filter_lookup";
+ const char *result;
+ int ndr_dsn = 0;
+
+ if (msg_verbose)
+ msg_info("%s: %s %s", myname, dsn->status, dsn->reason);
+
+ /*
+ * XXX Instead of hard-coded '4' etc., use some form of encapsulation
+ * when reading or updating the status class field.
+ */
+#define IS_SUCCESS_DSN(s) (dsn_valid(s) && (s)[0] == '2')
+#define IS_NDR_DSN(s) (dsn_valid(s) && ((s)[0] == '4' || (s)[0] == '5'))
+
+ /*
+ * Sanity check. We filter only success/bounce/defer DSNs.
+ */
+ if (IS_SUCCESS_DSN(dsn->status))
+ ndr_dsn = 0;
+ else if (IS_NDR_DSN(dsn->status))
+ ndr_dsn = 1;
+ else
+ msg_panic("%s: dsn argument with bad status code: %s",
+ myname, dsn->status);
+
+ /*
+ * Sanity check. A DSN filter must not be invoked with its own result.
+ */
+ if (dsn->reason == fp->dsn.reason)
+ msg_panic("%s: recursive call is not allowed", myname);
+
+ /*
+ * Look up replacement status and text.
+ */
+ vstring_sprintf(fp->buffer, "%s %s", dsn->status, dsn->reason);
+ if ((result = maps_find(fp->maps, STR(fp->buffer), 0)) != 0) {
+ /* Sanity check. Do not allow success<=>error mappings. */
+ if ((ndr_dsn == 0 && !IS_SUCCESS_DSN(result))
+ || (ndr_dsn != 0 && !IS_NDR_DSN(result))) {
+ msg_warn("%s: bad status code: %s", fp->maps->title, result);
+ return (0);
+ } else {
+ vstring_strcpy(fp->buffer, result);
+ dsn_split(&fp->dp, "can't happen", STR(fp->buffer));
+ (void) DSN_ASSIGN(&fp->dsn, DSN_STATUS(fp->dp.dsn),
+ (result[0] == '4' ? "delayed" :
+ result[0] == '5' ? "failed" :
+ dsn->action),
+ fp->dp.text, dsn->dtype, dsn->dtext,
+ dsn->mtype, dsn->mname);
+ return (&fp->dsn);
+ }
+ }
+ return (0);
+}
+
+/* dsn_filter_free - destroy bounce/defer NDR filter */
+
+void dsn_filter_free(DSN_FILTER *fp)
+{
+ const char myname[] = "dsn_filter_free";
+
+ if (msg_verbose)
+ msg_info("%s: %s", myname, fp->maps->title);
+
+ maps_free(fp->maps);
+ vstring_free(fp->buffer);
+ myfree((char *) fp);
+}
diff --git a/postfix/src/global/ndr_filter.h b/postfix/src/global/dsn_filter.h
similarity index 52%
rename from postfix/src/global/ndr_filter.h
rename to postfix/src/global/dsn_filter.h
index 1a1f7d1ab..43378dd96 100644
--- a/postfix/src/global/ndr_filter.h
+++ b/postfix/src/global/dsn_filter.h
@@ -1,24 +1,24 @@
-#ifndef _NDR_FILTER_H_INCLUDED_
-#define _NDR_FILTER_H_INCLUDED_
+#ifndef _DSN_FILTER_H_INCLUDED_
+#define _DSN_FILTER_H_INCLUDED_
/*++
/* NAME
-/* ndr_filter 3h
+/* dsn_filter 3h
/* SUMMARY
/* bounce/defer DSN filter
/* SYNOPSIS
-/* #include
+/* #include
/* DESCRIPTION
/* .nf
/*
* External interface.
*/
-typedef struct NDR_FILTER NDR_FILTER;
+typedef struct DSN_FILTER DSN_FILTER;
-extern NDR_FILTER *ndr_filter_create(const char *, const char *);
-extern DSN *ndr_filter_lookup(NDR_FILTER *, DSN *);
-extern void ndr_filter_free(NDR_FILTER *);
+extern DSN_FILTER *dsn_filter_create(const char *, const char *);
+extern DSN *dsn_filter_lookup(DSN_FILTER *, DSN *);
+extern void dsn_filter_free(DSN_FILTER *);
/* LICENSE
/* .ad
diff --git a/postfix/src/global/mail_params.c b/postfix/src/global/mail_params.c
index f322af651..6e4378c2f 100644
--- a/postfix/src/global/mail_params.c
+++ b/postfix/src/global/mail_params.c
@@ -121,7 +121,7 @@
/* bool var_multi_enable;
/* bool var_long_queue_ids;
/* bool var_daemon_open_fatal;
-/* char *var_ndr_filter;
+/* char *var_dsn_filter;
/*
/* void mail_params_init()
/*
@@ -315,7 +315,7 @@ char *var_multi_name;
bool var_multi_enable;
bool var_long_queue_ids;
bool var_daemon_open_fatal;
-char *var_ndr_filter;
+char *var_dsn_filter;
const char null_format_string[1] = "";
@@ -591,7 +591,7 @@ void mail_params_init()
VAR_INT_FILT_CLASSES, DEF_INT_FILT_CLASSES, &var_int_filt_classes, 0, 0,
/* multi_instance_wrapper may have dependencies but not dependents. */
VAR_MULTI_WRAPPER, DEF_MULTI_WRAPPER, &var_multi_wrapper, 0, 0,
- VAR_NDR_FILTER, DEF_NDR_FILTER, &var_ndr_filter, 0, 0,
+ VAR_DSN_FILTER, DEF_DSN_FILTER, &var_dsn_filter, 0, 0,
0,
};
static const CONFIG_STR_FN_TABLE function_str_defaults_2[] = {
diff --git a/postfix/src/global/mail_params.h b/postfix/src/global/mail_params.h
index 0069c4d2b..5027990d1 100644
--- a/postfix/src/global/mail_params.h
+++ b/postfix/src/global/mail_params.h
@@ -3747,27 +3747,27 @@ extern bool var_daemon_open_fatal;
/*
* Optional DSN bounce/defer filter.
*/
-#define VAR_NDR_FILTER "default_bounce_defer_filter"
-#define DEF_NDR_FILTER ""
-extern char *var_ndr_filter;
+#define VAR_DSN_FILTER "default_delivery_status_filter"
+#define DEF_DSN_FILTER ""
+extern char *var_dsn_filter;
-#define VAR_SMTP_NDR_FILTER "smtp_bounce_defer_filter"
-#define DEF_SMTP_NDR_FILTER "$" VAR_NDR_FILTER
-#define VAR_LMTP_NDR_FILTER "lmtp_bounce_defer_filter"
-#define DEF_LMTP_NDR_FILTER "$" VAR_NDR_FILTER
-extern char *var_smtp_ndr_filter;
+#define VAR_SMTP_DSN_FILTER "smtp_delivery_status_filter"
+#define DEF_SMTP_DSN_FILTER "$" VAR_DSN_FILTER
+#define VAR_LMTP_DSN_FILTER "lmtp_delivery_status_filter"
+#define DEF_LMTP_DSN_FILTER "$" VAR_DSN_FILTER
+extern char *var_smtp_dsn_filter;
-#define VAR_PIPE_NDR_FILTER "pipe_bounce_defer_filter"
-#define DEF_PIPE_NDR_FILTER "$" VAR_NDR_FILTER
-extern char *var_pipe_ndr_filter;
+#define VAR_PIPE_DSN_FILTER "pipe_delivery_status_filter"
+#define DEF_PIPE_DSN_FILTER "$" VAR_DSN_FILTER
+extern char *var_pipe_dsn_filter;
-#define VAR_VIRT_NDR_FILTER "virtual_bounce_defer_filter"
-#define DEF_VIRT_NDR_FILTER "$" VAR_NDR_FILTER
-extern char *var_virt_ndr_filter;
+#define VAR_VIRT_DSN_FILTER "virtual_delivery_status_filter"
+#define DEF_VIRT_DSN_FILTER "$" VAR_DSN_FILTER
+extern char *var_virt_dsn_filter;
-#define VAR_LOCAL_NDR_FILTER "local_bounce_defer_filter"
-#define DEF_LOCAL_NDR_FILTER "$" VAR_NDR_FILTER
-extern char *var_local_ndr_filter;
+#define VAR_LOCAL_DSN_FILTER "local_delivery_status_filter"
+#define DEF_LOCAL_DSN_FILTER "$" VAR_DSN_FILTER
+extern char *var_local_dsn_filter;
/* LICENSE
/* .ad
diff --git a/postfix/src/global/mail_version.h b/postfix/src/global/mail_version.h
index 8923bab87..425bfbfe2 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 "20140318"
+#define MAIL_RELEASE_DATE "20140321"
#define MAIL_VERSION_NUMBER "2.12"
#ifdef SNAPSHOT
diff --git a/postfix/src/global/ndr_filter.c b/postfix/src/global/ndr_filter.c
deleted file mode 100644
index 105c21aa6..000000000
--- a/postfix/src/global/ndr_filter.c
+++ /dev/null
@@ -1,182 +0,0 @@
-/*++
-/* NAME
-/* ndr_filter 3
-/* SUMMARY
-/* bounce or defer NDR filter
-/* SYNOPSIS
-/* #include
-/*
-/* NDR_FILTER *ndr_filter_create(
-/* const char *title,
-/* const char *map_names)
-/*
-/* DSN *ndr_filter_lookup(
-/* NDR_FILTER *fp,
-/* DSN *dsn)
-/*
-/* void dsn_free(
-/* NDR_FILTER *fp)
-/* DESCRIPTION
-/* This module maps a bounce or defer non-delivery status code
-/* and text into a bounce or defer non-delivery status code
-/* and text. The other DSN attributes are passed through without
-/* modification.
-/*
-/* ndr_filter_create() instantiates a bounce or defer NDR filter.
-/*
-/* ndr_filter_lookup() queries the specified filter. The DSN
-/* must be a bounce or defer DSN. If a match is found and the
-/* result is properly formatted, the result value must specify
-/* a bounce or defer DSN. The result is in part overwritten
-/* upon each call, and is in part a shallow copy of the dsn
-/* argument. The result is a null pointer when no valid match
-/* is found. This function must not be called with the result
-/* from a ndr_filter_lookup() call.
-/*
-/* dsn_free() destroys the specified NDR filter.
-/*
-/* Arguments:
-/* .IP title
-/* Origin of the mapnames argument, typically a configuration
-/* parameter name. This is reported in diagnostics.
-/* .IP mapnames
-/* List of lookup tables, separated by whitespace or comma.
-/* .IP fp
-/* filter created with ndr_filter_create()
-/* .IP dsn
-/* A bounce or defer DSN data structure. The ndr_filter_lookup()
-/* result value is in part a shallow copy of this argument.
-/* SEE ALSO
-/* maps(3) multi-table search
-/* DIAGNOSTICS
-/* Panic: invalid dsn argument; recursive call. Fatal error:
-/* memory allocation problem. Warning: invalid DSN lookup
-/* result.
-/* LICENSE
-/* .ad
-/* .fi
-/* The Secure Mailer license must be distributed with this software.
-/* AUTHOR(S)
-/* Wietse Venema
-/* IBM T.J. Watson Research
-/* P.O. Box 704
-/* Yorktown Heights, NY 10598, USA
-/*--*/
-
- /*
- * System libraries.
- */
-#include
-
- /*
- * Utility library.
- */
-#include
-#include
-#include
-
- /*
- * Global library.
- */
-#include
-#include
-#include
-#include
-#include
-
- /*
- * Private data structure.
- */
-struct NDR_FILTER {
- MAPS *maps; /* Replacement (status, text) */
- VSTRING *buffer; /* Status code and text */
- DSN_SPLIT dp; /* Parsing aid */
- DSN dsn; /* Shallow copy */
-};
-
- /*
- * SLMs.
- */
-#define STR(x) vstring_str(x)
-
-/* ndr_filter_create - create bounce/defer NDR filter */
-
-NDR_FILTER *ndr_filter_create(const char *title, const char *map_names)
-{
- const char myname[] = "ndr_filter_create";
- NDR_FILTER *fp;
-
- if (msg_verbose)
- msg_info("%s: %s %s", myname, title, map_names);
-
- fp = (NDR_FILTER *) mymalloc(sizeof(*fp));
- fp->buffer = vstring_alloc(100);
- fp->maps = maps_create(title, map_names, DICT_FLAG_LOCK);
- return (fp);
-}
-
-/* ndr_filter_lookup - apply bounce/defer NDR filter */
-
-DSN *ndr_filter_lookup(NDR_FILTER *fp, DSN *dsn)
-{
- const char myname[] = "ndr_filter_lookup";
- const char *result;
-
- 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)[0] == '4' || (s)[0] == '5'))
-
- /*
- * Sanity check. We filter only bounce/defer DSNs.
- */
- if (!IS_NDR_DSN(dsn->status))
- msg_panic("%s: dsn argument with bad status code: %s",
- myname, dsn->status);
-
- /*
- * Sanity check. An NDR filter must not be invoked with its own result.
- */
- if (dsn->reason == fp->dsn.reason)
- msg_panic("%s: recursive call is not allowed", myname);
-
- /*
- * Look up replacement status and text.
- */
- vstring_sprintf(fp->buffer, "%s %s", dsn->status, dsn->reason);
- if ((result = maps_find(fp->maps, STR(fp->buffer), 0)) != 0) {
- /* Sanity check. We accept only bounce/defer DSNs. */
- if (!IS_NDR_DSN(result)) {
- msg_warn("%s: bad status code: %s", fp->maps->title, result);
- return (0);
- } else {
- vstring_strcpy(fp->buffer, result);
- dsn_split(&fp->dp, "can't happen", STR(fp->buffer));
- (void) DSN_ASSIGN(&fp->dsn, DSN_STATUS(fp->dp.dsn),
- (result[0] == '4' ? "delayed" : "failed"),
- fp->dp.text, dsn->dtype, dsn->dtext,
- dsn->mtype, dsn->mname);
- return (&fp->dsn);
- }
- }
- return (0);
-}
-
-/* ndr_filter_free - destroy bounce/defer NDR filter */
-
-void ndr_filter_free(NDR_FILTER *fp)
-{
- const char myname[] = "ndr_filter_free";
-
- if (msg_verbose)
- msg_info("%s: %s", myname, fp->maps->title);
-
- maps_free(fp->maps);
- vstring_free(fp->buffer);
- myfree((char *) fp);
-}
diff --git a/postfix/src/global/sent.c b/postfix/src/global/sent.c
index c99ae5b17..48db9327b 100644
--- a/postfix/src/global/sent.c
+++ b/postfix/src/global/sent.c
@@ -19,8 +19,6 @@
/* message delivery record on request by the sender. The
/* flags argument determines the action.
/*
-/* vsent() implements an alternative interface.
-/*
/* Arguments:
/* .IP flags
/* Zero or more of the following:
@@ -79,6 +77,7 @@
/* Global library. */
+#define DSN_INTERN
#include
#include
#include
@@ -97,6 +96,7 @@ int sent(int flags, const char *id, MSG_STATS *stats,
DSN *dsn)
{
DSN my_dsn = *dsn;
+ DSN *dsn_res;
int status;
/*
@@ -107,6 +107,13 @@ int sent(int flags, const char *id, MSG_STATS *stats,
my_dsn.status = "2.0.0";
}
+ /*
+ * DSN filter (Postfix 2.12).
+ */
+ if (delivery_status_filter != 0
+ && (dsn_res = dsn_filter_lookup(delivery_status_filter, &my_dsn)) != 0)
+ my_dsn = *dsn_res;
+
/*
* MTA-requested address verification information is stored in the verify
* service database.
@@ -147,7 +154,7 @@ int sent(int flags, const char *id, MSG_STATS *stats,
vstring_sprintf(junk, "%s: %s service failed",
id, var_trace_service);
my_dsn.reason = vstring_str(junk);
- my_dsn.status ="4.3.0";
+ my_dsn.status = "4.3.0";
status = defer_append(flags, id, stats, recipient, relay, &my_dsn);
vstring_free(junk);
}
diff --git a/postfix/src/local/local.c b/postfix/src/local/local.c
index b28a759ce..c5ad9b9be 100644
--- a/postfix/src/local/local.c
+++ b/postfix/src/local/local.c
@@ -387,9 +387,10 @@
/* 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.
+/* .IP "\fBlocal_delivery_status_filter ($default_delivery_status_filter)\fR"
+/* Optional filter for the \fBlocal\fR(8) delivery agent to change the
+/* status code or explanatory text of successful or unsuccessful
+/* deliveries.
/* DELIVERY METHOD CONTROLS
/* .ad
/* .fi
@@ -904,7 +905,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,
+ VAR_LOCAL_DSN_FILTER, DEF_LOCAL_DSN_FILTER, &var_local_ndr_filter, 0, 0,
0,
};
static const CONFIG_BOOL_TABLE bool_table[] = {
@@ -943,7 +944,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,
+ MAIL_SERVER_BOUNCE_INIT, VAR_LOCAL_DSN_FILTER,
&var_local_ndr_filter,
0);
}
diff --git a/postfix/src/master/Makefile.in b/postfix/src/master/Makefile.in
index 6b1e2c0ba..d1be8fec7 100644
--- a/postfix/src/master/Makefile.in
+++ b/postfix/src/master/Makefile.in
@@ -94,7 +94,7 @@ event_server.o: ../../include/deliver_request.h
event_server.o: ../../include/dict.h
event_server.o: ../../include/dsn.h
event_server.o: ../../include/dsn_buf.h
-event_server.o: ../../include/ndr_filter.h
+event_server.o: ../../include/dsn_filter.h
event_server.o: ../../include/events.h
event_server.o: ../../include/htable.h
event_server.o: ../../include/iostuff.h
@@ -300,7 +300,7 @@ multi_server.o: ../../include/deliver_request.h
multi_server.o: ../../include/dict.h
multi_server.o: ../../include/dsn.h
multi_server.o: ../../include/dsn_buf.h
-multi_server.o: ../../include/ndr_filter.h
+multi_server.o: ../../include/dsn_filter.h
multi_server.o: ../../include/events.h
multi_server.o: ../../include/htable.h
multi_server.o: ../../include/iostuff.h
@@ -341,7 +341,7 @@ single_server.o: ../../include/deliver_request.h
single_server.o: ../../include/dict.h
single_server.o: ../../include/dsn.h
single_server.o: ../../include/dsn_buf.h
-single_server.o: ../../include/ndr_filter.h
+single_server.o: ../../include/dsn_filter.h
single_server.o: ../../include/events.h
single_server.o: ../../include/htable.h
single_server.o: ../../include/iostuff.h
@@ -382,7 +382,7 @@ trigger_server.o: ../../include/deliver_request.h
trigger_server.o: ../../include/dict.h
trigger_server.o: ../../include/dsn.h
trigger_server.o: ../../include/dsn_buf.h
-trigger_server.o: ../../include/ndr_filter.h
+trigger_server.o: ../../include/dsn_filter.h
trigger_server.o: ../../include/events.h
trigger_server.o: ../../include/htable.h
trigger_server.o: ../../include/iostuff.h
diff --git a/postfix/src/master/event_server.c b/postfix/src/master/event_server.c
index ad19ba277..876800db0 100644
--- a/postfix/src/master/event_server.c
+++ b/postfix/src/master/event_server.c
@@ -560,8 +560,8 @@ NORETURN event_server_main(int argc, char **argv, MULTI_SERVER_FN service,...)
char *generation;
int msg_vstream_needed = 0;
int redo_syslog_init = 0;
- const char *ndr_filter_title;
- const char **ndr_filter_maps;
+ const char *dsn_filter_title;
+ const char **dsn_filter_maps;
/*
* Process environment options as early as we can.
@@ -773,9 +773,9 @@ NORETURN event_server_main(int argc, char **argv, MULTI_SERVER_FN service,...)
event_server_slow_exit = va_arg(ap, MAIL_SERVER_SLOW_EXIT_FN);
break;
case MAIL_SERVER_BOUNCE_INIT:
- ndr_filter_title = va_arg(ap, const char *);
- ndr_filter_maps = va_arg(ap, const char **);
- bounce_client_init(ndr_filter_title, *ndr_filter_maps);
+ dsn_filter_title = va_arg(ap, const char *);
+ dsn_filter_maps = va_arg(ap, const char **);
+ bounce_client_init(dsn_filter_title, *dsn_filter_maps);
break;
default:
msg_panic("%s: unknown argument type: %d", myname, key);
diff --git a/postfix/src/master/multi_server.c b/postfix/src/master/multi_server.c
index 20179207d..c4f9d82ce 100644
--- a/postfix/src/master/multi_server.c
+++ b/postfix/src/master/multi_server.c
@@ -556,8 +556,8 @@ NORETURN multi_server_main(int argc, char **argv, MULTI_SERVER_FN service,...)
char *generation;
int msg_vstream_needed = 0;
int redo_syslog_init = 0;
- const char *ndr_filter_title;
- const char **ndr_filter_maps;
+ const char *dsn_filter_title;
+ const char **dsn_filter_maps;
/*
* Process environment options as early as we can.
@@ -763,9 +763,9 @@ NORETURN multi_server_main(int argc, char **argv, MULTI_SERVER_FN service,...)
service_name);
break;
case MAIL_SERVER_BOUNCE_INIT:
- ndr_filter_title = va_arg(ap, const char *);
- ndr_filter_maps = va_arg(ap, const char **);
- bounce_client_init(ndr_filter_title, *ndr_filter_maps);
+ dsn_filter_title = va_arg(ap, const char *);
+ dsn_filter_maps = va_arg(ap, const char **);
+ bounce_client_init(dsn_filter_title, *dsn_filter_maps);
break;
default:
msg_panic("%s: unknown argument type: %d", myname, key);
diff --git a/postfix/src/master/single_server.c b/postfix/src/master/single_server.c
index a5d068a60..8dc765004 100644
--- a/postfix/src/master/single_server.c
+++ b/postfix/src/master/single_server.c
@@ -434,8 +434,8 @@ NORETURN single_server_main(int argc, char **argv, SINGLE_SERVER_FN service,...)
char *generation;
int msg_vstream_needed = 0;
int redo_syslog_init = 0;
- const char *ndr_filter_title;
- const char **ndr_filter_maps;
+ const char *dsn_filter_title;
+ const char **dsn_filter_maps;
/*
* Process environment options as early as we can.
@@ -638,9 +638,9 @@ NORETURN single_server_main(int argc, char **argv, SINGLE_SERVER_FN service,...)
service_name);
break;
case MAIL_SERVER_BOUNCE_INIT:
- ndr_filter_title = va_arg(ap, const char *);
- ndr_filter_maps = va_arg(ap, const char **);
- bounce_client_init(ndr_filter_title, *ndr_filter_maps);
+ dsn_filter_title = va_arg(ap, const char *);
+ dsn_filter_maps = va_arg(ap, const char **);
+ bounce_client_init(dsn_filter_title, *dsn_filter_maps);
break;
default:
msg_panic("%s: unknown argument type: %d", myname, key);
diff --git a/postfix/src/master/trigger_server.c b/postfix/src/master/trigger_server.c
index 05d3f2f9c..591c3543c 100644
--- a/postfix/src/master/trigger_server.c
+++ b/postfix/src/master/trigger_server.c
@@ -437,8 +437,8 @@ NORETURN trigger_server_main(int argc, char **argv, TRIGGER_SERVER_FN service,..
char *generation;
int msg_vstream_needed = 0;
int redo_syslog_init = 0;
- const char *ndr_filter_title;
- const char **ndr_filter_maps;
+ const char *dsn_filter_title;
+ const char **dsn_filter_maps;
/*
* Process environment options as early as we can.
@@ -644,9 +644,9 @@ NORETURN trigger_server_main(int argc, char **argv, TRIGGER_SERVER_FN service,..
trigger_server_watchdog = *va_arg(ap, int *);
break;
case MAIL_SERVER_BOUNCE_INIT:
- ndr_filter_title = va_arg(ap, const char *);
- ndr_filter_maps = va_arg(ap, const char **);
- bounce_client_init(ndr_filter_title, *ndr_filter_maps);
+ dsn_filter_title = va_arg(ap, const char *);
+ dsn_filter_maps = va_arg(ap, const char **);
+ bounce_client_init(dsn_filter_title, *dsn_filter_maps);
break;
default:
msg_panic("%s: unknown argument type: %d", myname, key);
diff --git a/postfix/src/pipe/pipe.c b/postfix/src/pipe/pipe.c
index e7737a07f..4b6e96d14 100644
--- a/postfix/src/pipe/pipe.c
+++ b/postfix/src/pipe/pipe.c
@@ -404,9 +404,10 @@
/* 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.
+/* .IP "\fBpipe_delivery_status_filter ($default_delivery_status_filter)\fR"
+/* Optional filter for the \fBpipe\fR(8) delivery agent to change the
+/* delivery status code or explanatory text of successful or unsuccessful
+/* deliveries.
/* SEE ALSO
/* qmgr(8), queue manager
/* bounce(8), delivery status reports
@@ -1329,7 +1330,7 @@ int main(int argc, char **argv)
0,
};
static const CONFIG_STR_TABLE str_table[] = {
- VAR_PIPE_NDR_FILTER, DEF_PIPE_NDR_FILTER, &var_pipe_ndr_filter, 0, 0,
+ VAR_PIPE_DSN_FILTER, DEF_PIPE_DSN_FILTER, &var_pipe_ndr_filter, 0, 0,
0,
};
@@ -1344,7 +1345,7 @@ int main(int argc, char **argv)
MAIL_SERVER_POST_INIT, drop_privileges,
MAIL_SERVER_PRE_ACCEPT, pre_accept,
MAIL_SERVER_PRIVILEGED,
- MAIL_SERVER_BOUNCE_INIT, VAR_PIPE_NDR_FILTER,
+ MAIL_SERVER_BOUNCE_INIT, VAR_PIPE_DSN_FILTER,
&var_pipe_ndr_filter,
0);
}
diff --git a/postfix/src/smtp/lmtp_params.c b/postfix/src/smtp/lmtp_params.c
index cc17d9b08..250a2b34a 100644
--- a/postfix/src/smtp/lmtp_params.c
+++ b/postfix/src/smtp/lmtp_params.c
@@ -57,7 +57,7 @@
VAR_LMTP_RESP_FILTER, DEF_LMTP_RESP_FILTER, &var_smtp_resp_filter, 0, 0,
VAR_LMTP_ADDR_PREF, DEF_LMTP_ADDR_PREF, &var_smtp_addr_pref, 1, 0,
VAR_LMTP_DNS_RES_OPT, DEF_LMTP_DNS_RES_OPT, &var_smtp_dns_res_opt, 0, 0,
- VAR_LMTP_NDR_FILTER, DEF_LMTP_NDR_FILTER, &var_smtp_ndr_filter, 0, 0,
+ VAR_LMTP_DSN_FILTER, DEF_LMTP_DSN_FILTER, &var_smtp_ndr_filter, 0, 0,
0,
};
static const CONFIG_TIME_TABLE lmtp_time_table[] = {
diff --git a/postfix/src/smtp/smtp.c b/postfix/src/smtp/smtp.c
index 52456f624..41368636a 100644
--- a/postfix/src/smtp/smtp.c
+++ b/postfix/src/smtp/smtp.c
@@ -254,9 +254,10 @@
/* 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.
+/* .IP "\fBsmtp_delivery_status_filter ($default_delivery_status_filter)\fR"
+/* Optional filter for the \fBsmtp\fR(8) delivery agent to change the
+/* delivery status code or explanatory text of successful or unsuccessful
+/* deliveries.
/* MIME PROCESSING CONTROLS
/* .ad
/* .fi
@@ -1277,7 +1278,7 @@ int main(int argc, char **argv)
MAIL_SERVER_PRE_INIT, pre_init,
MAIL_SERVER_POST_INIT, post_init,
MAIL_SERVER_PRE_ACCEPT, pre_accept,
- MAIL_SERVER_BOUNCE_INIT, VAR_SMTP_NDR_FILTER,
+ MAIL_SERVER_BOUNCE_INIT, VAR_SMTP_DSN_FILTER,
&var_smtp_ndr_filter,
0);
}
diff --git a/postfix/src/smtp/smtp_params.c b/postfix/src/smtp/smtp_params.c
index 616ca7ad8..aecac56bd 100644
--- a/postfix/src/smtp/smtp_params.c
+++ b/postfix/src/smtp/smtp_params.c
@@ -58,7 +58,7 @@
VAR_SMTP_RESP_FILTER, DEF_SMTP_RESP_FILTER, &var_smtp_resp_filter, 0, 0,
VAR_SMTP_ADDR_PREF, DEF_SMTP_ADDR_PREF, &var_smtp_addr_pref, 1, 0,
VAR_SMTP_DNS_RES_OPT, DEF_SMTP_DNS_RES_OPT, &var_smtp_dns_res_opt, 0, 0,
- VAR_SMTP_NDR_FILTER, DEF_SMTP_NDR_FILTER, &var_smtp_ndr_filter, 0, 0,
+ VAR_SMTP_DSN_FILTER, DEF_SMTP_DSN_FILTER, &var_smtp_ndr_filter, 0, 0,
0,
};
static const CONFIG_TIME_TABLE smtp_time_table[] = {
diff --git a/postfix/src/virtual/virtual.c b/postfix/src/virtual/virtual.c
index c66431d23..337a99d09 100644
--- a/postfix/src/virtual/virtual.c
+++ b/postfix/src/virtual/virtual.c
@@ -247,9 +247,10 @@
/* 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 in the \fBvirtual\fR(8) delivery agent.
+/* .IP "\fBvirtual_delivery_status_filter ($default_delivery_status_filter)\fR"
+/* Optional filter for the \fBvirtual\fR(8) delivery agent to change the
+/* delivery status code or explanatory text of successful or unsuccessful
+/* deliveries.
/* SEE ALSO
/* qmgr(8), queue manager
/* bounce(8), delivery status reports
@@ -516,7 +517,7 @@ int main(int argc, char **argv)
VAR_VIRT_GID_MAPS, DEF_VIRT_GID_MAPS, &var_virt_gid_maps, 0, 0,
VAR_VIRT_MAILBOX_BASE, DEF_VIRT_MAILBOX_BASE, &var_virt_mailbox_base, 1, 0,
VAR_VIRT_MAILBOX_LOCK, DEF_VIRT_MAILBOX_LOCK, &var_virt_mailbox_lock, 1, 0,
- VAR_VIRT_NDR_FILTER, DEF_VIRT_NDR_FILTER, &var_virt_ndr_filter, 0, 0,
+ VAR_VIRT_DSN_FILTER, DEF_VIRT_DSN_FILTER, &var_virt_ndr_filter, 0, 0,
0,
};
static const CONFIG_BOOL_TABLE bool_table[] = {
@@ -538,7 +539,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_VIRT_NDR_FILTER,
+ MAIL_SERVER_BOUNCE_INIT, VAR_VIRT_DSN_FILTER,
&var_virt_ndr_filter,
0);
}