]> git.ipfire.org Git - thirdparty/postfix.git/commitdiff
postfix-2.3-20051228
authorWietse Venema <wietse@porcupine.org>
Wed, 28 Dec 2005 05:00:00 +0000 (00:00 -0500)
committerViktor Dukhovni <viktor@dukhovni.org>
Tue, 5 Feb 2013 06:32:00 +0000 (06:32 +0000)
16 files changed:
postfix/HISTORY
postfix/RELEASE_NOTES
postfix/html/postconf.5.html
postfix/html/smtp.8.html
postfix/man/man5/postconf.5
postfix/man/man8/smtp.8
postfix/mantools/postlink
postfix/proto/postconf.proto
postfix/src/global/mail_params.h
postfix/src/global/mail_version.h
postfix/src/smtp/lmtp_params.c
postfix/src/smtp/smtp.c
postfix/src/smtp/smtp.h
postfix/src/smtp/smtp_chat.c
postfix/src/smtp/smtp_params.c
postfix/src/smtp/smtp_proto.c

index 2d7c3564d496cff3dbeafda49ab26faff2ffc857..34a838444d7de5e7f4dcf27b3be6ae559327dde3 100644 (file)
@@ -11690,6 +11690,23 @@ Apologies for any names omitted.
        (example: sockaddr_to_hostaddr: Unknown error: success).
        File: util/myaddrinfo.c.
 
+20051228
+
+       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.
+
 Open problems:
 
        "postsuper -r" no longer resets the message arrival time,
index 0554a708913c70ceeee45fd37bafc49007d7c9a9..fd785d210b0b40edf0a61406aaae430199924225 100644 (file)
@@ -17,6 +17,20 @@ Incompatibility with Postfix 2.1 and earlier
 If you upgrade from Postfix 2.1 or earlier, read RELEASE_NOTES-2.2
 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.
+
 Major changes with snapshot 20051222
 ====================================
 
index a0d06322ef4c79f6cec89adae0305d4ca2b77d7f..cabc84d9c336f056cb41977ae54df42faed16665 100644 (file)
@@ -3224,7 +3224,7 @@ case insensitive lists of LHLO keywords (pipelining, starttls,
 auth, etc.) that the LMTP client will ignore in the LHLO response
 from a remote LMTP server. See <a href="postconf.5.html#lmtp_discard_lhlo_keywords">lmtp_discard_lhlo_keywords</a> for
 details. The table is not indexed by hostname for consistency with
-smtpd_discard_ehlo_keyword_address_map </p>
+<a href="postconf.5.html#smtpd_discard_ehlo_keyword_address_maps">smtpd_discard_ehlo_keyword_address_maps</a>. </p>
 
 <p> This feature is available in Postfix 2.3 and later. </p>
 
@@ -3377,6 +3377,15 @@ parameter.  See there for details. </p>
 <p> This feature is available in Postfix 2.3 and later. </p>
 
 
+</DD>
+
+<DT><b><a name="lmtp_pipeline_dot_quit">lmtp_pipeline_dot_quit</a>
+(default: never)</b></DT><DD>
+
+<p> The LMTP-specific version of the <a href="postconf.5.html#smtp_pipeline_dot_quit">smtp_pipeline_dot_quit</a>
+configuration parameter.  See there for details. </p>
+
+
 </DD>
 
 <DT><b><a name="lmtp_pix_workaround_delay_time">lmtp_pix_workaround_delay_time</a>
@@ -6892,6 +6901,45 @@ complete the EHLO and TLS handshake (Postfix version 2.3 and later).  </p>
 <a href="postconf.5.html#smtp_always_send_ehlo">smtp_always_send_ehlo</a> parameter.  </p>
 
 
+</DD>
+
+<DT><b><a name="smtp_pipeline_dot_quit">smtp_pipeline_dot_quit</a>
+(default: never)</b></DT><DD>
+
+<p> 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. </p>
+
+<p> Specify one of the following: </p>
+
+<dl>
+
+<dt> <b>always</b> </dt> <dd> 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.  </dd>
+
+<dt> <b>never</b> </dt> <dd> 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. </dd>
+
+<dt> <b>newmail</b> </dt> <dd> Pipeline the END-OF-DATA and QUIT
+commands only when mail is newer than $<a href="postconf.5.html#minimal_backoff_time">minimal_backoff_time</a>.  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.  </dd>
+
+</dl>
+
+<p> Note: when <a href="postconf.5.html#smtp_fallback_relay">smtp_fallback_relay</a> is used, the "always" and "newmail"
+settings become identical in practice. </p>
+
+<p> This feature is available in Postfix 2.3 and later. </p>
+
+
 </DD>
 
 <DT><b><a name="smtp_pix_workaround_delay_time">smtp_pix_workaround_delay_time</a>
index 41d9075d9e186cf047b7afa98cde9d7182a357a8..21c01c46f16463d364381d80a4cbcbfa081990ff 100644 (file)
@@ -170,18 +170,24 @@ SMTP(8)                                                                SMTP(8)
               The maximal length of message header and body lines
               that Postfix will send via SMTP.
 
+       <b><a href="postconf.5.html#smtp_pipeline_dot_quit">smtp_pipeline_dot_quit</a> (never)</b>
+              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.
+
        <b><a href="postconf.5.html#smtp_pix_workaround_delay_time">smtp_pix_workaround_delay_time</a> (10s)</b>
-              How  long  the  Postfix  SMTP  client pauses before
+              How long the  Postfix  SMTP  client  pauses  before
               sending ".&lt;CR&gt;&lt;LF&gt;" in order to work around the PIX
               firewall "&lt;CR&gt;&lt;LF&gt;.&lt;CR&gt;&lt;LF&gt;" bug.
 
        <b><a href="postconf.5.html#smtp_pix_workaround_threshold_time">smtp_pix_workaround_threshold_time</a> (500s)</b>
