2
0
mirror of https://github.com/vdukhovni/postfix synced 2025-08-29 13:18:12 +00:00

postfix-2.7-20090428

This commit is contained in:
Wietse Venema 2009-04-28 00:00:00 -05:00 committed by Viktor Dukhovni
parent f364bbc0e8
commit 6ab3d16b87
57 changed files with 1186 additions and 599 deletions

View File

@ -15169,10 +15169,28 @@ Apologies for any names omitted.
milter/milter.[hc], smtpd/smtpd.[hc], smtpd/smtpd_milter.c,
smtpd/smtpd_resolve.c.
Feature: new support for SMFIP_RCPT_REJ. When a recipient
is rejected, Postfix reports the event as decribed in
Feature: support to report rejected recipients to Milters
(SMFIP_RCPT_REJ). Postfix reports the event as decribed in
Sendmail 8.14.0 documentation: {rcpt_mailer} = "error",
{rcpt_host} = enhanced status code (e.g., "5.7.1"), and
{rcpt_addr} = reason to reject (e.g., "Relay access denied").
Files: milter/milter.[hc], milter/milter8.c, smtpd/smtpd.[hc],
smtpd/smtpd_milter.c.
20090427
Feature: Milter support for replacing the envelope sender
and adding recipients (SMFIR_CHGFROM, SMFIR_ADDRCPT_PAR).
This support currently ignores ESMTP command parameters.
Files: milter/milter8.c, cleanup/cleanup_milter.c.
20090428
Compatibility: to make all the new Milter features usable,
raise the default milter_protocol setting from 2 to 6.
This has been tested with a Sendmail 8.14 libmilter.
File: global/mail_params.h.
Bugfix: don't disable MIME parsing with smtp_header_checks,
smtp_mime_header_checks, smtp_nested_header_checks or with
smtp_body_checks. Bug reported by Victor. File: smtp/smtp_proto.c.

View File

@ -262,10 +262,12 @@ MMiilltteerr pprroottooccooll vveerrssiioonn
As Postfix is not built with the Sendmail libmilter library, you may need to
configure the Milter protocol version that Postfix should use. The default
version is 2. Other protocol versions are 3 and 4 (Postfix 2.3 and later), and
6 (Postfix 2.5 an later).
version is 6 (before Postfix 2.6 the default version is 2).
/etc/postfix/main.cf:
# Postfix >= 2.6
milter_protocol = 6
# 2.3 <= Postfix <= 2.5
milter_protocol = 2
If the Postfix milter_protocol setting specifies a too low version, the
@ -313,8 +315,10 @@ with before-queue filtering.
SSeennddmmaaiill mmaaccrroo eemmuullaattiioonn
Postfix emulates a limited number of Sendmail macros, as shown in the table.
Different macros are available at different SMTP protocol stages (EOH = end-of-
header, EOM = end-of-message); their availability is not always the same as in
Some macro values depend on whether a recipient is rejected (rejected
recipients are available on request by the Milter application). Different
macros are available at different SMTP protocol stages (EOH = end-of-header,
EOM = end-of-message); their availability is not always the same as in
Sendmail. See the workarounds section below for solutions.
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
@ -338,15 +342,18 @@ Sendmail. See the workarounds section below for solutions.
|{client_connections}|CONNECT |Connection concurrency for|
| | |this client |
|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
| | |Client hostname, "unknown"|
|{client_name} |Always |when lookup or |
| | |verification fails |
| | |Client hostname |
| | |When address -> name |
|{client_name} |Always |lookup or name -> address |
| | |verification fails: |
| | |"unknown" |
|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
|{client_port} |Always (Postfix >=2.5) |Client TCP port |
|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
| | |Client name from reverse |
|{client_ptr} |CONNECT, HELO, MAIL, DATA|lookup, "unknown" when |
| | |lookup fails |
| | |Client name from address -|
|{client_ptr} |CONNECT, HELO, MAIL, DATA|> name lookup |
| | |When address -> name |
| | |lookup fails: "unknown" |
|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
|{cert_issuer} |HELO, MAIL, DATA, EOH, |TLS client certificate |
| |EOM |issuer |
@ -371,14 +378,19 @@ Sendmail. See the workarounds section below for solutions.
|{mail_mailer} |MAIL (Postfix >= 2.6) |Sender mail delivery |
| | |transport |
|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
|{rcpt_addr} |RCPT |Recipient address |
| | |Recipient address |
|{rcpt_addr} |RCPT |With rejected recipient: |
| | |descriptive text |
|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
|{rcpt_host} |RCPT (Postfix >= 2.6) |Recipient next-hop |
| | |destination |
| | |Recipient next-hop |
|{rcpt_host} |RCPT (Postfix >= 2.6) |destination |
| | |With rejected recpient: |
| | |enhanced status code |
|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
| | |Recipient mail delivery |
|{rcpt_mailer} |RCPT (Postfix >= 2.6) |transport, "error" for |
| | |rejected recipient. |
|{rcpt_mailer} |RCPT (Postfix >= 2.6) |transport |
| | |With rejected recipient: |
| | |"error" |
|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
|{tls_version} |HELO, MAIL, DATA, EOH, |TLS protocol version |
| |EOM | |
@ -507,26 +519,21 @@ limitations will be removed as the implementation is extended over time. Of
course the usual limitations of before-queue filtering will always apply. See
the CONTENT_INSPECTION_README document for a discussion.
* Postfix version 2.3 introduces support for Sendmail 8 milter protocol
versions 2, 3 and 4; Postfix version 2.5 adds support for protocol version
6, which is available with Sendmail 8.14. Support for other protocol types
or protocol versions may be added later.
* For applications that are written in C, you need to use the Sendmail
libmilter library. A Postfix replacement may be provided in the future.
* For Milter applications that are written in C, you need to use the Sendmail
libmilter library.
* There are TWO sets of mail filters: filters that are used for SMTP mail
only (specified with the smtpd_milters parameter), and filters for non-SMTP
mail (specified with the non_smtpd_milters parameter). The non-SMTP filters
are primarily for local submissions.
* When mail is filtered by non-SMTP filters, the Postfix cleanup(8) server
has to simulate the SMTP client CONNECT and DISCONNECT events, and the SMTP
client EHLO, MAIL FROM, RCPT TO and DATA commands. This works as expected,
with only one exception: non-SMTP filters must not REJECT or TEMPFAIL
simulated RCPT TO commands. When a non-SMTP filter REJECTs or TEMPFAILs a
recipient, Postfix will report a configuration error, and mail will stay in
the queue.
o When mail is filtered by non-SMTP filters, the Postfix cleanup(8)
server has to simulate the SMTP client CONNECT and DISCONNECT events,
and the SMTP client EHLO, MAIL FROM, RCPT TO and DATA commands. This
works as expected, with only one exception: non-SMTP filters must not
REJECT or TEMPFAIL simulated RCPT TO commands. When a non-SMTP filter
REJECTs or TEMPFAILs a recipient, Postfix will report a configuration
error, and mail will stay in the queue.
* Postfix currently does not apply content filters to mail that is forwarded
or aliased internally, or to mail that is generated internally such as
@ -538,19 +545,42 @@ the CONTENT_INSPECTION_README document for a discussion.
command information; they have no access to the message header or body, and
cannot make modifications to the message or to the envelope.
* Postfix 2.3 does not support Milter requests to replace the message body.
Milter applications that request this unsupported operation will log a
warning like this:
* Postfix version 2.6 implements all Sendmail 8.14 Milter features, except it
ignores the optional ESMTP command parameters with requests to replace the
sender (SMFIR_CHGFROM), or to append a recipient (SMFIR_ADDRCPT_PAR). When
a Milter application supplies ESMTP command parameters, these are logged as
follows:
postfix/cleanup[40629]: warning: 100B22B3293: cleanup_chg_from: ignoring
ESMTP arguments "whatever"
Specify "milter_protocol = 6" to enable all available Sendmail 8.14 and
earlier Milter features.
* Postfix version 2.5 implements all Sendmail 8.14 Milter features except:
SMFIP_RCPT_REJ (report rejected recipients to the mail filter),
SMFIR_CHGFROM (replace sender, with optional ESMTP command parameters), and
SMFIR_ADDRCPT_PAR (add recipient, with optional ESMTP command parameters).
Specify "milter_protocol = 6" to enable all available Sendmail 8.14 and
earlier Milter features.
* Postfix 2.4 implements all Sendmail 8.13 Milter features.
Specify "milter_protocol = 4" to enable all available Sendmail 8.13 and
earlier Milter features.
* Postfix 2.3 implements all Sendmail 8.13 Milter features except requests to
replace the message body. Milter applications that request this unsupported
operation will log a warning like
application name: st_optionneg[134563840]: 0x3d does not fulfill action
requirements 0x1e
The solution is to use Postfix version 2.4 or later.
* Postfix version 2.5 implements the Sendmail 8.14 features except:
SMFIP_RCPT_REJ (report rejected recipients to the mail filter),
SMFIR_CHGFROM (replace sender, with optional ESMTP command parameters), and
SMFIR_ADDRCPT_PAR (add recipient, with optional ESMTP command parameters).
Specify "milter_protocol = 4" to enable all available Sendmail 8.13 and
earlier Milter features.
* Most Milter configuration options are global. Future Postfix versions may
support per-Milter timeouts, per-Milter error handling, etc.

View File

@ -136,8 +136,8 @@ Each restriction list is evaluated from left to right until some restriction
produces a result of PERMIT, REJECT or DEFER (try again later). The end of the
list is equivalent to a PERMIT result. By placing a PERMIT restriction before a
REJECT restriction you can make exceptions for specific clients or users. This
is called whitelisting; the last example above allows mail from local networks
but otherwise rejects mail to arbitrary destinations.
is called whitelisting; the fourth example above allows mail from local
networks but otherwise rejects mail to arbitrary destinations.
The table below summarizes the purpose of each SMTP access restriction list.
All lists use the exact same syntax; they differ only in the time of evaluation

View File

@ -11,17 +11,31 @@ instead, a new snapshot is released.
The mail_release_date configuration parameter (format: yyyymmdd)
specifies the release date of a stable release or snapshot release.
Incompatibility with snapshot 20090426
Incompatibility with snapshot 20090428
======================================
The Postfix SMTP client no longer tries to use the obsolete SSLv2
The Postfix SMTP client(!) no longer tries to use the obsolete SSLv2
protocol by default, as this may prevent the use of modern SSL
features. Lack of SSLv2 support should never be a problem, since
SSLv3 was defined in 1996, and TLSv1 in 2006. The Postfix SMTP
server maintains SSLv2 support for backwards compatibility with
ancient clients.
SSLv3 was defined in 1996, and TLSv1 in 2006, but you can undo the
change by specifying empty main.cf values for smtp_tls_protocols
and lmtp_tls_protocols. The Postfix SMTP server maintains SSLv2
support for backwards compatibility with ancient clients.
Major changes with snapshot 20090426
The default Milter protocol version is increased from 2 to 6; this
enables all available features up to and including Sendmail 8.14.0.
The new milter_protocol setting may break compatibility with older
Milter libraries or applications, and may cause Postfix to log
warning messages such as:
postfix/smtpd[21045]: warning: milter inet:host:port: can't read packet
header: Unknown error : 0
postfix/cleanup[15190]: warning: milter inet:host:port: can't read packet
header: Success
To restore compatibility, specify "milter_protocol = 2" in main.cf.
Major changes with snapshot 20090428
====================================
The following improvements have been made to the Milter implementation:
@ -31,9 +45,19 @@ The following improvements have been made to the Milter implementation:
- Support for the {mail_host}, {mail_mailer}, {rcpt_host} and
{rcpt_mailer} macros.
- Milters can now request rejected recipients with the SMFIP_RCPT_REJ
feature. In this case, {rcpt_mailer} is "error", {rcpt_host} is an
enhanced status code, and {rcpt_addr} is descriptive text.
- Milter applications can now request rejected recipients with the
SMFIP_RCPT_REJ feature. Rejected recipients are reported with
{rcpt_mailer} = "error", {rcpt_host} = enhanced status code, and
{rcpt_addr} = descriptive text. This feature requires "milter_protocol
= 6" or higher (default as of Postfix 2.6).
- Milters can now replace the envelope sender address with the
SMFIR_CHGFROM request, and can add recipients with SMFIR_ADDRCPT_PAR.
These implementations currently ignore ESMTP command parameters
with a warning message as follows:
postfix/cleanup[40629]: warning: 100B22B3293: cleanup_chg_from:
ignoring ESMTP arguments "whatever"
Incompatibility with snapshot 20090330
======================================

View File

