diff --git a/postfix/HISTORY b/postfix/HISTORY index 34a838444..0e687f07a 100644 --- a/postfix/HISTORY +++ b/postfix/HISTORY @@ -11690,22 +11690,17 @@ Apologies for any names omitted. (example: sockaddr_to_hostaddr: Unknown error: success). File: util/myaddrinfo.c. -20051228 +20051229 - Workaround: don't pipeline the DOT+QUIT commands in the - SMTP client. The 20050929 paranoia about malformed server - replies eliminated a rare occurrence of "lost mail" with - sites that mis-implement DOT+QUIT pipelining. However, we - now have a larger occurrence of repeated deliveries to sites - with different implementation errors. - - The default "smtp_pipeline_dot_quit = never" setting - eliminates the repeated deliveries at the cost of a small - performance loss with normal deliveries. Other settings - are "always" (always pipeline the DOT+QUIT commands, when - pipelining is enabled) and "newmail" (pipeline DOT+QUIT - only when mail is newer than $minimal_backoff_time). - Files: smtp/smtp_proto.c, smtp/smtp.c. + Workaround: when mail is still queued after 3000 seconds, + the SMTP client no longer pipelines the DOT+QUIT commands. + The 20050929 paranoia about malformed server replies + eliminated a rare occurrence of "lost mail" with sites that + mis-implement DOT+QUIT pipelining, but resulted in a larger + occurrence of repeated deliveries to sites with a different + DOT+QUIT pipelining bug. The time threshold is set with the + smtp_dot_quit_workaround_threshold_time parameter. Files: + smtp/smtp_proto.c, smtp/smtp.c. Open problems: diff --git a/postfix/RELEASE_NOTES b/postfix/RELEASE_NOTES index fd785d210..9dec3fe0d 100644 --- a/postfix/RELEASE_NOTES +++ b/postfix/RELEASE_NOTES @@ -20,16 +20,16 @@ before proceeding. Incompatibility with snapshot 20051228 ====================================== -New parameter "smtp_pipeline_dot_quit" (default: "never") to work -around broken servers and firewalls. After one documented case of -lost mail, as of 20050929 Postfix is more paranoid about malformed -SMTP server replies. Unfortuately this results in repeated delivery -attempts with other broken systems. To avoid this, the SMTP+LMTP -client no longer pipelines the DOT+QUIT commands by default. Instead -of "never" you can specify "always" (self-evident) or "newmail" -(pipeline DOT+QUIT only when mail is newer than $minimal_backoff_time, -so that the number of duplicate deliveries is limited). More details -are in the postconf(5) manual. +New workaround to limit the number of repeated deliveries with +servers or firewalls that mis-implement DOT+QUIT command pipelining. +After one documented case of lost mail, as of 20050929 Postfix is +more paranoid about malformed SMTP server replies. Unfortuately +this results in repeated deliveries with other broken systems. To +limit the number of repeated deliveries, the SMTP client no longer +pipelines the DOT+QUIT commands when mail is queued longer than the +time specified with the smtp_dot_quit_workaround_threshold_time +parameter (default: 3000s). More details are in the postconf(5) +manual. Major changes with snapshot 20051222 ==================================== diff --git a/postfix/html/postconf.5.html b/postfix/html/postconf.5.html index cabc84d9c..fb8c14ab4 100644 --- a/postfix/html/postconf.5.html +++ b/postfix/html/postconf.5.html @@ -3253,6 +3253,15 @@ discard LHLO keywords selectively.
+ + +The LMTP-specific version of the smtp_dot_quit_workaround_threshold_time +configuration parameter. See there for details.
+ +This feature is available in Postfix 2.3 and later.
- - -The LMTP-specific version of the smtp_pipeline_dot_quit -configuration parameter. See there for details.
- -How long a message must be queued before the "." + QUIT bug +workaround is turned on for all deliveries; this limits the +number of repeated deliveries with servers or firewalls that +mis-implement END-OF-DATA + QUIT pipelining.
+ +When the workaround is turned on, the Postfix SMTP client will +not send the QUIT command until it has received the server's +END-OF-DATA reply. This workaround incurs a small performance loss +with delivery to sites that correctly implement SMTP command +pipelining.
+ +By default, the workaround is turned off for mail that is queued +for less than 3000 seconds. In other words, the workaround is +normally turned off for the first few delivery attempts of personal +mail and of small mailing lists.
+ +Specify 0 to enable this workaround upon the first delivery +attempt, and specify a large value such as $maximal_queue_lifetime +to disable the workaround for practically all delivery attempts. +
+ +Note: when the smtp_fallback_relay feature is used, there will +be no second delivery attempt, and the workaround may have no effect. +
+ +This feature is available in Postfix 2.3 and later.
+ +When ESMTP command pipelining is enabled, whether or not the -SMTP client will send the QUIT command before it has received the -server's END-OF-DATA reply.
- -Specify one of the following:
- -Note: when smtp_fallback_relay is used, the "always" and "newmail" -settings become identical in practice.
- -This feature is available in Postfix 2.3 and later.
- -How long a message must be queued before the PIX firewall "<CR><LF>.<CR><LF>" bug workaround is turned -on. +on for delivery through firewalls with "smtp fixup" mode turned on.
diff --git a/postfix/html/smtp.8.html b/postfix/html/smtp.8.html
index 21c01c46f..4ed672cfb 100644
--- a/postfix/html/smtp.8.html
+++ b/postfix/html/smtp.8.html
@@ -166,25 +166,27 @@ SMTP(8) SMTP(8)
Defer mail delivery when no MX record resolves to
an IP address.
+ smtp_dot_quit_workaround_threshold_time (3000s)
+ How long a message must be queued before the "." +
+ QUIT bug workaround is turned on for all deliver-
+ ies; this limits the number of repeated deliveries
+ with servers or firewalls that mis-implement END-
+ OF-DATA + QUIT pipelining.
+
smtp_line_length_limit (990)
The maximal length of message header and body lines
that Postfix will send via SMTP.
- smtp_pipeline_dot_quit (never)
- When ESMTP command pipelining is enabled, whether
- or not the SMTP client will send the QUIT command
- before it has received the server's END-OF-DATA
- reply.
-
smtp_pix_workaround_delay_time (10s)
- How long the Postfix SMTP client pauses before
+ How long the Postfix SMTP client pauses before
sending ".<CR><LF>" in order to work around the PIX
firewall "<CR><LF>.<CR><LF>" bug.
smtp_pix_workaround_threshold_time (500s)
- How long a message must be queued before the PIX
- firewall "<CR><LF>.<CR><LF>" bug workaround is
- turned on.
+ How long a message must be queued before the PIX
+ firewall "<CR><LF>.<CR><LF>" bug workaround is
+ turned on for delivery through firewalls with "smtp
+ fixup" mode turned on.
smtp_quote_rfc821_envelope (yes)
Quote addresses in SMTP MAIL FROM and RCPT TO com-
diff --git a/postfix/man/man5/postconf.5 b/postfix/man/man5/postconf.5
index da6589148..9bfc3e523 100644
--- a/postfix/man/man5/postconf.5
+++ b/postfix/man/man5/postconf.5
@@ -1746,6 +1746,9 @@ this action from being logged.
.IP \(bu
Use the lmtp_discard_lhlo_keyword_address_maps feature to
discard LHLO keywords selectively.
+.SH lmtp_dot_quit_workaround_threshold_time (default: 3000s)
+The LMTP-specific version of the smtp_dot_quit_workaround_threshold_time
+configuration parameter. See there for details.
.SH lmtp_enforce_tls (default: no)
The LMTP-specific version of the smtp_enforce_tls configuration
parameter. See there for details.
@@ -1808,9 +1811,6 @@ The LMTP-specific version of the smtp_mx_session_limit configuration
parameter. See there for details.
.PP
This feature is available in Postfix 2.3 and later.
-.SH lmtp_pipeline_dot_quit (default: never)
-The LMTP-specific version of the smtp_pipeline_dot_quit
-configuration parameter. See there for details.
.SH lmtp_pix_workaround_delay_time (default: 10s)
The LMTP-specific version of the smtp_pix_workaround_delay_time
configuration parameter. See there for details.
@@ -3723,6 +3723,31 @@ this action from being logged.
.IP \(bu
Use the smtp_discard_ehlo_keyword_address_maps feature to
discard EHLO keywords selectively.
+.SH smtp_dot_quit_workaround_threshold_time (default: 3000s)
+How long a message must be queued before the "." + QUIT bug
+workaround is turned on for all deliveries; this limits the
+number of repeated deliveries with servers or firewalls that
+mis-implement END-OF-DATA + QUIT pipelining.
+.PP
+When the workaround is turned on, the Postfix SMTP client will
+not send the QUIT command until it has received the server's
+END-OF-DATA reply. This workaround incurs a small performance loss
+with delivery to sites that correctly implement SMTP command
+pipelining.
+.PP
+By default, the workaround is turned off for mail that is queued
+for less than 3000 seconds. In other words, the workaround is
+normally turned off for the first few delivery attempts of personal
+mail and of small mailing lists.
+.PP
+Specify 0 to enable this workaround upon the first delivery
+attempt, and specify a large value such as $maximal_queue_lifetime
+to disable the workaround for practically all delivery attempts.
+.PP
+Note: when the smtp_fallback_relay feature is used, there will
+be no second delivery attempt, and the workaround may have no effect.
+.PP
+This feature is available in Postfix 2.3 and later.
.SH smtp_enforce_tls (default: no)
Enforcement mode: require that remote SMTP servers use TLS
encryption, and never send mail in the clear. This also requires
@@ -3841,35 +3866,6 @@ This feature is available in Postfix 2.1 and later.
.SH smtp_never_send_ehlo (default: no)
Never send EHLO at the start of an SMTP session. See also the
smtp_always_send_ehlo parameter.
-.SH smtp_pipeline_dot_quit (default: never)
-When ESMTP command pipelining is enabled, whether or not the
-SMTP client will send the QUIT command before it has received the
-server's END-OF-DATA reply.
-.PP
-Specify one of the following:
-.IP "\fBalways\fR"
-Always pipeline the END-OF-DATA and
-QUIT commands. With servers or firewalls that mis-implement
-END-OF-DATA + QUIT pipelining, mail will be delivered repeatedly
-until it expires in the queue.
-.IP "\fBnever\fR"
-Wait for the server's END-OF-DATA reply
-before sending the QUIT command. This avoids repeated delivery
-attempts with servers and firewalls that mis-implement END-OF-DATA
-+ QUIT pipelining, at the cost of a small performance loss with
-sites that correctly implement SMTP.
-.IP "\fBnewmail\fR"
-Pipeline the END-OF-DATA and QUIT
-commands only when mail is newer than $minimal_backoff_time. This
-limits the number of repeated deliveries with servers and firewalls
-that mis-implement END-OF-DATA + QUIT pipelining, while avoiding
-the performance loss associated with the "never" setting for normal
-deliveries.
-.PP
-Note: when smtp_fallback_relay is used, the "always" and "newmail"
-settings become identical in practice.
-.PP
-This feature is available in Postfix 2.3 and later.
.SH smtp_pix_workaround_delay_time (default: 10s)
How long the Postfix SMTP client pauses before sending
".
How long a message must be queued before the PIX firewall "<CR><LF>.<CR><LF>" bug workaround is turned -on. +on for delivery through firewalls with "smtp fixup" mode turned on.
@@ -9126,42 +9126,36 @@ rejecting the address as invalid.
This feature is available in Postfix 2.3 and later. -%PARAM smtp_pipeline_dot_quit never +%PARAM smtp_dot_quit_workaround_threshold_time 3000s -
When ESMTP command pipelining is enabled, whether or not the -SMTP client will send the QUIT command before it has received the -server's END-OF-DATA reply.
+How long a message must be queued before the "." + QUIT bug +workaround is turned on for all deliveries; this limits the +number of repeated deliveries with servers or firewalls that +mis-implement END-OF-DATA + QUIT pipelining.
-Specify one of the following:
+When the workaround is turned on, the Postfix SMTP client will +not send the QUIT command until it has received the server's +END-OF-DATA reply. This workaround incurs a small performance loss +with delivery to sites that correctly implement SMTP command +pipelining.
-By default, the workaround is turned off for mail that is queued +for less than 3000 seconds. In other words, the workaround is +normally turned off for the first few delivery attempts of personal +mail and of small mailing lists.
-Specify 0 to enable this workaround upon the first delivery +attempt, and specify a large value such as $maximal_queue_lifetime +to disable the workaround for practically all delivery attempts. +
-Note: when smtp_fallback_relay is used, the "always" and "newmail" -settings become identical in practice.
+Note: when the smtp_fallback_relay feature is used, there will +be no second delivery attempt, and the workaround may have no effect. +
This feature is available in Postfix 2.3 and later.
-%PARAM lmtp_pipeline_dot_quit never +%PARAM lmtp_dot_quit_workaround_threshold_time 3000s -The LMTP-specific version of the smtp_pipeline_dot_quit +
The LMTP-specific version of the smtp_dot_quit_workaround_threshold_time configuration parameter. See there for details.
diff --git a/postfix/src/global/mail_params.h b/postfix/src/global/mail_params.h index 51c6668cf..acfa48531 100644 --- a/postfix/src/global/mail_params.h +++ b/postfix/src/global/mail_params.h @@ -1006,15 +1006,11 @@ extern int var_smtp_pix_thresh; #define DEF_LMTP_PIX_DELAY "10s" extern int var_smtp_pix_delay; -#define SMTP_PIPE_DOT_QUIT_NEVER "never" -#define SMTP_PIPE_DOT_QUIT_NEWMAIL "newmail" -#define SMTP_PIPE_DOT_QUIT_ALWAYS "always" - -#define VAR_SMTP_PIPE_DOT_QUIT "smtp_pipeline_dot_quit" -#define DEF_SMTP_PIPE_DOT_QUIT SMTP_PIPE_DOT_QUIT_NEVER -#define VAR_LMTP_PIPE_DOT_QUIT "lmtp_pipeline_dot_quit" -#define DEF_LMTP_PIPE_DOT_QUIT SMTP_PIPE_DOT_QUIT_NEVER -extern char *var_smtp_pipe_dot_quit; +#define VAR_SMTP_DOTQ_THRESH "smtp_dot_quit_workaround_threshold" +#define DEF_SMTP_DOTQ_THRESH "3000s" +#define VAR_LMTP_DOTQ_THRESH "lmtp_dot_quit_workaround_threshold" +#define DEF_LMTP_DOTQ_THRESH "3000s" +extern int var_smtp_dotq_thresh; #define VAR_SMTP_DEFER_MXADDR "smtp_defer_if_no_mx_address_found" #define DEF_SMTP_DEFER_MXADDR 0 diff --git a/postfix/src/global/mail_version.h b/postfix/src/global/mail_version.h index 1210c95e4..3bd0e8953 100644 --- a/postfix/src/global/mail_version.h +++ b/postfix/src/global/mail_version.h @@ -20,7 +20,7 @@ * Patches change both the patchlevel and the release date. Snapshots have no * patchlevel; they change the release date only. */ -#define MAIL_RELEASE_DATE "20051228" +#define MAIL_RELEASE_DATE "20051229" #define MAIL_VERSION_NUMBER "2.3" #ifdef SNAPSHOT diff --git a/postfix/src/smtp/lmtp_params.c b/postfix/src/smtp/lmtp_params.c index a29e9e552..b8d3d4736 100644 --- a/postfix/src/smtp/lmtp_params.c +++ b/postfix/src/smtp/lmtp_params.c @@ -22,7 +22,6 @@ VAR_PROP_EXTENSION, DEF_PROP_EXTENSION, &var_prop_extension, 0, 0, VAR_LMTP_GENERIC_MAPS, DEF_LMTP_GENERIC_MAPS, &var_smtp_generic_maps, 0, 0, VAR_LMTP_TCP_PORT, DEF_LMTP_TCP_PORT, &var_lmtp_tcp_port, 0, 0, - VAR_LMTP_PIPE_DOT_QUIT, DEF_LMTP_PIPE_DOT_QUIT, &var_smtp_pipe_dot_quit, 1, 0, 0, }; static CONFIG_TIME_TABLE lmtp_time_table[] = { @@ -45,6 +44,9 @@ #endif VAR_SCACHE_PROTO_TMOUT, DEF_SCACHE_PROTO_TMOUT, &var_scache_proto_tmout, 1, 0, VAR_MIN_BACKOFF_TIME, DEF_MIN_BACKOFF_TIME, &var_min_backoff_time, 1, 0, + VAR_MAX_BACKOFF_TIME, DEF_MAX_BACKOFF_TIME, &var_max_backoff_time, 1, 0, + VAR_MAX_QUEUE_TIME, DEF_MAX_QUEUE_TIME, &var_max_queue_time, 0, 0, + VAR_LMTP_DOTQ_THRESH, DEF_LMTP_DOTQ_THRESH, &var_smtp_dotq_thresh, 0, 0, 0, }; static CONFIG_INT_TABLE lmtp_int_table[] = { diff --git a/postfix/src/smtp/smtp.c b/postfix/src/smtp/smtp.c index 2196e4db1..00b3cae5c 100644 --- a/postfix/src/smtp/smtp.c +++ b/postfix/src/smtp/smtp.c @@ -140,13 +140,14 @@ /* Never send EHLO at the start of an SMTP session. /* .IP "\fBsmtp_defer_if_no_mx_address_found (no)\fR" /* Defer mail delivery when no MX record resolves to an IP address. +/* .IP "\fBsmtp_dot_quit_workaround_threshold_time (3000s)\fR" +/* How long a message must be queued before the "." + QUIT bug +/* workaround is turned on for all deliveries; this limits the +/* number of repeated deliveries with servers or firewalls that +/* mis-implement END-OF-DATA + QUIT pipelining. /* .IP "\fBsmtp_line_length_limit (990)\fR" /* The maximal length of message header and body lines that Postfix /* will send via SMTP. -/* .IP "\fBsmtp_pipeline_dot_quit (never)\fR" -/* When ESMTP command pipelining is enabled, whether or not the -/* SMTP client will send the QUIT command before it has received the -/* server's END-OF-DATA reply. /* .IP "\fBsmtp_pix_workaround_delay_time (10s)\fR" /* How long the Postfix SMTP client pauses before sending /* ".