-              How  long  a  message must be queued before the PIX
-              firewall  "&lt;CR&gt;&lt;LF&gt;.&lt;CR&gt;&lt;LF&gt;"  bug  workaround   is
+              How long a message must be queued  before  the  PIX
+              firewall   "&lt;CR&gt;&lt;LF&gt;.&lt;CR&gt;&lt;LF&gt;"  bug  workaround  is
               turned on.
 
        <b><a href="postconf.5.html#smtp_quote_rfc821_envelope">smtp_quote_rfc821_envelope</a> (yes)</b>
-              Quote  addresses in SMTP MAIL FROM and RCPT TO com-
+              Quote addresses in SMTP MAIL FROM and RCPT TO  com-
               mands as required by <a href="http://www.faqs.org/rfcs/rfc821.html">RFC 821</a>.
 
        <b><a href="postconf.5.html#smtp_skip_5xx_greeting">smtp_skip_5xx_greeting</a> (yes)</b>
@@ -189,7 +195,7 @@ SMTP(8)                                                                SMTP(8)
               (go away, do not try again later).
 
        <b><a href="postconf.5.html#smtp_skip_quit_response">smtp_skip_quit_response</a> (yes)</b>
-              Do  not wait for the response to the SMTP QUIT com-
+              Do not wait for the response to the SMTP QUIT  com-
               mand.
 
        Available in Postfix version 2.0 and earlier:
@@ -201,36 +207,36 @@ SMTP(8)                                                                SMTP(8)
        Available in Postfix version 2.2 and later:
 
        <b><a href="postconf.5.html#smtp_discard_ehlo_keyword_address_maps">smtp_discard_ehlo_keyword_address_maps</a> (empty)</b>
-              Lookup  tables,  indexed  by the remote SMTP server
-              address, with case insensitive lists of  EHLO  key-
-              words  (pipelining,  starttls, auth, etc.) that the
+              Lookup tables, indexed by the  remote  SMTP  server
+              address,  with  case insensitive lists of EHLO key-
+              words (pipelining, starttls, auth, etc.)  that  the
               SMTP client will ignore in the EHLO response from a
               remote SMTP server.
 
        <b><a href="postconf.5.html#smtp_discard_ehlo_keywords">smtp_discard_ehlo_keywords</a> (empty)</b>
-              A  case insensitive list of EHLO keywords (pipelin-
-              ing, starttls, auth, etc.)  that  the  SMTP  client
+              A case insensitive list of EHLO keywords  (pipelin-
+              ing,  starttls,  auth,  etc.)  that the SMTP client
               will ignore in the EHLO response from a remote SMTP
               server.
 
        <b><a href="postconf.5.html#smtp_generic_maps">smtp_generic_maps</a> (empty)</b>
               Optional lookup tables that perform address rewrit-
-              ing  in  the  SMTP client, typically to transform a
+              ing in the SMTP client, typically  to  transform  a
               locally valid address into a globally valid address
               when sending mail across the Internet.
 
        Available in Postfix version 2.3 and later:
 
        <b><a href="postconf.5.html#lmtp_discard_lhlo_keyword_address_maps">lmtp_discard_lhlo_keyword_address_maps</a> (empty)</b>
-              Lookup  tables,  indexed  by the remote LMTP server
-              address, with case insensitive lists of  LHLO  key-
-              words  (pipelining,  starttls, auth, etc.) that the
+              Lookup tables, indexed by the  remote  LMTP  server
+              address,  with  case insensitive lists of LHLO key-
+              words (pipelining, starttls, auth, etc.)  that  the
               LMTP client will ignore in the LHLO response from a
               remote LMTP server.
 
        <b><a href="postconf.5.html#lmtp_discard_lhlo_keywords">lmtp_discard_lhlo_keywords</a> ($<a href="postconf.5.html#myhostname">myhostname</a>)</b>
-              A  case insensitive list of LHLO keywords (pipelin-
-              ing, starttls, auth, etc.)  that  the  LMTP  client
+              A case insensitive list of LHLO keywords  (pipelin-
+              ing,  starttls,  auth,  etc.)  that the LMTP client
               will ignore in the LHLO response from a remote LMTP
               server.
 
@@ -238,7 +244,7 @@ SMTP(8)                                                                SMTP(8)
        Available in Postfix version 2.0 and later:
 
        <b><a href="postconf.5.html#disable_mime_output_conversion">disable_mime_output_conversion</a> (no)</b>
-              Disable the conversion of 8BITMIME format  to  7BIT
+              Disable  the  conversion of 8BITMIME format to 7BIT
               format.
 
        <b><a href="postconf.5.html#mime_boundary_length_limit">mime_boundary_length_limit</a> (2048)</b>
@@ -253,132 +259,132 @@ SMTP(8)                                                                SMTP(8)
        Available in Postfix version 2.1 and later:
 
        <b><a href="postconf.5.html#smtp_send_xforward_command">smtp_send_xforward_command</a> (no)</b>
-              Send  the  non-standard  XFORWARD  command when the
-              Postfix SMTP server EHLO response  announces  XFOR-
+              Send the non-standard  XFORWARD  command  when  the
+              Postfix  SMTP  server EHLO response announces XFOR-
               WARD support.
 
 <b>SASL AUTHENTICATION CONTROLS</b>
        <b><a href="postconf.5.html#smtp_sasl_auth_enable">smtp_sasl_auth_enable</a> (no)</b>
-              Enable  SASL  authentication  in  the  Postfix SMTP
+              Enable SASL  authentication  in  the  Postfix  SMTP
               client.
 
        <b><a href="postconf.5.html#smtp_sasl_password_maps">smtp_sasl_password_maps</a> (empty)</b>
-              Optional SMTP client lookup tables with  one  user-
-              name:password  entry per remote hostname or domain,
+              Optional  SMTP  client lookup tables with one user-
+              name:password entry per remote hostname or  domain,
               or sender address when sender-dependent authentica-
               tion is enabled.
 
        <b><a href="postconf.5.html#smtp_sasl_security_options">smtp_sasl_security_options</a> (noplaintext, noanonymous)</b>