@ -2,6 +2,9 @@ Wish list:
Remove this file from the stable release.
Need to sign delivery status notifications, to avoid surprises
when eventually people start enforcing DKIM etc. signatures.
"postconf -N" option to print user-defined parameter names
(these have no defaults, since they exist only when
specified in main.cf or with "-o name=value").
@ -25,8 +28,8 @@ Wish list:
if it contains any text that is special, then rfc822_externalize
the whole thing.
SMTP server: make the server_addr and server_port port
available to policy server, Dovecot, and perhaps Milters.
SMTP server: make the server_addr and server_port available
to policy server, Dovecot, and perhaps Milters.
Maybe change maps_rbl_reject_code default to 521, and
update wording in STRESS_README.
@ -88,7 +91,7 @@ Wish list:
Combine smtpd_peer.c and qmqpd_peer.c into a single function
that produces a client context object, and provide attribute
print/scan routines that pass these client context objects
around. With this, we no longer have to update a multiple
around. With this, we no longer have to update multiple
pieces of code when a client attribute is added. Ditto for
SASL and TLS context.
@ -189,9 +192,9 @@ Wish list:
Check that "UINT32 == unsigned int" choice is ok (i.e. LP64
UNIX).
Tempfail when a Milter application wants content access,
while it is configured in an SMTP server that runs before
the smtpd_proxy filter.
Tempfail when a Milter application tries to negotiate content
access, while it is configured in an SMTP server that runs
before the smtpd_proxy filter.
Log DSN original recipient when rejecting mail.

View File

@ -442,12 +442,15 @@ in the "<a href="QSHAPE_README.html#hold_queue">hold" queue</a>, and is availabl
<p> As Postfix is not built with the Sendmail libmilter library,
you may need to configure the Milter protocol version that Postfix
should use. The default version is 2. Other protocol versions are
3 and 4 (Postfix 2.3 and later), and 6 (Postfix 2.5 an later). </p>
should use. The default version is 6 (before Postfix 2.6 the default
version is 2). </p>
<blockquote>
<pre>
/etc/postfix/<a href="postconf.5.html">main.cf</a>:
# Postfix &ge; 2.6
<a href="postconf.5.html#milter_protocol">milter_protocol</a> = 6
# 2.3 &le; Postfix &le; 2.5
<a href="postconf.5.html#milter_protocol">milter_protocol</a> = 2
</pre>
</blockquote>
@ -515,7 +518,9 @@ times. This is an inherent problem with before-queue filtering. </p>
<h3><a name="macros">Sendmail macro emulation</a></h3>
<p> Postfix emulates a limited number of Sendmail macros, as shown
in the table. Different macros are available at different SMTP
in the table. Some macro values depend on whether a recipient is
rejected (rejected recipients are available on request by the Milter
application). Different macros are available at different SMTP
protocol stages (EOH = end-of-header, EOM = end-of-message); their
availability is not
always the same as in Sendmail. See the <a
@ -552,15 +557,16 @@ address </td> </tr>
<tr> <td> {client_connections} </td> <td> CONNECT </td> <td>
Connection concurrency for this client </td> </tr>
<tr> <td> {client_name} </td> <td> Always </td> <td> Client hostname,
"unknown" when lookup or verification fails </td> </tr>
<tr> <td> {client_name} </td> <td> Always </td> <td> Client hostname
<br> When address &rarr; name lookup or name &rarr; address
verification fails: "unknown" </td> </tr>
<tr> <td> {client_port} </td> <td> Always (Postfix &ge;2.5) </td>
<td> Client TCP port </td> </tr>
<tr> <td> {client_ptr} </td> <td> CONNECT, HELO, MAIL, DATA </td>
<td> Client name from reverse lookup, "unknown" when lookup fails
</td> </tr>
<td> Client name from address &rarr; name lookup <br> When address
&rarr; name lookup fails: "unknown" </td> </tr>
<tr> <td> {cert_issuer} </td> <td> HELO, MAIL, DATA, EOH, EOM </td> <td>
TLS client certificate issuer </td> </tr>
@ -587,14 +593,15 @@ Sender next-hop destination </td> </tr>
<td> Sender mail delivery transport </td> </tr>
<tr> <td> {rcpt_addr} </td> <td> RCPT </td> <td> Recipient address
</td> </tr>
<br> With rejected recipient: descriptive text </td> </tr>
<tr> <td> {rcpt_host} </td> <td> RCPT (Postfix &ge; 2.6) </td> <td>
Recipient next-hop destination </td> </tr>
Recipient next-hop destination <br> With rejected recpient: enhanced
status code </td> </tr>
<tr> <td> {rcpt_mailer} </td> <td> RCPT (Postfix &ge; 2.6) </td>
<td> Recipient mail delivery transport, "error" for rejected
recipient. </td> </tr>
<td> Recipient mail delivery transport <br> With rejected recipient:
"error" </td> </tr>
<tr> <td> {tls_version} </td> <td> HELO, MAIL, DATA, EOH, EOM </td>
<td> TLS protocol version </td> </tr>
@ -790,15 +797,8 @@ a discussion. </p>
<ul>
<li> <p> Postfix version 2.3 introduces support for Sendmail 8
milter protocol versions 2, 3 and 4; Postfix version 2.5 adds support
for protocol version 6, which is available with Sendmail 8.14.
Support for other protocol types or protocol versions may be added
later. </p>
<li> <p> For applications that are written in C, you need to use
the Sendmail libmilter library. A Postfix replacement may be
provided in the future. </p>
<li> <p> For Milter applications that are written in C, you need
to use the Sendmail libmilter library. </p>
<li> <p> There are TWO sets of mail filters: filters that are used
for SMTP mail only (specified with the <a href="postconf.5.html#smtpd_milters">smtpd_milters</a> parameter),
@ -806,6 +806,8 @@ and filters for non-SMTP mail (specified with the <a href="postconf.5.html#non_s
parameter). The non-SMTP filters are primarily for local submissions.
</p>
<ul>
<li> <p> When mail is filtered by non-SMTP filters, the Postfix
<a href="cleanup.8.html">cleanup(8)</a> server has to simulate the SMTP client CONNECT and
DISCONNECT events, and the SMTP client EHLO, MAIL FROM, RCPT TO and
@ -815,6 +817,8 @@ commands. When a non-SMTP filter REJECTs or TEMPFAILs a recipient,
Postfix will report a configuration error, and mail will stay in
the queue. </p>
</ul>
<li> <p> Postfix currently does not apply content filters to mail
that is forwarded or aliased internally, or to mail that is generated
internally such as bounces or Postmaster notifications. This may
@ -827,9 +831,37 @@ only to the SMTP command information; they have no access to the
message header or body, and cannot make modifications to the message
or to the envelope. </p>
<li> <p> Postfix 2.3 does not support Milter requests to replace
the message body. Milter applications that request this unsupported
operation will log a warning like this: </p>
<li> <p> Postfix version 2.6 implements all Sendmail 8.14 Milter
features, except it ignores the optional ESMTP command parameters
with requests to replace the sender (SMFIR_CHGFROM), or to append
a recipient (SMFIR_ADDRCPT_PAR). When a Milter application supplies
ESMTP command parameters, these are logged as follows: </p>
<pre>
postfix/cleanup[40629]: warning: 100B22B3293: cleanup_chg_from: ignoring ESMTP arguments "<i>whatever</i>"
</pre>
<p> Specify "<a href="postconf.5.html#milter_protocol">milter_protocol</a> = 6" to enable all available Sendmail
8.14 and earlier Milter features. </p>
<li> <p> Postfix version 2.5 implements all Sendmail 8.14 Milter
features except: SMFIP_RCPT_REJ (report rejected recipients to the
mail filter), SMFIR_CHGFROM (replace sender, with optional ESMTP
command parameters), and SMFIR_ADDRCPT_PAR (add recipient, with
optional ESMTP command parameters). </p>
<p> Specify "<a href="postconf.5.html#milter_protocol">milter_protocol</a> = 6" to enable all available Sendmail
8.14 and earlier Milter features. </p>
<li> <p> Postfix 2.4 implements all Sendmail 8.13 Milter features.
</p>
<p> Specify "<a href="postconf.5.html#milter_protocol">milter_protocol</a> = 4" to enable all available Sendmail
8.13 and earlier Milter features. </p>
<li> <p> Postfix 2.3 implements all Sendmail 8.13 Milter features
except requests to replace the message body. Milter applications
that request this unsupported operation will log a warning like
<blockquote>
<pre>
@ -839,11 +871,8 @@ operation will log a warning like this: </p>
<p> The solution is to use Postfix version 2.4 or later. </p>
<li> <p> Postfix version 2.5 implements the Sendmail 8.14 features
except: SMFIP_RCPT_REJ (report rejected recipients to the mail
filter), SMFIR_CHGFROM (replace sender, with optional ESMTP command
parameters), and SMFIR_ADDRCPT_PAR (add recipient, with optional
ESMTP command parameters).
<p> Specify "<a href="postconf.5.html#milter_protocol">milter_protocol</a> = 4" to enable all available Sendmail
8.13 and earlier Milter features. </p>
<li> <p> Most Milter configuration options are global. Future Postfix
versions may support per-Milter timeouts, per-Milter error handling,

View File

@ -193,8 +193,8 @@ some restriction produces a result of PERMIT, REJECT or DEFER (try
again later). The end of the list is equivalent to a PERMIT result.
By placing a PERMIT restriction before a REJECT restriction you
can make exceptions for specific clients or users. This is called
whitelisting; the last example above allows mail from local networks
but otherwise rejects mail to arbitrary destinations. </p>
whitelisting; the fourth example above allows mail from local
networks but otherwise rejects mail to arbitrary destinations. </p>
<p> The table below summarizes the purpose of each SMTP access
restriction list. All lists use the exact same syntax; they differ

View File

