[exim-cvs] PIPELINING: break and check for 452 every hundred…

Startseite
Nachricht löschen
Nachricht beantworten
Autor: Exim Git Commits Mailing List
Datum:  
To: exim-cvs
Betreff: [exim-cvs] PIPELINING: break and check for 452 every hundred RCPTs
Gitweb: https://git.exim.org/exim.git/commitdiff/c4639661040515feaa187921d47580b767f7c3b1
Commit:     c4639661040515feaa187921d47580b767f7c3b1
Parent:     7c6d46575a89c424346c6dbdc052b5e22cb0169f
Author:     Jeremy Harris <jgh146exb@???>
AuthorDate: Sun Dec 22 19:53:39 2019 +0000
Committer:  Jeremy Harris <jgh146exb@???>
CommitDate: Sun Dec 22 19:53:39 2019 +0000


    PIPELINING: break and check for 452 every hundred RCPTs
---
 doc/doc-txt/ChangeLog        |   8 +
 src/src/transports/smtp.c    | 183 ++++++++++++----------
 src/src/transports/smtp.h    |   1 +
 test/confs/0217              |   2 +-
 test/log/0217                | 103 +++++++++++++
 test/scripts/0000-Basic/0217 | 338 +++++++++++++++++++++++++++++++++++++++++
 test/stderr/0217             | 202 ++++++++++++------------
 test/stdout/0217             | 354 +++++++++++++++++++++++++++++++++++++++++++
 8 files changed, 1013 insertions(+), 178 deletions(-)


diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog
index e200c52..5280212 100644
--- a/doc/doc-txt/ChangeLog
+++ b/doc/doc-txt/ChangeLog
@@ -58,6 +58,14 @@ JH/14 Bug 2500: Rewind some of the common-coding in string handling between the
       tracking also did many adjustments to string handling.  Since then, eximon
       frequently terminated with an assert failure.


+JH/15 When PIPELINING, synch after every hundred or so RCPT commands sent and
+      check for 452 responses.  This slightly helps the inefficieny of doing
+      a large alias-expansion into a recipient-limited target.  The max_rcpt
+      transport option still applies (and at the current default, will override
+      the new feature).  The check is done for either cause of synch, and forces
+      a fast-retry of all 452'd recipients using a new MAIL FROM on the same
+      connection.  The new facility is not tunable at this time.
+


 Exim version 4.93
 -----------------
diff --git a/src/src/transports/smtp.c b/src/src/transports/smtp.c
index 92723a2..7428134 100644
--- a/src/src/transports/smtp.c
+++ b/src/src/transports/smtp.c
@@ -1150,6 +1150,7 @@ if (sx->pending_MAIL)
   {
   DEBUG(D_transport) debug_printf("%s expect mail\n", __FUNCTION__);
   count--;
+  sx->pending_MAIL = FALSE;
   if (!smtp_read_response(sx, sx->buffer, sizeof(sx->buffer),
               '2', ob->command_timeout))
     {
@@ -1284,38 +1285,55 @@ while (count-- > 0)
     event_defer_errno = addr->more_errno;
     msg_event_raise(US"msg:rcpt:host:defer", addr);
 #endif
+    /* If a 452 and we've had at least one 2xx or 5xx, set next_addr to the
+    start point for another MAIL command. */


-    /* Log temporary errors if there are more hosts to be tried.
-    If not, log this last one in the == line. */
-
-    if (sx->conn_args.host->next)
-      if (LOGGING(outgoing_port))
-        log_write(0, LOG_MAIN, "H=%s [%s]:%d %s", sx->conn_args.host->name,
-          sx->conn_args.host->address,
-          sx->port == PORT_NONE ? 25 : sx->port, addr->message);
-      else
-        log_write(0, LOG_MAIN, "H=%s [%s]: %s", sx->conn_args.host->name,
-          sx->conn_args.host->address, addr->message);
+    if (addr->more_errno >> 8 == 52  &&  yield & 3)
+      {
+      if (!sx->RCPT_452)
+        {
+        DEBUG(D_transport)
+          debug_printf("%s: seen first 452 too-many-rcpts\n", __FUNCTION__);
+        sx->RCPT_452 = TRUE;
+        sx->next_addr = addr;
+        }
+      addr->transport_return = PENDING_DEFER;
+      addr->basic_errno = 0;
+      }
+    else
+      {
+      /* Log temporary errors if there are more hosts to be tried.
+      If not, log this last one in the == line. */
+
+      if (sx->conn_args.host->next)
+        if (LOGGING(outgoing_port))
+          log_write(0, LOG_MAIN, "H=%s [%s]:%d %s", sx->conn_args.host->name,
+        sx->conn_args.host->address,
+        sx->port == PORT_NONE ? 25 : sx->port, addr->message);
+        else
+          log_write(0, LOG_MAIN, "H=%s [%s]: %s", sx->conn_args.host->name,
+        sx->conn_args.host->address, addr->message);


 #ifndef DISABLE_EVENT
-    else
-      msg_event_raise(US"msg:rcpt:defer", addr);
+      else
+        msg_event_raise(US"msg:rcpt:defer", addr);
 #endif


-    /* Do not put this message on the list of those waiting for specific
-    hosts, as otherwise it is likely to be tried too often. */
+      /* Do not put this message on the list of those waiting for specific
+      hosts, as otherwise it is likely to be tried too often. */


-    update_waiting = FALSE;
+      update_waiting = FALSE;


-    /* Add a retry item for the address so that it doesn't get tried again
-    too soon. If address_retry_include_sender is true, add the sender address
-    to the retry key. */
+      /* Add a retry item for the address so that it doesn't get tried again
+      too soon. If address_retry_include_sender is true, add the sender address
+      to the retry key. */


-    retry_add_item(addr,
-      ob->address_retry_include_sender
-        ? string_sprintf("%s:<%s>", addr->address_retry_key, sender_address)
-        : addr->address_retry_key,
-      0);
+      retry_add_item(addr,
+        ob->address_retry_include_sender
+          ? string_sprintf("%s:<%s>", addr->address_retry_key, sender_address)
+          : addr->address_retry_key,
+        0);
+      }
     }
       }
     }