-              SASL  security  options; as of Postfix 2.3 the list
-              of available features depends on  the  SASL  client
-              implementation     that     is     selected    with
+              SASL security options; as of Postfix 2.3  the  list
+              of  available  features  depends on the SASL client
+              implementation    that     is     selected     with
               <b><a href="postconf.5.html#smtp_sasl_type">smtp_sasl_type</a></b>.
 
        Available in Postfix version 2.2 and later:
 
        <b><a href="postconf.5.html#smtp_sasl_mechanism_filter">smtp_sasl_mechanism_filter</a> (empty)</b>
-              If non-empty, a Postfix SMTP client filter for  the
-              remote  SMTP  server's  list of offered SASL mecha-
+              If  non-empty, a Postfix SMTP client filter for the
+              remote SMTP server's list of  offered  SASL  mecha-
               nisms.
 
        Available in Postfix version 2.3 and later:
 
        <b><a href="postconf.5.html#smtp_sender_dependent_authentication">smtp_sender_dependent_authentication</a> (no)</b>
-              Enable sender-dependent authentication in the  SMTP
-              client;  this is available only with SASL authenti-
-              cation, and disables  SMTP  connection  caching  to
-              ensure  that  mail  from different senders will use
+              Enable  sender-dependent authentication in the SMTP
+              client; this is available only with SASL  authenti-
+              cation,  and  disables  SMTP  connection caching to
+              ensure that mail from different  senders  will  use
               the appropriate credentials.
 
        <b><a href="postconf.5.html#smtp_sasl_path">smtp_sasl_path</a> (empty)</b>
-              Implementation-specific information that is  passed
-              through  to the SASL plug-in implementation that is
+              Implementation-specific  information that is passed
+              through to the SASL plug-in implementation that  is
               selected with <b><a href="postconf.5.html#smtp_sasl_type">smtp_sasl_type</a></b>.
 
        <b><a href="postconf.5.html#smtp_sasl_type">smtp_sasl_type</a> (cyrus)</b>
-              The SASL plug-in type that the Postfix SMTP  client
+              The  SASL plug-in type that the Postfix SMTP client
               should use for authentication.
 
 <b>STARTTLS SUPPORT CONTROLS</b>
-       Detailed  information  about STARTTLS configuration may be
+       Detailed information about STARTTLS configuration  may  be
        found in the <a href="TLS_README.html">TLS_README</a> document.
 
        <b><a href="postconf.5.html#smtp_use_tls">smtp_use_tls</a> (no)</b>
-              Opportunistic mode: use  TLS  when  a  remote  SMTP
-              server  announces  STARTTLS support, otherwise send
+              Opportunistic  mode:  use  TLS  when  a remote SMTP
+              server announces STARTTLS support,  otherwise  send
               the mail in the clear.
 
        <b><a href="postconf.5.html#smtp_enforce_tls">smtp_enforce_tls</a> (no)</b>
-              Enforcement mode: require that remote SMTP  servers
-              use  TLS  encryption,  and  never  send mail in the
+              Enforcement  mode: require that remote SMTP servers
+              use TLS encryption, and  never  send  mail  in  the
               clear.
 
        <b><a href="postconf.5.html#smtp_sasl_tls_security_options">smtp_sasl_tls_security_options</a>           ($<a href="postconf.5.html#smtp_sasl_security_options">smtp_sasl_secu</a>-</b>
        <b><a href="postconf.5.html#smtp_sasl_security_options">rity_options</a>)</b>
-              The SASL authentication security options  that  the
-              Postfix  SMTP  client  uses  for TLS encrypted SMTP
+              The  SASL  authentication security options that the
+              Postfix SMTP client uses  for  TLS  encrypted  SMTP
               sessions.
 
        <b><a href="postconf.5.html#smtp_starttls_timeout">smtp_starttls_timeout</a> (300s)</b>
-              Time limit for Postfix SMTP client write  and  read
-              operations  during  TLS  startup and shutdown hand-
+              Time  limit  for Postfix SMTP client write and read
+              operations during TLS startup  and  shutdown  hand-
               shake procedures.
 
        <b><a href="postconf.5.html#smtp_tls_CAfile">smtp_tls_CAfile</a> (empty)</b>
-              The file with the certificate of the  certification
-              authority  (CA) that issued the Postfix SMTP client
+              The  file with the certificate of the certification
+              authority (CA) that issued the Postfix SMTP  client
               certificate.
 
        <b><a href="postconf.5.html#smtp_tls_CApath">smtp_tls_CApath</a> (empty)</b>
-              Directory with  PEM  format  certificate  authority
-              certificates  that  the Postfix SMTP client uses to
+              Directory  with  PEM  format  certificate authority
+              certificates that the Postfix SMTP client  uses  to
               verify a remote SMTP server certificate.
 
        <b><a href="postconf.5.html#smtp_tls_cert_file">smtp_tls_cert_file</a> (empty)</b>
-              File with the Postfix SMTP client  RSA  certificate
+              File  with  the Postfix SMTP client RSA certificate
               in PEM format.
 
        <b><a href="postconf.5.html#smtp_tls_cipherlist">smtp_tls_cipherlist</a> (empty)</b>
-              Controls  the Postfix SMTP client TLS cipher selec-
+              Controls the Postfix SMTP client TLS cipher  selec-
               tion scheme.
 
        <b><a href="postconf.5.html#smtp_tls_dcert_file">smtp_tls_dcert_file</a> (empty)</b>
-              File with the Postfix SMTP client  DSA  certificate
+              File  with  the Postfix SMTP client DSA certificate
               in PEM format.
 
        <b><a href="postconf.5.html#smtp_tls_dkey_file">smtp_tls_dkey_file</a> ($<a href="postconf.5.html#smtp_tls_dcert_file">smtp_tls_dcert_file</a>)</b>
-              File  with  the Postfix SMTP client DSA private key
+              File with the Postfix SMTP client DSA  private  key
               in PEM format.
 
        <b><a href="postconf.5.html#smtp_tls_enforce_peername">smtp_tls_enforce_peername</a> (yes)</b>