@ -154,13 +154,14 @@ CLEANUP(8) CLEANUP(8)
mail that does not arrive via the Postfix <a href="smtpd.8.html"><b>smtpd</b>(8)</a>
server.
<b><a href="postconf.5.html#milter_protocol">milter_protocol</a> (2)</b>
<b><a href="postconf.5.html#milter_protocol">milter_protocol</a> (6)</b>
The mail filter protocol version and optional pro-
tocol extensions for communication with a Milter
(mail filter) application.
application; prior to Postfix 2.6 the default pro-
tocol is 2.
<b><a href="postconf.5.html#milter_default_action">milter_default_action</a> (tempfail)</b>
The default action when a Milter (mail filter)
The default action when a Milter (mail filter)
application is unavailable or mis-configured.
<b><a href="postconf.5.html#milter_macro_daemon_name">milter_macro_daemon_name</a> ($<a href="postconf.5.html#myhostname">myhostname</a>)</b>
@ -172,55 +173,55 @@ CLEANUP(8) CLEANUP(8)
cations.
<b><a href="postconf.5.html#milter_connect_timeout">milter_connect_timeout</a> (30s)</b>
The time limit for connecting to a Milter (mail
filter) application, and for negotiating protocol
The time limit for connecting to a Milter (mail
filter) application, and for negotiating protocol
options.
<b><a href="postconf.5.html#milter_command_timeout">milter_command_timeout</a> (30s)</b>
The time limit for sending an SMTP command to a
The time limit for sending an SMTP command to a
Milter (mail filter) application, and for receiving
the response.
<b><a href="postconf.5.html#milter_content_timeout">milter_content_timeout</a> (300s)</b>
The time limit for sending message content to a
The time limit for sending message content to a
Milter (mail filter) application, and for receiving
the response.
<b><a href="postconf.5.html#milter_connect_macros">milter_connect_macros</a> (see 'postconf -d' output)</b>
The macros that are sent to Milter (mail filter)
applications after completion of an SMTP connec-
The macros that are sent to Milter (mail filter)
applications after completion of an SMTP connec-
tion.
<b><a href="postconf.5.html#milter_helo_macros">milter_helo_macros</a> (see 'postconf -d' output)</b>
The macros that are sent to Milter (mail filter)
The macros that are sent to Milter (mail filter)
applications after the SMTP HELO or EHLO command.
<b><a href="postconf.5.html#milter_mail_macros">milter_mail_macros</a> (see 'postconf -d' output)</b>
The macros that are sent to Milter (mail filter)
The macros that are sent to Milter (mail filter)
applications after the SMTP MAIL FROM command.
<b><a href="postconf.5.html#milter_rcpt_macros">milter_rcpt_macros</a> (see 'postconf -d' output)</b>
The macros that are sent to Milter (mail filter)
The macros that are sent to Milter (mail filter)
applications after the SMTP RCPT TO command.
<b><a href="postconf.5.html#milter_data_macros">milter_data_macros</a> (see 'postconf -d' output)</b>
The macros that are sent to version 4 or higher
Milter (mail filter) applications after the SMTP
The macros that are sent to version 4 or higher
Milter (mail filter) applications after the SMTP
DATA command.
<b><a href="postconf.5.html#milter_unknown_command_macros">milter_unknown_command_macros</a> (see 'postconf -d' output)</b>
The macros that are sent to version 3 or higher
Milter (mail filter) applications after an unknown
The macros that are sent to version 3 or higher
Milter (mail filter) applications after an unknown
SMTP command.
<b><a href="postconf.5.html#milter_end_of_data_macros">milter_end_of_data_macros</a> (see 'postconf -d' output)</b>
The macros that are sent to Milter (mail filter)
The macros that are sent to Milter (mail filter)
applications after the message end-of-data.
Available in Postfix version 2.5 and later:
<b><a href="postconf.5.html#milter_end_of_header_macros">milter_end_of_header_macros</a> (see 'postconf -d' output)</b>
The macros that are sent to Milter (mail filter)
The macros that are sent to Milter (mail filter)
applications after the end of the message header.
<b>MIME PROCESSING CONTROLS</b>
@ -238,27 +239,27 @@ CLEANUP(8) CLEANUP(8)
will handle.
<b><a href="postconf.5.html#strict_8bitmime">strict_8bitmime</a> (no)</b>
Enable both <a href="postconf.5.html#strict_7bit_headers">strict_7bit_headers</a> and strict_8bit-
Enable both <a href="postconf.5.html#strict_7bit_headers">strict_7bit_headers</a> and strict_8bit-
mime_body.
<b><a href="postconf.5.html#strict_7bit_headers">strict_7bit_headers</a> (no)</b>
Reject mail with 8-bit text in message headers.
<b><a href="postconf.5.html#strict_8bitmime_body">strict_8bitmime_body</a> (no)</b>
Reject 8-bit message body text without 8-bit MIME
Reject 8-bit message body text without 8-bit MIME
content encoding information.
<b><a href="postconf.5.html#strict_mime_encoding_domain">strict_mime_encoding_domain</a> (no)</b>
Reject mail with invalid Content-Transfer-Encoding:
information for the message/* or multipart/* MIME
information for the message/* or multipart/* MIME
content types.
Available in Postfix version 2.5 and later:
<b><a href="postconf.5.html#detect_8bit_encoding_header">detect_8bit_encoding_header</a> (yes)</b>
Automatically detect 8BITMIME body content by look-
ing at Content-Transfer-Encoding: message headers;
historically, this behavior was hard-coded to be
ing at Content-Transfer-Encoding: message headers;
historically, this behavior was hard-coded to be
"always on".
<b>AUTOMATIC BCC RECIPIENT CONTROLS</b>
@ -266,31 +267,31 @@ CLEANUP(8) CLEANUP(8)
mail enters the mail system:
<b><a href="postconf.5.html#always_bcc">always_bcc</a> (empty)</b>
Optional address that receives a "blind carbon
Optional address that receives a "blind carbon
copy" of each message that is received by the Post-
fix mail system.
Available in Postfix version 2.1 and later:
<b><a href="postconf.5.html#sender_bcc_maps">sender_bcc_maps</a> (empty)</b>
Optional BCC (blind carbon-copy) address lookup
Optional BCC (blind carbon-copy) address lookup
tables, indexed by sender address.
<b><a href="postconf.5.html#recipient_bcc_maps">recipient_bcc_maps</a> (empty)</b>
Optional BCC (blind carbon-copy) address lookup
Optional BCC (blind carbon-copy) address lookup
tables, indexed by recipient address.
<b>ADDRESS TRANSFORMATION CONTROLS</b>
Address rewriting is delegated to the <a href="trivial-rewrite.8.html"><b>trivial-rewrite</b>(8)</a>
daemon. The <a href="cleanup.8.html"><b>cleanup</b>(8)</a> server implements table driven
Address rewriting is delegated to the <a href="trivial-rewrite.8.html"><b>trivial-rewrite</b>(8)</a>
daemon. The <a href="cleanup.8.html"><b>cleanup</b>(8)</a> server implements table driven
address mapping.
<b><a href="postconf.5.html#empty_address_recipient">empty_address_recipient</a> (MAILER-DAEMON)</b>
The recipient of mail addressed to the null
The recipient of mail addressed to the null
address.
<b><a href="postconf.5.html#canonical_maps">canonical_maps</a> (empty)</b>
Optional address mapping lookup tables for message
Optional address mapping lookup tables for message
headers and envelopes.
<b><a href="postconf.5.html#recipient_canonical_maps">recipient_canonical_maps</a> (empty)</b>
@ -301,49 +302,49 @@ CLEANUP(8) CLEANUP(8)
Optional address mapping lookup tables for envelope
and header sender addresses.
<b><a href="postconf.5.html#masquerade_classes">masquerade_classes</a> (envelope_sender, header_sender,</b>
<b><a href="postconf.5.html#masquerade_classes">masquerade_classes</a> (envelope_sender, header_sender,</b>
<b>header_recipient)</b>
What addresses are subject to address masquerading.
<b><a href="postconf.5.html#masquerade_domains">masquerade_domains</a> (empty)</b>
Optional list of domains whose subdomain structure
Optional list of domains whose subdomain structure
will be stripped off in email addresses.
<b><a href="postconf.5.html#masquerade_exceptions">masquerade_exceptions</a> (empty)</b>
Optional list of user names that are not subjected
to address masquerading, even when their address
Optional list of user names that are not subjected
to address masquerading, even when their address
matches $<a href="postconf.5.html#masquerade_domains">masquerade_domains</a>.
<b><a href="postconf.5.html#propagate_unmatched_extensions">propagate_unmatched_extensions</a> (canonical, virtual)</b>
What address lookup tables copy an address exten-
What address lookup tables copy an address exten-
sion from the lookup key to the lookup result.
Available before Postfix version 2.0:
<b><a href="postconf.5.html#virtual_maps">virtual_maps</a> (empty)</b>
Optional lookup tables with a) names of domains for
which all addresses are aliased to addresses in
other local or remote domains, and b) addresses
that are aliased to addresses in other local or
which all addresses are aliased to addresses in
other local or remote domains, and b) addresses
that are aliased to addresses in other local or
remote domains.
Available in Postfix version 2.0 and later:
<b><a href="postconf.5.html#virtual_alias_maps">virtual_alias_maps</a> ($<a href="postconf.5.html#virtual_maps">virtual_maps</a>)</b>
Optional lookup tables that alias specific mail
addresses or domains to other local or remote
Optional lookup tables that alias specific mail
addresses or domains to other local or remote
address.
Available in Postfix version 2.2 and later:
<b><a href="postconf.5.html#canonical_classes">canonical_classes</a> (envelope_sender, envelope_recipient,</b>
<b><a href="postconf.5.html#canonical_classes">canonical_classes</a> (envelope_sender, envelope_recipient,</b>
<b>header_sender, header_recipient)</b>
What addresses are subject to <a href="postconf.5.html#canonical_maps">canonical_maps</a>
What addresses are subject to <a href="postconf.5.html#canonical_maps">canonical_maps</a>
address mapping.
<b><a href="postconf.5.html#recipient_canonical_classes">recipient_canonical_classes</a> (envelope_recipient,</b>
<b>header_recipient)</b>
What addresses are subject to <a href="postconf.5.html#recipient_canonical_maps">recipient_canoni</a>-
What addresses are subject to <a href="postconf.5.html#recipient_canonical_maps">recipient_canoni</a>-
<a href="postconf.5.html#recipient_canonical_maps">cal_maps</a> address mapping.
<b><a href="postconf.5.html#sender_canonical_classes">sender_canonical_classes</a> (envelope_sender, header_sender)</b>
@ -351,15 +352,15 @@ CLEANUP(8) CLEANUP(8)
address mapping.
<b><a href="postconf.5.html#remote_header_rewrite_domain">remote_header_rewrite_domain</a> (empty)</b>
Don't rewrite message headers from remote clients
Don't rewrite message headers from remote clients
at all when this parameter is empty; otherwise, re-
write message headers and append the specified
write message headers and append the specified
domain name to incomplete addresses.
<b>RESOURCE AND RATE CONTROLS</b>
<b><a href="postconf.5.html#duplicate_filter_limit">duplicate_filter_limit</a> (1000)</b>
The maximal number of addresses remembered by the
address duplicate filter for <a href="aliases.5.html"><b>aliases</b>(5)</a> or <a href="virtual.5.html"><b>vir-</b></a>
The maximal number of addresses remembered by the
address duplicate filter for <a href="aliases.5.html"><b>aliases</b>(5)</a> or <a href="virtual.5.html"><b>vir-</b></a>
<a href="virtual.5.html"><b>tual</b>(5)</a> alias expansion, or for <a href="showq.8.html"><b>showq</b>(8)</a> queue dis-
plays.
@ -368,16 +369,16 @@ CLEANUP(8) CLEANUP(8)
message header.
<b><a href="postconf.5.html#hopcount_limit">hopcount_limit</a> (50)</b>
The maximal number of Received: message headers
The maximal number of Received: message headers
that is allowed in the primary message headers.
<b><a href="postconf.5.html#in_flow_delay">in_flow_delay</a> (1s)</b>
Time to pause before accepting a new message, when
Time to pause before accepting a new message, when
the message arrival rate exceeds the message deliv-
ery rate.
<b><a href="postconf.5.html#message_size_limit">message_size_limit</a> (10240000)</b>
The maximal size in bytes of a message, including
The maximal size in bytes of a message, including
envelope information.
Available in Postfix version 2.0 and later:
@ -395,35 +396,35 @@ CLEANUP(8) CLEANUP(8)
will handle.
<b><a href="postconf.5.html#queue_file_attribute_count_limit">queue_file_attribute_count_limit</a> (100)</b>
The maximal number of (name=value) attributes that
The maximal number of (name=value) attributes that
may be stored in a Postfix queue file.
Available in Postfix version 2.1 and later:
<b><a href="postconf.5.html#virtual_alias_expansion_limit">virtual_alias_expansion_limit</a> (1000)</b>
The maximal number of addresses that virtual alias
The maximal number of addresses that virtual alias
expansion produces from each original recipient.
<b><a href="postconf.5.html#virtual_alias_recursion_limit">virtual_alias_recursion_limit</a> (1000)</b>
The maximal nesting depth of virtual alias expan-
The maximal nesting depth of virtual alias expan-
sion.
<b>MISCELLANEOUS CONTROLS</b>
<b><a href="postconf.5.html#config_directory">config_directory</a> (see 'postconf -d' output)</b>
The default location of the Postfix <a href="postconf.5.html">main.cf</a> and
The default location of the Postfix <a href="postconf.5.html">main.cf</a> and
<a href="master.5.html">master.cf</a> configuration files.
<b><a href="postconf.5.html#daemon_timeout">daemon_timeout</a> (18000s)</b>
How much time a Postfix daemon process may take to
handle a request before it is terminated by a
How much time a Postfix daemon process may take to
handle a request before it is terminated by a
built-in watchdog timer.
<b><a href="postconf.5.html#delay_logging_resolution_limit">delay_logging_resolution_limit</a> (2)</b>
The maximal number of digits after the decimal
The maximal number of digits after the decimal
point when logging sub-second delay values.
<b><a href="postconf.5.html#delay_warning_time">delay_warning_time</a> (0h)</b>
The time after which the sender receives the mes-
The time after which the sender receives the mes-
sage headers of mail that is still queued.
<b><a href="postconf.5.html#ipc_timeout">ipc_timeout</a> (3600s)</b>
@ -431,13 +432,13 @@ CLEANUP(8) CLEANUP(8)
over an internal communication channel.
<b><a href="postconf.5.html#max_idle">max_idle</a> (100s)</b>
The maximum amount of time that an idle Postfix
daemon process waits for an incoming connection
The maximum amount of time that an idle Postfix
daemon process waits for an incoming connection
before terminating voluntarily.
<b><a href="postconf.5.html#max_use">max_use</a> (100)</b>
The maximal number of incoming connections that a
Postfix daemon process will service before termi-
The maximal number of incoming connections that a
Postfix daemon process will service before termi-
nating voluntarily.
<b><a href="postconf.5.html#myhostname">myhostname</a> (see 'postconf -d' output)</b>
@ -445,19 +446,19 @@ CLEANUP(8) CLEANUP(8)
<b><a href="postconf.5.html#myorigin">myorigin</a> ($<a href="postconf.5.html#myhostname">myhostname</a>)</b>
The domain name that locally-posted mail appears to
come from, and that locally posted mail is deliv-
come from, and that locally posted mail is deliv-
ered to.
<b><a href="postconf.5.html#process_id">process_id</a> (read-only)</b>
The process ID of a Postfix command or daemon
The process ID of a Postfix command or daemon
process.
<b><a href="postconf.5.html#process_name">process_name</a> (read-only)</b>
The process name of a Postfix command or daemon
The process name of a Postfix command or daemon
process.
<b><a href="postconf.5.html#queue_directory">queue_directory</a> (see 'postconf -d' output)</b>
The location of the Postfix top-level queue direc-
The location of the Postfix top-level queue direc-
tory.
<b><a href="postconf.5.html#soft_bounce">soft_bounce</a> (no)</b>
@ -468,14 +469,14 @@ CLEANUP(8) CLEANUP(8)
The syslog facility of Postfix logging.
<b><a href="postconf.5.html#syslog_name">syslog_name</a> (see 'postconf -d' output)</b>
The mail system name that is prepended to the
process name in syslog records, so that "smtpd"
The mail system name that is prepended to the
process name in syslog records, so that "smtpd"
becomes, for example, "postfix/smtpd".
Available in Postfix version 2.1 and later:
<b><a href="postconf.5.html#enable_original_recipient">enable_original_recipient</a> (yes)</b>
Enable support for the X-Original-To message
Enable support for the X-Original-To message
header.
<b>FILES</b>
@ -499,7 +500,7 @@ CLEANUP(8) CLEANUP(8)
<a href="CONTENT_INSPECTION_README.html">CONTENT_INSPECTION_README</a> content inspection
<b>LICENSE</b>
The Secure Mailer license must be distributed with this
The Secure Mailer license must be distributed with this
software.
<b>AUTHOR(S)</b>

View File

@ -308,10 +308,6 @@ LOCAL(8) LOCAL(8)
<b>ward</b>+<i>foo</i> or in ~<i>name</i>/.<b>forward</b>, to the mailbox owned by the
user <i>name</i>, or it is sent back as undeliverable.
In all cases the <a href="local.8.html"><b>local</b>(8)</a> daemon prepends an optional
`<b>Delivered-To:</b> header line with the final recipient
address.
<b>DELIVERY RIGHTS</b>
Deliveries to external files and external commands are
made with the rights of the receiving user on whose behalf

View File

@ -5697,10 +5697,11 @@ for a list of available macro names and their meanings. </p>
</DD>
<DT><b><a name="milter_protocol">milter_protocol</a>
(default: 2)</b></DT><DD>
(default: 6)</b></DT><DD>
<p> The mail filter protocol version and optional protocol extensions
for communication with a Milter (mail filter) application. Postfix
for communication with a Milter application; prior to Postfix 2.6
the default protocol is 2. Postfix
sends this version number during the initial protocol handshake.
It should match the version number that is expected by the mail
filter application (or by its Milter library). </p>
@ -5710,14 +5711,15 @@ filter application (or by its Milter library). </p>
<dl compact>
<dt>2</dt> <dd>Use Sendmail 8 mail filter protocol version 2 (default
as of Sendmail version 8.11).</dd>
with Sendmail version 8.11 .. 8.13 and Postfix version 2.3 ..
2.5).</dd>
<dt>3</dt> <dd>Use Sendmail 8 mail filter protocol version 3.</dd>
<dt>4</dt> <dd>Use Sendmail 8 mail filter protocol version 4.</dd>
<dt>6</dt> <dd>Use Sendmail 8 mail filter protocol version 6 (default
as of Sendmail version 8.14).</dd>
with Sendmail version 8.14 and Postfix version 2.6).</dd>
</dl>

File diff suppressed because it is too large Load Diff

View File

@ -3162,9 +3162,10 @@ after the SMTP MAIL FROM command. See MILTER_README
for a list of available macro names and their meanings.
.PP
This feature is available in Postfix 2.3 and later.
.SH milter_protocol (default: 2)
.SH milter_protocol (default: 6)
The mail filter protocol version and optional protocol extensions
for communication with a Milter (mail filter) application. Postfix
for communication with a Milter application; prior to Postfix 2.6
the default protocol is 2. Postfix
sends this version number during the initial protocol handshake.
It should match the version number that is expected by the mail
filter application (or by its Milter library).
@ -3172,14 +3173,15 @@ filter application (or by its Milter library).
Protocol versions:
.IP "2"
Use Sendmail 8 mail filter protocol version 2 (default
as of Sendmail version 8.11).
with Sendmail version 8.11 .. 8.13 and Postfix version 2.3 ..
2.5).
.IP "3"
Use Sendmail 8 mail filter protocol version 3.
.IP "4"
Use Sendmail 8 mail filter protocol version 4.
.IP "6"
Use Sendmail 8 mail filter protocol version 6 (default
as of Sendmail version 8.14).
with Sendmail version 8.14 and Postfix version 2.6).
.PP
Protocol extensions:
.IP "no_header_reply"

View File

@ -144,9 +144,10 @@ see the MILTER_README document.
.IP "\fBnon_smtpd_milters (empty)\fR"
A list of Milter (mail filter) applications for new mail that
does not arrive via the Postfix \fBsmtpd\fR(8) server.
.IP "\fBmilter_protocol (2)\fR"
.IP "\fBmilter_protocol (6)\fR"
The mail filter protocol version and optional protocol extensions
for communication with a Milter (mail filter) application.
for communication with a Milter application; prior to Postfix 2.6
the default protocol is 2.
.IP "\fBmilter_default_action (tempfail)\fR"
The default action when a Milter (mail filter) application is
unavailable or mis-configured.

View File

@ -320,10 +320,6 @@ or to the alias \fIname\fR, to the destinations listed in
~\fIname\fR/.\fBforward\fR+\fIfoo\fR or in ~\fIname\fR/.\fBforward\fR,
to the mailbox owned by the user \fIname\fR, or it is sent back as
undeliverable.
In all cases the \fBlocal\fR(8) daemon prepends an optional
`\fBDelivered-To:\fR header line with the final recipient
address.
.SH "DELIVERY RIGHTS"
.na
.nf

View File

@ -200,9 +200,10 @@ mail is queued. For details see the MILTER_README document.
.IP "\fBsmtpd_milters (empty)\fR"
A list of Milter (mail filter) applications for new mail that
arrives via the Postfix \fBsmtpd\fR(8) server.
.IP "\fBmilter_protocol (2)\fR"
.IP "\fBmilter_protocol (6)\fR"
The mail filter protocol version and optional protocol extensions
for communication with a Milter (mail filter) application.
for communication with a Milter application; prior to Postfix 2.6
the default protocol is 2.
.IP "\fBmilter_default_action (tempfail)\fR"
The default action when a Milter (mail filter) application is
unavailable or mis-configured.

View File

@ -442,12 +442,15 @@ in the "hold" queue, and is available with Postfix 2.6 or later.
<p> As Postfix is not built with the Sendmail libmilter library,
you may need to configure the Milter protocol version that Postfix
should use. The default version is 2. Other protocol versions are
3 and 4 (Postfix 2.3 and later), and 6 (Postfix 2.5 an later). </p>
should use. The default version is 6 (before Postfix 2.6 the default
version is 2). </p>
<blockquote>
<pre>
/etc/postfix/main.cf:
# Postfix &ge; 2.6
milter_protocol = 6
# 2.3 &le; Postfix &le; 2.5
milter_protocol = 2
</pre>
</blockquote>
@ -515,7 +518,9 @@ times. This is an inherent problem with before-queue filtering. </p>
<h3><a name="macros">Sendmail macro emulation</a></h3>
<p> Postfix emulates a limited number of Sendmail macros, as shown
in the table. Different macros are available at different SMTP
in the table. Some macro values depend on whether a recipient is
rejected (rejected recipients are available on request by the Milter
application). Different macros are available at different SMTP
protocol stages (EOH = end-of-header, EOM = end-of-message); their
availability is not
always the same as in Sendmail. See the <a
@ -552,15 +557,16 @@ address </td> </tr>
<tr> <td> {client_connections} </td> <td> CONNECT </td> <td>
Connection concurrency for this client </td> </tr>
<tr> <td> {client_name} </td> <td> Always </td> <td> Client hostname,
"unknown" when lookup or verification fails </td> </tr>
<tr> <td> {client_name} </td> <td> Always </td> <td> Client hostname
<br> When address &rarr; name lookup or name &rarr; address
verification fails: "unknown" </td> </tr>
<tr> <td> {client_port} </td> <td> Always (Postfix &ge;2.5) </td>
<td> Client TCP port </td> </tr>
<tr> <td> {client_ptr} </td> <td> CONNECT, HELO, MAIL, DATA </td>
<td> Client name from reverse lookup, "unknown" when lookup fails
</td> </tr>
<td> Client name from address &rarr; name lookup <br> When address
&rarr; name lookup fails: "unknown" </td> </tr>
<tr> <td> {cert_issuer} </td> <td> HELO, MAIL, DATA, EOH, EOM </td> <td>
TLS client certificate issuer </td> </tr>
@ -587,14 +593,15 @@ Sender next-hop destination </td> </tr>
<td> Sender mail delivery transport </td> </tr>
<tr> <td> {rcpt_addr} </td> <td> RCPT </td> <td> Recipient address
</td> </tr>
<br> With rejected recipient: descriptive text </td> </tr>
<tr> <td> {rcpt_host} </td> <td> RCPT (Postfix &ge; 2.6) </td> <td>
Recipient next-hop destination </td> </tr>
Recipient next-hop destination <br> With rejected recpient: enhanced
status code </td> </tr>
<tr> <td> {rcpt_mailer} </td> <td> RCPT (Postfix &ge; 2.6) </td>
<td> Recipient mail delivery transport, "error" for rejected
recipient. </td> </tr>
<td> Recipient mail delivery transport <br> With rejected recipient:
"error" </td> </tr>
<tr> <td> {tls_version} </td> <td> HELO, MAIL, DATA, EOH, EOM </td>
<td> TLS protocol version </td> </tr>
@ -790,15 +797,8 @@ a discussion. </p>
<ul>
<li> <p> Postfix version 2.3 introduces support for Sendmail 8
milter protocol versions 2, 3 and 4; Postfix version 2.5 adds support
for protocol version 6, which is available with Sendmail 8.14.
Support for other protocol types or protocol versions may be added
later. </p>
<li> <p> For applications that are written in C, you need to use
the Sendmail libmilter library. A Postfix replacement may be
provided in the future. </p>
<li> <p> For Milter applications that are written in C, you need
to use the Sendmail libmilter library. </p>
<li> <p> There are TWO sets of mail filters: filters that are used
for SMTP mail only (specified with the smtpd_milters parameter),
@ -806,6 +806,8 @@ and filters for non-SMTP mail (specified with the non_smtpd_milters
parameter). The non-SMTP filters are primarily for local submissions.
</p>
<ul>
<li> <p> When mail is filtered by non-SMTP filters, the Postfix
cleanup(8) server has to simulate the SMTP client CONNECT and
DISCONNECT events, and the SMTP client EHLO, MAIL FROM, RCPT TO and
@ -815,6 +817,8 @@ commands. When a non-SMTP filter REJECTs or TEMPFAILs a recipient,
Postfix will report a configuration error, and mail will stay in
the queue. </p>
</ul>
<li> <p> Postfix currently does not apply content filters to mail
that is forwarded or aliased internally, or to mail that is generated
internally such as bounces or Postmaster notifications. This may
@ -827,9 +831,37 @@ only to the SMTP command information; they have no access to the
message header or body, and cannot make modifications to the message
or to the envelope. </p>
<li> <p> Postfix 2.3 does not support Milter requests to replace
the message body. Milter applications that request this unsupported
operation will log a warning like this: </p>
<li> <p> Postfix version 2.6 implements all Sendmail 8.14 Milter
features, except it ignores the optional ESMTP command parameters
with requests to replace the sender (SMFIR_CHGFROM), or to append
a recipient (SMFIR_ADDRCPT_PAR). When a Milter application supplies
ESMTP command parameters, these are logged as follows: </p>
<pre>
postfix/cleanup[40629]: warning: 100B22B3293: cleanup_chg_from: ignoring ESMTP arguments "<i>whatever</i>"
</pre>
<p> Specify "milter_protocol = 6" to enable all available Sendmail
8.14 and earlier Milter features. </p>
<li> <p> Postfix version 2.5 implements all Sendmail 8.14 Milter
features except: SMFIP_RCPT_REJ (report rejected recipients to the
mail filter), SMFIR_CHGFROM (replace sender, with optional ESMTP
command parameters), and SMFIR_ADDRCPT_PAR (add recipient, with
optional ESMTP command parameters). </p>
<p> Specify "milter_protocol = 6" to enable all available Sendmail
8.14 and earlier Milter features. </p>
<li> <p> Postfix 2.4 implements all Sendmail 8.13 Milter features.
</p>
<p> Specify "milter_protocol = 4" to enable all available Sendmail
8.13 and earlier Milter features. </p>
<li> <p> Postfix 2.3 implements all Sendmail 8.13 Milter features
except requests to replace the message body. Milter applications
that request this unsupported operation will log a warning like
<blockquote>
<pre>
@ -839,11 +871,8 @@ operation will log a warning like this: </p>
<p> The solution is to use Postfix version 2.4 or later. </p>
<li> <p> Postfix version 2.5 implements the Sendmail 8.14 features
except: SMFIP_RCPT_REJ (report rejected recipients to the mail
filter), SMFIR_CHGFROM (replace sender, with optional ESMTP command
parameters), and SMFIR_ADDRCPT_PAR (add recipient, with optional
ESMTP command parameters).
<p> Specify "milter_protocol = 4" to enable all available Sendmail
8.13 and earlier Milter features. </p>
<li> <p> Most Milter configuration options are global. Future Postfix
versions may support per-Milter timeouts, per-Milter error handling,

View File

@ -193,8 +193,8 @@ some restriction produces a result of PERMIT, REJECT or DEFER (try
again later). The end of the list is equivalent to a PERMIT result.
By placing a PERMIT restriction before a REJECT restriction you
can make exceptions for specific clients or users. This is called
whitelisting; the last example above allows mail from local networks
but otherwise rejects mail to arbitrary destinations. </p>
whitelisting; the fourth example above allows mail from local
networks but otherwise rejects mail to arbitrary destinations. </p>
<p> The table below summarizes the purpose of each SMTP access
restriction list. All lists use the exact same syntax; they differ

View File

@ -10454,10 +10454,11 @@ for details. </p>
<p> This feature is available in Postfix 2.3 and later. </p>
%PARAM milter_protocol 2
%PARAM milter_protocol 6
<p> The mail filter protocol version and optional protocol extensions
for communication with a Milter (mail filter) application. Postfix
for communication with a Milter application; prior to Postfix 2.6
the default protocol is 2. Postfix
sends this version number during the initial protocol handshake.
It should match the version number that is expected by the mail
filter application (or by its Milter library). </p>
@ -10467,14 +10468,15 @@ filter application (or by its Milter library). </p>
<dl compact>
<dt>2</dt> <dd>Use Sendmail 8 mail filter protocol version 2 (default
as of Sendmail version 8.11).</dd>
with Sendmail version 8.11 .. 8.13 and Postfix version 2.3 ..
2.5).</dd>
<dt>3</dt> <dd>Use Sendmail 8 mail filter protocol version 3.</dd>
<dt>4</dt> <dd>Use Sendmail 8 mail filter protocol version 4.</dd>
<dt>6</dt> <dd>Use Sendmail 8 mail filter protocol version 6 (default
as of Sendmail version 8.14).</dd>
with Sendmail version 8.14 and Postfix version 2.6).</dd>
</dl>

View File

@ -174,7 +174,7 @@ int bounce_notify_service(int flags, char *service, char *queue_name,
postmaster = var_2bounce_rcpt;
if ((bounce = post_mail_fopen_nowait(mail_addr_double_bounce(),
postmaster,
INT_FILT_BOUNCE,
INT_FILT_MASK_BOUNCE,
NULL_TRACE_FLAGS,
new_id)) != 0) {
@ -213,7 +213,7 @@ int bounce_notify_service(int flags, char *service, char *queue_name,
*/
else {
if ((bounce = post_mail_fopen_nowait(NULL_SENDER, recipient,
INT_FILT_BOUNCE,
INT_FILT_MASK_BOUNCE,
NULL_TRACE_FLAGS,
new_id)) != 0) {
@ -267,7 +267,7 @@ int bounce_notify_service(int flags, char *service, char *queue_name,
postmaster = var_bounce_rcpt;
if ((bounce = post_mail_fopen_nowait(mail_addr_double_bounce(),
postmaster,
INT_FILT_BOUNCE,
INT_FILT_MASK_BOUNCE,
NULL_TRACE_FLAGS,
new_id)) != 0) {
count = -1;

View File

@ -160,7 +160,7 @@ int bounce_notify_verp(int flags, char *service, char *queue_name,
} else {
verp_sender(verp_buf, verp_delims, recipient, rcpt);
if ((bounce = post_mail_fopen_nowait(NULL_SENDER, STR(verp_buf),
INT_FILT_BOUNCE,
INT_FILT_MASK_BOUNCE,
NULL_TRACE_FLAGS,
new_id)) != 0) {
@ -219,7 +219,7 @@ int bounce_notify_verp(int flags, char *service, char *queue_name,
postmaster = var_bounce_rcpt;
if ((bounce = post_mail_fopen_nowait(mail_addr_double_bounce(),
postmaster,
INT_FILT_BOUNCE,
INT_FILT_MASK_BOUNCE,
NULL_TRACE_FLAGS,
new_id)) != 0) {
if (bounce_header(bounce, bounce_info, postmaster,

View File

@ -147,7 +147,7 @@ int bounce_one_service(int flags, char *queue_name, char *queue_id,
} else {
if ((bounce = post_mail_fopen_nowait(mail_addr_double_bounce(),
var_2bounce_rcpt,
INT_FILT_BOUNCE,
INT_FILT_MASK_BOUNCE,
NULL_TRACE_FLAGS,
new_id)) != 0) {
@ -183,7 +183,7 @@ int bounce_one_service(int flags, char *queue_name, char *queue_id,
bounce_status = 0;
} else {
if ((bounce = post_mail_fopen_nowait(NULL_SENDER, orig_sender,
INT_FILT_BOUNCE,
INT_FILT_MASK_BOUNCE,
NULL_TRACE_FLAGS,
new_id)) != 0) {
@ -228,7 +228,7 @@ int bounce_one_service(int flags, char *queue_name, char *queue_id,
*/
if ((bounce = post_mail_fopen_nowait(mail_addr_double_bounce(),
var_bounce_rcpt,
INT_FILT_BOUNCE,
INT_FILT_MASK_BOUNCE,
NULL_TRACE_FLAGS,
new_id)) != 0) {
if (bounce_header(bounce, bounce_info, var_bounce_rcpt,

View File

@ -140,7 +140,7 @@ int bounce_trace_service(int flags, char *service, char *queue_name,
* a new queue file.
*/
if ((bounce = post_mail_fopen_nowait(NULL_SENDER, recipient,
INT_FILT_BOUNCE,
INT_FILT_MASK_BOUNCE,
NULL_TRACE_FLAGS,
new_id)) != 0) {
count = -1;

View File

@ -164,7 +164,7 @@ int bounce_warn_service(int unused_flags, char *service, char *queue_name,
postmaster = var_delay_rcpt;
if ((bounce = post_mail_fopen_nowait(mail_addr_double_bounce(),
postmaster,
INT_FILT_BOUNCE,
INT_FILT_MASK_BOUNCE,
NULL_TRACE_FLAGS,
new_id)) != 0) {
@ -202,7 +202,7 @@ int bounce_warn_service(int unused_flags, char *service, char *queue_name,
*/
else {
if ((bounce = post_mail_fopen_nowait(NULL_SENDER, recipient,
INT_FILT_BOUNCE,
INT_FILT_MASK_BOUNCE,
NULL_TRACE_FLAGS,
new_id)) != 0) {
@ -252,7 +252,7 @@ int bounce_warn_service(int unused_flags, char *service, char *queue_name,
postmaster = var_delay_rcpt;
if ((bounce = post_mail_fopen_nowait(mail_addr_double_bounce(),
postmaster,
INT_FILT_BOUNCE,
INT_FILT_MASK_BOUNCE,
NULL_TRACE_FLAGS,
new_id)) != 0) {
count = -1;

View File

@ -74,7 +74,9 @@ milter_tests: cleanup_milter_test bug_tests \
cleanup_milter_test5 cleanup_milter_test6 cleanup_milter_test7 \
cleanup_milter_test8 cleanup_milter_test9 cleanup_milter_test10a \
cleanup_milter_test10b cleanup_milter_test10c cleanup_milter_test10d \
cleanup_milter_test10e cleanup_milter_test11 cleanup_milter_test12
cleanup_milter_test10e cleanup_milter_test11 cleanup_milter_test12 \
cleanup_milter_test13a cleanup_milter_test13b cleanup_milter_test13c \
cleanup_milter_test13d
root_tests:
@ -296,6 +298,42 @@ cleanup_milter_test12: cleanup_milter test-queue-file12 cleanup_milter.in12 \
diff cleanup_milter.ref12 cleanup_milter.tmp
rm -f test-queue-file12.tmp cleanup_milter.tmp
cleanup_milter_test13a: cleanup_milter test-queue-file13a cleanup_milter.in13a \
cleanup_milter.ref13a ../postcat/postcat
cp test-queue-file13a test-queue-file13a.tmp
chmod u+w test-queue-file13a.tmp
./cleanup_milter <cleanup_milter.in13a
../postcat/postcat -ov test-queue-file13a.tmp 2>/dev/null >cleanup_milter.tmp
diff cleanup_milter.ref13a cleanup_milter.tmp
rm -f test-queue-file13a.tmp cleanup_milter.tmp
cleanup_milter_test13b: cleanup_milter test-queue-file13b cleanup_milter.in13b \
cleanup_milter.ref13b ../postcat/postcat
cp test-queue-file13b test-queue-file13b.tmp
chmod u+w test-queue-file13b.tmp
./cleanup_milter <cleanup_milter.in13b
../postcat/postcat -ov test-queue-file13b.tmp 2>/dev/null >cleanup_milter.tmp
diff cleanup_milter.ref13b cleanup_milter.tmp
rm -f test-queue-file13b.tmp cleanup_milter.tmp
cleanup_milter_test13c: cleanup_milter test-queue-file13c cleanup_milter.in13c \
cleanup_milter.ref13c ../postcat/postcat
cp test-queue-file13c test-queue-file13c.tmp
chmod u+w test-queue-file13c.tmp
./cleanup_milter <cleanup_milter.in13c
../postcat/postcat -ov test-queue-file13c.tmp 2>/dev/null >cleanup_milter.tmp
diff cleanup_milter.ref13c cleanup_milter.tmp
rm -f test-queue-file13c.tmp cleanup_milter.tmp
cleanup_milter_test13d: cleanup_milter test-queue-file13d cleanup_milter.in13d \
cleanup_milter.ref13d ../postcat/postcat
cp test-queue-file13d test-queue-file13d.tmp
chmod u+w test-queue-file13d.tmp
./cleanup_milter <cleanup_milter.in13d
../postcat/postcat -ov test-queue-file13d.tmp 2>/dev/null >cleanup_milter.tmp
diff cleanup_milter.ref13d cleanup_milter.tmp
rm -f test-queue-file13d.tmp cleanup_milter.tmp
depend: $(MAKES)
(sed '1,/^# do not edit/!d' Makefile.in; \
set -e; for i in [a-z][a-z0-9]*.c; do \

View File

@ -124,9 +124,10 @@
/* .IP "\fBnon_smtpd_milters (empty)\fR"
/* A list of Milter (mail filter) applications for new mail that
/* does not arrive via the Postfix \fBsmtpd\fR(8) server.
/* .IP "\fBmilter_protocol (2)\fR"
/* .IP "\fBmilter_protocol (6)\fR"
/* The mail filter protocol version and optional protocol extensions
/* for communication with a Milter (mail filter) application.
/* for communication with a Milter application; prior to Postfix 2.6
/* the default protocol is 2.
/* .IP "\fBmilter_default_action (tempfail)\fR"
/* The default action when a Milter (mail filter) application is
/* unavailable or mis-configured.

View File

@ -72,6 +72,8 @@ typedef struct CLEANUP_STATE {
off_t body_offset; /* start of body content */
off_t xtra_offset; /* start of extra segment */
off_t cont_length; /* length including Milter edits */
off_t sender_pt_offset; /* replace sender here */
off_t sender_pt_target; /* record after sender address */
off_t append_rcpt_pt_offset; /* append recipient here */
off_t append_rcpt_pt_target; /* target of above record */
off_t append_hdr_pt_offset; /* append header here */

View File

@ -377,7 +377,20 @@ static void cleanup_envelope_process(CLEANUP_STATE *state, int type,
state->errs |= CLEANUP_STAT_BAD;
return;
}
if (state->milters || cleanup_milters) {
/* Remember the sender record offset. */
if ((state->sender_pt_offset = vstream_ftell(state->dst)) < 0)
msg_fatal("%s: vstream_ftell %s: %m:", myname, cleanup_path);
}
cleanup_addr_sender(state, buf);
if (state->milters || cleanup_milters) {
/* Make room to replace sender. */
if (len < REC_TYPE_PTR_PAYL_SIZE)
rec_pad(state->dst, REC_TYPE_PTR, REC_TYPE_PTR_PAYL_SIZE - len);
/* Remember the after-sender record offset. */
if ((state->sender_pt_target = vstream_ftell(state->dst)) < 0)
msg_fatal("%s: vstream_ftell %s: %m:", myname, cleanup_path);
}
if (cleanup_milters != 0
&& state->milters == 0
&& CLEANUP_MILTER_OK(state))

View File

@ -959,6 +959,99 @@ static const char *cleanup_del_header(void *context, ssize_t index,
return (CLEANUP_OUT_OK(state) ? 0 : cleanup_milter_error(state, 0));
}
/* cleanup_chg_from - replace sender address, ignore ESMTP arguments */
static const char *cleanup_chg_from(void *context, const char *ext_from,
const char *esmtp_args)
{
const char *myname = "cleanup_chg_from";
CLEANUP_STATE *state = (CLEANUP_STATE *) context;
off_t new_sender_offset;
int addr_count;
TOK822 *tree;
TOK822 *tp;
VSTRING *int_sender_buf;
if (msg_verbose)
msg_info("%s: \"%s\" \"%s\"", myname, ext_from, esmtp_args);
if (esmtp_args[0])
msg_warn("%s: %s: ignoring ESMTP arguments \"%.100s\"",
state->queue_id, myname, esmtp_args);
/*
* The cleanup server remembers the location of the the original sender
* address record (offset in sender_pt_offset) and the file offset of the
* record that follows the sender address (offset in sender_pt_target).
* Short original sender records are padded, so that they can safely be
* overwritten with a pointer record to the new sender address record.
*/
if (state->sender_pt_offset < 0)
msg_panic("%s: no original sender record offset", myname);
if (state->sender_pt_target < 0)
msg_panic("%s: no post-sender record offset", myname);
/*
* Allocate space after the end of the queue file, and write the new
* sender record, followed by a reverse pointer record that points to the
* record that follows the original sender address record. No padding is
* needed for a "new" short sender record, since the record is not meant
* to be overwritten. When the "new" sender is replaced, we allocate a
* new record at the end of the queue file.
*
* We update the queue file in a safe manner: save the new sender after the
* end of the queue file, write the reverse pointer, and only then
* overwrite the old sender record with the forward pointer to the new
* sender.
*/
if ((new_sender_offset = vstream_fseek(state->dst, (off_t) 0, SEEK_END)) < 0) {
msg_warn("%s: seek file %s: %m", myname, cleanup_path);
return (cleanup_milter_error(state, errno));
}
/*
* Transform the address from external form to internal form. This also
* removes the enclosing <>, if present.
*
* XXX vstring_alloc() rejects zero-length requests.
*/
int_sender_buf = vstring_alloc(strlen(ext_from) + 1);
tree = tok822_parse(ext_from);
for (addr_count = 0, tp = tree; tp != 0; tp = tp->next) {
if (tp->type == TOK822_ADDR) {
if (addr_count == 0) {
tok822_internalize(int_sender_buf, tp->head, TOK822_STR_DEFL);
addr_count += 1;
} else {
msg_warn("%s: Milter request to add multi-sender: \"%s\"",
state->queue_id, ext_from);
break;
}
}
}
tok822_free_tree(tree);
cleanup_addr_sender(state, STR(int_sender_buf));
vstring_free(int_sender_buf);
cleanup_out_format(state, REC_TYPE_PTR, REC_TYPE_PTR_FORMAT,
(long) state->sender_pt_target);
/*
* Overwrite the original sender record with the pointer to the new
* sender address record.
*/
if (vstream_fseek(state->dst, state->sender_pt_offset, SEEK_SET) < 0) {
msg_warn("%s: seek file %s: %m", myname, cleanup_path);
return (cleanup_milter_error(state, errno));
}
cleanup_out_format(state, REC_TYPE_PTR, REC_TYPE_PTR_FORMAT,
(long) new_sender_offset);
/*
* In case of error while doing record output.
*/
return (CLEANUP_OUT_OK(state) ? 0 : cleanup_milter_error(state, 0));
}
/* cleanup_add_rcpt - append recipient address */
static const char *cleanup_add_rcpt(void *context, const char *ext_rcpt)
@ -1065,6 +1158,20 @@ static const char *cleanup_add_rcpt(void *context, const char *ext_rcpt)
return (CLEANUP_OUT_OK(state) ? 0 : cleanup_milter_error(state, 0));
}
/* cleanup_add_rcpt_par - append recipient address, ignore ESMTP arguments */
static const char *cleanup_add_rcpt_par(void *context, const char *ext_rcpt,
const char *esmtp_args)
{
const char *myname = "cleanup_add_rcpt";
CLEANUP_STATE *state = (CLEANUP_STATE *) context;
if (esmtp_args[0])
msg_warn("%s: %s: ignoring ESMTP arguments \"%.100s\"",
state->queue_id, myname, esmtp_args);
return (cleanup_add_rcpt(context, ext_rcpt));
}
/* cleanup_del_rcpt - remove recipient and all its expansions */
static const char *cleanup_del_rcpt(void *context, const char *ext_rcpt)
@ -1366,7 +1473,8 @@ void cleanup_milter_receive(CLEANUP_STATE *state, int count)
milter_edit_callback(state->milters,
cleanup_add_header, cleanup_upd_header,
cleanup_ins_header, cleanup_del_header,
cleanup_add_rcpt, cleanup_del_rcpt,
cleanup_chg_from, cleanup_add_rcpt,
cleanup_add_rcpt_par, cleanup_del_rcpt,
cleanup_repl_body, (void *) state);
}
@ -1399,7 +1507,7 @@ static const char *cleanup_milter_apply(CLEANUP_STATE *state, const char *event,
switch (resp[0]) {
case 'H':
/* XXX Should log the reason here. */
if (state->flags & CLEANUP_FLAG_HOLD)
if (state->flags & CLEANUP_FLAG_HOLD)
return (0);
state->flags |= CLEANUP_FLAG_HOLD;
action = "milter-hold";
@ -1538,7 +1646,8 @@ void cleanup_milter_emul_mail(CLEANUP_STATE *state,
milter_edit_callback(milters,
cleanup_add_header, cleanup_upd_header,
cleanup_ins_header, cleanup_del_header,
cleanup_add_rcpt, cleanup_del_rcpt,
cleanup_chg_from, cleanup_add_rcpt,
cleanup_add_rcpt_par, cleanup_del_rcpt,
cleanup_repl_body, (void *) state);
if (state->client_name == 0)
cleanup_milter_client_init(state);
@ -1768,6 +1877,14 @@ static void open_queue_file(CLEANUP_STATE *state, const char *path)
cleanup_path, STR(buf));
state->data_offset = data_offset;
state->xtra_offset = data_offset + msg_seg_len;
} else if (rec_type == REC_TYPE_FROM) {
state->sender_pt_offset = curr_offset;
if (LEN(buf) < REC_TYPE_PTR_PAYL_SIZE
&& rec_get_raw(state->dst, buf, 0, REC_FLAG_NONE) != REC_TYPE_PTR)
msg_fatal("file %s: missing PTR record after short sender",
cleanup_path);
if ((state->sender_pt_target = vstream_ftell(state->dst)) < 0)
msg_fatal("file %s: missing END record", cleanup_path);
} else if (rec_type == REC_TYPE_PTR) {
if (state->data_offset < 0)
msg_fatal("file %s: missing SIZE record", cleanup_path);
@ -1826,6 +1943,8 @@ int main(int unused_argc, char **argv)
int istty = isatty(vstream_fileno(VSTREAM_IN));
CLEANUP_STATE *state = cleanup_state_alloc((VSTREAM *) 0);
state->queue_id = mystrdup("NOQUEUE");
msg_vstream_init(argv[0], VSTREAM_ERR);
var_line_limit = DEF_LINE_LIMIT;
var_header_limit = DEF_HEADER_LIMIT;
@ -1910,12 +2029,24 @@ int main(int unused_argc, char **argv)
} else {
cleanup_del_header(state, index, argv->argv[2]);
}
} else if (strcmp(argv->argv[0], "chg_from") == 0) {
if (argv->argc != 3) {
msg_warn("bad chg_from argument count: %d", argv->argc);
} else {
cleanup_chg_from(state, argv->argv[1], argv->argv[2]);
}
} else if (strcmp(argv->argv[0], "add_rcpt") == 0) {
if (argv->argc != 2) {
msg_warn("bad add_rcpt argument count: %d", argv->argc);
} else {
cleanup_add_rcpt(state, argv->argv[1]);
}
} else if (strcmp(argv->argv[0], "add_rcpt_par") == 0) {
if (argv->argc != 3) {
msg_warn("bad add_rcpt_par argument count: %d", argv->argc);
} else {
cleanup_add_rcpt_par(state, argv->argv[1], argv->argv[2]);
}
} else if (strcmp(argv->argv[0], "del_rcpt") == 0) {
if (argv->argc != 2) {
msg_warn("bad del_rcpt argument count: %d", argv->argc);

View File

@ -0,0 +1,22 @@
#verbose on
open test-queue-file13a.tmp
# Add a recipient to a message that was received with "sendmail -t"
# so that all the recipients are in the extracted queue file segment.
add_rcpt_par me@porcupine.org esmtpstuff
# Delete the recipient added above.
del_rcpt me@porcupine.org
# Add a new recipient, using a different address than above, so that
# the duplicate filter won't suppress it.
add_rcpt_par em@porcupine.org esmtpstuff
# Delete the recipient.
del_rcpt em@porcupine.org
close

View File

@ -0,0 +1,8 @@
#verbose on
open test-queue-file13b.tmp
# Change the sender.
chg_from m@porcupine.org esmtpstuff
close

View File

@ -0,0 +1,9 @@
#verbose on
open test-queue-file13c.tmp
# Change the sender.
chg_from m@porcupine.org esmtpstuff
chg_from n@porcupine.org esmtpstuff
close

View File

@ -0,0 +1,9 @@
#verbose on
open test-queue-file13d.tmp
# Change the null sender, to test correct padding of short sender records.
chg_from m@porcupine.org esmtpstuff
chg_from n@porcupine.org esmtpstuff
close

View File

@ -1,60 +1,66 @@
*** ENVELOPE RECORDS test-queue-file11.tmp ***
0 message_size: 358 480 1 0 358
81 message_arrival_time: Thu Jan 18 15:15:42 2007
100 create_time: Thu Jan 18 15:15:48 2007
0 message_size: 366 605 1 0 366
81 message_arrival_time: Mon Apr 27 20:41:30 2009
100 create_time: Mon Apr 27 20:41:41 2009
124 named_attribute: rewrite_context=local
147 sender:
149 named_attribute: log_client_name=localhost
176 named_attribute: log_client_address=127.0.0.1
206 named_attribute: log_message_origin=localhost[127.0.0.1]
247 named_attribute: log_protocol_name=SMTP
271 named_attribute: client_name=localhost
294 named_attribute: reverse_client_name=localhost
325 named_attribute: client_address=127.0.0.1
351 named_attribute: client_address_type=2
374 named_attribute: dsn_orig_rcpt=rfc822;wietse@localhost
413 original_recipient: wietse@localhost
431 recipient: wietse@localhost.example.com
461 pointer_record: 0
478 *** MESSAGE CONTENTS test-queue-file11.tmp ***
480 regular_text: Received: from localhost (localhost [127.0.0.1])
530 regular_text: by foo.example.com (Postfix) with SMTP id 2ADF9290403
586 regular_text: for <wietse@localhost>; Thu, 18 Jan 2007 15:15:42 -0500 (EST)
650 regular_text: Message-Id: <20070118201548.2ADF9290403@foo.example.com>
708 regular_text: Date: Thu, 18 Jan 2007 15:15:42 -0500 (EST)
753 regular_text: From: MAILER-DAEMON
774 regular_text: To: undisclosed-recipients:;
804 pointer_record: 821
821 pointer_record: 842
842 regular_text:
844 regular_text: Sed ut perspiciatis unde omnis iste natus error sit voluptatem
909 regular_text: accusantium doloremque laudantium, totam rem aperiam, eaque ipsa
976 regular_text: quae ab illo inventore veritatis et quasi architecto beatae vitae
1044 regular_text: dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit
1113 regular_text: aspernatur aut odit aut fugit, sed quia consequuntur magni dolores
1182 regular_text: eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam
1248 regular_text: est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci
1316 regular_text: velit, sed quia non numquam eius modi tempora incidunt ut labore
1383 regular_text: et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima
1448 regular_text: veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam,
1522 regular_text: nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure
1591 regular_text: reprehenderit qui in ea voluptate velit esse quam nihil molestiae
1659 regular_text: consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla
1726 regular_text: pariatur?
1738 regular_text:
1741 regular_text: At vero eos et accusamus et iusto odio dignissimos ducimus qui
1806 regular_text: blanditiis praesentium voluptatum deleniti atque corrupti quos
1871 regular_text: dolores et quas molestias excepturi sint occaecati cupiditate non
1939 regular_text: provident, similique sunt in culpa qui officia deserunt mollitia
2006 regular_text: animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis
2077 regular_text: est et expedita distinctio. Nam libero tempore, cum soluta nobis
2144 regular_text: est eligendi optio cumque nihil impedit quo minus id quod maxime
2211 regular_text: placeat facere possimus, omnis voluptas assumenda est, omnis dolor
2280 regular_text: repellendus. Temporibus autem quibusdam et aut officiis debitis aut
2350 regular_text: rerum necessitatibus saepe eveniet ut et voluptates repudiandae
2416 regular_text: sint et molestiae non recusandae. Itaque earum rerum hic tenetur a
2485 regular_text: sapiente delectus, ut aut reiciendis voluptatibus maiores alias
2551 regular_text: consequatur aut perferendis doloribus asperiores repellat.
2612 pointer_record: 838
838 *** HEADER EXTRACTED test-queue-file11.tmp ***
840 *** MESSAGE FILE END test-queue-file11.tmp ***
149 pointer_record: 0
164 named_attribute: log_client_name=localhost
191 named_attribute: log_client_address=127.0.0.1
221 named_attribute: log_client_port=51286
244 named_attribute: log_message_origin=localhost[127.0.0.1]
285 named_attribute: log_helo_name=localhost
310 named_attribute: log_protocol_name=SMTP
334 named_attribute: client_name=localhost
357 named_attribute: reverse_client_name=localhost
388 named_attribute: client_address=127.0.0.1
414 named_attribute: client_port=51286
433 named_attribute: helo_name=localhost
454 named_attribute: protocol_name=SMTP
474 named_attribute: client_address_type=2
497 named_attribute: dsn_orig_rcpt=rfc822;wietse@localhost
536 original_recipient: wietse@localhost
554 recipient: wietse@localhost.porcupine.org
586 pointer_record: 0
603 *** MESSAGE CONTENTS test-queue-file11.tmp ***
605 regular_text: Received: from localhost (localhost [127.0.0.1])
655 regular_text: by hades.porcupine.org (Postfix) with SMTP id 382B12B3292
715 regular_text: for <wietse@localhost>; Mon, 27 Apr 2009 20:41:30 -0400 (EDT)
779 regular_text: Message-Id: <20090428004141.382B12B3292@hades.porcupine.org>
841 regular_text: Date: Mon, 27 Apr 2009 20:41:30 -0400 (EDT)
886 regular_text: From: MAILER-DAEMON
907 regular_text: To: undisclosed-recipients:;
937 pointer_record: 954
954 pointer_record: 975
975 regular_text:
977 regular_text: Sed ut perspiciatis unde omnis iste natus error sit voluptatem
1042 regular_text: accusantium doloremque laudantium, totam rem aperiam, eaque ipsa
1109 regular_text: quae ab illo inventore veritatis et quasi architecto beatae vitae
1177 regular_text: dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit
1246 regular_text: aspernatur aut odit aut fugit, sed quia consequuntur magni dolores
1315 regular_text: eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam
1381 regular_text: est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci
1449 regular_text: velit, sed quia non numquam eius modi tempora incidunt ut labore
1516 regular_text: et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima
1581 regular_text: veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam,
1655 regular_text: nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure
1724 regular_text: reprehenderit qui in ea voluptate velit esse quam nihil molestiae
1792 regular_text: consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla
1859 regular_text: pariatur?
1871 regular_text:
1874 regular_text: At vero eos et accusamus et iusto odio dignissimos ducimus qui
1939 regular_text: blanditiis praesentium voluptatum deleniti atque corrupti quos
2004 regular_text: dolores et quas molestias excepturi sint occaecati cupiditate non
2072 regular_text: provident, similique sunt in culpa qui officia deserunt mollitia
2139 regular_text: animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis
2210 regular_text: est et expedita distinctio. Nam libero tempore, cum soluta nobis
2277 regular_text: est eligendi optio cumque nihil impedit quo minus id quod maxime
2344 regular_text: placeat facere possimus, omnis voluptas assumenda est, omnis dolor
2413 regular_text: repellendus. Temporibus autem quibusdam et aut officiis debitis aut
2483 regular_text: rerum necessitatibus saepe eveniet ut et voluptates repudiandae
2549 regular_text: sint et molestiae non recusandae. Itaque earum rerum hic tenetur a
2618 regular_text: sapiente delectus, ut aut reiciendis voluptatibus maiores alias
2684 regular_text: consequatur aut perferendis doloribus asperiores repellat.
2745 pointer_record: 971
971 *** HEADER EXTRACTED test-queue-file11.tmp ***
973 *** MESSAGE FILE END test-queue-file11.tmp ***

View File

@ -0,0 +1,33 @@
*** ENVELOPE RECORDS test-queue-file13a.tmp ***
0 message_size: 332 182 1 0 332
81 message_arrival_time: Sun Jan 21 13:32:59 2007
100 create_time: Sun Jan 21 13:33:08 2007
124 named_attribute: rewrite_context=local
147 sender_fullname: Wietse Venema
162 sender: me@porcupine.org
180 *** MESSAGE CONTENTS test-queue-file13a.tmp ***
182 regular_text: Received: by hades.porcupine.org (Postfix, from userid 1001)
244 regular_text: id DE040290405; Sun, 21 Jan 2007 13:33:08 -0500 (EST)
300 regular_text: From: me@porcupine.org
324 regular_text: To: you@porcupine.org
347 regular_text: Message-Id: <20060725192735.5EC2D29013F@hades.porcupine.org>
409 regular_text: Date: Tue, 25 Jul 2006 15:27:19 -0400 (EDT)
454 regular_text: Subject: hey!
469 padding: 0
472 pointer_record: 0
489 regular_text:
491 regular_text: text
497 pointer_record: 0
514 *** HEADER EXTRACTED test-queue-file13a.tmp ***
516 original_recipient: you@porcupine.org
535 recipient: you@porcupine.org
554 pointer_record: 573
573 named_attribute: notify_flags=1
589 original_recipient: me@porcupine.org
607 canceled_recipient: me@porcupine.org
625 pointer_record: 642
642 named_attribute: notify_flags=1
658 original_recipient: em@porcupine.org
676 canceled_recipient: em@porcupine.org
694 pointer_record: 571
571 *** MESSAGE FILE END test-queue-file13a.tmp ***

View File

@ -0,0 +1,27 @@
*** ENVELOPE RECORDS test-queue-file13b.tmp ***
0 message_size: 332 182 1 0 332
81 message_arrival_time: Sun Jan 21 13:32:59 2007
100 create_time: Sun Jan 21 13:33:08 2007
124 named_attribute: rewrite_context=local
147 sender_fullname: Wietse Venema
162 pointer_record: 573
573 sender: m@porcupine.org
590 pointer_record: 180
180 *** MESSAGE CONTENTS test-queue-file13b.tmp ***
182 regular_text: Received: by hades.porcupine.org (Postfix, from userid 1001)
244 regular_text: id DE040290405; Sun, 21 Jan 2007 13:33:08 -0500 (EST)
300 regular_text: From: me@porcupine.org
324 regular_text: To: you@porcupine.org
347 regular_text: Message-Id: <20060725192735.5EC2D29013F@hades.porcupine.org>
409 regular_text: Date: Tue, 25 Jul 2006 15:27:19 -0400 (EDT)
454 regular_text: Subject: hey!
469 padding: 0
472 pointer_record: 0
489 regular_text:
491 regular_text: text
497 pointer_record: 0
514 *** HEADER EXTRACTED test-queue-file13b.tmp ***
516 original_recipient: you@porcupine.org
535 recipient: you@porcupine.org
554 pointer_record: 0
571 *** MESSAGE FILE END test-queue-file13b.tmp ***

View File

@ -0,0 +1,27 @@
*** ENVELOPE RECORDS test-queue-file13c.tmp ***
0 message_size: 332 182 1 0 332
81 message_arrival_time: Sun Jan 21 13:32:59 2007
100 create_time: Sun Jan 21 13:33:08 2007
124 named_attribute: rewrite_context=local
147 sender_fullname: Wietse Venema
162 pointer_record: 607
607 sender: n@porcupine.org
624 pointer_record: 180
180 *** MESSAGE CONTENTS test-queue-file13c.tmp ***
182 regular_text: Received: by hades.porcupine.org (Postfix, from userid 1001)
244 regular_text: id DE040290405; Sun, 21 Jan 2007 13:33:08 -0500 (EST)
300 regular_text: From: me@porcupine.org
324 regular_text: To: you@porcupine.org
347 regular_text: Message-Id: <20060725192735.5EC2D29013F@hades.porcupine.org>
409 regular_text: Date: Tue, 25 Jul 2006 15:27:19 -0400 (EDT)
454 regular_text: Subject: hey!
469 padding: 0
472 pointer_record: 0
489 regular_text:
491 regular_text: text
497 pointer_record: 0
514 *** HEADER EXTRACTED test-queue-file13c.tmp ***
516 original_recipient: you@porcupine.org
535 recipient: you@porcupine.org
554 pointer_record: 0
571 *** MESSAGE FILE END test-queue-file13c.tmp ***

View File

@ -0,0 +1,37 @@
*** ENVELOPE RECORDS test-queue-file13d.tmp ***
0 message_size: 366 605 1 0 366
81 message_arrival_time: Mon Apr 27 20:41:30 2009
100 create_time: Mon Apr 27 20:41:41 2009
124 named_attribute: rewrite_context=local
147 pointer_record: 1009
1009 sender: n@porcupine.org
1026 pointer_record: 164
164 named_attribute: log_client_name=localhost
191 named_attribute: log_client_address=127.0.0.1
221 named_attribute: log_client_port=51286
244 named_attribute: log_message_origin=localhost[127.0.0.1]
285 named_attribute: log_helo_name=localhost
310 named_attribute: log_protocol_name=SMTP
334 named_attribute: client_name=localhost
357 named_attribute: reverse_client_name=localhost
388 named_attribute: client_address=127.0.0.1
414 named_attribute: client_port=51286
433 named_attribute: helo_name=localhost
454 named_attribute: protocol_name=SMTP
474 named_attribute: client_address_type=2
497 named_attribute: dsn_orig_rcpt=rfc822;wietse@localhost
536 original_recipient: wietse@localhost
554 recipient: wietse@localhost.porcupine.org
586 pointer_record: 0
603 *** MESSAGE CONTENTS test-queue-file13d.tmp ***
605 regular_text: Received: from localhost (localhost [127.0.0.1])
655 regular_text: by hades.porcupine.org (Postfix) with SMTP id 382B12B3292
715 regular_text: for <wietse@localhost>; Mon, 27 Apr 2009 20:41:30 -0400 (EDT)
779 regular_text: Message-Id: <20090428004141.382B12B3292@hades.porcupine.org>
841 regular_text: Date: Mon, 27 Apr 2009 20:41:30 -0400 (EDT)
886 regular_text: From: MAILER-DAEMON
907 regular_text: To: undisclosed-recipients:;
937 pointer_record: 0
954 pointer_record: 0
971 *** HEADER EXTRACTED test-queue-file13d.tmp ***
973 *** MESSAGE FILE END test-queue-file13d.tmp ***

View File

@ -91,6 +91,8 @@ CLEANUP_STATE *cleanup_state_alloc(VSTREAM *src)
state->body_offset = -1;
state->xtra_offset = -1;
state->cont_length = 0;
state->sender_pt_offset = -1;
state->sender_pt_target = -1;
state->append_rcpt_pt_offset = -1;
state->append_rcpt_pt_target = -1;
state->append_hdr_pt_offset = -1;

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -14,12 +14,12 @@
/* the internal_mail_filter_classes configuration parameter.
/*
/* Specify one of the following:
/* .IP INT_FILT_NONE
/* .IP INT_FILT_MASK_NONE
/* Mail that must be excluded from inspection (address probes, etc.).
/* .IP INT_FILT_NOTIFY
/* .IP INT_FILT_MASK_NOTIFY
/* Postmaster notifications from the smtpd(8) and smtp(8)
/* protocol adapters.
/* .IP INT_FILT_BOUNCE
/* .IP INT_FILT_MASK_BOUNCE
/* Delivery status notifications from the bounce(8) server.
/* DIAGNOSTICS
/* Fatal: invalid mail category name.
@ -54,8 +54,8 @@
int int_filt_flags(int class)
{
static const NAME_MASK table[] = {
"notify", INT_FILT_NOTIFY,
"bounce", INT_FILT_BOUNCE,
INT_FILT_CLASS_NOTIFY, INT_FILT_MASK_NOTIFY,
INT_FILT_CLASS_BOUNCE, INT_FILT_MASK_BOUNCE,
0,
};
int filtered_classes = 0;

View File

@ -14,9 +14,9 @@
/*
* External interface.
*/
#define INT_FILT_NONE (0)
#define INT_FILT_NOTIFY (1<<1)
#define INT_FILT_BOUNCE (1<<2)
#define INT_FILT_MASK_NONE (0)
#define INT_FILT_MASK_NOTIFY (1<<1)
#define INT_FILT_MASK_BOUNCE (1<<2)
extern int int_filt_flags(int);

View File

@ -2967,7 +2967,7 @@ extern int var_milt_cmd_time;
extern int var_milt_msg_time;
#define VAR_MILT_PROTOCOL "milter_protocol"
#define DEF_MILT_PROTOCOL "2"
#define DEF_MILT_PROTOCOL "6"
extern char *var_milt_protocol;
#define VAR_MILT_DEF_ACTION "milter_default_action"
@ -2986,8 +2986,12 @@ extern char *var_milt_v;
* What internal mail do we inspect/stamp/etc.? This is not yet safe enough
* to enable world-wide.
*/
#define INT_FILT_CLASS_NONE ""
#define INT_FILT_CLASS_NOTIFY "notify"
#define INT_FILT_CLASS_BOUNCE "bounce"
#define VAR_INT_FILT_CLASSES "internal_mail_filter_classes"
#define DEF_INT_FILT_CLASSES ""
#define DEF_INT_FILT_CLASSES INT_FILT_CLASS_NONE
extern char *var_int_filt_classes;
/*

View File

@ -20,7 +20,7 @@
* Patches change both the patchlevel and the release date. Snapshots have no
* patchlevel; they change the release date only.
*/
#define MAIL_RELEASE_DATE "20090427"
#define MAIL_RELEASE_DATE "20090428"
#define MAIL_VERSION_NUMBER "2.7"
#ifdef SNAPSHOT

View File

@ -300,10 +300,6 @@
/* ~\fIname\fR/.\fBforward\fR+\fIfoo\fR or in ~\fIname\fR/.\fBforward\fR,
/* to the mailbox owned by the user \fIname\fR, or it is sent back as
/* undeliverable.
/*
/* In all cases the \fBlocal\fR(8) daemon prepends an optional
/* `\fBDelivered-To:\fR header line with the final recipient
/* address.
/* DELIVERY RIGHTS
/* .ad
/* .fi

View File

@ -35,14 +35,17 @@
/* void *mac_context;
/*
/* void milter_edit_callback(milters, add_header, upd_header,
/* ins_header, del_header, add_rcpt,
/* del_rcpt, repl_body, context)
/* ins_header, del_header, chg_from,
/* add_rcpt, add_rcpt_par, del_rcpt,
/* repl_body, context)
/* MILTERS *milters;
/* MILTER_ADD_HEADER_FN add_header;
/* MILTER_EDIT_HEADER_FN upd_header;
/* MILTER_EDIT_HEADER_FN ins_header;
/* MILTER_DEL_HEADER_FN del_header;
/* MILTER_EDIT_FROM_FN chg_from;
/* MILTER_EDIT_RCPT_FN add_rcpt;
/* MILTER_EDIT_RCPT_PAR_FN add_rcpt_par;
/* MILTER_EDIT_RCPT_FN del_rcpt;
/* MILTER_EDIT_BODY_FN repl_body;
/* void *context;
@ -108,7 +111,7 @@
/*
/* The functions that inspect content or envelope commands
/* return either an SMTP reply ([45]XX followed by enhanced
/* status code and text), "D" (discard), "H" (quarantine),
/* status code and text), "D" (discard), "H" (quarantine),
/* "S" (shutdown connection), or a null pointer, which means
/* "no news is good news".
/*
@ -294,7 +297,9 @@ void milter_edit_callback(MILTERS *milters,
MILTER_EDIT_HEADER_FN upd_header,
MILTER_EDIT_HEADER_FN ins_header,
MILTER_DEL_HEADER_FN del_header,
MILTER_EDIT_FROM_FN chg_from,
MILTER_EDIT_RCPT_FN add_rcpt,
MILTER_EDIT_RCPT_PAR_FN add_rcpt_par,
MILTER_EDIT_RCPT_FN del_rcpt,
MILTER_EDIT_BODY_FN repl_body,
void *chg_context)
@ -303,7 +308,9 @@ void milter_edit_callback(MILTERS *milters,
milters->upd_header = upd_header;
milters->ins_header = ins_header;
milters->del_header = del_header;
milters->chg_from = chg_from;
milters->add_rcpt = add_rcpt;
milters->add_rcpt_par = add_rcpt_par;
milters->del_rcpt = del_rcpt;
milters->repl_body = repl_body;
milters->chg_context = chg_context;

View File

@ -91,7 +91,9 @@ typedef const char *(*MILTER_MAC_LOOKUP_FN) (const char *, void *);
typedef const char *(*MILTER_ADD_HEADER_FN) (void *, const char *, const char *, const char *);
typedef const char *(*MILTER_EDIT_HEADER_FN) (void *, ssize_t, const char *, const char *, const char *);
typedef const char *(*MILTER_DEL_HEADER_FN) (void *, ssize_t, const char *);
typedef const char *(*MILTER_EDIT_FROM_FN) (void *, const char *, const char *);
typedef const char *(*MILTER_EDIT_RCPT_FN) (void *, const char *);
typedef const char *(*MILTER_EDIT_RCPT_PAR_FN) (void *, const char *, const char *);
typedef const char *(*MILTER_EDIT_BODY_FN) (void *, int, VSTRING *);
typedef struct MILTERS {
@ -104,7 +106,9 @@ typedef struct MILTERS {
MILTER_EDIT_HEADER_FN upd_header;
MILTER_DEL_HEADER_FN del_header;
MILTER_EDIT_HEADER_FN ins_header;
MILTER_EDIT_FROM_FN chg_from;
MILTER_EDIT_RCPT_FN add_rcpt;
MILTER_EDIT_RCPT_PAR_FN add_rcpt_par;
MILTER_EDIT_RCPT_FN del_rcpt;
MILTER_EDIT_BODY_FN repl_body;
} MILTERS;
@ -123,7 +127,8 @@ extern MILTERS *milter_new(const char *, int, int, int, const char *,
extern void milter_macro_callback(MILTERS *, MILTER_MAC_LOOKUP_FN, void *);
extern void milter_edit_callback(MILTERS *milters, MILTER_ADD_HEADER_FN,
MILTER_EDIT_HEADER_FN, MILTER_EDIT_HEADER_FN,
MILTER_DEL_HEADER_FN, MILTER_EDIT_RCPT_FN,
MILTER_DEL_HEADER_FN, MILTER_EDIT_FROM_FN,
MILTER_EDIT_RCPT_FN, MILTER_EDIT_RCPT_PAR_FN,
MILTER_EDIT_RCPT_FN, MILTER_EDIT_BODY_FN,
void *);
extern const char *milter_conn_event(MILTERS *, const char *, const char *, const char *, unsigned);

View File

@ -1412,6 +1412,30 @@ static const char *milter8_event(MILTER8 *milter, int event,
STR(milter->body));
continue;
/*
* Modification request: replace sender, with optional
* ESMTP args.
*/
case SMFIR_CHGFROM:
if (milter8_read_data(milter, &data_size,
MILTER8_DATA_STRING, milter->buf,
MILTER8_DATA_MORE) != 0)
MILTER8_EVENT_BREAK(milter->def_reply);
if (data_size > 0) {
if (milter8_read_data(milter, &data_size,
MILTER8_DATA_STRING, milter->body,
MILTER8_DATA_END) != 0)
MILTER8_EVENT_BREAK(milter->def_reply);
} else
STR(milter->body)[0] = 0;
/* Skip to the next request after previous edit error. */
if (edit_resp)
continue;
edit_resp = parent->chg_from(parent->chg_context,
STR(milter->buf),
STR(milter->body));
continue;
/*
* Modification request: append recipient.
*/
@ -1427,6 +1451,30 @@ static const char *milter8_event(MILTER8 *milter, int event,
STR(milter->buf));
continue;
/*
* Modification request: append recipient, with optional
* ESMTP args.
*/
case SMFIR_ADDRCPT_PAR:
if (milter8_read_data(milter, &data_size,
MILTER8_DATA_STRING, milter->buf,
MILTER8_DATA_MORE) != 0)
MILTER8_EVENT_BREAK(milter->def_reply);
if (data_size > 0) {
if (milter8_read_data(milter, &data_size,
MILTER8_DATA_STRING, milter->body,
MILTER8_DATA_END) != 0)
MILTER8_EVENT_BREAK(milter->def_reply);
} else
STR(milter->body)[0] = 0;
/* Skip to the next request after previous edit error. */
if (edit_resp)
continue;
edit_resp = parent->add_rcpt_par(parent->chg_context,
STR(milter->buf),
STR(milter->body));
continue;
/*
* Modification request: delete (expansion of) recipient.
*/
@ -1542,10 +1590,8 @@ static void milter8_connect(MILTER8 *milter)
| SMFIF_DELRCPT | SMFIF_CHGHDRS
| SMFIF_CHGBODY
| SMFIF_QUARANTINE
#if 0
| SMFIF_CHGFROM
| SMFIF_ADDRCPT_PAR
#endif
| SMFIF_SETSYMLIST
);
UINT32_TYPE my_version = 0;

View File

@ -27,10 +27,12 @@
/* .IP "\fB-c connect|helo|mail|rcpt|data|header|eoh|body|eom|unknown|close|abort\fR"
/* When to send the non-default reply specified with \fB-a\fR.
/* The default protocol stage is \fBconnect\fR.
/* .IP "\fB-d\fI level\fR"
/* Enable libmilter debugging at the specified level.
/* .IP "\fB-C\fI count\fR"
/* Terminate after \fIcount\fR connections.
/* .IP "\fB-d\fI level\fR"
/* Enable libmilter debugging at the specified level.
/* .IP "\fB-f \fIsender\fR
/* Replace the sender by the specified address.
/* .IP "\fB-h \fI'index header-label header-value'\fR"
/* Replace the message header at the specified position.
/* .IP "\fB-i \fI'index header-label header-value'\fR"
@ -132,6 +134,11 @@ static char *reply_code;
static char *reply_dsn;
static char *reply_message;
#ifdef SMFIR_CHGFROM
static char *chg_from;
#endif
#ifdef SMFIR_INSHEADER
static char *ins_hdr;
static int ins_idx;
@ -194,7 +201,7 @@ static int test_reply(SMFICTX *ctx, int code)
for (cpp = macro_names; *cpp; cpp++)
if ((symval = smfi_getsymval(ctx, (char *) *cpp)) != 0)
printf("macro: %s=\"%s\"\n", *cpp, symval);
(void) fflush(stdout); /* In case output redirected. */
(void) fflush(stdout); /* In case output redirected. */
if (code == SMFIR_REPLYCODE) {
if (smfi_setmlreply(ctx, reply_code, reply_dsn, reply_message, reply_message, (char *) 0) == MI_FAILURE)
@ -332,6 +339,12 @@ static sfsistat test_eom(SMFICTX *ctx)
}
}
#endif
#ifdef SMFIR_CHGFROM
if (chg_from != 0 && smfi_chgfrom(ctx, chg_from, "whatever") == MI_FAILURE)
fprintf(stderr, "smfi_chgfrom failed\n");
else
printf("smfi_chgfrom OK\n");
#endif
#ifdef SMFIR_INSHEADER
if (ins_hdr && smfi_insheader(ctx, ins_idx, ins_hdr, ins_val) == MI_FAILURE)
fprintf(stderr, "smfi_insheader failed\n");
@ -395,7 +408,7 @@ static struct smfiDesc smfilter =
{
"test-milter",
SMFI_VERSION,
SMFIF_ADDRCPT | SMFIF_DELRCPT | SMFIF_ADDHDRS | SMFIF_CHGHDRS | SMFIF_CHGBODY,
SMFIF_ADDRCPT | SMFIF_DELRCPT | SMFIF_ADDHDRS | SMFIF_CHGHDRS | SMFIF_CHGBODY | SMFIF_CHGFROM,
test_connect,
test_helo,
test_mail,
@ -517,7 +530,7 @@ int main(int argc, char **argv)
char *noreply = 0;
const struct noproto_map *np;
while ((ch = getopt(argc, argv, "a:A:b:c:C:d:h:i:lm:M:n:N:p:rv")) > 0) {
while ((ch = getopt(argc, argv, "a:A:b:c:C:d:f:h:i:lm:M:n:N:p:rv")) > 0) {
switch (ch) {
case 'a':
action = optarg;
@ -549,6 +562,18 @@ int main(int argc, char **argv)
exit(1);
}
break;
case 'f':
#ifdef SMFIR_CHGFROM
if (chg_from) {
fprintf(stderr, "too many -f options\n");
exit(1);
}
chg_from = optarg;
#else
fprintf(stderr, "no libmilter support to change sender\n");
exit(1);
#endif
break;
case 'h':
#ifdef SMFIR_CHGHEADER
if (chg_hdr) {
@ -662,7 +687,7 @@ int main(int argc, char **argv)
"\t[-n events] don't receive these events\n"
"\t[-N events] don't reply to these events\n"
"\t-p port milter application\n"
"\t-r request rejected recipients\n"
"\t-r request rejected recipients\n"
"\t[-C conn_count] when to exit\n",
argv[0]);
exit(1);

View File

@ -407,7 +407,7 @@ void smtp_chat_notify(SMTP_SESSION *session)
notice = post_mail_fopen_nowait(mail_addr_double_bounce(),
var_error_rcpt,
INT_FILT_NOTIFY,
INT_FILT_MASK_NOTIFY,
NULL_TRACE_FLAGS, NO_QUEUE_ID);
if (notice == 0) {
msg_warn("postmaster notify: %m");

View File

@ -1753,12 +1753,15 @@ static int smtp_loop(SMTP_STATE *state, NOCLOBBER int send_state,
* XXX Don't downgrade just because generic_maps is turned
* on.
*/
if (downgrading || smtp_generic_maps || smtp_header_checks
|| smtp_body_checks)
#define SMTP_ANY_CHECKS (smtp_header_checks || smtp_body_checks)
if (downgrading || smtp_generic_maps || SMTP_ANY_CHECKS)
session->mime_state = mime_state_alloc(downgrading ?
MIME_OPT_DOWNGRADE
| MIME_OPT_REPORT_NESTING :
MIME_OPT_DISABLE_MIME,
SMTP_ANY_CHECKS == 0 ?
MIME_OPT_DISABLE_MIME :
0,
smtp_generic_maps
|| smtp_header_checks ?
smtp_header_rewrite :

View File

@ -176,9 +176,10 @@
/* .IP "\fBsmtpd_milters (empty)\fR"
/* A list of Milter (mail filter) applications for new mail that
/* arrives via the Postfix \fBsmtpd\fR(8) server.
/* .IP "\fBmilter_protocol (2)\fR"
/* .IP "\fBmilter_protocol (6)\fR"
/* The mail filter protocol version and optional protocol extensions
/* for communication with a Milter (mail filter) application.
/* for communication with a Milter application; prior to Postfix 2.6
/* the default protocol is 2.
/* .IP "\fBmilter_default_action (tempfail)\fR"
/* The default action when a Milter (mail filter) application is
/* unavailable or mis-configured.

View File

@ -246,7 +246,7 @@ void smtpd_chat_notify(SMTPD_STATE *state)
notice = post_mail_fopen_nowait(mail_addr_double_bounce(),
var_error_rcpt,
INT_FILT_NOTIFY,
INT_FILT_MASK_NOTIFY,
NULL_TRACE_FLAGS, NO_QUEUE_ID);
if (notice == 0) {
msg_warn("postmaster notify: %m");

View File

@ -471,7 +471,7 @@ static void verify_query_service(VSTREAM *client_stream)
STR(addr), addr_status, now, updated);
post_mail_fopen_async(strcmp(var_verify_sender, "<>") == 0 ?
"" : var_verify_sender, STR(addr),
INT_FILT_NONE,
INT_FILT_MASK_NONE,
DEL_REQ_FLAG_MTA_VRFY,
(VSTRING *) 0,
verify_post_mail_action,