2
0
mirror of https://github.com/vdukhovni/postfix synced 2025-08-22 18:07:41 +00:00

postfix-2.12-20140321

This commit is contained in:
Wietse Venema 2014-03-21 00:00:00 -05:00 committed by Viktor Dukhovni
parent 1b55748771
commit 48a0b6fc23
38 changed files with 958 additions and 840 deletions

View File

@ -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.

View File

@ -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.

View File

@ -292,9 +292,10 @@ SMTP(8) SMTP(8)
Available in Postfix version 2.12 and later:
<b><a href="postconf.5.html#smtp_bounce_defer_filter">smtp_bounce_defer_filter</a> ($<a href="postconf.5.html#default_bounce_defer_filter">default_bounce_defer_filter</a>)</b>
Optional filter to change arbitrary hard delivery errors into
soft errors and vice versa in the <a href="smtp.8.html"><b>smtp</b>(8)</a> delivery agent.
<b><a href="postconf.5.html#smtp_delivery_status_filter">smtp_delivery_status_filter</a> ($<a href="postconf.5.html#default_delivery_status_filter">default_delivery_status_filter</a>)</b>
Optional filter for the <a href="smtp.8.html"><b>smtp</b>(8)</a> delivery agent to change the
delivery status code or explanatory text of successful or unsuc-
cessful deliveries.
<b>MIME PROCESSING CONTROLS</b>
Available in Postfix version 2.0 and later:

View File

@ -360,9 +360,10 @@ LOCAL(8) LOCAL(8)
Available in Postfix version 2.12 and later:
<b><a href="postconf.5.html#local_bounce_defer_filter">local_bounce_defer_filter</a> ($<a href="postconf.5.html#default_bounce_defer_filter">default_bounce_defer_filter</a>)</b>
Optional filter to change arbitrary hard delivery errors into
soft errors and vice versa in the <a href="local.8.html"><b>local</b>(8)</a> delivery agent.
<b><a href="postconf.5.html#local_delivery_status_filter">local_delivery_status_filter</a> ($<a href="postconf.5.html#default_delivery_status_filter">default_delivery_status_filter</a>)</b>
Optional filter for the <a href="local.8.html"><b>local</b>(8)</a> delivery agent to change the
status code or explanatory text of successful or unsuccessful
deliveries.
<b>DELIVERY METHOD CONTROLS</b>
The precedence of <a href="local.8.html"><b>local</b>(8)</a> delivery methods from high to low is:

View File

@ -449,9 +449,10 @@ PIPE(8) PIPE(8)
Available in Postfix version 2.12 and later:
<b><a href="postconf.5.html#pipe_bounce_defer_filter">pipe_bounce_defer_filter</a> ($<a href="postconf.5.html#default_bounce_defer_filter">default_bounce_defer_filter</a>)</b>
Optional filter to change arbitrary hard delivery errors into
soft errors and vice versa in the <a href="pipe.8.html"><b>pipe</b>(8)</a> delivery agent.
<b><a href="postconf.5.html#pipe_delivery_status_filter">pipe_delivery_status_filter</a> ($<a href="postconf.5.html#default_delivery_status_filter">default_delivery_status_filter</a>)</b>
Optional filter for the <a href="pipe.8.html"><b>pipe</b>(8)</a> delivery agent to change the
delivery status code or explanatory text of successful or unsuc-
cessful deliveries.
<b>SEE ALSO</b>
<a href="qmgr.8.html">qmgr(8)</a>, queue manager

View File