-              When TLS encryption is enforced, require  that  the
+              When  TLS  encryption is enforced, require that the
               remote SMTP server hostname matches the information
               in the remote SMTP server certificate.
 
        <b><a href="postconf.5.html#smtp_tls_key_file">smtp_tls_key_file</a> ($<a href="postconf.5.html#smtp_tls_cert_file">smtp_tls_cert_file</a>)</b>
-              File with the Postfix SMTP client RSA  private  key
+              File  with  the Postfix SMTP client RSA private key
               in PEM format.
 
        <b><a href="postconf.5.html#smtp_tls_loglevel">smtp_tls_loglevel</a> (0)</b>
-              Enable  additional  Postfix  SMTP client logging of
+              Enable additional Postfix SMTP  client  logging  of
               TLS activity.
 
        <b><a href="postconf.5.html#smtp_tls_note_starttls_offer">smtp_tls_note_starttls_offer</a> (no)</b>
-              Log the hostname  of  a  remote  SMTP  server  that
-              offers  STARTTLS,  when  TLS is not already enabled
+              Log  the  hostname  of  a  remote  SMTP server that
+              offers STARTTLS, when TLS is  not  already  enabled
               for that server.
 
        <b><a href="postconf.5.html#smtp_tls_per_site">smtp_tls_per_site</a> (empty)</b>
               Optional lookup tables with the Postfix SMTP client
-              TLS  usage  policy  by  next-hop domain name and by
+              TLS usage policy by next-hop  domain  name  and  by
               remote SMTP server hostname.
 
        <b><a href="postconf.5.html#smtp_tls_scert_verifydepth">smtp_tls_scert_verifydepth</a> (5)</b>
-              The verification depth for remote SMTP server  cer-
+              The  verification depth for remote SMTP server cer-
               tificates.
 
        <b><a href="postconf.5.html#smtp_tls_session_cache_database">smtp_tls_session_cache_database</a> (empty)</b>
-              Name  of  the  file containing the optional Postfix
+              Name of the file containing  the  optional  Postfix
               SMTP client TLS session cache.
 
        <b><a href="postconf.5.html#smtp_tls_session_cache_timeout">smtp_tls_session_cache_timeout</a> (3600s)</b>
@@ -386,35 +392,35 @@ SMTP(8)                                                                SMTP(8)
               sion cache information.
 
        <b><a href="postconf.5.html#tls_daemon_random_bytes">tls_daemon_random_bytes</a> (32)</b>
-              The  number  of pseudo-random bytes that an <a href="smtp.8.html"><b>smtp</b>(8)</a>
-              or <a href="smtpd.8.html"><b>smtpd</b>(8)</a> process  requests  from  the  <a href="tlsmgr.8.html"><b>tlsmgr</b>(8)</a>
-              server  in order to seed its internal pseudo random
+              The number of pseudo-random bytes that  an  <a href="smtp.8.html"><b>smtp</b>(8)</a>
+              or  <a href="smtpd.8.html"><b>smtpd</b>(8)</a>  process  requests  from the <a href="tlsmgr.8.html"><b>tlsmgr</b>(8)</a>
+              server in order to seed its internal pseudo  random
               number generator (PRNG).
 
 <b>RESOURCE AND RATE CONTROLS</b>
        <b><a href="postconf.5.html#smtp_destination_concurrency_limit">smtp_destination_concurrency_limit</a>      ($<a href="postconf.5.html#default_destination_concurrency_limit">default_destina</a>-</b>
        <b><a href="postconf.5.html#default_destination_concurrency_limit">tion_concurrency_limit</a>)</b>
-              The maximal number of parallel  deliveries  to  the
-              same  destination  via  the  smtp  message delivery
+              The  maximal  number  of parallel deliveries to the
+              same destination  via  the  smtp  message  delivery
               transport.
 
        <b><a href="postconf.5.html#smtp_destination_recipient_limit">smtp_destination_recipient_limit</a>        ($<a href="postconf.5.html#default_destination_recipient_limit">default_destina</a>-</b>
        <b><a href="postconf.5.html#default_destination_recipient_limit">tion_recipient_limit</a>)</b>
-              The maximal number of recipients per  delivery  via
+              The  maximal  number of recipients per delivery via
               the smtp message delivery transport.
 
        <b><a href="postconf.5.html#smtp_connect_timeout">smtp_connect_timeout</a> (30s)</b>
-              The  SMTP  client  time  limit for completing a TCP
+              The SMTP client time limit  for  completing  a  TCP
               connection,  or  zero  (use  the  operating  system
               built-in time limit).
 
        <b><a href="postconf.5.html#smtp_helo_timeout">smtp_helo_timeout</a> (300s)</b>
-              The  SMTP client time limit for sending the HELO or
-              EHLO command, and for receiving the initial  server
+              The SMTP client time limit for sending the HELO  or
+              EHLO  command, and for receiving the initial server
               response.
 
        <b><a href="postconf.5.html#lmtp_lhlo_timeout">lmtp_lhlo_timeout</a> (300s)</b>
-              The  LMTP  client  time  limit for sending the LHLO
+              The LMTP client time limit  for  sending  the  LHLO
               command,  and  for  receiving  the  initial  server
               response.
 
@@ -423,30 +429,30 @@ SMTP(8)                                                                SMTP(8)
               command, and for receiving the server response.
 
        <b><a href="postconf.5.html#smtp_mail_timeout">smtp_mail_timeout</a> (300s)</b>
-              The SMTP client time limit  for  sending  the  MAIL
-              FROM   command,   and   for  receiving  the  server
+              The  SMTP  client  time  limit for sending the MAIL
+              FROM  command,  and  for   receiving   the   server
               response.
 
        <b><a href="postconf.5.html#smtp_rcpt_timeout">smtp_rcpt_timeout</a> (300s)</b>
-              The SMTP client time limit  for  sending  the  SMTP
-              RCPT  TO  command,  and  for  receiving  the server
+              The  SMTP  client  time  limit for sending the SMTP
+              RCPT TO  command,  and  for  receiving  the  server
               response.
 
        <b><a href="postconf.5.html#smtp_data_init_timeout">smtp_data_init_timeout</a> (120s)</b>