@@ -3128,7 +3146,7 @@ int
 smtp_write_mail_and_rcpt_cmds(smtp_context * sx, int * yield)
 {
 address_item * addr;
-int address_count;
+int address_count, pipe_limit;
 int rc;


if (build_mailcmd_options(sx, sx->first_addr) != OK)
@@ -3211,11 +3229,11 @@ that max_rcpt will be large, so all addresses will be done at once.

For verify we flush the pipeline after any (the only) rcpt address. */

-for (addr = sx->first_addr, address_count = 0;
+for (addr = sx->first_addr, address_count = 0, pipe_limit = 100;
      addr  &&  address_count < sx->max_rcpt;
      addr = addr->next) if (addr->transport_return == PENDING_DEFER)
   {
-  int count;
+  int cmds_sent;
   BOOL no_flush;
   uschar * rcpt_addr;


@@ -3223,7 +3241,10 @@ for (addr = sx->first_addr, address_count = 0;
     ? dsn_support_yes : dsn_support_no;


   address_count++;
-  no_flush = pipelining_active && !sx->verify
+  if (pipe_limit-- <= 0)
+    { no_flush = FALSE; pipe_limit = 100; }
+  else
+    no_flush = pipelining_active && !sx->verify
       && (!mua_wrapper || addr->next && address_count < sx->max_rcpt);


   build_rcptcmd_options(sx, addr);
@@ -3246,13 +3267,13 @@ for (addr = sx->first_addr, address_count = 0;
     }
 #endif


-  count = smtp_write_command(sx, no_flush ? SCMD_BUFFER : SCMD_FLUSH,
+  cmds_sent = smtp_write_command(sx, no_flush ? SCMD_BUFFER : SCMD_FLUSH,
     "RCPT TO:<%s>%s%s\r\n", rcpt_addr, sx->igquotstr, sx->buffer);


-  if (count < 0) return -5;
-  if (count > 0)
+  if (cmds_sent < 0) return -5;
+  if (cmds_sent > 0)
     {
-    switch(sync_responses(sx, count, 0))
+    switch(sync_responses(sx, cmds_sent, 0))
       {
       case 3: sx->ok = TRUE;            /* 2xx & 5xx => OK & progress made */
       case 2: sx->completed_addr = TRUE;    /* 5xx (only) => progress made */
@@ -3262,6 +3283,17 @@ for (addr = sx->first_addr, address_count = 0;
           if (!sx->lmtp)            /*  can't tell about progress yet */
         sx->completed_addr = TRUE;
       case 0:                    /* No 2xx or 5xx, but no probs */
+          /* If any RCPT got a 452 response then next_addr has been updated
+          for restarting with a new MAIL on the same connection.  Send no more
+          RCPTs for this MAIL. */
+
+          if (sx->RCPT_452)
+        {
+        DEBUG(D_transport) debug_printf("seen 452 too-many-rcpts\n");
+        sx->RCPT_452 = FALSE;
+        /* sx->next_addr has been reset for fast_retry */
+        return 0;
+        }
           break;


       case -1: return -3;            /* Timeout on RCPT */
@@ -3273,7 +3305,6 @@ for (addr = sx->first_addr, address_count = 0;
       case -5: return -1;            /* TLS first-read error */
 #endif
       }
-    sx->pending_MAIL = FALSE;            /* Dealt with MAIL */
     }
   }      /* Loop for next address */


@@ -3947,53 +3978,53 @@ else
       }


 #ifndef DISABLE_PRDR
-      if (sx->prdr_active)
-        {
-    const uschar * overall_message;
+    if (sx->prdr_active)
+      {
+      const uschar * overall_message;


-    /* PRDR - get the final, overall response.  For any non-success
-    upgrade all the address statuses. */
+      /* PRDR - get the final, overall response.  For any non-success
+      upgrade all the address statuses. */


-        sx->ok = smtp_read_response(sx, sx->buffer, sizeof(sx->buffer), '2',
-          ob->final_timeout);
-        if (!sx->ok)
+      sx->ok = smtp_read_response(sx, sx->buffer, sizeof(sx->buffer), '2',
+    ob->final_timeout);
+      if (!sx->ok)
+    {
+    if(errno == 0 && sx->buffer[0] == '4')
       {
-      if(errno == 0 && sx->buffer[0] == '4')
-            {
-            errno = ERRNO_DATA4XX;
-            addrlist->more_errno |= ((sx->buffer[1] - '0')*10 + sx->buffer[2] - '0') << 8;
-            }
-      for (address_item * addr = addrlist; addr != sx->first_addr; addr = addr->next)
-            if (sx->buffer[0] == '5' || addr->transport_return == OK)
-              addr->transport_return = PENDING_OK; /* allow set_errno action */
-      goto RESPONSE_FAILED;
+      errno = ERRNO_DATA4XX;
+      addrlist->more_errno |= ((sx->buffer[1] - '0')*10 + sx->buffer[2] - '0') << 8;
       }
+    for (address_item * addr = addrlist; addr != sx->first_addr; addr = addr->next)
+      if (sx->buffer[0] == '5' || addr->transport_return == OK)
+        addr->transport_return = PENDING_OK; /* allow set_errno action */
+    goto RESPONSE_FAILED;
+    }


-    /* Append the overall response to the individual PRDR response for logging
-    and update the journal, or setup retry. */
+      /* Append the overall response to the individual PRDR response for logging
+      and update the journal, or setup retry. */


-    overall_message = string_printing(sx->buffer);
-        for (address_item * addr = addrlist; addr != sx->first_addr; addr = addr->next)
-      if (addr->transport_return == OK)
-        addr->message = string_sprintf("%s\\n%s", addr->message, overall_message);
+      overall_message = string_printing(sx->buffer);
+      for (address_item * addr = addrlist; addr != sx->first_addr; addr = addr->next)
+    if (addr->transport_return == OK)
+      addr->message = string_sprintf("%s\\n%s", addr->message, overall_message);


-        for (address_item * addr = addrlist; addr != sx->first_addr; addr = addr->next)
-      if (addr->transport_return == OK)
-        {
-        if (testflag(addr, af_homonym))
-          sprintf(CS sx->buffer, "%.500s/%s\n", addr->unique + 3, tblock->name);
-        else
-          sprintf(CS sx->buffer, "%.500s\n", addr->unique);
+      for (address_item * addr = addrlist; addr != sx->first_addr; addr = addr->next)
+    if (addr->transport_return == OK)
+      {
+      if (testflag(addr, af_homonym))
+        sprintf(CS sx->buffer, "%.500s/%s\n", addr->unique + 3, tblock->name);
+      else
+        sprintf(CS sx->buffer, "%.500s\n", addr->unique);


-        DEBUG(D_deliver) debug_printf("journalling(PRDR) %s\n", sx->buffer);
-        len = Ustrlen(CS sx->buffer);
-        if (write(journal_fd, sx->buffer, len) != len)
-          log_write(0, LOG_MAIN|LOG_PANIC, "failed to write journal for "
-        "%s: %s", sx->buffer, strerror(errno));
-        }
-      else if (addr->transport_return == DEFER)
-        retry_add_item(addr, addr->address_retry_key, -2);
-    }
+      DEBUG(D_deliver) debug_printf("journalling(PRDR) %s\n", sx->buffer);
+      len = Ustrlen(CS sx->buffer);
+      if (write(journal_fd, sx->buffer, len) != len)
+        log_write(0, LOG_MAIN|LOG_PANIC, "failed to write journal for "
+          "%s: %s", sx->buffer, strerror(errno));
+      }
+    else if (addr->transport_return == DEFER)
+      retry_add_item(addr, addr->address_retry_key, -2);
+      }
 #endif


     /* Ensure the journal file is pushed out to disk. */
@@ -4141,7 +4172,6 @@ if (!sx->ok)
         );
   }


-
 /* If all has gone well, send_quit will be set TRUE, implying we can end the
 SMTP session tidily. However, if there were too many addresses to send in one
 message (indicated by first_addr being non-NULL) we want to carry on with the
@@ -4230,9 +4260,10 @@ if (sx->completed_addr && sx->ok && sx->send_quit)
       int socket_fd = sx->cctx.sock;



-      if (sx->first_addr != NULL)         /* More addresses still to be sent */
-        {                                /*   in this run of the transport */
-        continue_sequence++;             /* Causes * in logging */
+      if (sx->first_addr != NULL)    /* More addresses still to be sent */
+        {                /*   in this run of the transport */
+        continue_sequence++;        /* Causes * in logging */
+    pipelining_active = sx->pipelining_used;    /* was cleared at DATA */
         goto SEND_MESSAGE;
         }


diff --git a/src/src/transports/smtp.h b/src/src/transports/smtp.h
index 8ea844b..46b1b04 100644
--- a/src/src/transports/smtp.h
+++ b/src/src/transports/smtp.h
@@ -144,6 +144,7 @@ typedef struct {
#endif
BOOL pending_MAIL:1;
BOOL pending_BDAT:1;
+ BOOL RCPT_452:1;
BOOL good_RCPT:1;
BOOL completed_addr:1;
BOOL send_rset:1;
diff --git a/test/confs/0217 b/test/confs/0217
index a225df5..9842c39 100644
--- a/test/confs/0217
+++ b/test/confs/0217
@@ -50,7 +50,7 @@ send_to_server:

begin retry

-* * F,5d,10s
+* *        F,5d,10s



 # End
diff --git a/test/log/0217 b/test/log/0217
index e84d6e4..48aa31f 100644
--- a/test/log/0217
+++ b/test/log/0217
@@ -277,3 +277,106 @@
 1999-03-02 09:44:33 10HmbP-0005vi-00 -> y@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] C="250 OK"
 1999-03-02 09:44:33 10HmbP-0005vi-00 -> z@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] C="250 OK"
 1999-03-02 09:44:33 10HmbP-0005vi-00 Completed
+1999-03-02 09:44:33 10HmbQ-0005vi-00 <= CALLER@??? U=CALLER P=local S=sss
+1999-03-02 09:44:33 10HmbQ-0005vi-00 => y00@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y01@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y02@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y03@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y04@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y05@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y06@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y07@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y08@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y09@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y10@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y11@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y12@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y13@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y14@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y15@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y16@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y17@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y18@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y19@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y20@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y21@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y22@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y23@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y24@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y25@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y26@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y27@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y28@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y29@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y30@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y31@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y32@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y33@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y34@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y35@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y36@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y37@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y38@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y39@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y40@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y41@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y42@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y43@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y44@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y45@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y46@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y47@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y48@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> y49@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 msg accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 => n50@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n51@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n52@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n53@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n54@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n55@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n56@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n57@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n58@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n59@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n60@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n61@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n62@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n63@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n64@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n65@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n66@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n67@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n68@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n69@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n70@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n71@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n72@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n73@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n74@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n75@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n76@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n77@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n78@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n79@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n80@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n81@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n82@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n83@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n84@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n85@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n86@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n87@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n88@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n89@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n90@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n91@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n92@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n93@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n94@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n95@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n96@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n97@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n98@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 -> n99@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 2 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 => n100@??? R=client T=send_to_server H=127.0.0.1 [127.0.0.1] L C="250 mesg 3 accepted"
+1999-03-02 09:44:33 10HmbQ-0005vi-00 Completed
diff --git a/test/scripts/0000-Basic/0217 b/test/scripts/0000-Basic/0217
index a74be60..db793b0 100644
--- a/test/scripts/0000-Basic/0217
+++ b/test/scripts/0000-Basic/0217
@@ -640,4 +640,342 @@ DATA
 ****
 exim -v -odi -DHAP=hosts_avoid_pipelining=127.0.0.1 w x y z
 ****
+# Server says 452 excess-rcpts temp error after first 50
+# Exim client checks after 100
+sudo rm -fr DIR/spool/input
+server PORT_S
+220 Server ready
+EHLO
+250-OK
+250 PIPELINING
+MAIL FROM
+250 OK
+RCPT TO
+250 OK 0
+RCPT TO
+250 OK 1
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK 49
+RCPT TO
+452 excess 50
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess
+RCPT TO
+452 excess 99
+RCPT TO
+452 excess 100
+DATA
+354 go
+.
+250 msg accepted
+MAIL FROM
+250 good mail
+RCPT TO
+250 OK 50
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO:<n99
+250 OK 99-2
+RCPT TO
+452 excess 100
+DATA
+354 go
+.
+250 mesg 2 accepted
+MAIL FROM
+250 good mail
+RCPT TO
+250 OK 100
+DATA
+354 go
+.
+250 mesg 3 accepted
+QUIT
+250 OK
+****
+exim -odi y00 y01 y02 y03 y04 y05 y06 y07 y08 y09 y10 y11 y12 y13 y14 y15 y16 y17 y18 y19 y20 y21 y22 y23 y24 y25 y26 y27 y28 y29 y30 y31 y32 y33 y34 y35 y36 y37 y38 y39 y40 y41 y42 y43 y44 y45 y46 y47 y48 y49 n50 n51 n52 n53 n54 n55 n56 n57 n58 n59 n60 n61 n62 n63 n64 n65 n66 n67 n68 n69 n70 n71 n72 n73 n74 n75 n76 n77 n78 n79 n80 n81 n82 n83 n84 n85 n86 n87 n88 n89 n90 n91 n92 n93 n94 n95 n96 n97 n98 n99 n100
+.
+****
 no_msglog_check
diff --git a/test/stderr/0217 b/test/stderr/0217
index c65c953..f23d8c2 100644
--- a/test/stderr/0217
+++ b/test/stderr/0217
@@ -108,79 +108,6 @@ Connecting to 127.0.0.1 [127.0.0.1]:1224 ...  connected
   SMTP>> RCPT TO:<n97@???>
   SMTP>> RCPT TO:<n98@???>
   SMTP>> RCPT TO:<n99@???>
-  SMTP>> RCPT TO:<n100@???>
-  SMTP>> RCPT TO:<n101@???>
-  SMTP>> RCPT TO:<n102@???>
-  SMTP>> RCPT TO:<n103@???>
-  SMTP>> RCPT TO:<n104@???>
-  SMTP>> RCPT TO:<n105@???>
-  SMTP>> RCPT TO:<n106@???>
-  SMTP>> RCPT TO:<n107@???>
-  SMTP>> RCPT TO:<n108@???>
-  SMTP>> RCPT TO:<n109@???>
-  SMTP>> RCPT TO:<n110@???>
-  SMTP>> RCPT TO:<n111@???>
-  SMTP>> RCPT TO:<n112@???>
-  SMTP>> RCPT TO:<n113@???>
-  SMTP>> RCPT TO:<n114@???>
-  SMTP>> RCPT TO:<n115@???>
-  SMTP>> RCPT TO:<n116@???>
-  SMTP>> RCPT TO:<n117@???>
-  SMTP>> RCPT TO:<n118@???>
-  SMTP>> RCPT TO:<n119@???>
-  SMTP>> RCPT TO:<n120@???>
-  SMTP>> RCPT TO:<n121@???>
-  SMTP>> RCPT TO:<n122@???>
-  SMTP>> RCPT TO:<n123@???>
-  SMTP>> RCPT TO:<n124@???>
-  SMTP>> RCPT TO:<n125@???>
-  SMTP>> RCPT TO:<n126@???>
-  SMTP>> RCPT TO:<n127@???>
-  SMTP>> RCPT TO:<n128@???>
-  SMTP>> RCPT TO:<n129@???>
-  SMTP>> RCPT TO:<n130@???>
-  SMTP>> RCPT TO:<n131@???>
-  SMTP>> RCPT TO:<n132@???>
-  SMTP>> RCPT TO:<n133@???>
-  SMTP>> RCPT TO:<n134@???>
-  SMTP>> RCPT TO:<n135@???>
-  SMTP>> RCPT TO:<n136@???>
-  SMTP>> RCPT TO:<n137@???>
-  SMTP>> RCPT TO:<n138@???>
-  SMTP>> RCPT TO:<n139@???>
-  SMTP>> RCPT TO:<n140@???>
-  SMTP>> RCPT TO:<n141@???>
-  SMTP>> RCPT TO:<n142@???>
-  SMTP>> RCPT TO:<n143@???>
-  SMTP>> RCPT TO:<n144@???>
-  SMTP>> RCPT TO:<n145@???>
-  SMTP>> RCPT TO:<n146@???>
-  SMTP>> RCPT TO:<n147@???>
-  SMTP>> RCPT TO:<n148@???>
-  SMTP>> RCPT TO:<n149@???>
-  SMTP>> RCPT TO:<n150@???>
-  SMTP>> RCPT TO:<n151@???>
-  SMTP>> RCPT TO:<n152@???>
-  SMTP>> RCPT TO:<n153@???>
-  SMTP>> RCPT TO:<n154@???>
-  SMTP>> RCPT TO:<n155@???>
-  SMTP>> RCPT TO:<n156@???>
-  SMTP>> RCPT TO:<n157@???>
-  SMTP>> RCPT TO:<n158@???>
-  SMTP>> RCPT TO:<n159@???>
-  SMTP>> RCPT TO:<n160@???>
-  SMTP>> RCPT TO:<n161@???>
-  SMTP>> RCPT TO:<n162@???>
-  SMTP>> RCPT TO:<n163@???>
-  SMTP>> RCPT TO:<n164@???>
-  SMTP>> RCPT TO:<n165@???>
-  SMTP>> RCPT TO:<n166@???>
-  SMTP>> RCPT TO:<n167@???>
-  SMTP>> RCPT TO:<n168@???>
-  SMTP>> RCPT TO:<n169@???>
-  SMTP>> RCPT TO:<n170@???>
-  SMTP>> RCPT TO:<n171@???>
-  SMTP>> RCPT TO:<n172@???>
   SMTP<< 250 OK
   SMTP<< 250 OK
   SMTP<< 550 NO
@@ -283,6 +210,107 @@ Connecting to 127.0.0.1 [127.0.0.1]:1224 ...  connected
   SMTP<< 550 NO
   SMTP<< 550 NO
   SMTP<< 550 NO
+  SMTP>> RCPT TO:<n100@???>
+  SMTP>> RCPT TO:<n101@???>
+  SMTP>> RCPT TO:<n102@???>
+  SMTP>> RCPT TO:<n103@???>
+  SMTP>> RCPT TO:<n104@???>
+  SMTP>> RCPT TO:<n105@???>
+  SMTP>> RCPT TO:<n106@???>
+  SMTP>> RCPT TO:<n107@???>
+  SMTP>> RCPT TO:<n108@???>
+  SMTP>> RCPT TO:<n109@???>
+  SMTP>> RCPT TO:<n110@???>
+  SMTP>> RCPT TO:<n111@???>
+  SMTP>> RCPT TO:<n112@???>
+  SMTP>> RCPT TO:<n113@???>
+  SMTP>> RCPT TO:<n114@???>
+  SMTP>> RCPT TO:<n115@???>
+  SMTP>> RCPT TO:<n116@???>
+  SMTP>> RCPT TO:<n117@???>
+  SMTP>> RCPT TO:<n118@???>
+  SMTP>> RCPT TO:<n119@???>
+  SMTP>> RCPT TO:<n120@???>
+  SMTP>> RCPT TO:<n121@???>
+  SMTP>> RCPT TO:<n122@???>
+  SMTP>> RCPT TO:<n123@???>
+  SMTP>> RCPT TO:<n124@???>
+  SMTP>> RCPT TO:<n125@???>
+  SMTP>> RCPT TO:<n126@???>
+  SMTP>> RCPT TO:<n127@???>
+  SMTP>> RCPT TO:<n128@???>
+  SMTP>> RCPT TO:<n129@???>
+  SMTP>> RCPT TO:<n130@???>
+  SMTP>> RCPT TO:<n131@???>
+  SMTP>> RCPT TO:<n132@???>
+  SMTP>> RCPT TO:<n133@???>
+  SMTP>> RCPT TO:<n134@???>
+  SMTP>> RCPT TO:<n135@???>
+  SMTP>> RCPT TO:<n136@???>
+  SMTP>> RCPT TO:<n137@???>
+  SMTP>> RCPT TO:<n138@???>
+  SMTP>> RCPT TO:<n139@???>
+  SMTP>> RCPT TO:<n140@???>
+  SMTP>> RCPT TO:<n141@???>
+  SMTP>> RCPT TO:<n142@???>
+  SMTP>> RCPT TO:<n143@???>
+  SMTP>> RCPT TO:<n144@???>
+  SMTP>> RCPT TO:<n145@???>
+  SMTP>> RCPT TO:<n146@???>
+  SMTP>> RCPT TO:<n147@???>
+  SMTP>> RCPT TO:<n148@???>
+  SMTP>> RCPT TO:<n149@???>
+  SMTP>> RCPT TO:<n150@???>
+  SMTP>> RCPT TO:<n151@???>
+  SMTP>> RCPT TO:<n152@???>
+  SMTP>> RCPT TO:<n153@???>
+  SMTP>> RCPT TO:<n154@???>
+  SMTP>> RCPT TO:<n155@???>
+  SMTP>> RCPT TO:<n156@???>
+  SMTP>> RCPT TO:<n157@???>
+  SMTP>> RCPT TO:<n158@???>
+  SMTP>> RCPT TO:<n159@???>
+  SMTP>> RCPT TO:<n160@???>
+  SMTP>> RCPT TO:<n161@???>
+  SMTP>> RCPT TO:<n162@???>
+  SMTP>> RCPT TO:<n163@???>
+  SMTP>> RCPT TO:<n164@???>
+  SMTP>> RCPT TO:<n165@???>
+  SMTP>> RCPT TO:<n166@???>
+  SMTP>> RCPT TO:<n167@???>
+  SMTP>> RCPT TO:<n168@???>
+  SMTP>> RCPT TO:<n169@???>
+  SMTP>> RCPT TO:<n170@???>
+  SMTP>> RCPT TO:<n171@???>
+  SMTP>> RCPT TO:<n172@???>
+  SMTP>> RCPT TO:<n173@???>
+  SMTP>> RCPT TO:<n174@???>
+  SMTP>> RCPT TO:<n175@???>
+  SMTP>> RCPT TO:<n176@???>
+  SMTP>> RCPT TO:<n177@???>
+  SMTP>> RCPT TO:<n178@???>
+  SMTP>> RCPT TO:<n179@???>
+  SMTP>> RCPT TO:<n180@???>
+  SMTP>> RCPT TO:<n181@???>
+  SMTP>> RCPT TO:<n182@???>
+  SMTP>> RCPT TO:<n183@???>
+  SMTP>> RCPT TO:<n184@???>
+  SMTP>> RCPT TO:<n185@???>
+  SMTP>> RCPT TO:<n186@???>
+  SMTP>> RCPT TO:<n187@???>
+  SMTP>> RCPT TO:<n188@???>
+  SMTP>> RCPT TO:<n189@???>
+  SMTP>> RCPT TO:<n190@???>
+  SMTP>> RCPT TO:<n191@???>
+  SMTP>> RCPT TO:<n192@???>
+  SMTP>> RCPT TO:<n193@???>
+  SMTP>> RCPT TO:<n194@???>
+  SMTP>> RCPT TO:<n195@???>
+  SMTP>> RCPT TO:<n196@???>
+  SMTP>> RCPT TO:<n197@???>
+  SMTP>> RCPT TO:<n198@???>
+  SMTP>> RCPT TO:<n199@???>
+  SMTP>> DATA
   SMTP<< 550 NO
   SMTP<< 550 NO
   SMTP<< 550 NO
@@ -355,34 +383,6 @@ Connecting to 127.0.0.1 [127.0.0.1]:1224 ...  connected
   SMTP<< 550 NO
   SMTP<< 550 NO
   SMTP<< 550 NO
-  SMTP>> RCPT TO:<n173@???>
-  SMTP>> RCPT TO:<n174@???>
-  SMTP>> RCPT TO:<n175@???>
-  SMTP>> RCPT TO:<n176@???>
-  SMTP>> RCPT TO:<n177@???>
-  SMTP>> RCPT TO:<n178@???>
-  SMTP>> RCPT TO:<n179@???>
-  SMTP>> RCPT TO:<n180@???>
-  SMTP>> RCPT TO:<n181@???>
-  SMTP>> RCPT TO:<n182@???>
-  SMTP>> RCPT TO:<n183@???>
-  SMTP>> RCPT TO:<n184@???>
-  SMTP>> RCPT TO:<n185@???>
-  SMTP>> RCPT TO:<n186@???>
-  SMTP>> RCPT TO:<n187@???>
-  SMTP>> RCPT TO:<n188@???>
-  SMTP>> RCPT TO:<n189@???>
-  SMTP>> RCPT TO:<n190@???>
-  SMTP>> RCPT TO:<n191@???>
-  SMTP>> RCPT TO:<n192@???>
-  SMTP>> RCPT TO:<n193@???>
-  SMTP>> RCPT TO:<n194@???>
-  SMTP>> RCPT TO:<n195@???>
-  SMTP>> RCPT TO:<n196@???>
-  SMTP>> RCPT TO:<n197@???>
-  SMTP>> RCPT TO:<n198@???>
-  SMTP>> RCPT TO:<n199@???>
-  SMTP>> DATA
   SMTP<< 550 NO
   SMTP<< 550 NO
   SMTP<< 550 NO
diff --git a/test/stdout/0217 b/test/stdout/0217
index f08a3fa..17ed51b 100644
--- a/test/stdout/0217
+++ b/test/stdout/0217
@@ -615,3 +615,357 @@ Date: Tue, 2 Mar 1999 09:44:33 +0000
 .
 250 OK
 End of script
+Listening on port 1224 ... 
+Connection request from [127.0.0.1]
+220 Server ready
+EHLO myhost.test.ex
+250-OK
+250 PIPELINING
+MAIL FROM:<CALLER@???>
+250 OK
+RCPT TO:<y00@???>
+250 OK 0
+RCPT TO:<y01@???>
+250 OK 1
+RCPT TO:<y02@???>
+250 OK
+RCPT TO:<y03@???>
+250 OK
+RCPT TO:<y04@???>
+250 OK
+RCPT TO:<y05@???>
+250 OK
+RCPT TO:<y06@???>
+250 OK
+RCPT TO:<y07@???>
+250 OK
+RCPT TO:<y08@???>
+250 OK
+RCPT TO:<y09@???>
+250 OK
+RCPT TO:<y10@???>
+250 OK
+RCPT TO:<y11@???>
+250 OK
+RCPT TO:<y12@???>
+250 OK
+RCPT TO:<y13@???>
+250 OK
+RCPT TO:<y14@???>
+250 OK
+RCPT TO:<y15@???>
+250 OK
+RCPT TO:<y16@???>
+250 OK
+RCPT TO:<y17@???>
+250 OK
+RCPT TO:<y18@???>
+250 OK
+RCPT TO:<y19@???>
+250 OK
+RCPT TO:<y20@???>
+250 OK
+RCPT TO:<y21@???>
+250 OK
+RCPT TO:<y22@???>
+250 OK
+RCPT TO:<y23@???>
+250 OK
+RCPT TO:<y24@???>
+250 OK
+RCPT TO:<y25@???>
+250 OK
+RCPT TO:<y26@???>
+250 OK
+RCPT TO:<y27@???>
+250 OK
+RCPT TO:<y28@???>
+250 OK
+RCPT TO:<y29@???>
+250 OK
+RCPT TO:<y30@???>
+250 OK
+RCPT TO:<y31@???>
+250 OK
+RCPT TO:<y32@???>
+250 OK
+RCPT TO:<y33@???>
+250 OK
+RCPT TO:<y34@???>
+250 OK
+RCPT TO:<y35@???>
+250 OK
+RCPT TO:<y36@???>
+250 OK
+RCPT TO:<y37@???>
+250 OK
+RCPT TO:<y38@???>
+250 OK
+RCPT TO:<y39@???>
+250 OK
+RCPT TO:<y40@???>
+250 OK
+RCPT TO:<y41@???>
+250 OK
+RCPT TO:<y42@???>
+250 OK
+RCPT TO:<y43@???>
+250 OK
+RCPT TO:<y44@???>
+250 OK
+RCPT TO:<y45@???>
+250 OK
+RCPT TO:<y46@???>
+250 OK
+RCPT TO:<y47@???>
+250 OK
+RCPT TO:<y48@???>
+250 OK
+RCPT TO:<y49@???>
+250 OK 49
+RCPT TO:<n50@???>
+452 excess 50
+RCPT TO:<n51@???>
+452 excess
+RCPT TO:<n52@???>
+452 excess
+RCPT TO:<n53@???>
+452 excess
+RCPT TO:<n54@???>
+452 excess
+RCPT TO:<n55@???>
+452 excess
+RCPT TO:<n56@???>
+452 excess
+RCPT TO:<n57@???>
+452 excess
+RCPT TO:<n58@???>
+452 excess
+RCPT TO:<n59@???>
+452 excess
+RCPT TO:<n60@???>
+452 excess
+RCPT TO:<n61@???>
+452 excess
+RCPT TO:<n62@???>
+452 excess
+RCPT TO:<n63@???>
+452 excess
+RCPT TO:<n64@???>
+452 excess
+RCPT TO:<n65@???>
+452 excess
+RCPT TO:<n66@???>
+452 excess
+RCPT TO:<n67@???>
+452 excess
+RCPT TO:<n68@???>
+452 excess
+RCPT TO:<n69@???>
+452 excess
+RCPT TO:<n70@???>
+452 excess
+RCPT TO:<n71@???>
+452 excess
+RCPT TO:<n72@???>
+452 excess
+RCPT TO:<n73@???>
+452 excess
+RCPT TO:<n74@???>
+452 excess
+RCPT TO:<n75@???>
+452 excess
+RCPT TO:<n76@???>
+452 excess
+RCPT TO:<n77@???>
+452 excess
+RCPT TO:<n78@???>
+452 excess
+RCPT TO:<n79@???>
+452 excess
+RCPT TO:<n80@???>
+452 excess
+RCPT TO:<n81@???>
+452 excess
+RCPT TO:<n82@???>
+452 excess
+RCPT TO:<n83@???>
+452 excess
+RCPT TO:<n84@???>
+452 excess
+RCPT TO:<n85@???>
+452 excess
+RCPT TO:<n86@???>
+452 excess
+RCPT TO:<n87@???>
+452 excess
+RCPT TO:<n88@???>
+452 excess
+RCPT TO:<n89@???>
+452 excess
+RCPT TO:<n90@???>
+452 excess
+RCPT TO:<n91@???>
+452 excess
+RCPT TO:<n92@???>
+452 excess
+RCPT TO:<n93@???>
+452 excess
+RCPT TO:<n94@???>
+452 excess
+RCPT TO:<n95@???>
+452 excess
+RCPT TO:<n96@???>
+452 excess
+RCPT TO:<n97@???>
+452 excess
+RCPT TO:<n98@???>
+452 excess
+RCPT TO:<n99@???>
+452 excess 99
+RCPT TO:<n100@???>
+452 excess 100
+DATA
+354 go
+Received: from CALLER by myhost.test.ex with local (Exim x.yz)
+    (envelope-from <CALLER@???>)
+    id 10HmbQ-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000
+Message-Id: <E10HmbQ-0005vi-00@???>
+From: CALLER_NAME <CALLER@???>
+Date: Tue, 2 Mar 1999 09:44:33 +0000
+
+.
+250 msg accepted
+MAIL FROM:<CALLER@???>
+250 good mail
+RCPT TO:<n50@???>
+250 OK 50
+RCPT TO:<n51@???>
+250 OK
+RCPT TO:<n52@???>
+250 OK
+RCPT TO:<n53@???>
+250 OK
+RCPT TO:<n54@???>
+250 OK
+RCPT TO:<n55@???>
+250 OK
+RCPT TO:<n56@???>
+250 OK
+RCPT TO:<n57@???>
+250 OK
+RCPT TO:<n58@???>
+250 OK
+RCPT TO:<n59@???>
+250 OK
+RCPT TO:<n60@???>
+250 OK
+RCPT TO:<n61@???>
+250 OK
+RCPT TO:<n62@???>
+250 OK
+RCPT TO:<n63@???>
+250 OK
+RCPT TO:<n64@???>
+250 OK
+RCPT TO:<n65@???>
+250 OK
+RCPT TO:<n66@???>
+250 OK
+RCPT TO:<n67@???>
+250 OK
+RCPT TO:<n68@???>
+250 OK
+RCPT TO:<n69@???>
+250 OK
+RCPT TO:<n70@???>
+250 OK
+RCPT TO:<n71@???>
+250 OK
+RCPT TO:<n72@???>
+250 OK
+RCPT TO:<n73@???>
+250 OK
+RCPT TO:<n74@???>
+250 OK
+RCPT TO:<n75@???>
+250 OK
+RCPT TO:<n76@???>
+250 OK
+RCPT TO:<n77@???>
+250 OK
+RCPT TO:<n78@???>
+250 OK
+RCPT TO:<n79@???>
+250 OK
+RCPT TO:<n80@???>
+250 OK
+RCPT TO:<n81@???>
+250 OK
+RCPT TO:<n82@???>
+250 OK
+RCPT TO:<n83@???>
+250 OK
+RCPT TO:<n84@???>
+250 OK
+RCPT TO:<n85@???>
+250 OK
+RCPT TO:<n86@???>
+250 OK
+RCPT TO:<n87@???>
+250 OK
+RCPT TO:<n88@???>
+250 OK
+RCPT TO:<n89@???>
+250 OK
+RCPT TO:<n90@???>
+250 OK
+RCPT TO:<n91@???>
+250 OK
+RCPT TO:<n92@???>
+250 OK
+RCPT TO:<n93@???>
+250 OK
+RCPT TO:<n94@???>
+250 OK
+RCPT TO:<n95@???>
+250 OK
+RCPT TO:<n96@???>
+250 OK
+RCPT TO:<n97@???>
+250 OK
+RCPT TO:<n98@???>
+250 OK
+RCPT TO:<n99@???>
+250 OK 99-2
+RCPT TO:<n100@???>
+452 excess 100
+DATA
+354 go
+Received: from CALLER by myhost.test.ex with local (Exim x.yz)
+    (envelope-from <CALLER@???>)
+    id 10HmbQ-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000
+Message-Id: <E10HmbQ-0005vi-00@???>
+From: CALLER_NAME <CALLER@???>
+Date: Tue, 2 Mar 1999 09:44:33 +0000
+
+.
+250 mesg 2 accepted
+MAIL FROM:<CALLER@???>
+250 good mail
+RCPT TO:<n100@???>
+250 OK 100
+DATA
+354 go
+Received: from CALLER by myhost.test.ex with local (Exim x.yz)
+    (envelope-from <CALLER@???>)
+    id 10HmbQ-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000
+Message-Id: <E10HmbQ-0005vi-00@???>
+From: CALLER_NAME <CALLER@???>
+Date: Tue, 2 Mar 1999 09:44:33 +0000
+
+.
+250 mesg 3 accepted
+QUIT
+250 OK
+End of script