@ -1756,74 +1756,6 @@ Example:
</pre>
</DD>
<DT><b><a name="default_bounce_defer_filter">default_bounce_defer_filter</a>
(default: empty)</b></DT><DD>
<p> 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. </p>
<p> Specify zero or more "<a href="DATABASE_README.html">type:table</a>" 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: </p>
<blockquote>
enhanced-status-code SPACE explanatory-text
</blockquote>
<p> 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.
</p>
<p> Example: </p>
<p> The following example turns specific soft TLS errors into hard
errors, by overriding the first number in the enhanced status code.
</p>
<blockquote>
<pre>
/etc/postfix/<a href="postconf.5.html">main.cf</a>:
<a href="postconf.5.html#smtp_bounce_defer_filter">smtp_bounce_defer_filter</a> = <a href="pcre_table.5.html">pcre</a>:/etc/postfix/smtp_ndr_filter
</pre>
</blockquote>
<blockquote>
<pre>
/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
</pre>
</blockquote>
<p> Notes: </p>
<ul>
<li> <p> This feature will NOT override the <a href="postconf.5.html#soft_bounce">soft_bounce</a> safety net. </p>
<li> <p> This feature will change the enhanced status code and text
that is logged to the maillog file, and that is reported to the
sender. </p>
</ul>
<p> This feature is available in Postfix 2.12 and later. </p>
</DD>
<DT><b><a name="default_database_type">default_database_type</a>
@ -1952,6 +1884,93 @@ name of the message delivery transport.
</p>
</DD>
<DT><b><a name="default_delivery_status_filter">default_delivery_status_filter</a>
(default: empty)</b></DT><DD>
<p> 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. </p>
<p> Specify zero or more "<a href="DATABASE_README.html">type:table</a>" 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: </p>
<blockquote>
enhanced-status-code SPACE explanatory-text
</blockquote>
<p> 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. </p>
<p> Example 1: convert specific soft TLS errors into hard errors,
by overriding the first number in the enhanced status code. </p>
<blockquote>
<pre>
/etc/postfix/<a href="postconf.5.html">main.cf</a>:
<a href="postconf.5.html#smtp_delivery_status_filter">smtp_delivery_status_filter</a> = <a href="pcre_table.5.html">pcre</a>:/etc/postfix/smtp_dsn_filter
</pre>
</blockquote>
<blockquote>
<pre>
/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
</pre>
</blockquote>
<p> 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.
</p>
<blockquote>
<pre>
/etc/postfix/<a href="postconf.5.html">main.cf</a>:
<a href="postconf.5.html#local_delivery_status_filter">local_delivery_status_filter</a> = <a href="pcre_table.5.html">pcre</a>:/etc/postfix/local_dsn_filter
</pre>
</blockquote>
<blockquote>
<pre>
/etc/postfix/local_dsn_filter:
/^(2\S+ delivered to file).+/ $1
/^(2\S+ delivered to command).+/ $1
</pre>
</blockquote>
<p> Notes: </p>
<ul>
<li> <p> This feature will NOT override the <a href="postconf.5.html#soft_bounce">soft_bounce</a> safety net. </p>
<li> <p> 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.
</p>
</ul>
<p> This feature is available in Postfix 2.12 and later. </p>
</DD>
<DT><b><a name="default_destination_concurrency_failed_cohort_limit">default_destination_concurrency_failed_cohort_limit</a>
@ -3920,17 +3939,6 @@ parameter. See there for details. </p>
<p> This feature is available in Postfix 2.5 and later. </p>
</DD>
<DT><b><a name="lmtp_bounce_defer_filter">lmtp_bounce_defer_filter</a>
(default: empty)</b></DT><DD>
<p> The LMTP-specific version of the <a href="postconf.5.html#smtp_bounce_defer_filter">smtp_bounce_defer_filter</a>
configuration parameter. See there for details. </p>
<p> This feature is available in Postfix 2.12 and later. </p>
</DD>
<DT><b><a name="lmtp_cache_connection">lmtp_cache_connection</a>
@ -4132,6 +4140,17 @@ configuration parameter. See there for details. </p>
<p> This feature is available in Postfix 2.3 and later. </p>
</DD>
<DT><b><a name="lmtp_delivery_status_filter">lmtp_delivery_status_filter</a>
(default: empty)</b></DT><DD>
<p> The LMTP-specific version of the <a href="postconf.5.html#smtp_delivery_status_filter">smtp_delivery_status_filter</a>
configuration parameter. See there for details. </p>
<p> This feature is available in Postfix 2.12 and later. </p>
</DD>
<DT><b><a name="lmtp_destination_concurrency_limit">lmtp_destination_concurrency_limit</a>
@ -5127,18 +5146,6 @@ This feature is available in Postfix 2.1 and later.
</p>
</DD>
<DT><b><a name="local_bounce_defer_filter">local_bounce_defer_filter</a>
(default: $<a href="postconf.5.html#default_bounce_defer_filter">default_bounce_defer_filter</a>)</b></DT><DD>
<p> Optional filter to change arbitrary hard delivery errors into
soft errors and vice versa in the <a href="local.8.html">local(8)</a> delivery agent. See
<a href="postconf.5.html#default_bounce_defer_filter">default_bounce_defer_filter</a> for details. </p>
<p> This feature is available in Postfix 2.12 and later. </p>
</DD>
<DT><b><a name="local_command_shell">local_command_shell</a>
@ -5169,6 +5176,18 @@ Example:
</pre>
</DD>
<DT><b><a name="local_delivery_status_filter">local_delivery_status_filter</a>
(default: $<a href="postconf.5.html#default_delivery_status_filter">default_delivery_status_filter</a>)</b></DT><DD>
<p> Optional filter for the <a href="local.8.html">local(8)</a> delivery agent to change the
status code or explanatory text of successful or unsuccessful
deliveries. See <a href="postconf.5.html#default_delivery_status_filter">default_delivery_status_filter</a> for details. </p>
<p> This feature is available in Postfix 2.12 and later. </p>
</DD>
<DT><b><a name="local_destination_concurrency_limit">local_destination_concurrency_limit</a>
@ -7013,12 +7032,12 @@ This feature is available in Postfix 2.0 and later.
</DD>
<DT><b><a name="pipe_bounce_defer_filter">pipe_bounce_defer_filter</a>
(default: $<a href="postconf.5.html#default_bounce_defer_filter">default_bounce_defer_filter</a>)</b></DT><DD>
<DT><b><a name="pipe_delivery_status_filter">pipe_delivery_status_filter</a>
(default: $<a href="postconf.5.html#default_delivery_status_filter">default_delivery_status_filter</a>)</b></DT><DD>
<p> Optional filter to change arbitrary hard delivery errors into
soft errors and vice versa in the <a href="pipe.8.html">pipe(8)</a> delivery agent. See
<a href="postconf.5.html#default_bounce_defer_filter">default_bounce_defer_filter</a> for details. </p>
<p> Optional filter for the <a href="pipe.8.html">pipe(8)</a> delivery agent to change the
delivery status code or explanatory text of successful or unsuccessful
deliveries. See <a href="postconf.5.html#default_delivery_status_filter">default_delivery_status_filter</a> for details. </p>
<p> This feature is available in Postfix 2.12 and later. </p>
@ -9588,22 +9607,6 @@ that change the delivery time or destination are not available.
<p> This feature is available in Postfix 2.5 and later. </p>
</DD>
<DT><b><a name="smtp_bounce_defer_filter">smtp_bounce_defer_filter</a>
(default: $<a href="postconf.5.html#default_bounce_defer_filter">default_bounce_defer_filter</a>)</b></DT><DD>
<p> Optional filter to change arbitrary hard delivery errors into
soft errors and vice versa in the <a href="smtp.8.html">smtp(8)</a> delivery agent. See
<a href="postconf.5.html#default_bounce_defer_filter">default_bounce_defer_filter</a> for details. </p>
<p> 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 <a href="postconf.5.html#smtp_reply_filter">smtp_reply_filter</a>
feature modifies remote SMTP server responses that may result in
email non-delivery or delivery. </p>
</DD>
<DT><b><a name="smtp_cname_overrides_servername">smtp_cname_overrides_servername</a>
@ -9868,6 +9871,21 @@ This feature is available in Postfix 2.1 and later.
</p>
</DD>
<DT><b><a name="smtp_delivery_status_filter">smtp_delivery_status_filter</a>
(default: $<a href="postconf.5.html#default_delivery_status_filter">default_delivery_status_filter</a>)</b></DT><DD>
<p> Optional filter for the <a href="smtp.8.html">smtp(8)</a> delivery agent to change the
delivery status code or explanatory text of successful or unsuccessful
deliveries. See <a href="postconf.5.html#default_delivery_status_filter">default_delivery_status_filter</a> for details. </p>
<p> 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 <a href="postconf.5.html#smtp_reply_filter">smtp_reply_filter</a> feature modifies
remote SMTP server responses only. </p>
</DD>
<DT><b><a name="smtp_destination_concurrency_limit">smtp_destination_concurrency_limit</a>
@ -18219,12 +18237,12 @@ This feature is available in Postfix 2.1 and later.
</DD>
<DT><b><a name="virtual_bounce_defer_filter">virtual_bounce_defer_filter</a>
(default: $<a href="postconf.5.html#default_bounce_defer_filter">default_bounce_defer_filter</a>)</b></DT><DD>
<DT><b><a name="virtual_delivery_status_filter">virtual_delivery_status_filter</a>
(default: $<a href="postconf.5.html#default_delivery_status_filter">default_delivery_status_filter</a>)</b></DT><DD>
<p> Optional filter to change arbitrary hard delivery errors into
soft errors and vice versa in the <a href="virtual.8.html">virtual(8)</a> delivery agent. See
<a href="postconf.5.html#default_bounce_defer_filter">default_bounce_defer_filter</a> for details. </p>
<p> Optional filter for the <a href="virtual.8.html">virtual(8)</a> delivery agent to change the
delivery status code or explanatory text of successful or unsuccessful
deliveries. See <a href="postconf.5.html#default_delivery_status_filter">default_delivery_status_filter</a> for details. </p>
<p> This feature is available in Postfix 2.12 and later. </p>

