mirror of
https://github.com/vdukhovni/postfix
synced 2025-08-23 02:17:44 +00:00
postfix-2.12-20140321
This commit is contained in:
parent
1b55748771
commit
48a0b6fc23
@ -19627,10 +19627,25 @@ Apologies for any names omitted.
|
|||||||
Feature: local_bounce_defer_filter support. Files:
|
Feature: local_bounce_defer_filter support. Files:
|
||||||
global/bounce.[hc], global/defer.[hc], local/command.c,
|
global/bounce.[hc], global/defer.[hc], local/command.c,
|
||||||
local/file.c, local/bounce_workaround.c, local/local.c,
|
local/file.c, local/bounce_workaround.c, local/local.c,
|
||||||
global/mail_params.h.
|
global/mail_params.h, mantools/postlink.
|
||||||
|
|
||||||
20140318
|
20140318
|
||||||
|
|
||||||
Refinement: don't throttle an SMTP destination when the new
|
Refinement: don't throttle an SMTP destination when the new
|
||||||
smtp_bounce_defer_filter feature turns a soft bounce into
|
smtp_bounce_defer_filter feature turns a soft bounce into
|
||||||
a hard bounce. File: smtp/smtp_trouble.c.
|
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.
|
||||||
|
@ -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
|
If you upgrade from Postfix 2.10 or earlier, read RELEASE_NOTES-2.11
|
||||||
before proceeding.
|
before proceeding.
|
||||||
|
|
||||||
Major changes with snapshot 20140318
|
Major changes with snapshot 20140321
|
||||||
====================================
|
====================================
|
||||||
|
|
||||||
Support to change arbitrary hard delivery errors into soft errors
|
Delivery status filter support, to replace the delivery status codes
|
||||||
and vice versa, or to replace the descriptive text in non-delivery
|
and explanatory text of successful or unsuccessful deliveries. This
|
||||||
notifications. This was originally implemented for sites that want
|
was originally implemented for sites that want to turn certain soft
|
||||||
to bounce mail when no remote SMTP server supports STARTTLS.
|
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
|
This feature is implemented as a filter that replaces the three-number
|
||||||
enhanced status code and descriptive text in Postfix delivery agent
|
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.
|
errors, by overriding the first number in the enhanced status code.
|
||||||
|
|
||||||
/etc/postfix/main.cf:
|
/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 host \S+ refused to start TLS: .+)/ 5$1
|
||||||
/^4(\.\d+\.\d+ TLS is required, but was not offered by host .+)/ 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)
|
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
|
and virtual(8) delivery agents. That is, all delivery agents that
|
||||||
actually deliver mail.
|
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:
|
The new main.cf parameters and default values are:
|
||||||
|
|
||||||
default_bounce_defer_filter =
|
default_delivery_status_filter =
|
||||||
lmtp_bounce_defer_filter = $default_bounce_defer_filter
|
lmtp_delivery_status_filter = $default_delivery_status_filter
|
||||||
local_bounce_defer_filter = $default_bounce_defer_filter
|
local_delivery_status_filter = $default_delivery_status_filter
|
||||||
pipe_bounce_defer_filter = $default_bounce_defer_filter
|
pipe_delivery_status_filter = $default_delivery_status_filter
|
||||||
smtp_bounce_defer_filter = $default_bounce_defer_filter
|
smtp_delivery_status_filter = $default_delivery_status_filter
|
||||||
virtual_bounce_defer_filter = $default_bounce_defer_filter
|
virtual_delivery_status_filter = $default_delivery_status_filter
|
||||||
|
|
||||||
See the postconf(5) manpage for more details.
|
See the postconf(5) manpage for more details.
|
||||||
|
@ -292,9 +292,10 @@ SMTP(8) SMTP(8)
|
|||||||
|
|
||||||
Available in Postfix version 2.12 and later:
|
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>
|
<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 to change arbitrary hard delivery errors into
|
Optional filter for the <a href="smtp.8.html"><b>smtp</b>(8)</a> delivery agent to change the
|
||||||
soft errors and vice versa in the <a href="smtp.8.html"><b>smtp</b>(8)</a> delivery agent.
|
delivery status code or explanatory text of successful or unsuc-
|
||||||
|
cessful deliveries.
|
||||||
|
|
||||||
<b>MIME PROCESSING CONTROLS</b>
|
<b>MIME PROCESSING CONTROLS</b>
|
||||||
Available in Postfix version 2.0 and later:
|
Available in Postfix version 2.0 and later:
|
||||||
|
@ -360,9 +360,10 @@ LOCAL(8) LOCAL(8)
|
|||||||
|
|
||||||
Available in Postfix version 2.12 and later:
|
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>
|
<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 to change arbitrary hard delivery errors into
|
Optional filter for the <a href="local.8.html"><b>local</b>(8)</a> delivery agent to change the
|
||||||
soft errors and vice versa in the <a href="local.8.html"><b>local</b>(8)</a> delivery agent.
|
status code or explanatory text of successful or unsuccessful
|
||||||
|
deliveries.
|
||||||
|
|
||||||
<b>DELIVERY METHOD CONTROLS</b>
|
<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:
|
The precedence of <a href="local.8.html"><b>local</b>(8)</a> delivery methods from high to low is:
|
||||||
|
@ -449,9 +449,10 @@ PIPE(8) PIPE(8)
|
|||||||
|
|
||||||
Available in Postfix version 2.12 and later:
|
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>
|
<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 to change arbitrary hard delivery errors into
|
Optional filter for the <a href="pipe.8.html"><b>pipe</b>(8)</a> delivery agent to change the
|
||||||
soft errors and vice versa in the <a href="pipe.8.html"><b>pipe</b>(8)</a> delivery agent.
|
delivery status code or explanatory text of successful or unsuc-
|
||||||
|
cessful deliveries.
|
||||||
|
|
||||||
<b>SEE ALSO</b>
|
<b>SEE ALSO</b>
|
||||||
<a href="qmgr.8.html">qmgr(8)</a>, queue manager
|
<a href="qmgr.8.html">qmgr(8)</a>, queue manager
|
||||||
|
@ -1756,74 +1756,6 @@ Example:
|
|||||||
</pre>
|
</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>
|
</DD>
|
||||||
|
|
||||||
<DT><b><a name="default_database_type">default_database_type</a>
|
<DT><b><a name="default_database_type">default_database_type</a>
|
||||||
@ -1952,6 +1884,93 @@ name of the message delivery transport.
|
|||||||
</p>
|
</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>
|
</DD>
|
||||||
|
|
||||||
<DT><b><a name="default_destination_concurrency_failed_cohort_limit">default_destination_concurrency_failed_cohort_limit</a>
|
<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>
|
<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>
|
</DD>
|
||||||
|
|
||||||
<DT><b><a name="lmtp_cache_connection">lmtp_cache_connection</a>
|
<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>
|
<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>
|
</DD>
|
||||||
|
|
||||||
<DT><b><a name="lmtp_destination_concurrency_limit">lmtp_destination_concurrency_limit</a>
|
<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>
|
</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>
|
</DD>
|
||||||
|
|
||||||
<DT><b><a name="local_command_shell">local_command_shell</a>
|
<DT><b><a name="local_command_shell">local_command_shell</a>
|
||||||
@ -5169,6 +5176,18 @@ Example:
|
|||||||
</pre>
|
</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>
|
</DD>
|
||||||
|
|
||||||
<DT><b><a name="local_destination_concurrency_limit">local_destination_concurrency_limit</a>
|
<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>
|
</DD>
|
||||||
|
|
||||||
<DT><b><a name="pipe_bounce_defer_filter">pipe_bounce_defer_filter</a>
|
<DT><b><a name="pipe_delivery_status_filter">pipe_delivery_status_filter</a>
|
||||||
(default: $<a href="postconf.5.html#default_bounce_defer_filter">default_bounce_defer_filter</a>)</b></DT><DD>
|
(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
|
<p> Optional filter for the <a href="pipe.8.html">pipe(8)</a> delivery agent to change the
|
||||||
soft errors and vice versa in the <a href="pipe.8.html">pipe(8)</a> delivery agent. See
|
delivery status code or explanatory text of successful or unsuccessful
|
||||||
<a href="postconf.5.html#default_bounce_defer_filter">default_bounce_defer_filter</a> for details. </p>
|
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>
|
<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>
|
<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>
|
</DD>
|
||||||
|
|
||||||
<DT><b><a name="smtp_cname_overrides_servername">smtp_cname_overrides_servername</a>
|
<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>
|
</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>
|
</DD>
|
||||||
|
|
||||||
<DT><b><a name="smtp_destination_concurrency_limit">smtp_destination_concurrency_limit</a>
|
<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>
|
</DD>
|
||||||
|
|
||||||
<DT><b><a name="virtual_bounce_defer_filter">virtual_bounce_defer_filter</a>
|
<DT><b><a name="virtual_delivery_status_filter">virtual_delivery_status_filter</a>
|
||||||
(default: $<a href="postconf.5.html#default_bounce_defer_filter">default_bounce_defer_filter</a>)</b></DT><DD>
|
(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
|
<p> Optional filter for the <a href="virtual.8.html">virtual(8)</a> delivery agent to change the
|
||||||
soft errors and vice versa in the <a href="virtual.8.html">virtual(8)</a> delivery agent. See
|
delivery status code or explanatory text of successful or unsuccessful
|
||||||
<a href="postconf.5.html#default_bounce_defer_filter">default_bounce_defer_filter</a> for details. </p>
|
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>
|
<p> This feature is available in Postfix 2.12 and later. </p>
|
||||||
|
|
||||||
|
@ -292,9 +292,10 @@ SMTP(8) SMTP(8)
|
|||||||
|
|
||||||
Available in Postfix version 2.12 and later:
|
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>
|
<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 to change arbitrary hard delivery errors into
|
Optional filter for the <a href="smtp.8.html"><b>smtp</b>(8)</a> delivery agent to change the
|
||||||
soft errors and vice versa in the <a href="smtp.8.html"><b>smtp</b>(8)</a> delivery agent.
|
delivery status code or explanatory text of successful or unsuc-
|
||||||
|
cessful deliveries.
|
||||||
|
|
||||||
<b>MIME PROCESSING CONTROLS</b>
|
<b>MIME PROCESSING CONTROLS</b>
|
||||||
Available in Postfix version 2.0 and later:
|
Available in Postfix version 2.0 and later:
|
||||||
|
@ -263,9 +263,10 @@ VIRTUAL(8) VIRTUAL(8)
|
|||||||
|
|
||||||
Available in Postfix version 2.12 and later:
|
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>
|
<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 to change arbitrary hard delivery errors into
|
Optional filter for the <a href="virtual.8.html"><b>virtual</b>(8)</a> delivery agent to change the
|
||||||
soft errors and vice versa in the <a href="virtual.8.html"><b>virtual</b>(8)</a> delivery agent.
|
delivery status code or explanatory text of successful or unsuc-
|
||||||
|
cessful deliveries.
|
||||||
|
|
||||||
<b>SEE ALSO</b>
|
<b>SEE ALSO</b>
|
||||||
<a href="qmgr.8.html">qmgr(8)</a>, queue manager
|
<a href="qmgr.8.html">qmgr(8)</a>, queue manager
|
||||||
|
@ -1021,71 +1021,6 @@ debugger_command =
|
|||||||
.fi
|
.fi
|
||||||
.ad
|
.ad
|
||||||
.ft R
|
.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)
|
.SH default_database_type (default: see "postconf -d" output)
|
||||||
The default database type for use in \fBnewaliases\fR(1), \fBpostalias\fR(1)
|
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
|
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
|
Use \fItransport\fR_delivery_slot_loan to specify a
|
||||||
transport-specific override, where \fItransport\fR is the master.cf
|
transport-specific override, where \fItransport\fR is the master.cf
|
||||||
name of the message delivery transport.
|
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)
|
.SH default_destination_concurrency_failed_cohort_limit (default: 1)
|
||||||
How many pseudo-cohorts must suffer connection or handshake
|
How many pseudo-cohorts must suffer connection or handshake
|
||||||
failure before a specific destination is considered unavailable
|
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.
|
parameter. See there for details.
|
||||||
.PP
|
.PP
|
||||||
This feature is available in Postfix 2.5 and later.
|
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)
|
.SH lmtp_cache_connection (default: yes)
|
||||||
Keep Postfix LMTP client connections open for up to $max_idle
|
Keep Postfix LMTP client connections open for up to $max_idle
|
||||||
seconds. When the LMTP client receives a request for the same
|
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.
|
configuration parameter. See there for details.
|
||||||
.PP
|
.PP
|
||||||
This feature is available in Postfix 2.3 and later.
|
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)
|
.SH lmtp_destination_concurrency_limit (default: $default_destination_concurrency_limit)
|
||||||
The maximal number of parallel deliveries to the same destination
|
The maximal number of parallel deliveries to the same destination
|
||||||
via the lmtp message delivery transport. This limit is enforced by
|
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).
|
The default time unit is s (seconds).
|
||||||
.PP
|
.PP
|
||||||
This feature is available in Postfix 2.1 and later.
|
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)
|
.SH local_command_shell (default: empty)
|
||||||
Optional shell program for \fBlocal\fR(8) delivery to non-Postfix command.
|
Optional shell program for \fBlocal\fR(8) delivery to non-Postfix command.
|
||||||
By default, non-Postfix commands are executed directly; commands
|
By default, non-Postfix commands are executed directly; commands
|
||||||
@ -2959,6 +2980,12 @@ local_command_shell = /bin/bash -c
|
|||||||
.fi
|
.fi
|
||||||
.ad
|
.ad
|
||||||
.ft R
|
.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)
|
.SH local_destination_concurrency_limit (default: 2)
|
||||||
The maximal number of parallel deliveries via the local mail
|
The maximal number of parallel deliveries via the local mail
|
||||||
delivery transport to the same recipient (when
|
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.
|
submissions from the Postfix maildrop queue.
|
||||||
.PP
|
.PP
|
||||||
This feature is available in Postfix 2.0 and later.
|
This feature is available in Postfix 2.0 and later.
|
||||||
.SH pipe_bounce_defer_filter (default: $default_bounce_defer_filter)
|
.SH pipe_delivery_status_filter (default: $default_delivery_status_filter)
|
||||||
Optional filter to change arbitrary hard delivery errors into
|
Optional filter for the \fBpipe\fR(8) delivery agent to change the
|
||||||
soft errors and vice versa in the \fBpipe\fR(8) delivery agent. See
|
delivery status code or explanatory text of successful or unsuccessful
|
||||||
default_bounce_defer_filter for details.
|
deliveries. See default_delivery_status_filter for details.
|
||||||
.PP
|
.PP
|
||||||
This feature is available in Postfix 2.12 and later.
|
This feature is available in Postfix 2.12 and later.
|
||||||
.SH plaintext_reject_code (default: 450)
|
.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.
|
that change the delivery time or destination are not available.
|
||||||
.PP
|
.PP
|
||||||
This feature is available in Postfix 2.5 and later.
|
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)
|
.SH smtp_cname_overrides_servername (default: version dependent)
|
||||||
When the remote SMTP servername is a DNS CNAME, replace the
|
When the remote SMTP servername is a DNS CNAME, replace the
|
||||||
servername with the result from CNAME expansion for the purpose of
|
servername with the result from CNAME expansion for the purpose of
|
||||||
@ -6027,6 +6044,15 @@ or worse preference
|
|||||||
than the local MTA itself.
|
than the local MTA itself.
|
||||||
.PP
|
.PP
|
||||||
This feature is available in Postfix 2.1 and later.
|
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)
|
.SH smtp_destination_concurrency_limit (default: $default_destination_concurrency_limit)
|
||||||
The maximal number of parallel deliveries to the same destination
|
The maximal number of parallel deliveries to the same destination
|
||||||
via the smtp message delivery transport. This limit is enforced by
|
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.
|
change in the future.
|
||||||
.PP
|
.PP
|
||||||
This feature is available in Postfix 2.1 and later.
|
This feature is available in Postfix 2.1 and later.
|
||||||
.SH virtual_bounce_defer_filter (default: $default_bounce_defer_filter)
|
.SH virtual_delivery_status_filter (default: $default_delivery_status_filter)
|
||||||
Optional filter to change arbitrary hard delivery errors into
|
Optional filter for the \fBvirtual\fR(8) delivery agent to change the
|
||||||
soft errors and vice versa in the \fBvirtual\fR(8) delivery agent. See
|
delivery status code or explanatory text of successful or unsuccessful
|
||||||
default_bounce_defer_filter for details.
|
deliveries. See default_delivery_status_filter for details.
|
||||||
.PP
|
.PP
|
||||||
This feature is available in Postfix 2.12 and later.
|
This feature is available in Postfix 2.12 and later.
|
||||||
.SH virtual_destination_concurrency_limit (default: $default_destination_concurrency_limit)
|
.SH virtual_destination_concurrency_limit (default: $default_destination_concurrency_limit)
|
||||||
|
@ -421,9 +421,10 @@ attribute, when delivering mail to a child alias that does not have
|
|||||||
its own owner alias.
|
its own owner alias.
|
||||||
.PP
|
.PP
|
||||||
Available in Postfix version 2.12 and later:
|
Available in Postfix version 2.12 and later:
|
||||||
.IP "\fBlocal_bounce_defer_filter ($default_bounce_defer_filter)\fR"
|
.IP "\fBlocal_delivery_status_filter ($default_delivery_status_filter)\fR"
|
||||||
Optional filter to change arbitrary hard delivery errors into
|
Optional filter for the \fBlocal\fR(8) delivery agent to change the
|
||||||
soft errors and vice versa in the \fBlocal\fR(8) delivery agent.
|
status code or explanatory text of successful or unsuccessful
|
||||||
|
deliveries.
|
||||||
.SH "DELIVERY METHOD CONTROLS"
|
.SH "DELIVERY METHOD CONTROLS"
|
||||||
.na
|
.na
|
||||||
.nf
|
.nf
|
||||||
|
@ -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".
|
records, so that "smtpd" becomes, for example, "postfix/smtpd".
|
||||||
.PP
|
.PP
|
||||||
Available in Postfix version 2.12 and later:
|
Available in Postfix version 2.12 and later:
|
||||||
.IP "\fBpipe_bounce_defer_filter ($default_bounce_defer_filter)\fR"
|
.IP "\fBpipe_delivery_status_filter ($default_delivery_status_filter)\fR"
|
||||||
Optional filter to change arbitrary hard delivery errors into
|
Optional filter for the \fBpipe\fR(8) delivery agent to change the
|
||||||
soft errors and vice versa in the \fBpipe\fR(8) delivery agent.
|
delivery status code or explanatory text of successful or unsuccessful
|
||||||
|
deliveries.
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
.na
|
.na
|
||||||
.nf
|
.nf
|
||||||
|
@ -276,9 +276,10 @@ Available in Postfix version 2.11 and later:
|
|||||||
Level of DNS support in the Postfix SMTP client.
|
Level of DNS support in the Postfix SMTP client.
|
||||||
.PP
|
.PP
|
||||||
Available in Postfix version 2.12 and later:
|
Available in Postfix version 2.12 and later:
|
||||||
.IP "\fBsmtp_bounce_defer_filter ($default_bounce_defer_filter)\fR"
|
.IP "\fBsmtp_delivery_status_filter ($default_delivery_status_filter)\fR"
|
||||||
Optional filter to change arbitrary hard delivery errors into
|
Optional filter for the \fBsmtp\fR(8) delivery agent to change the
|
||||||
soft errors and vice versa in the \fBsmtp\fR(8) delivery agent.
|
delivery status code or explanatory text of successful or unsuccessful
|
||||||
|
deliveries.
|
||||||
.SH "MIME PROCESSING CONTROLS"
|
.SH "MIME PROCESSING CONTROLS"
|
||||||
.na
|
.na
|
||||||
.nf
|
.nf
|
||||||
|
@ -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".
|
records, so that "smtpd" becomes, for example, "postfix/smtpd".
|
||||||
.PP
|
.PP
|
||||||
Available in Postfix version 2.12 and later:
|
Available in Postfix version 2.12 and later:
|
||||||
.IP "\fBvirtual_bounce_defer_filter ($default_bounce_defer_filter)\fR"
|
.IP "\fBvirtual_delivery_status_filter ($default_delivery_status_filter)\fR"
|
||||||
Optional filter to change arbitrary hard delivery errors into
|
Optional filter for the \fBvirtual\fR(8) delivery agent to change the
|
||||||
soft errors and vice versa in the \fBvirtual\fR(8) delivery agent.
|
delivery status code or explanatory text of successful or unsuccessful
|
||||||
|
deliveries.
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
.na
|
.na
|
||||||
.nf
|
.nf
|
||||||
|
@ -133,7 +133,7 @@ while (<>) {
|
|||||||
s;\bdaemon_timeout\b;<a href="postconf.5.html#daemon_timeout">$&</a>;g;
|
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_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;\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_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_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;
|
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_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_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_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_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_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;
|
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_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_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;\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_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_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;
|
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;\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;\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;\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;\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_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;
|
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_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_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_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_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;
|
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_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_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_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_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_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;
|
s;\bvir[-</bB>]*\n*[ <bB>]*tual_mail[-</bB>]*\n* *[<bB>]*box_domains\b;<a href="postconf.5.html#virtual_mailbox_domains">$&</a>;g;
|
||||||
|
@ -15616,12 +15616,12 @@ anchor assertion) TLSA records. </p>
|
|||||||
|
|
||||||
<p> This feature is available in Postfix 2.11 and later. </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
|
<p> Optional filter to replace the delivery status code or explanatory
|
||||||
soft errors and vice versa. This is implemented by rewriting the
|
text of successful or unsuccessful deliveries. This does, however,
|
||||||
three-number enhanced status code and the explanatory text in a
|
not allow the replacement of a successful status code (2.X.X) with
|
||||||
Postfix delivery agent bounce/defer message. </p>
|
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
|
<p> Specify zero or more "type:table" lookup table names, separated
|
||||||
by comma or whitespace. With each bounce or defer request, the
|
by comma or whitespace. With each bounce or defer request, the
|
||||||
@ -15633,27 +15633,25 @@ enhanced-status-code SPACE explanatory-text
|
|||||||
</blockquote>
|
</blockquote>
|
||||||
|
|
||||||
<p> The first table match wins. The lookup result must have the
|
<p> The first table match wins. The lookup result must have the
|
||||||
same structure as the query: enhanced status codes must have a
|
same structure as the query, a successful status code (2.X.X) must
|
||||||
first numerical field of 4 (defer) or 5 (bounce), and the explanatory
|
be replaced with a successful status code, an unsuccessful status
|
||||||
text field must be non-empty. Other results will result in a warning.
|
code (4.X.X or 5.X.X) must be replaced with an unsuccessful status
|
||||||
</p>
|
code, and the explanatory text field must be non-empty. Other results
|
||||||
|
will result in a warning. </p>
|
||||||
|
|
||||||
<p> Example: </p>
|
<p> Example 1: convert specific soft TLS errors into hard errors,
|
||||||
|
by overriding the first number in the enhanced status code. </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>
|
<blockquote>
|
||||||
<pre>
|
<pre>
|
||||||
/etc/postfix/main.cf:
|
/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>
|
</pre>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
|
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<pre>
|
<pre>
|
||||||
/etc/postfix/smtp_ndr_filter:
|
/etc/postfix/smtp_dsn_filter:
|
||||||
/^4(\.\d+\.\d+ TLS is required, but host \S+ refused to start TLS: .+)/
|
/^4(\.\d+\.\d+ TLS is required, but host \S+ refused to start TLS: .+)/
|
||||||
5$1
|
5$1
|
||||||
/^4(\.\d+\.\d+ TLS is required, but was not offered by host .+)/
|
/^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>
|
</pre>
|
||||||
</blockquote>
|
</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>
|
<p> Notes: </p>
|
||||||
|
|
||||||
<ul>
|
<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
|
<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
|
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>
|
</ul>
|
||||||
|
|
||||||
<p> This feature is available in Postfix 2.12 and later. </p>
|
<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
|
<p> Optional filter for the smtp(8) delivery agent to change the
|
||||||
soft errors and vice versa in the smtp(8) delivery agent. See
|
delivery status code or explanatory text of successful or unsuccessful
|
||||||
default_bounce_defer_filter for details. </p>
|
deliveries. See default_delivery_status_filter for details. </p>
|
||||||
|
|
||||||
<p> NOTE: This feature modifies error messages that are generated
|
<p> NOTE: This feature modifies Postfix SMTP client error or non-error
|
||||||
by the Postfix SMTP client, and that may or may not be derived from
|
messages that may or may not be derived from remote SMTP server
|
||||||
remote SMTP server responses. In contrast, the smtp_reply_filter
|
responses. In contrast, the smtp_reply_filter feature modifies
|
||||||
feature modifies remote SMTP server responses that may result in
|
remote SMTP server responses only. </p>
|
||||||
email non-delivery or delivery. </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>
|
configuration parameter. See there for details. </p>
|
||||||
|
|
||||||
<p> This feature is available in Postfix 2.12 and later. </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
|
<p> Optional filter for the pipe(8) delivery agent to change the
|
||||||
soft errors and vice versa in the pipe(8) delivery agent. See
|
delivery status code or explanatory text of successful or unsuccessful
|
||||||
default_bounce_defer_filter for details. </p>
|
deliveries. See default_delivery_status_filter for details. </p>
|
||||||
|
|
||||||
<p> This feature is available in Postfix 2.12 and later. </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
|
<p> Optional filter for the virtual(8) delivery agent to change the
|
||||||
soft errors and vice versa in the virtual(8) delivery agent. See
|
delivery status code or explanatory text of successful or unsuccessful
|
||||||
default_bounce_defer_filter for details. </p>
|
deliveries. See default_delivery_status_filter for details. </p>
|
||||||
|
|
||||||
<p> This feature is available in Postfix 2.12 and later. </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
|
<p> Optional filter for the local(8) delivery agent to change the
|
||||||
soft errors and vice versa in the local(8) delivery agent. See
|
status code or explanatory text of successful or unsuccessful
|
||||||
default_bounce_defer_filter for details. </p>
|
deliveries. See default_delivery_status_filter for details. </p>
|
||||||
|
|
||||||
<p> This feature is available in Postfix 2.12 and later. </p>
|
<p> This feature is available in Postfix 2.12 and later. </p>
|
||||||
|
@ -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 \
|
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 \
|
smtp_reply_footer.c safe_ultostr.c verify_sender_addr.c \
|
||||||
dict_memcache.c mail_version.c memcache_proto.c server_acl.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 \
|
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 \
|
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 \
|
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 \
|
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 \
|
smtp_reply_footer.o safe_ultostr.o verify_sender_addr.o \
|
||||||
dict_memcache.o mail_version.o memcache_proto.o server_acl.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 \
|
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 \
|
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 \
|
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 \
|
fold_addr.h header_body_checks.h data_redirect.h match_service.h \
|
||||||
addr_match_list.h smtp_reply_footer.h safe_ultostr.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 \
|
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
|
TESTSRC = rec2stream.c stream2rec.c recdump.c
|
||||||
DEFS = -I. -I$(INC_DIR) -D$(SYSTYPE)
|
DEFS = -I. -I$(INC_DIR) -D$(SYSTYPE)
|
||||||
CFLAGS = $(DEBUG) $(OPT) $(DEFS)
|
CFLAGS = $(DEBUG) $(OPT) $(DEFS)
|
||||||
@ -666,7 +666,7 @@ bounce.o: log_adhoc.h
|
|||||||
bounce.o: mail_params.h
|
bounce.o: mail_params.h
|
||||||
bounce.o: mail_proto.h
|
bounce.o: mail_proto.h
|
||||||
bounce.o: msg_stats.h
|
bounce.o: msg_stats.h
|
||||||
bounce.o: ndr_filter.h
|
bounce.o: dsn_filter.h
|
||||||
bounce.o: rcpt_print.h
|
bounce.o: rcpt_print.h
|
||||||
bounce.o: recipient_list.h
|
bounce.o: recipient_list.h
|
||||||
bounce.o: trace.h
|
bounce.o: trace.h
|
||||||
@ -812,7 +812,7 @@ defer.o: mail_params.h
|
|||||||
defer.o: mail_proto.h
|
defer.o: mail_proto.h
|
||||||
defer.o: mail_queue.h
|
defer.o: mail_queue.h
|
||||||
defer.o: msg_stats.h
|
defer.o: msg_stats.h
|
||||||
defer.o: ndr_filter.h
|
defer.o: dsn_filter.h
|
||||||
defer.o: rcpt_print.h
|
defer.o: rcpt_print.h
|
||||||
defer.o: recipient_list.h
|
defer.o: recipient_list.h
|
||||||
defer.o: trace.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: ../../include/sys_defs.h
|
||||||
namadr_list.o: namadr_list.c
|
namadr_list.o: namadr_list.c
|
||||||
namadr_list.o: namadr_list.h
|
namadr_list.o: namadr_list.h
|
||||||
ndr_filter.o: ../../include/argv.h
|
dsn_filter.o: ../../include/argv.h
|
||||||
ndr_filter.o: ../../include/dict.h
|
dsn_filter.o: ../../include/dict.h
|
||||||
ndr_filter.o: ../../include/msg.h
|
dsn_filter.o: ../../include/msg.h
|
||||||
ndr_filter.o: ../../include/myflock.h
|
dsn_filter.o: ../../include/myflock.h
|
||||||
ndr_filter.o: ../../include/mymalloc.h
|
dsn_filter.o: ../../include/mymalloc.h
|
||||||
ndr_filter.o: ../../include/sys_defs.h
|
dsn_filter.o: ../../include/sys_defs.h
|
||||||
ndr_filter.o: ../../include/vbuf.h
|
dsn_filter.o: ../../include/vbuf.h
|
||||||
ndr_filter.o: ../../include/vstream.h
|
dsn_filter.o: ../../include/vstream.h
|
||||||
ndr_filter.o: ../../include/vstring.h
|
dsn_filter.o: ../../include/vstring.h
|
||||||
ndr_filter.o: dsn.h
|
dsn_filter.o: dsn.h
|
||||||
ndr_filter.o: dsn_util.h
|
dsn_filter.o: dsn_util.h
|
||||||
ndr_filter.o: maps.h
|
dsn_filter.o: maps.h
|
||||||
ndr_filter.o: ndr_filter.c
|
dsn_filter.o: dsn_filter.c
|
||||||
ndr_filter.o: ndr_filter.h
|
dsn_filter.o: dsn_filter.h
|
||||||
off_cvt.o: ../../include/msg.h
|
off_cvt.o: ../../include/msg.h
|
||||||
off_cvt.o: ../../include/sys_defs.h
|
off_cvt.o: ../../include/sys_defs.h
|
||||||
off_cvt.o: ../../include/vbuf.h
|
off_cvt.o: ../../include/vbuf.h
|
||||||
|
@ -53,7 +53,7 @@
|
|||||||
/* const char *title;
|
/* const char *title;
|
||||||
/* const char *maps;
|
/* const char *maps;
|
||||||
/* INTERNAL API
|
/* INTERNAL API
|
||||||
/* NDR_FILTER *bounce_defer_filter;
|
/* DSN_FILTER *delivery_status_filter;
|
||||||
/*
|
/*
|
||||||
/* int bounce_append_intern(flags, id, stats, recipient, relay, dsn)
|
/* int bounce_append_intern(flags, id, stats, recipient, relay, dsn)
|
||||||
/* int flags;
|
/* int flags;
|
||||||
@ -181,7 +181,7 @@
|
|||||||
|
|
||||||
/* Global library. */
|
/* Global library. */
|
||||||
|
|
||||||
#define BOUNCE_DEFER_INTERN
|
#define DSN_INTERN
|
||||||
#include <mail_params.h>
|
#include <mail_params.h>
|
||||||
#include <mail_proto.h>
|
#include <mail_proto.h>
|
||||||
#include <log_adhoc.h>
|
#include <log_adhoc.h>
|
||||||
@ -195,7 +195,7 @@
|
|||||||
|
|
||||||
/* Shared internally, between bounce and defer clients. */
|
/* 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 */
|
/* 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).
|
* DSN filter (Postfix 2.12).
|
||||||
*/
|
*/
|
||||||
if (bounce_defer_filter != 0
|
if (delivery_status_filter != 0
|
||||||
&& (dsn_res = ndr_filter_lookup(bounce_defer_filter, &my_dsn)) != 0) {
|
&& (dsn_res = dsn_filter_lookup(delivery_status_filter, &my_dsn)) != 0) {
|
||||||
if (dsn_res->status[0] == '4')
|
if (dsn_res->status[0] == '4')
|
||||||
return (defer_append_intern(flags, id, stats, rcpt, relay, dsn_res));
|
return (defer_append_intern(flags, id, stats, rcpt, relay, dsn_res));
|
||||||
my_dsn = *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).
|
* DSN filter (Postfix 2.12).
|
||||||
*/
|
*/
|
||||||
if (bounce_defer_filter != 0
|
if (delivery_status_filter != 0
|
||||||
&& (dsn_res = ndr_filter_lookup(bounce_defer_filter, &my_dsn)) != 0) {
|
&& (dsn_res = dsn_filter_lookup(delivery_status_filter, &my_dsn)) != 0) {
|
||||||
if (dsn_res->status[0] == '4')
|
if (dsn_res->status[0] == '4')
|
||||||
return (defer_append_intern(flags, id, stats, rcpt, relay, dsn_res));
|
return (defer_append_intern(flags, id, stats, rcpt, relay, dsn_res));
|
||||||
my_dsn = *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";
|
const char myname[] = "bounce_client_init";
|
||||||
|
|
||||||
if (bounce_defer_filter != 0)
|
if (delivery_status_filter != 0)
|
||||||
msg_panic("%s: duplicate initialization", myname);
|
msg_panic("%s: duplicate initialization", myname);
|
||||||
if (*maps)
|
if (*maps)
|
||||||
bounce_defer_filter = ndr_filter_create(title, maps);
|
delivery_status_filter = dsn_filter_create(title, maps);
|
||||||
}
|
}
|
||||||
|
@ -70,11 +70,11 @@ extern void bounce_client_init(const char *, const char *);
|
|||||||
* Start of private API.
|
* 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 *,
|
extern int bounce_append_intern(int, const char *, MSG_STATS *, RECIPIENT *,
|
||||||
const char *, DSN *);
|
const char *, DSN *);
|
||||||
|
@ -77,7 +77,7 @@
|
|||||||
/* question has been deferred. The defer log is not deleted,
|
/* question has been deferred. The defer log is not deleted,
|
||||||
/* and no recipients are deleted from the original queue file.
|
/* 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.
|
/* bounce_one() routine.
|
||||||
/*
|
/*
|
||||||
/* defer_append_intern() is for use after the DSN filter.
|
/* defer_append_intern() is for use after the DSN filter.
|
||||||
@ -160,7 +160,7 @@
|
|||||||
|
|
||||||
/* Global library. */
|
/* Global library. */
|
||||||
|
|
||||||
#define BOUNCE_DEFER_INTERN
|
#define DSN_INTERN
|
||||||
#include <mail_params.h>
|
#include <mail_params.h>
|
||||||
#include <mail_queue.h>
|
#include <mail_queue.h>
|
||||||
#include <mail_proto.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).
|
* DSN filter (Postfix 2.12).
|
||||||
*/
|
*/
|
||||||
if (bounce_defer_filter != 0
|
if (delivery_status_filter != 0
|
||||||
&& (dsn_res = ndr_filter_lookup(bounce_defer_filter, &my_dsn)) != 0) {
|
&& (dsn_res = dsn_filter_lookup(delivery_status_filter, &my_dsn)) != 0) {
|
||||||
if (dsn_res->status[0] == '5')
|
if (dsn_res->status[0] == '5')
|
||||||
return (bounce_append_intern(flags, id, stats, rcpt, relay, dsn_res));
|
return (bounce_append_intern(flags, id, stats, rcpt, relay, dsn_res));
|
||||||
my_dsn = *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).
|
* DSN filter (Postfix 2.12).
|
||||||
*/
|
*/
|
||||||
if (bounce_defer_filter != 0
|
if (delivery_status_filter != 0
|
||||||
&& (dsn_res = ndr_filter_lookup(bounce_defer_filter, &my_dsn)) != 0) {
|
&& (dsn_res = dsn_filter_lookup(delivery_status_filter, &my_dsn)) != 0) {
|
||||||
if (dsn_res->status[0] == '5')
|
if (dsn_res->status[0] == '5')
|
||||||
return (bounce_one_intern(flags, queue, id, encoding, sender,
|
return (bounce_one_intern(flags, queue, id, encoding, sender,
|
||||||
dsn_envid, dsn_ret, stats, rcpt,
|
dsn_envid, dsn_ret, stats, rcpt,
|
||||||
|
@ -33,7 +33,7 @@ extern int defer_one(int, const char *, const char *, const char *,
|
|||||||
/*
|
/*
|
||||||
* Start of private API.
|
* Start of private API.
|
||||||
*/
|
*/
|
||||||
#ifdef BOUNCE_DEFER_INTERN
|
#ifdef DSN_INTERN
|
||||||
|
|
||||||
extern int defer_append_intern(int, const char *, MSG_STATS *, RECIPIENT *,
|
extern int defer_append_intern(int, const char *, MSG_STATS *, RECIPIENT *,
|
||||||
const char *, DSN *);
|
const char *, DSN *);
|
||||||
|
192
postfix/src/global/dsn_filter.c
Normal file
192
postfix/src/global/dsn_filter.c
Normal 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);
|
||||||
|
}
|
@ -1,24 +1,24 @@
|
|||||||
#ifndef _NDR_FILTER_H_INCLUDED_
|
#ifndef _DSN_FILTER_H_INCLUDED_
|
||||||
#define _NDR_FILTER_H_INCLUDED_
|
#define _DSN_FILTER_H_INCLUDED_
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
/* NAME
|
/* NAME
|
||||||
/* ndr_filter 3h
|
/* dsn_filter 3h
|
||||||
/* SUMMARY
|
/* SUMMARY
|
||||||
/* bounce/defer DSN filter
|
/* bounce/defer DSN filter
|
||||||
/* SYNOPSIS
|
/* SYNOPSIS
|
||||||
/* #include <ndr_filter.h>
|
/* #include <dsn_filter.h>
|
||||||
/* DESCRIPTION
|
/* DESCRIPTION
|
||||||
/* .nf
|
/* .nf
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* External interface.
|
* 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_FILTER *dsn_filter_create(const char *, const char *);
|
||||||
extern DSN *ndr_filter_lookup(NDR_FILTER *, DSN *);
|
extern DSN *dsn_filter_lookup(DSN_FILTER *, DSN *);
|
||||||
extern void ndr_filter_free(NDR_FILTER *);
|
extern void dsn_filter_free(DSN_FILTER *);
|
||||||
|
|
||||||
/* LICENSE
|
/* LICENSE
|
||||||
/* .ad
|
/* .ad
|
@ -121,7 +121,7 @@
|
|||||||
/* bool var_multi_enable;
|
/* bool var_multi_enable;
|
||||||
/* bool var_long_queue_ids;
|
/* bool var_long_queue_ids;
|
||||||
/* bool var_daemon_open_fatal;
|
/* bool var_daemon_open_fatal;
|
||||||
/* char *var_ndr_filter;
|
/* char *var_dsn_filter;
|
||||||
/*
|
/*
|
||||||
/* void mail_params_init()
|
/* void mail_params_init()
|
||||||
/*
|
/*
|
||||||
@ -315,7 +315,7 @@ char *var_multi_name;
|
|||||||
bool var_multi_enable;
|
bool var_multi_enable;
|
||||||
bool var_long_queue_ids;
|
bool var_long_queue_ids;
|
||||||
bool var_daemon_open_fatal;
|
bool var_daemon_open_fatal;
|
||||||
char *var_ndr_filter;
|
char *var_dsn_filter;
|
||||||
|
|
||||||
const char null_format_string[1] = "";
|
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,
|
VAR_INT_FILT_CLASSES, DEF_INT_FILT_CLASSES, &var_int_filt_classes, 0, 0,
|
||||||
/* multi_instance_wrapper may have dependencies but not dependents. */
|
/* multi_instance_wrapper may have dependencies but not dependents. */
|
||||||
VAR_MULTI_WRAPPER, DEF_MULTI_WRAPPER, &var_multi_wrapper, 0, 0,
|
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,
|
0,
|
||||||
};
|
};
|
||||||
static const CONFIG_STR_FN_TABLE function_str_defaults_2[] = {
|
static const CONFIG_STR_FN_TABLE function_str_defaults_2[] = {
|
||||||
|
@ -3747,27 +3747,27 @@ extern bool var_daemon_open_fatal;
|
|||||||
/*
|
/*
|
||||||
* Optional DSN bounce/defer filter.
|
* Optional DSN bounce/defer filter.
|
||||||
*/
|
*/
|
||||||
#define VAR_NDR_FILTER "default_bounce_defer_filter"
|
#define VAR_DSN_FILTER "default_delivery_status_filter"
|
||||||
#define DEF_NDR_FILTER ""
|
#define DEF_DSN_FILTER ""
|
||||||
extern char *var_ndr_filter;
|
extern char *var_dsn_filter;
|
||||||
|
|
||||||
#define VAR_SMTP_NDR_FILTER "smtp_bounce_defer_filter"
|
#define VAR_SMTP_DSN_FILTER "smtp_delivery_status_filter"
|
||||||
#define DEF_SMTP_NDR_FILTER "$" VAR_NDR_FILTER
|
#define DEF_SMTP_DSN_FILTER "$" VAR_DSN_FILTER
|
||||||
#define VAR_LMTP_NDR_FILTER "lmtp_bounce_defer_filter"
|
#define VAR_LMTP_DSN_FILTER "lmtp_delivery_status_filter"
|
||||||
#define DEF_LMTP_NDR_FILTER "$" VAR_NDR_FILTER
|
#define DEF_LMTP_DSN_FILTER "$" VAR_DSN_FILTER
|
||||||
extern char *var_smtp_ndr_filter;
|
extern char *var_smtp_dsn_filter;
|
||||||
|
|
||||||
#define VAR_PIPE_NDR_FILTER "pipe_bounce_defer_filter"
|
#define VAR_PIPE_DSN_FILTER "pipe_delivery_status_filter"
|
||||||
#define DEF_PIPE_NDR_FILTER "$" VAR_NDR_FILTER
|
#define DEF_PIPE_DSN_FILTER "$" VAR_DSN_FILTER
|
||||||
extern char *var_pipe_ndr_filter;
|
extern char *var_pipe_dsn_filter;
|
||||||
|
|
||||||
#define VAR_VIRT_NDR_FILTER "virtual_bounce_defer_filter"
|
#define VAR_VIRT_DSN_FILTER "virtual_delivery_status_filter"
|
||||||
#define DEF_VIRT_NDR_FILTER "$" VAR_NDR_FILTER
|
#define DEF_VIRT_DSN_FILTER "$" VAR_DSN_FILTER
|
||||||
extern char *var_virt_ndr_filter;
|
extern char *var_virt_dsn_filter;
|
||||||
|
|
||||||
#define VAR_LOCAL_NDR_FILTER "local_bounce_defer_filter"
|
#define VAR_LOCAL_DSN_FILTER "local_delivery_status_filter"
|
||||||
#define DEF_LOCAL_NDR_FILTER "$" VAR_NDR_FILTER
|
#define DEF_LOCAL_DSN_FILTER "$" VAR_DSN_FILTER
|
||||||
extern char *var_local_ndr_filter;
|
extern char *var_local_dsn_filter;
|
||||||
|
|
||||||
/* LICENSE
|
/* LICENSE
|
||||||
/* .ad
|
/* .ad
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
* Patches change both the patchlevel and the release date. Snapshots have no
|
* Patches change both the patchlevel and the release date. Snapshots have no
|
||||||
* patchlevel; they change the release date only.
|
* patchlevel; they change the release date only.
|
||||||
*/
|
*/
|
||||||
#define MAIL_RELEASE_DATE "20140318"
|
#define MAIL_RELEASE_DATE "20140321"
|
||||||
#define MAIL_VERSION_NUMBER "2.12"
|
#define MAIL_VERSION_NUMBER "2.12"
|
||||||
|
|
||||||
#ifdef SNAPSHOT
|
#ifdef SNAPSHOT
|
||||||
|
@ -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);
|
|
||||||
}
|
|
@ -19,8 +19,6 @@
|
|||||||
/* message delivery record on request by the sender. The
|
/* message delivery record on request by the sender. The
|
||||||
/* flags argument determines the action.
|
/* flags argument determines the action.
|
||||||
/*
|
/*
|
||||||
/* vsent() implements an alternative interface.
|
|
||||||
/*
|
|
||||||
/* Arguments:
|
/* Arguments:
|
||||||
/* .IP flags
|
/* .IP flags
|
||||||
/* Zero or more of the following:
|
/* Zero or more of the following:
|
||||||
@ -79,6 +77,7 @@
|
|||||||
|
|
||||||
/* Global library. */
|
/* Global library. */
|
||||||
|
|
||||||
|
#define DSN_INTERN
|
||||||
#include <mail_params.h>
|
#include <mail_params.h>
|
||||||
#include <verify.h>
|
#include <verify.h>
|
||||||
#include <log_adhoc.h>
|
#include <log_adhoc.h>
|
||||||
@ -97,6 +96,7 @@ int sent(int flags, const char *id, MSG_STATS *stats,
|
|||||||
DSN *dsn)
|
DSN *dsn)
|
||||||
{
|
{
|
||||||
DSN my_dsn = *dsn;
|
DSN my_dsn = *dsn;
|
||||||
|
DSN *dsn_res;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -107,6 +107,13 @@ int sent(int flags, const char *id, MSG_STATS *stats,
|
|||||||
my_dsn.status = "2.0.0";
|
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
|
* MTA-requested address verification information is stored in the verify
|
||||||
* service database.
|
* service database.
|
||||||
|
@ -387,9 +387,10 @@
|
|||||||
/* its own owner alias.
|
/* its own owner alias.
|
||||||
/* .PP
|
/* .PP
|
||||||
/* Available in Postfix version 2.12 and later:
|
/* Available in Postfix version 2.12 and later:
|
||||||
/* .IP "\fBlocal_bounce_defer_filter ($default_bounce_defer_filter)\fR"
|
/* .IP "\fBlocal_delivery_status_filter ($default_delivery_status_filter)\fR"
|
||||||
/* Optional filter to change arbitrary hard delivery errors into
|
/* Optional filter for the \fBlocal\fR(8) delivery agent to change the
|
||||||
/* soft errors and vice versa in the \fBlocal\fR(8) delivery agent.
|
/* status code or explanatory text of successful or unsuccessful
|
||||||
|
/* deliveries.
|
||||||
/* DELIVERY METHOD CONTROLS
|
/* DELIVERY METHOD CONTROLS
|
||||||
/* .ad
|
/* .ad
|
||||||
/* .fi
|
/* .fi
|
||||||
@ -904,7 +905,7 @@ int main(int argc, char **argv)
|
|||||||
VAR_DELIVER_HDR, DEF_DELIVER_HDR, &var_deliver_hdr, 0, 0,
|
VAR_DELIVER_HDR, DEF_DELIVER_HDR, &var_deliver_hdr, 0, 0,
|
||||||
VAR_MAILBOX_LOCK, DEF_MAILBOX_LOCK, &var_mailbox_lock, 1, 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_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,
|
0,
|
||||||
};
|
};
|
||||||
static const CONFIG_BOOL_TABLE bool_table[] = {
|
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_POST_INIT, post_init,
|
||||||
MAIL_SERVER_PRE_ACCEPT, pre_accept,
|
MAIL_SERVER_PRE_ACCEPT, pre_accept,
|
||||||
MAIL_SERVER_PRIVILEGED,
|
MAIL_SERVER_PRIVILEGED,
|
||||||
MAIL_SERVER_BOUNCE_INIT, VAR_LOCAL_NDR_FILTER,
|
MAIL_SERVER_BOUNCE_INIT, VAR_LOCAL_DSN_FILTER,
|
||||||
&var_local_ndr_filter,
|
&var_local_ndr_filter,
|
||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
|
@ -94,7 +94,7 @@ event_server.o: ../../include/deliver_request.h
|
|||||||
event_server.o: ../../include/dict.h
|
event_server.o: ../../include/dict.h
|
||||||
event_server.o: ../../include/dsn.h
|
event_server.o: ../../include/dsn.h
|
||||||
event_server.o: ../../include/dsn_buf.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/events.h
|
||||||
event_server.o: ../../include/htable.h
|
event_server.o: ../../include/htable.h
|
||||||
event_server.o: ../../include/iostuff.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/dict.h
|
||||||
multi_server.o: ../../include/dsn.h
|
multi_server.o: ../../include/dsn.h
|
||||||
multi_server.o: ../../include/dsn_buf.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/events.h
|
||||||
multi_server.o: ../../include/htable.h
|
multi_server.o: ../../include/htable.h
|
||||||
multi_server.o: ../../include/iostuff.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/dict.h
|
||||||
single_server.o: ../../include/dsn.h
|
single_server.o: ../../include/dsn.h
|
||||||
single_server.o: ../../include/dsn_buf.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/events.h
|
||||||
single_server.o: ../../include/htable.h
|
single_server.o: ../../include/htable.h
|
||||||
single_server.o: ../../include/iostuff.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/dict.h
|
||||||
trigger_server.o: ../../include/dsn.h
|
trigger_server.o: ../../include/dsn.h
|
||||||
trigger_server.o: ../../include/dsn_buf.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/events.h
|
||||||
trigger_server.o: ../../include/htable.h
|
trigger_server.o: ../../include/htable.h
|
||||||
trigger_server.o: ../../include/iostuff.h
|
trigger_server.o: ../../include/iostuff.h
|
||||||
|
@ -560,8 +560,8 @@ NORETURN event_server_main(int argc, char **argv, MULTI_SERVER_FN service,...)
|
|||||||
char *generation;
|
char *generation;
|
||||||
int msg_vstream_needed = 0;
|
int msg_vstream_needed = 0;
|
||||||
int redo_syslog_init = 0;
|
int redo_syslog_init = 0;
|
||||||
const char *ndr_filter_title;
|
const char *dsn_filter_title;
|
||||||
const char **ndr_filter_maps;
|
const char **dsn_filter_maps;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Process environment options as early as we can.
|
* 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);
|
event_server_slow_exit = va_arg(ap, MAIL_SERVER_SLOW_EXIT_FN);
|
||||||
break;
|
break;
|
||||||
case MAIL_SERVER_BOUNCE_INIT:
|
case MAIL_SERVER_BOUNCE_INIT:
|
||||||
ndr_filter_title = va_arg(ap, const char *);
|
dsn_filter_title = va_arg(ap, const char *);
|
||||||
ndr_filter_maps = va_arg(ap, const char **);
|
dsn_filter_maps = va_arg(ap, const char **);
|
||||||
bounce_client_init(ndr_filter_title, *ndr_filter_maps);
|
bounce_client_init(dsn_filter_title, *dsn_filter_maps);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
msg_panic("%s: unknown argument type: %d", myname, key);
|
msg_panic("%s: unknown argument type: %d", myname, key);
|
||||||
|
@ -556,8 +556,8 @@ NORETURN multi_server_main(int argc, char **argv, MULTI_SERVER_FN service,...)
|
|||||||
char *generation;
|
char *generation;
|
||||||
int msg_vstream_needed = 0;
|
int msg_vstream_needed = 0;
|
||||||
int redo_syslog_init = 0;
|
int redo_syslog_init = 0;
|
||||||
const char *ndr_filter_title;
|
const char *dsn_filter_title;
|
||||||
const char **ndr_filter_maps;
|
const char **dsn_filter_maps;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Process environment options as early as we can.
|
* 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);
|
service_name);
|
||||||
break;
|
break;
|
||||||
case MAIL_SERVER_BOUNCE_INIT:
|
case MAIL_SERVER_BOUNCE_INIT:
|
||||||
ndr_filter_title = va_arg(ap, const char *);
|
dsn_filter_title = va_arg(ap, const char *);
|
||||||
ndr_filter_maps = va_arg(ap, const char **);
|
dsn_filter_maps = va_arg(ap, const char **);
|
||||||
bounce_client_init(ndr_filter_title, *ndr_filter_maps);
|
bounce_client_init(dsn_filter_title, *dsn_filter_maps);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
msg_panic("%s: unknown argument type: %d", myname, key);
|
msg_panic("%s: unknown argument type: %d", myname, key);
|
||||||
|
@ -434,8 +434,8 @@ NORETURN single_server_main(int argc, char **argv, SINGLE_SERVER_FN service,...)
|
|||||||
char *generation;
|
char *generation;
|
||||||
int msg_vstream_needed = 0;
|
int msg_vstream_needed = 0;
|
||||||
int redo_syslog_init = 0;
|
int redo_syslog_init = 0;
|
||||||
const char *ndr_filter_title;
|
const char *dsn_filter_title;
|
||||||
const char **ndr_filter_maps;
|
const char **dsn_filter_maps;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Process environment options as early as we can.
|
* 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);
|
service_name);
|
||||||
break;
|
break;
|
||||||
case MAIL_SERVER_BOUNCE_INIT:
|
case MAIL_SERVER_BOUNCE_INIT:
|
||||||
ndr_filter_title = va_arg(ap, const char *);
|
dsn_filter_title = va_arg(ap, const char *);
|
||||||
ndr_filter_maps = va_arg(ap, const char **);
|
dsn_filter_maps = va_arg(ap, const char **);
|
||||||
bounce_client_init(ndr_filter_title, *ndr_filter_maps);
|
bounce_client_init(dsn_filter_title, *dsn_filter_maps);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
msg_panic("%s: unknown argument type: %d", myname, key);
|
msg_panic("%s: unknown argument type: %d", myname, key);
|
||||||
|
@ -437,8 +437,8 @@ NORETURN trigger_server_main(int argc, char **argv, TRIGGER_SERVER_FN service,..
|
|||||||
char *generation;
|
char *generation;
|
||||||
int msg_vstream_needed = 0;
|
int msg_vstream_needed = 0;
|
||||||
int redo_syslog_init = 0;
|
int redo_syslog_init = 0;
|
||||||
const char *ndr_filter_title;
|
const char *dsn_filter_title;
|
||||||
const char **ndr_filter_maps;
|
const char **dsn_filter_maps;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Process environment options as early as we can.
|
* 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 *);
|
trigger_server_watchdog = *va_arg(ap, int *);
|
||||||
break;
|
break;
|
||||||
case MAIL_SERVER_BOUNCE_INIT:
|
case MAIL_SERVER_BOUNCE_INIT:
|
||||||
ndr_filter_title = va_arg(ap, const char *);
|
dsn_filter_title = va_arg(ap, const char *);
|
||||||
ndr_filter_maps = va_arg(ap, const char **);
|
dsn_filter_maps = va_arg(ap, const char **);
|
||||||
bounce_client_init(ndr_filter_title, *ndr_filter_maps);
|
bounce_client_init(dsn_filter_title, *dsn_filter_maps);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
msg_panic("%s: unknown argument type: %d", myname, key);
|
msg_panic("%s: unknown argument type: %d", myname, key);
|
||||||
|
@ -404,9 +404,10 @@
|
|||||||
/* records, so that "smtpd" becomes, for example, "postfix/smtpd".
|
/* records, so that "smtpd" becomes, for example, "postfix/smtpd".
|
||||||
/* .PP
|
/* .PP
|
||||||
/* Available in Postfix version 2.12 and later:
|
/* Available in Postfix version 2.12 and later:
|
||||||
/* .IP "\fBpipe_bounce_defer_filter ($default_bounce_defer_filter)\fR"
|
/* .IP "\fBpipe_delivery_status_filter ($default_delivery_status_filter)\fR"
|
||||||
/* Optional filter to change arbitrary hard delivery errors into
|
/* Optional filter for the \fBpipe\fR(8) delivery agent to change the
|
||||||
/* soft errors and vice versa in the \fBpipe\fR(8) delivery agent.
|
/* delivery status code or explanatory text of successful or unsuccessful
|
||||||
|
/* deliveries.
|
||||||
/* SEE ALSO
|
/* SEE ALSO
|
||||||
/* qmgr(8), queue manager
|
/* qmgr(8), queue manager
|
||||||
/* bounce(8), delivery status reports
|
/* bounce(8), delivery status reports
|
||||||
@ -1329,7 +1330,7 @@ int main(int argc, char **argv)
|
|||||||
0,
|
0,
|
||||||
};
|
};
|
||||||
static const CONFIG_STR_TABLE str_table[] = {
|
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,
|
0,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1344,7 +1345,7 @@ int main(int argc, char **argv)
|
|||||||
MAIL_SERVER_POST_INIT, drop_privileges,
|
MAIL_SERVER_POST_INIT, drop_privileges,
|
||||||
MAIL_SERVER_PRE_ACCEPT, pre_accept,
|
MAIL_SERVER_PRE_ACCEPT, pre_accept,
|
||||||
MAIL_SERVER_PRIVILEGED,
|
MAIL_SERVER_PRIVILEGED,
|
||||||
MAIL_SERVER_BOUNCE_INIT, VAR_PIPE_NDR_FILTER,
|
MAIL_SERVER_BOUNCE_INIT, VAR_PIPE_DSN_FILTER,
|
||||||
&var_pipe_ndr_filter,
|
&var_pipe_ndr_filter,
|
||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
|
@ -57,7 +57,7 @@
|
|||||||
VAR_LMTP_RESP_FILTER, DEF_LMTP_RESP_FILTER, &var_smtp_resp_filter, 0, 0,
|
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_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_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,
|
0,
|
||||||
};
|
};
|
||||||
static const CONFIG_TIME_TABLE lmtp_time_table[] = {
|
static const CONFIG_TIME_TABLE lmtp_time_table[] = {
|
||||||
|
@ -254,9 +254,10 @@
|
|||||||
/* Level of DNS support in the Postfix SMTP client.
|
/* Level of DNS support in the Postfix SMTP client.
|
||||||
/* .PP
|
/* .PP
|
||||||
/* Available in Postfix version 2.12 and later:
|
/* Available in Postfix version 2.12 and later:
|
||||||
/* .IP "\fBsmtp_bounce_defer_filter ($default_bounce_defer_filter)\fR"
|
/* .IP "\fBsmtp_delivery_status_filter ($default_delivery_status_filter)\fR"
|
||||||
/* Optional filter to change arbitrary hard delivery errors into
|
/* Optional filter for the \fBsmtp\fR(8) delivery agent to change the
|
||||||
/* soft errors and vice versa in the \fBsmtp\fR(8) delivery agent.
|
/* delivery status code or explanatory text of successful or unsuccessful
|
||||||
|
/* deliveries.
|
||||||
/* MIME PROCESSING CONTROLS
|
/* MIME PROCESSING CONTROLS
|
||||||
/* .ad
|
/* .ad
|
||||||
/* .fi
|
/* .fi
|
||||||
@ -1277,7 +1278,7 @@ int main(int argc, char **argv)
|
|||||||
MAIL_SERVER_PRE_INIT, pre_init,
|
MAIL_SERVER_PRE_INIT, pre_init,
|
||||||
MAIL_SERVER_POST_INIT, post_init,
|
MAIL_SERVER_POST_INIT, post_init,
|
||||||
MAIL_SERVER_PRE_ACCEPT, pre_accept,
|
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,
|
&var_smtp_ndr_filter,
|
||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
|
@ -58,7 +58,7 @@
|
|||||||
VAR_SMTP_RESP_FILTER, DEF_SMTP_RESP_FILTER, &var_smtp_resp_filter, 0, 0,
|
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_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_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,
|
0,
|
||||||
};
|
};
|
||||||
static const CONFIG_TIME_TABLE smtp_time_table[] = {
|
static const CONFIG_TIME_TABLE smtp_time_table[] = {
|
||||||
|
@ -247,9 +247,10 @@
|
|||||||
/* records, so that "smtpd" becomes, for example, "postfix/smtpd".
|
/* records, so that "smtpd" becomes, for example, "postfix/smtpd".
|
||||||
/* .PP
|
/* .PP
|
||||||
/* Available in Postfix version 2.12 and later:
|
/* Available in Postfix version 2.12 and later:
|
||||||
/* .IP "\fBvirtual_bounce_defer_filter ($default_bounce_defer_filter)\fR"
|
/* .IP "\fBvirtual_delivery_status_filter ($default_delivery_status_filter)\fR"
|
||||||
/* Optional filter to change arbitrary hard delivery errors into
|
/* Optional filter for the \fBvirtual\fR(8) delivery agent to change the
|
||||||
/* soft errors and vice versa in the \fBvirtual\fR(8) delivery agent.
|
/* delivery status code or explanatory text of successful or unsuccessful
|
||||||
|
/* deliveries.
|
||||||
/* SEE ALSO
|
/* SEE ALSO
|
||||||
/* qmgr(8), queue manager
|
/* qmgr(8), queue manager
|
||||||
/* bounce(8), delivery status reports
|
/* 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_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_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_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,
|
0,
|
||||||
};
|
};
|
||||||
static const CONFIG_BOOL_TABLE bool_table[] = {
|
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_POST_INIT, post_init,
|
||||||
MAIL_SERVER_PRE_ACCEPT, pre_accept,
|
MAIL_SERVER_PRE_ACCEPT, pre_accept,
|
||||||
MAIL_SERVER_PRIVILEGED,
|
MAIL_SERVER_PRIVILEGED,
|
||||||
MAIL_SERVER_BOUNCE_INIT, VAR_VIRT_NDR_FILTER,
|
MAIL_SERVER_BOUNCE_INIT, VAR_VIRT_DSN_FILTER,
|
||||||
&var_virt_ndr_filter,
|
&var_virt_ndr_filter,
|
||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user