-              The SMTP client time limit  for  sending  the  SMTP
-              DATA   command,   and   for  receiving  the  server
+              The  SMTP  client  time  limit for sending the SMTP
+              DATA  command,  and  for   receiving   the   server
               response.
 
        <b><a href="postconf.5.html#smtp_data_xfer_timeout">smtp_data_xfer_timeout</a> (180s)</b>
-              The SMTP client time limit  for  sending  the  SMTP
+              The  SMTP  client  time  limit for sending the SMTP
               message content.
 
        <b><a href="postconf.5.html#smtp_data_done_timeout">smtp_data_done_timeout</a> (600s)</b>
-              The  SMTP  client  time  limit for sending the SMTP
+              The SMTP client time limit  for  sending  the  SMTP
               ".", and for receiving the server response.
 
        <b><a href="postconf.5.html#smtp_quit_timeout">smtp_quit_timeout</a> (300s)</b>
-              The SMTP client time limit  for  sending  the  QUIT
+              The  SMTP  client  time  limit for sending the QUIT
               command, and for receiving the server response.
 
        Available in Postfix version 2.1 and later:
@@ -457,12 +463,12 @@ SMTP(8)                                                                SMTP(8)
               lookups, or zero (no limit).
 
        <b><a href="postconf.5.html#smtp_mx_session_limit">smtp_mx_session_limit</a> (2)</b>
-              The  maximal  number  of SMTP sessions per delivery
-              request before giving up or delivering to  a  fall-
+              The maximal number of SMTP  sessions  per  delivery
+              request  before  giving up or delivering to a fall-
               back <a href="postconf.5.html#relayhost">relay host</a>, or zero (no limit).
 
        <b><a href="postconf.5.html#smtp_rset_timeout">smtp_rset_timeout</a> (20s)</b>
-              The  SMTP  client  time  limit for sending the RSET
+              The SMTP client time limit  for  sending  the  RSET
               command, and for receiving the server response.
 
        Available in Postfix version 2.2 and earlier:
@@ -474,11 +480,11 @@ SMTP(8)                                                                SMTP(8)
        Available in Postfix version 2.2 and later:
 
        <b><a href="postconf.5.html#smtp_connection_cache_destinations">smtp_connection_cache_destinations</a> (empty)</b>
-              Permanently  enable SMTP connection caching for the
+              Permanently enable SMTP connection caching for  the
               specified destinations.
 
        <b><a href="postconf.5.html#smtp_connection_cache_on_demand">smtp_connection_cache_on_demand</a> (yes)</b>
-              Temporarily enable SMTP connection caching while  a
+              Temporarily  enable SMTP connection caching while a
               destination has a high volume of mail in the active
               queue.
 
@@ -488,57 +494,57 @@ SMTP(8)                                                                SMTP(8)
 
        <b><a href="postconf.5.html#smtp_connection_cache_time_limit">smtp_connection_cache_time_limit</a> (2s)</b>
               When SMTP connection caching is enabled, the amount
-              of time that an unused SMTP client socket  is  kept
+              of  time  that an unused SMTP client socket is kept
               open before it is closed.
 
        Available in Postfix version 2.3 and later:
 
        <b><a href="postconf.5.html#connection_cache_protocol_timeout">connection_cache_protocol_timeout</a> (5s)</b>
-              Time  limit  for  connection cache connect, send or
+              Time limit for connection cache  connect,  send  or
               receive operations.
 
 <b>TROUBLE SHOOTING CONTROLS</b>
        <b><a href="postconf.5.html#debug_peer_level">debug_peer_level</a> (2)</b>
-              The increment  in  verbose  logging  level  when  a
-              remote  client  or  server matches a pattern in the
+              The  increment  in  verbose  logging  level  when a
+              remote client or server matches a  pattern  in  the
               <a href="postconf.5.html#debug_peer_list">debug_peer_list</a> parameter.
 
        <b><a href="postconf.5.html#debug_peer_list">debug_peer_list</a> (empty)</b>
-              Optional list of remote client or  server  hostname
-              or  network address patterns that cause the verbose
-              logging level to increase by the  amount  specified
+              Optional  list  of remote client or server hostname
+              or network address patterns that cause the  verbose
+              logging  level  to increase by the amount specified
               in $<a href="postconf.5.html#debug_peer_level">debug_peer_level</a>.
 
        <b><a href="postconf.5.html#error_notice_recipient">error_notice_recipient</a> (postmaster)</b>
-              The  recipient  of  postmaster  notifications about
-              mail delivery problems that are caused  by  policy,
+              The recipient  of  postmaster  notifications  about
+              mail  delivery  problems that are caused by policy,
               resource, software or protocol errors.
 
        <b><a href="postconf.5.html#notify_classes">notify_classes</a> (resource, software)</b>
-              The  list of error classes that are reported to the
+              The list of error classes that are reported to  the
               postmaster.
 
 <b>MISCELLANEOUS CONTROLS</b>
        <b><a href="postconf.5.html#best_mx_transport">best_mx_transport</a> (empty)</b>
-              Where the Postfix SMTP client should  deliver  mail
+              Where  the  Postfix SMTP client should deliver mail
               when it detects a "mail loops back to myself" error
               condition.
 
        <b><a href="postconf.5.html#config_directory">config_directory</a> (see 'postconf -d' output)</b>
-              The default location of  the  Postfix  main.cf  and
+              The  default  location  of  the Postfix main.cf and
               master.cf 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#disable_dns_lookups">disable_dns_lookups</a> (no)</b>
-              Disable DNS lookups in the Postfix  SMTP  and  LMTP
+              Disable  DNS  lookups  in the Postfix SMTP and LMTP
               clients.
 
        <b><a href="postconf.5.html#inet_interfaces">inet_interfaces</a> (all)</b>
@@ -546,7 +552,7 @@ SMTP(8)                                                                SMTP(8)
               tem receives mail on.
 
        <b><a href="postconf.5.html#inet_protocols">inet_protocols</a> (ipv4)</b>