View File

@ -292,9 +292,10 @@ SMTP(8) SMTP(8)
Available in Postfix version 2.12 and later:
<b><a href="postconf.5.html#smtp_bounce_defer_filter">smtp_bounce_defer_filter</a> ($<a href="postconf.5.html#default_bounce_defer_filter">default_bounce_defer_filter</a>)</b>
Optional filter to change arbitrary hard delivery errors into
soft errors and vice versa in the <a href="smtp.8.html"><b>smtp</b>(8)</a> delivery agent.
<b><a href="postconf.5.html#smtp_delivery_status_filter">smtp_delivery_status_filter</a> ($<a href="postconf.5.html#default_delivery_status_filter">default_delivery_status_filter</a>)</b>
Optional filter for the <a href="smtp.8.html"><b>smtp</b>(8)</a> delivery agent to change the
delivery status code or explanatory text of successful or unsuc-
cessful deliveries.
<b>MIME PROCESSING CONTROLS</b>
Available in Postfix version 2.0 and later:

View File

@ -263,9 +263,10 @@ VIRTUAL(8) VIRTUAL(8)
Available in Postfix version 2.12 and later:
<b><a href="postconf.5.html#virtual_bounce_defer_filter">virtual_bounce_defer_filter</a> ($<a href="postconf.5.html#default_bounce_defer_filter">default_bounce_defer_filter</a>)</b>
Optional filter to change arbitrary hard delivery errors into
soft errors and vice versa in the <a href="virtual.8.html"><b>virtual</b>(8)</a> delivery agent.
<b><a href="postconf.5.html#virtual_delivery_status_filter">virtual_delivery_status_filter</a> ($<a href="postconf.5.html#default_delivery_status_filter">default_delivery_status_filter</a>)</b>
Optional filter for the <a href="virtual.8.html"><b>virtual</b>(8)</a> delivery agent to change the
delivery status code or explanatory text of successful or unsuc-
cessful deliveries.
<b>SEE ALSO</b>
<a href="qmgr.8.html">qmgr(8)</a>, queue manager

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -133,7 +133,7 @@ while (<>) {
s;\bdaemon_timeout\b;<a href="postconf.5.html#daemon_timeout">$&</a>;g;
s;\bdebug_peer_level\b;<a href="postconf.5.html#debug_peer_level">$&</a>;g;
s;\bdebug_peer_list\b;<a href="postconf.5.html#debug_peer_list">$&</a>;g;
s;\bdefault_bounce_defer_filter\b;<a href="postconf.5.html#default_bounce_defer_filter">$&</a>;g;
s;\bdefault_delivery_status_filter\b;<a href="postconf.5.html#default_delivery_status_filter">$&</a>;g;
s;\bdefault_data[-</Bb>]*\n* *[<Bb>]*base_type\b;<a href="postconf.5.html#default_database_type">$&</a>;g;
s;\bdefault_deliv[-</Bb>]*\n* *[<Bb>]*ery_slot_cost\b;<a href="postconf.5.html#default_delivery_slot_cost">$&</a>;g;
s;\bdefault_deliv[-</Bb>]*\n* *[<Bb>]*ery_slot_discount\b;<a href="postconf.5.html#default_delivery_slot_discount">$&</a>;g;
@ -213,7 +213,7 @@ while (<>) {
s;\blmtp_address_preference\b;<a href="postconf.5.html#lmtp_address_preference">$&</a>;g;
s;\blmtp_body_checks\b;<a href="postconf.5.html#lmtp_body_checks">$&</a>;g;
s;\blmtp_cname_overrides_servername\b;<a href="postconf.5.html#lmtp_cname_overrides_servername">$&</a>;g;
s;\blmtp_bounce_defer_filter\b;<a href="postconf.5.html#lmtp_bounce_defer_filter">$&</a>;g;
s;\blmtp_delivery_status_filter\b;<a href="postconf.5.html#lmtp_delivery_status_filter">$&</a>;g;
s;\blmtp_dns_resolver_options\b;<a href="postconf.5.html#lmtp_dns_resolver_options">$&</a>;g;
s;\blmtp_dns_support_level\b;<a href="postconf.5.html#lmtp_dns_support_level">$&</a>;g;
s;\blmtp_header_checks\b;<a href="postconf.5.html#lmtp_header_checks">$&</a>;g;
@ -307,7 +307,7 @@ while (<>) {
s;\blmtp_skip_quit_response\b;<a href="postconf.5.html#lmtp_skip_quit_response">$&</a>;g;
s;\blmtp_tcp_port\b;<a href="postconf.5.html#lmtp_tcp_port">$&</a>;g;
s;\blmtp_xforward_timeout\b;<a href="postconf.5.html#lmtp_xforward_timeout">$&</a>;g;
s;\blocal_bounce_defer_filter\b;<a href="postconf.5.html#local_bounce_defer_filter">$&</a>;g;
s;\blocal_delivery_status_filter\b;<a href="postconf.5.html#local_delivery_status_filter">$&</a>;g;
s;\blocal_command_shell\b;<a href="postconf.5.html#local_command_shell">$&</a>;g;
s;\blocal_destina[-</bB>]*\n* *[<bB>]*tion_concurrency_limit\b;<a href="postconf.5.html#local_destination_concurrency_limit">$&</a>;g;
s;\blocal_destina[-</bB>]*\n* *[<bB>]*tion_recip[-</bB>]*\n* *[<bB>]*ient_limit\b;<a href="postconf.5.html#local_destination_recipient_limit">$&</a>;g;
@ -360,7 +360,7 @@ while (<>) {
s;\bpar[-</bB>]*\n* *[<bB>]*ent_domain_matches_subdomains\b;<a href="postconf.5.html#parent_domain_matches_subdomains">$&</a>;g;
s;\bpermit_mx_backup_networks\b;<a href="postconf.5.html#permit_mx_backup_networks">$&</a>;g;
s;\bpickup_service_name\b;<a href="postconf.5.html#pickup_service_name">$&</a>;g;
s;\bpipe_bounce_defer_filter\b;<a href="postconf.5.html#pipe_bounce_defer_filter">$&</a>;g;
s;\bpipe_delivery_status_filter\b;<a href="postconf.5.html#pipe_delivery_status_filter">$&</a>;g;
s;\bplaintext_reject_code\b;<a href="postconf.5.html#plaintext_reject_code">$&</a>;g;
s;\bpost[-</bB>]*\n* *[<bB>]*multi_start_commands\b;<a href="postconf.5.html#postmulti_start_commands">$&</a>;g;
s;\bpost[-</bB>]*\n* *[<bB>]*multi_stop_commands\b;<a href="postconf.5.html#postmulti_stop_commands">$&</a>;g;
@ -455,7 +455,7 @@ while (<>) {
s;\bsmtp_connection_cache_time_limit\b;<a href="postconf.5.html#smtp_connection_cache_time_limit">$&</a>;g;
s;\bsmtp_connection_cache_destinations\b;<a href="postconf.5.html#smtp_connection_cache_destinations">$&</a>;g;
s;\bsmtp_bounce_defer_filter\b;<a href="postconf.5.html#smtp_bounce_defer_filter">$&</a>;g;
s;\bsmtp_delivery_status_filter\b;<a href="postconf.5.html#smtp_delivery_status_filter">$&</a>;g;
s;\bsmtp_data_done_timeout\b;<a href="postconf.5.html#smtp_data_done_timeout">$&</a>;g;
s;\bsmtp_data_init_timeout\b;<a href="postconf.5.html#smtp_data_init_timeout">$&</a>;g;
s;\bsmtp_data_xfer_timeout\b;<a href="postconf.5.html#smtp_data_xfer_timeout">$&</a>;g;
@ -606,7 +606,7 @@ while (<>) {
s;\bvir[-</bB>]*\n*[ <bB>]*tual_alias_maps\b;<a href="postconf.5.html#virtual_alias_maps">$&</a>;g;
s;\bvir[-</bB>]*\n*[ <bB>]*tual_maps\b;<a href="postconf.5.html#virtual_maps">$&</a>;g;
s;\bvir[-</bB>]*\n*[ <bB>]*tual_alias_recursion_limit\b;<a href="postconf.5.html#virtual_alias_recursion_limit">$&</a>;g;
s;\bvir[-</bB>]*\n*[ <bB>]*tual_bounce_defer_filter\b;<a href="postconf.5.html#virtual_bounce_defer_filter">$&</a>;g;
s;\bvir[-</bB>]*\n*[ <bB>]*tual_delivery_status_filter\b;<a href="postconf.5.html#virtual_delivery_status_filter">$&</a>;g;
s;\bvir[-</bB>]*\n*[ <bB>]*tual_gid_maps\b;<a href="postconf.5.html#virtual_gid_maps">$&</a>;g;
s;\bvir[-</bB>]*\n*[ <bB>]*tual_mail[-</bB>]*\n* *[<bB>]*box_base\b;<a href="postconf.5.html#virtual_mailbox_base">$&</a>;g;
s;\bvir[-</bB>]*\n*[ <bB>]*tual_mail[-</bB>]*\n* *[<bB>]*box_domains\b;<a href="postconf.5.html#virtual_mailbox_domains">$&</a>;g;

View File

@ -15616,12 +15616,12 @@ anchor assertion) TLSA records. </p>
<p> This feature is available in Postfix 2.11 and later. </p>
%PARAM default_bounce_defer_filter
%PARAM default_delivery_status_filter
<p> 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. </p>
<p> 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. </p>
<p> 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
</blockquote>
<p> 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.
</p>
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. </p>
<p> Example: </p>
<p> The following example turns specific soft TLS errors into hard
errors, by overriding the first number in the enhanced status code.
</p>
<p> Example 1: convert specific soft TLS errors into hard errors,
by overriding the first number in the enhanced status code. </p>
<blockquote>
<pre>
/etc/postfix/main.cf:
smtp_bounce_defer_filter = pcre:/etc/postfix/smtp_ndr_filter
smtp_delivery_status_filter = pcre:/etc/postfix/smtp_dsn_filter
</pre>
</blockquote>
<blockquote>
<pre>
/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.
</pre>
</blockquote>
<p> 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.
</p>
<blockquote>
<pre>
/etc/postfix/main.cf:
local_delivery_status_filter = pcre:/etc/postfix/local_dsn_filter
</pre>
</blockquote>
<blockquote>
<pre>
/etc/postfix/local_dsn_filter:
/^(2\S+ delivered to file).+/ $1
/^(2\S+ delivered to command).+/ $1
</pre>
</blockquote>
<p> Notes: </p>
<ul>
@ -15674,51 +15692,51 @@ errors, by overriding the first number in the enhanced status code.
<li> <p> This feature will change the enhanced status code and text
that is logged to the maillog file, and that is reported to the
sender. </p>
sender in delivery confirmation or non-delivery notifications.
</p>
</ul>
<p> This feature is available in Postfix 2.12 and later. </p>
%PARAM smtp_bounce_defer_filter $default_bounce_defer_filter
%PARAM smtp_delivery_status_filter $default_delivery_status_filter
<p> 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. </p>
<p> 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. </p>
<p> 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. </p>
<p> 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. </p>
%PARAM lmtp_bounce_defer_filter
%PARAM lmtp_delivery_status_filter
<p> The LMTP-specific version of the smtp_bounce_defer_filter
<p> The LMTP-specific version of the smtp_delivery_status_filter
configuration parameter. See there for details. </p>
<p> This feature is available in Postfix 2.12 and later. </p>
%PARAM pipe_bounce_defer_filter $default_bounce_defer_filter
%PARAM pipe_delivery_status_filter $default_delivery_status_filter
<p> 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. </p>
<p> 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. </p>
<p> This feature is available in Postfix 2.12 and later. </p>
%PARAM virtual_bounce_defer_filter $default_bounce_defer_filter
%PARAM virtual_delivery_status_filter $default_delivery_status_filter
<p> 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. </p>
<p> 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. </p>
<p> This feature is available in Postfix 2.12 and later. </p>
%PARAM local_bounce_defer_filter $default_bounce_defer_filter
%PARAM local_delivery_status_filter $default_delivery_status_filter
<p> 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. </p>
<p> 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. </p>
<p> This feature is available in Postfix 2.12 and later. </p>

View File

@ -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

View File

@ -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 <mail_params.h>
#include <mail_proto.h>
#include <log_adhoc.h>
@ -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);
}

View File

@ -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 <ndr_filter.h>
#include <dsn_filter.h>
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 *);

View File

@ -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 <mail_params.h>
#include <mail_queue.h>
#include <mail_proto.h>
@ -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,

View File

@ -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 *);

View File

@ -0,0 +1,192 @@
/*++
/* NAME
/* dsn_filter 3
/* SUMMARY
/* filter DSN status or text
/* SYNOPSIS
/* #include <dsn_filter.h>
/*
/* 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 <sys_defs.h>
/*
* Utility library.
*/
#include <msg.h>
#include <mymalloc.h>
#include <vstring.h>
/*
* Global library.
*/
#include <maps.h>
#include <dsn.h>
#include <dsn_util.h>
#include <maps.h>
#include <dsn_filter.h>
/*
* 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);
}

View File

@ -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 <ndr_filter.h>
/* #include <dsn_filter.h>
/* 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

View File

@ -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[] = {

View File

@ -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

View File

@ -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

View File

@ -1,182 +0,0 @@
/*++
/* NAME
/* ndr_filter 3
/* SUMMARY
/* bounce or defer NDR filter
/* SYNOPSIS
/* #include <ndr_filter.h>
/*
/* 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 <sys_defs.h>
/*
* Utility library.
*/
#include <msg.h>
#include <mymalloc.h>
#include <vstring.h>
/*
* Global library.
*/
#include <maps.h>
#include <dsn.h>
#include <dsn_util.h>
#include <maps.h>
#include <ndr_filter.h>
/*
* 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);
}

View File

@ -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 <mail_params.h>
#include <verify.h>
#include <log_adhoc.h>
@ -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);
}

View File

@ -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);
}

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);
}

View File

@ -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[] = {

View File

@ -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);
}

View File

@ -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[] = {

View File

@ -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);
}