-              The Internet protocols Postfix will attempt to  use
+              The  Internet protocols Postfix will attempt to use
               when making or accepting connections.
 
        <b><a href="postconf.5.html#ipc_timeout">ipc_timeout</a> (3600s)</b>
@@ -554,74 +560,74 @@ SMTP(8)                                                                SMTP(8)
               over an internal communication channel.
 
        <b><a href="postconf.5.html#lmtp_tcp_port">lmtp_tcp_port</a> (24)</b>
-              The default TCP port that the Postfix  LMTP  client
+              The  default  TCP port that the Postfix LMTP client
               connects to.
 
        <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 the next  service  request
+              The maximum amount of time  that  an  idle  Postfix
+              daemon  process  waits for the next service request
               before exiting.
 
        <b><a href="postconf.5.html#max_use">max_use</a> (100)</b>
-              The  maximal number of connection requests before a
+              The maximal number of connection requests before  a
               Postfix daemon process terminates.
 
        <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#proxy_interfaces">proxy_interfaces</a> (empty)</b>
               The network interface addresses that this mail sys-
-              tem  receives  mail on by way of a proxy or network
+              tem receives mail on by way of a proxy  or  network
               address translation unit.
 
        <b><a href="postconf.5.html#smtp_bind_address">smtp_bind_address</a> (empty)</b>
               An optional numerical network address that the SMTP
-              client  should  bind to when making an IPv4 connec-
+              client should bind to when making an  IPv4  connec-
               tion.
 
        <b><a href="postconf.5.html#smtp_bind_address6">smtp_bind_address6</a> (empty)</b>
               An optional numerical network address that the SMTP
-              client  should  bind to when making an IPv6 connec-
+              client should bind to when making an  IPv6  connec-
               tion.
 
        <b><a href="postconf.5.html#smtp_helo_name">smtp_helo_name</a> ($<a href="postconf.5.html#myhostname">myhostname</a>)</b>
-              The hostname to send in the SMTP EHLO or HELO  com-
+              The  hostname to send in the SMTP EHLO or HELO com-
               mand.
 
        <b><a href="postconf.5.html#lmtp_lhloname">lmtp_lhlo_name</a> ($<a href="postconf.5.html#myhostname">myhostname</a>)</b>
               The hostname to send in the LMTP LHLO command.
 
        <b><a href="postconf.5.html#smtp_host_lookup">smtp_host_lookup</a> (dns)</b>
-              What  mechanisms  when the SMTP client uses to look
+              What mechanisms when the SMTP client uses  to  look
               up a host's IP address.
 
        <b><a href="postconf.5.html#smtp_randomize_addresses">smtp_randomize_addresses</a> (yes)</b>
-              Randomize the order  of  equal-preference  MX  host
+              Randomize  the  order  of  equal-preference MX host
               addresses.
 
        <b><a href="postconf.5.html#syslog_facility">syslog_facility</a> (mail)</b>
               The syslog facility of Postfix logging.
 
        <b><a href="postconf.5.html#syslog_name">syslog_name</a> (postfix)</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 with Postfix 2.2 and earlier:
 
        <b><a href="postconf.5.html#fallback_relay">fallback_relay</a> (empty)</b>
-              Optional  list of relay hosts for SMTP destinations
+              Optional list of relay hosts for SMTP  destinations
               that can't be found or that are unreachable.
 
        Available with Postfix 2.3 and later:
 
        <b><a href="postconf.5.html#smtp_fallback_relay">smtp_fallback_relay</a> ($<a href="postconf.5.html#fallback_relay">fallback_relay</a>)</b>
-              Optional list of relay hosts for SMTP  destinations
+              Optional  list of relay hosts for SMTP destinations
               that can't be found or that are unreachable.
 
 <b>SEE ALSO</b>
@@ -639,7 +645,7 @@ SMTP(8)                                                                SMTP(8)
        <a href="TLS_README.html">TLS_README</a>, Postfix STARTTLS howto
 
 <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>
index a8f8f4f9e1feca46046c7b8c9612d66d8e4ee9f5..da6589148e57cb1e789ca6d39a08f20fde53d9a3 100644 (file)
@@ -1729,7 +1729,7 @@ case insensitive lists of LHLO keywords (pipelining, starttls,
 auth, etc.) that the LMTP client will ignore in the LHLO response
 from a remote LMTP server. See lmtp_discard_lhlo_keywords for
 details. The table is not indexed by hostname for consistency with
-smtpd_discard_ehlo_keyword_address_map
+smtpd_discard_ehlo_keyword_address_maps.
 .PP
 This feature is available in Postfix 2.3 and later.
 .SH lmtp_discard_lhlo_keywords (default: $myhostname)
@@ -1808,6 +1808,9 @@ 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.
@@ -3838,6 +3841,35 @@ 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
 ".<CR><LF>" in order to work around the PIX firewall
index 3f42ff7d1247f6b7c742175001797ed4cf260608..f8bcaefebdca22318620e076f0d8a2dca390a4e5 100644 (file)
@@ -165,6 +165,10 @@ Defer mail delivery when no MX record resolves to an IP address.
 .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
 ".<CR><LF>" in order to work around the PIX firewall
@@ -190,9 +194,9 @@ again later).
 Available in Postfix version 2.2 and later:
 .IP "\fBsmtp_discard_ehlo_keyword_address_maps (empty)\fR"
 Lookup tables, indexed by the remote SMTP server address, with
-case insensitive lists of EHLO keywords (pipelining, starttls,
-auth, etc.) that the SMTP client will ignore in the EHLO response
-from a remote SMTP server.
+case insensitive lists of EHLO keywords (pipelining, starttls, auth,
+etc.) that the SMTP client will ignore in the EHLO response from a
+remote SMTP server.
 .IP "\fBsmtp_discard_ehlo_keywords (empty)\fR"
 A case insensitive list of EHLO keywords (pipelining, starttls,
 auth, etc.) that the SMTP client will ignore in the EHLO response
index 8301739627d804c7d3f89991363b38df31b235b6..7ec5cb6b427937945a78f4349b660ab55a716bd2 100755 (executable)
@@ -387,6 +387,7 @@ while (<>) {
     s;\bsmtp_mx_session_limit\b;<a href="postconf.5.html#smtp_mx_session_limit">$&</a>;g;
     s;\bsmtp_never_send_ehlo\b;<a href="postconf.5.html#smtp_never_send_ehlo">$&</a>;g;
     s;\bsmtp_sender_depen[-</bB>]*\n*[ <bB>]*dent_authentication\b;<a href="postconf.5.html#smtp_sender_dependent_authentication">$&</a>;g;
+    s;\bsmtp_pipeline_dot_quit\b;<a href="postconf.5.html#smtp_pipeline_dot_quit">$&</a>;g;
     s;\bsmtp_pix_workaround_delay_time\b;<a href="postconf.5.html#smtp_pix_workaround_delay_time">$&</a>;g;
     s;\bsmtp_pix_workaround_threshold_time\b;<a href="postconf.5.html#smtp_pix_workaround_threshold_time">$&</a>;g;
     s;\bsmtp_quit_timeout\b;<a href="postconf.5.html#smtp_quit_timeout">$&</a>;g;
index c8c51be02cfdd6d432a3cbce4881a9028eb8a760..d6ca70d2b7d4260dabc34a0dcc78ef03b73d58fb 100644 (file)
@@ -8837,7 +8837,7 @@ case insensitive lists of LHLO keywords (pipelining, starttls,
 auth, etc.) that the LMTP client will ignore in the LHLO response
 from a remote LMTP server. See lmtp_discard_lhlo_keywords for
 details. The table is not indexed by hostname for consistency with
-smtpd_discard_ehlo_keyword_address_map </p>
+smtpd_discard_ehlo_keyword_address_maps. </p>
 
 <p> This feature is available in Postfix 2.3 and later. </p>
 
@@ -9125,3 +9125,43 @@ is rejected by the <b>reject_plaintext_session</b> restriction.
 rejecting the address as invalid.  </p>
 
 <p> This feature is available in Postfix 2.3 and later.
+
+%PARAM smtp_pipeline_dot_quit never
+
+<p> 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. </p>
+
+<p> Specify one of the following: </p>
+
+<dl>
+
+<dt> <b>always</b> </dt> <dd> 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.  </dd>
+
+<dt> <b>never</b> </dt> <dd> 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. </dd>
+
+<dt> <b>newmail</b> </dt> <dd> 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.  </dd>
+
+</dl>
+
+<p> Note: when smtp_fallback_relay is used, the "always" and "newmail"
+settings become identical in practice. </p>
+
+<p> This feature is available in Postfix 2.3 and later. </p>
+
+%PARAM lmtp_pipeline_dot_quit never
+
+<p> The LMTP-specific version of the smtp_pipeline_dot_quit
+configuration parameter.  See there for details. </p>
index 685bf264763f432a2ddd5db03a1699be4c3654a8..51c6668cfd549e5c4d6fb60d736ca845565f6f51 100644 (file)
@@ -1006,6 +1006,16 @@ 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_DEFER_MXADDR  "smtp_defer_if_no_mx_address_found"
 #define DEF_SMTP_DEFER_MXADDR  0
 #define VAR_LMTP_DEFER_MXADDR  "lmtp_defer_if_no_mx_address_found"
index f0381afbec577820cf09171153dca4e7702a1988..1210c95e4b98e9bf5ddbebace6ec387c857bb3d9 100644 (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      "20051227"
+#define MAIL_RELEASE_DATE      "20051228"
 #define MAIL_VERSION_NUMBER    "2.3"
 
 #ifdef SNAPSHOT
index efb85e3e624594e2917c9c78b2a3e9a29f6cf7ee..a29e9e552879523a789be409ff8ae5f03317845d 100644 (file)
@@ -22,6 +22,7 @@
        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[] = {
@@ -43,6 +44,7 @@
        VAR_LMTP_STARTTLS_TMOUT, DEF_LMTP_STARTTLS_TMOUT, &var_smtp_starttls_tmout, 1, 0,
 #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,
        0,
     };
     static CONFIG_INT_TABLE lmtp_int_table[] = {
index a2b862daaa87788dc6a34395b88e9d198912c71e..2196e4db104e25cc3e7dfbb78ae13319ca47d7fa 100644 (file)
 /* .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
 /*     ".<CR><LF>" in order to work around the PIX firewall
 /*     Available in Postfix version 2.2 and later:
 /* .IP "\fBsmtp_discard_ehlo_keyword_address_maps (empty)\fR"
 /*     Lookup tables, indexed by the remote SMTP server address, with
-/*     case insensitive lists of EHLO keywords (pipelining, starttls,
-/*     auth, etc.) that the SMTP client will ignore in the EHLO response
-/*     from a remote SMTP server.
+/*     case insensitive lists of EHLO keywords (pipelining, starttls, auth,
+/*     etc.) that the SMTP client will ignore in the EHLO response from a
+/*     remote SMTP server.
 /* .IP "\fBsmtp_discard_ehlo_keywords (empty)\fR"
 /*     A case insensitive list of EHLO keywords (pipelining, starttls,
 /*     auth, etc.) that the SMTP client will ignore in the EHLO response
 #include <msg.h>
 #include <mymalloc.h>
 #include <name_mask.h>
+#include <name_code.h>
 
 /* Global library. */
 
@@ -617,6 +622,8 @@ char   *var_prop_extension;
 bool    var_smtp_sender_auth;
 char   *var_lmtp_tcp_port;
 int     var_scache_proto_tmout;
+char   *var_smtp_pipe_dot_quit;
+int     var_min_backoff_time;
 
  /*
   * Global variables. smtp_errno is set by the address lookup routines and by
@@ -629,6 +636,7 @@ SCACHE *smtp_scache;
 MAPS   *smtp_ehlo_dis_maps;
 MAPS   *smtp_generic_maps;
 int     smtp_ext_prop_mask;
+int     smtp_pipe_dot_quit;
 
 #ifdef USE_TLS
 
@@ -722,6 +730,12 @@ static void post_init(char *unused_name, char **unused_argv)
        SMTP_HOST_LOOKUP_NATIVE, SMTP_HOST_FLAG_NATIVE,
        0,
     };
+    static NAME_CODE pipe_dot_quit_codes[] = {
+       SMTP_PIPE_DOT_QUIT_NEVER, SMTP_PIPE_DOT_QUIT_CODE_NEVER,
+       SMTP_PIPE_DOT_QUIT_NEWMAIL, SMTP_PIPE_DOT_QUIT_CODE_NEWMAIL,
+       SMTP_PIPE_DOT_QUIT_ALWAYS, SMTP_PIPE_DOT_QUIT_CODE_ALWAYS,
+       0, SMTP_PIPE_DOT_QUIT_CODE_ERROR,
+    };
 
     /*
      * Select hostname lookup mechanisms.
@@ -748,6 +762,16 @@ static void post_init(char *unused_name, char **unused_argv)
                                         var_ipc_idle_limit,
                                         var_ipc_ttl_limit);
 #endif
+
+    /*
+     * Initialize dot-quit pipelining workaround.
+     */
+    smtp_pipe_dot_quit = name_code(pipe_dot_quit_codes,
+                                  NAME_CODE_FLAG_NONE,
+                                  var_smtp_pipe_dot_quit);
+    if (smtp_pipe_dot_quit == SMTP_PIPE_DOT_QUIT_CODE_ERROR)
+       msg_fatal("unknown %s value: %s", VAR_SMTP_PIPE_DOT_QUIT,
+                 var_smtp_pipe_dot_quit);
 }
 
 /* pre_init - pre-jail initialization */
index 9e4e5c8edd111e70254d3ac7f7151f7bd6eefbad..620c6de93ec3fbc79c0c85ca4f602288b6312b22 100644 (file)
@@ -166,6 +166,13 @@ extern SSL_CTX *smtp_tls_ctx;              /* client-side TLS engine */
 
 #endif
 
+#define SMTP_PIPE_DOT_QUIT_CODE_ERROR  0
+#define SMTP_PIPE_DOT_QUIT_CODE_NEVER  1
+#define SMTP_PIPE_DOT_QUIT_CODE_NEWMAIL        2
+#define SMTP_PIPE_DOT_QUIT_CODE_ALWAYS 3
+
+extern int smtp_pipe_dot_quit;
+
  /*
   * smtp_session.c
   */
index 6008b2d0b1c76cc3326b68e9ffb3ce9db283d92c..d92e9063e3e8fdc4b3b83a9691f88ff76ae199f8 100644 (file)
@@ -289,7 +289,7 @@ SMTP_RESP *smtp_chat_resp(SMTP_SESSION *session)
            msg_warn("non-%s response from %s: %s",
                     (session->state->misc_flags &
                      SMTP_MISC_FLAG_USE_LMTP) ? "LMTP" : "ESMTP",
-                    session->namaddr, STR(session->buffer));
+                    session->namaddrport, STR(session->buffer));
            vstream_longjmp(session->stream, SMTP_ERR_PROTO);
        }
     }
index f3a1494b1428618627b434111aa4acd4b68654d0..95765849cf91ae13db2e800a5042c925c8e43eaa 100644 (file)
@@ -23,6 +23,7 @@
        VAR_PROP_EXTENSION, DEF_PROP_EXTENSION, &var_prop_extension, 0, 0,
        VAR_SMTP_GENERIC_MAPS, DEF_SMTP_GENERIC_MAPS, &var_smtp_generic_maps, 0, 0,
        VAR_LMTP_TCP_PORT, DEF_LMTP_TCP_PORT, &var_lmtp_tcp_port, 0, 0,
+       VAR_SMTP_PIPE_DOT_QUIT, DEF_SMTP_PIPE_DOT_QUIT, &var_smtp_pipe_dot_quit, 1, 0,
        0,
     };
     static CONFIG_TIME_TABLE smtp_time_table[] = {
@@ -44,6 +45,7 @@
        VAR_SMTP_STARTTLS_TMOUT, DEF_SMTP_STARTTLS_TMOUT, &var_smtp_starttls_tmout, 1, 0,
 #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,
        0,
     };
     static CONFIG_INT_TABLE smtp_int_table[] = {
index 5fbe78d73032ec902e7d3e05a0f1643e02aabce7..f6c5583dfffd2f493081ab45e91d2b0c68ab3831 100644 (file)
@@ -926,8 +926,16 @@ static int smtp_loop(SMTP_STATE *state, NOCLOBBER int send_state,
 #define SENDER_IS_AHEAD \
        (recv_state < send_state || recv_rcpt != send_rcpt)
 
+#define DONT_PIPELINE_DOT_QUIT \
+       (smtp_pipe_dot_quit == SMTP_PIPE_DOT_QUIT_CODE_NEVER \
+        || (smtp_pipe_dot_quit == SMTP_PIPE_DOT_QUIT_CODE_NEWMAIL \
+            && request->msg_stats.incoming_arrival.tv_sec \
+               < vstream_ftime(session->stream) - var_min_backoff_time))
+
 #define SENDER_IN_WAIT_STATE \
-       (send_state == SMTP_STATE_DOT || send_state == SMTP_STATE_LAST)
+       (send_state == SMTP_STATE_DOT || send_state == SMTP_STATE_LAST \
+        || (recv_state == SMTP_STATE_DOT && send_state == SMTP_STATE_QUIT \
+            && DONT_PIPELINE_DOT_QUIT))
 
 #define SENDING_MAIL \
        (recv_state <= SMTP_STATE_DOT)
@@ -1144,7 +1152,8 @@ static int smtp_loop(SMTP_STATE *state, NOCLOBBER int send_state,
            break;
 
            /*
-            * Build the "." command before we have seen the DATA response.
+            * Build the "." command after we have seen the DATA response
+            * (DATA is a protocol synchronization point).
             * 
             * Changing the connection caching state here is safe because it
             * affects none of the not-yet processed replies to