Add new errors mail_4xx, data_4xx, lost_connection, tls_required.
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Thu, 9 Mar 2006 15:10:16 +0000 (15:10 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Thu, 9 Mar 2006 15:10:16 +0000 (15:10 +0000)
32 files changed:
doc/doc-misc/WishList
doc/doc-txt/ChangeLog
doc/doc-txt/NewStuff
src/src/exim.c
src/src/macros.h
src/src/readconf.c
src/src/retry.c
src/src/transports/lmtp.c
src/src/transports/smtp.c
test/aux-fixed/5100.script.10 [new file with mode: 0644]
test/confs/0497
test/confs/2010
test/confs/2110
test/confs/5100
test/log/0217
test/log/0497
test/log/0498
test/log/1008
test/log/2010
test/log/2110
test/log/5100
test/log/5102
test/log/5103
test/scripts/0000-Basic/0497
test/scripts/2000-GnuTLS/2010
test/scripts/2100-OpenSSL/2110
test/scripts/5100-lmtp-transport/5100
test/stderr/0217
test/stdout/0497
test/stdout/0498
test/stdout/1008
test/stdout/5100

index 3f70a9d..fc5e0c1 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-misc/WishList,v 1.64 2006/03/08 09:43:10 ph10 Exp $
+$Cambridge: exim/doc/doc-misc/WishList,v 1.65 2006/03/09 15:10:16 ph10 Exp $
 
 EXIM 4 WISH LIST
 ----------------
@@ -295,16 +295,6 @@ David Carter
 So several warnings could be generated as the mailbox got bigger and bigger.
 ------------------------------------------------------------------------------
 
-(146) 15-May-2000 M  Allow SMTP error codes in retry rules
-
-This would allow special handling of certain errors from certain hosts. In
-particular, it would allow failing of certain 4xx codes.
-
-This is now available for 4xx responses to RCPT commands. Is anything more
-needed? Apparently, yes; there's been a request for a similar feature for MAIL
-commands.
-------------------------------------------------------------------------------
-
 (148) 15-May-2000 S  Warn recipient if message rejected for quota excession.
 Heinz Ekker
 
@@ -1255,11 +1245,6 @@ This is an option that turns all hard bounces into soft bounces. The idea is
 that it can be used as a safety-net while testing configurations. Instead of a
 local bounce, the message stays on the queue; instead of 5xx SMTP responses,
 4xx ones are given.
-
-The ability to do the opposite - turn 4xx into 5xx under certain circumstances
-might also be useful (e.g. after a certain time). This might best be done by
-extending the retry logic to recognize 4xx as a special error. (This is now
-done.)
 ------------------------------------------------------------------------------
 
 (202) 10-Oct-03 S  -bvsomething to do a callout after the verify
@@ -1297,7 +1282,6 @@ permanent ones after some fixed time.
 ------------------------------------------------------------------------------
 
 (209) 31-Oct-03 S  a way of making crashes in pipe commands temporary errors
-
 ------------------------------------------------------------------------------
 
 (210) 31-Oct-03 S  runtime option to change the daemon name used for tcprwappers
@@ -1330,13 +1314,6 @@ e.g. exigrep, eximstats, will be automatically handled if the logs are
 changed.)
 ------------------------------------------------------------------------------
 
-(216) 27-Nov-03 S  Option to bounce if required TLS doesn't happen
-
-This is for the smtp transport with hosts_require_tls set. Currently, it
-defers. Possibly the best approach is to make the error one that can be seen by
-the retry logic.
-------------------------------------------------------------------------------
-
 (217) 27-Nov-03 M  A function to pass back variables from Perl
 
 This is a function that can be called from Perl, to take a name and a value and
@@ -1602,12 +1579,6 @@ For example: mainlog_selector and rejectlog_selector, with log_selector setting
 both of them.
 ------------------------------------------------------------------------------
 
-(286) 21-Jul-04 M Distinguishing a larger number of errors
-
-For instance, detecting "connection reset by peer" (ENETRESET or ECONNRESET)
-might be useful.
-------------------------------------------------------------------------------
-
 (288) 10-Aug-04 M Option for verify to require MX
 
 e.g. verify=sender/require_mx
@@ -2018,10 +1989,5 @@ variables that are included in the data. This has to be done inside the lookup
 code, because of caching. Probably means we have to invent ewildlsearch and
 enwildlsearch.
 ------------------------------------------------------------------------------
-
-(350) 28-Feb-06 S Additional errors for retry rules
-
-(i) Unexpected connection close; (ii) mail_4xx.
-------------------------------------------------------------------------------
 --- HWM 350 ------------------------------------------------------------------
 ---------------------------- End of WishList ---------------------------------
index 2987559..f28bb32 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.326 2006/03/08 11:13:07 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.327 2006/03/09 15:10:16 ph10 Exp $
 
 Change log file for Exim from version 4.21
 -------------------------------------------
@@ -300,6 +300,9 @@ PH/58 Allow for the insertion of a newline as well as a space when a string
       is turned into more than one encoded-word during RFC 2047 encoding. The
       Sieve code now uses this.
 
+PH/59 Added the following errors that can be detected in retry rules: mail_4xx,
+      data_4xx, lost_connection, tls_required.
+
 
 Exim version 4.60
 -----------------
index 065ddd3..f3e34e7 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/NewStuff,v 1.95 2006/03/06 16:05:12 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/NewStuff,v 1.96 2006/03/09 15:10:16 ph10 Exp $
 
 New Features in Exim
 --------------------
@@ -165,6 +165,24 @@ PH/18 There is a new ACL modifier called "add_header" which does what its name
       described for WARN with "message" in section 39.19 of the 4.60 manual, is
       supported.
 
+PH/19 The following errors can now be detected in retry rules:
+
+      mail_4xx   This is like rcpt_4xx, but applies to MAIL commands
+
+      data_4xx   This is like rcpt_4xx, but applies to DATA commands and the
+                 response code after the end of the data
+
+      lost_connection  This error occurs when the server unexpectedly closes
+                 the SMTP connection. There may, of course, legitmate reasons
+                 for this (host died, network died), but if it repeats a lot
+                 for the same host, it indicates something odd.
+
+      tls_required  The server was required to use TLS (hosts_require_tls),
+                 but either did not offer it, or responded with 4xx to
+                 STARTTLS, or there was a problem setting up the TLS connection
+
+      Note that a 5xx response to STARTTLS is a permanent error.
+
 
 
 Version 4.60
index ec36d49..30ea05c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/exim.c,v 1.36 2006/02/23 10:25:01 ph10 Exp $ */
+/* $Cambridge: exim/src/src/exim.c,v 1.37 2006/03/09 15:10:16 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -3725,11 +3725,13 @@ if (test_retry_arg >= 0)
       return EXIT_FAILURE;
       }
 
-    /* For the rcpt_4xx errors, a value of 255 means "any", and a code > 100 as
-    an error is for matching codes to the decade. Turn them into a real error
-    code, off the decade. */
+    /* For the {MAIL,RCPT,DATA}_4xx errors, a value of 255 means "any", and a
+    code > 100 as an error is for matching codes to the decade. Turn them into
+    a real error code, off the decade. */
 
-    if (basic_errno == ERRNO_RCPT4XX)
+    if (basic_errno == ERRNO_MAIL4XX ||
+        basic_errno == ERRNO_RCPT4XX ||
+        basic_errno == ERRNO_DATA4XX)
       {
       int code = (more_errno >> 8) & 255;
       if (code == 255)
index 4975890..7de0c4b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/macros.h,v 1.23 2006/02/14 14:55:37 ph10 Exp $ */
+/* $Cambridge: exim/src/src/macros.h,v 1.24 2006/03/09 15:10:16 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -452,6 +452,8 @@ to conflict with system errno values. */
 #define ERRNO_AUTHFAIL       (-42)   /* When required by client */
 #define ERRNO_CONNECTTIMEOUT (-43)   /* Used internally in smtp transport */
 #define ERRNO_RCPT4XX        (-44)   /* RCPT gave 4xx error */
+#define ERRNO_MAIL4XX        (-45)   /* MAIL gave 4xx error */
+#define ERRNO_DATA4XX        (-46)   /* DATA gave 4xx error */
 
 /* These must be last, so all retry deferments can easily be identified */
 
index 59e75d0..d1911a7 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/readconf.c,v 1.21 2006/02/22 15:08:20 ph10 Exp $ */
+/* $Cambridge: exim/src/src/readconf.c,v 1.22 2006/03/09 15:10:16 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -3421,7 +3421,9 @@ else if (len == 7 && strncmpic(pp, US"timeout", len) == 0)
     }
   }
 
-else if (strncmpic(pp, US"rcpt_4", 6) == 0)
+else if (strncmpic(pp, US"mail_4", 6) == 0 ||
+         strncmpic(pp, US"rcpt_4", 6) == 0 ||
+         strncmpic(pp, US"data_4", 6) == 0)
   {
   BOOL bad = FALSE;
   int x = 255;                           /* means "any 4xx code" */
@@ -3438,18 +3440,24 @@ else if (strncmpic(pp, US"rcpt_4", 6) == 0)
     else if (a != 'x' || b != 'x') bad = TRUE;
     }
 
-  if (bad) return US"rcpt_4 must be followed by xx, dx, or dd, where "
-    "x is literal and d is any digit";
+  if (bad)
+    return string_sprintf("%.4s_4 must be followed by xx, dx, or dd, where "
+      "x is literal and d is any digit", pp);
 
-  *basic_errno = ERRNO_RCPT4XX;
+  *basic_errno = (*pp == 'm')? ERRNO_MAIL4XX :
+                 (*pp == 'r')? ERRNO_RCPT4XX : ERRNO_DATA4XX;
   *more_errno = x << 8;
   }
 
 else if (len == 4 && strncmpic(pp, US"auth", len) == 0 &&
          strncmpic(q+1, US"failed", p-q-1) == 0)
-  {
   *basic_errno = ERRNO_AUTHFAIL;
-  }
+
+else if (strcmpic(pp, US"lost_connection") == 0)
+  *basic_errno = ERRNO_SMTPCLOSED;
+
+else if (strcmpic(pp, US"tls_required") == 0)
+  *basic_errno = ERRNO_TLSREQUIRED;
 
 else if (len != 1 || Ustrncmp(pp, "*", 1) != 0)
   return string_sprintf("unknown or malformed retry error \"%.*s\"", p-pp, pp);
index dbfd3ce..ca61e5c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/retry.c,v 1.8 2006/02/16 16:37:57 ph10 Exp $ */
+/* $Cambridge: exim/src/src/retry.c,v 1.9 2006/03/09 15:10:16 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -414,20 +414,31 @@ for (yield = retries; yield != NULL; yield = yield->next)
         continue;
       }
 
-    /* Handle 4xx responses to RCPT. The code that was received is in the 2nd
-    least significant byte of more_errno (with 400 subtracted). The required
-    value is coded in the 2nd least significant byte of the yield->more_errno
-    field as follows:
+    /* The TLSREQUIRED error also covers TLSFAILURE. These are subtly different
+    errors, but not worth separating at this level. */
+
+    else if (yield->basic_errno == ERRNO_TLSREQUIRED)
+      {
+      if (basic_errno != ERRNO_TLSREQUIRED && basic_errno != ERRNO_TLSFAILURE)
+        continue;
+      }
+
+    /* Handle 4xx responses to MAIL, RCPT, or DATA. The code that was received
+    is in the 2nd least significant byte of more_errno (with 400 subtracted).
+    The required value is coded in the 2nd least significant byte of the
+    yield->more_errno field as follows:
 
       255     => any 4xx code
       >= 100  => the decade must match the value less 100
       < 100   => the exact value must match
     */
 
-    else if (yield->basic_errno == ERRNO_RCPT4XX)
+    else if (yield->basic_errno == ERRNO_MAIL4XX ||
+             yield->basic_errno == ERRNO_RCPT4XX ||
+             yield->basic_errno == ERRNO_DATA4XX)
       {
       int wanted;
-      if (basic_errno != ERRNO_RCPT4XX) continue;
+      if (basic_errno != yield->basic_errno) continue;
       wanted = (yield->more_errno >> 8) & 255;
       if (wanted != 255)
         {
index 79ad67d..969e45d 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/transports/lmtp.c,v 1.7 2006/02/07 11:19:03 ph10 Exp $ */
+/* $Cambridge: exim/src/src/transports/lmtp.c,v 1.8 2006/03/09 15:10:16 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -578,7 +578,14 @@ if (!lmtp_write_command(fd_in, "MAIL FROM:<%s>\r\n", return_path))
   goto WRITE_FAILED;
 
 if (!lmtp_read_response(out, buffer, sizeof(buffer), '2', timeout))
+  {
+  if (errno == 0 && buffer[0] == '4')
+    {
+    errno = ERRNO_MAIL4XX;
+    addrlist->more_errno |= ((buffer[1] - '0')*10 + buffer[2] - '0') << 8;
+    }
   goto RESPONSE_FAILED;
+  }
 
 /* Next, we hand over all the recipients. Some may be permanently or
 temporarily rejected; others may be accepted, for now. */
@@ -601,9 +608,8 @@ for (addr = addrlist; addr != NULL; addr = addr->next)
       string_printing(buffer));
     if (buffer[0] == '5') addr->transport_return = FAIL; else
       {
-      int bincode = (buffer[1] - '0')*10 + buffer[2] - '0';
       addr->basic_errno = ERRNO_RCPT4XX;
-      addr->more_errno |= bincode << 8;
+      addr->more_errno |= ((buffer[1] - '0')*10 + buffer[2] - '0') << 8;
       }
     }
   }
@@ -616,7 +622,14 @@ if (send_data)
 
   if (!lmtp_write_command(fd_in, "DATA\r\n")) goto WRITE_FAILED;
   if (!lmtp_read_response(out, buffer, sizeof(buffer), '3', timeout))
+    {
+    if (errno == 0 && buffer[0] == '4')
+      {
+      errno = ERRNO_DATA4XX;
+      addrlist->more_errno |= ((buffer[1] - '0')*10 + buffer[2] - '0') << 8;
+      }
     goto RESPONSE_FAILED;
+    }
 
   sigalrm_seen = FALSE;
   transport_write_timeout = timeout;
@@ -676,6 +689,11 @@ if (send_data)
 
     else
       {
+      if (buffer[0] == '4')
+        {
+        addr->basic_errno = ERRNO_DATA4XX;
+        addr->more_errno |= ((buffer[1] - '0')*10 + buffer[2] - '0') << 8;
+        }
       addr->message = string_sprintf("LMTP error after %s: %s", big_buffer,
         string_printing(buffer));
       addr->transport_return = (buffer[0] == '5')? FAIL : DEFER;
@@ -696,13 +714,15 @@ goto RETURN;
 
 /* Come here if any call to read_response, other than a response after the data
 phase, failed. Put the error in the top address - this will be replicated
-because the yield is still FALSE. Analyse the error, and if if isn't too bad,
-send a QUIT command. Wait for the response with a short timeout, so we don't
-wind up this process before the far end has had time to read the QUIT. */
+because the yield is still FALSE. (But omit ETIMEDOUT, as there will already be
+a suitable message.) Analyse the error, and if if isn't too bad, send a QUIT
+command. Wait for the response with a short timeout, so we don't wind up this
+process before the far end has had time to read the QUIT. */
 
 RESPONSE_FAILED:
 
 save_errno = errno;
+if (errno != ETIMEDOUT && errno != 0) addrlist->basic_errno = errno;
 addrlist->message = NULL;
 
 if (check_response(&save_errno, addrlist->more_errno,
index 9b204e0..e223bb1 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/transports/smtp.c,v 1.24 2006/03/01 16:07:16 ph10 Exp $ */
+/* $Cambridge: exim/src/src/transports/smtp.c,v 1.25 2006/03/09 15:10:16 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -598,6 +598,12 @@ if (pending_MAIL)
     if (errno == 0 && buffer[0] != 0)
       {
       uschar flushbuffer[4096];
+      int save_errno = 0;
+      if (buffer[0] == '4')
+        {
+        save_errno = ERRNO_MAIL4XX;
+        addr->more_errno |= ((buffer[1] - '0')*10 + buffer[2] - '0') << 8;
+        }
       while (count-- > 0)
         {
         if (!smtp_read_response(inblock, flushbuffer, sizeof(flushbuffer),
@@ -605,6 +611,7 @@ if (pending_MAIL)
             && (errno != 0 || flushbuffer[0] == 0))
           break;
         }
+      errno = save_errno;
       }
     return -3;
     }
@@ -683,11 +690,9 @@ while (count-- > 0)
 
     else
       {
-      int bincode = (buffer[1] - '0')*10 + buffer[2] - '0';
-
       addr->transport_return = DEFER;
       addr->basic_errno = ERRNO_RCPT4XX;
-      addr->more_errno |= bincode << 8;
+      addr->more_errno |= ((buffer[1] - '0')*10 + buffer[2] - '0') << 8;
 
       /* Log temporary errors if there are more hosts to be tried. */
 
@@ -720,7 +725,15 @@ if (pending_DATA != 0 &&
   int code;
   uschar *msg;
   BOOL pass_message;
-  if (pending_DATA > 0 || (yield & 1) != 0) return -3;
+  if (pending_DATA > 0 || (yield & 1) != 0)
+    {
+    if (errno == 0 && buffer[0] == '4')
+      {
+      errno = ERRNO_DATA4XX;
+      addrlist->more_errno |= ((buffer[1] - '0')*10 + buffer[2] - '0') << 8;
+      }
+    return -3;
+    }
   (void)check_response(host, &errno, 0, buffer, &code, &msg, &pass_message);
   DEBUG(D_transport) debug_printf("%s\nerror for DATA ignored: pipelining "
     "is in use and there were no good recipients\n", msg);
@@ -1340,7 +1353,15 @@ switch(rc)
 
   case +1:                /* Block was sent */
   if (!smtp_read_response(&inblock, buffer, sizeof(buffer), '2',
-    ob->command_timeout)) goto RESPONSE_FAILED;
+       ob->command_timeout))
+    {
+    if (errno == 0 && buffer[0] == '4')
+      {
+      errno = ERRNO_MAIL4XX;
+      addrlist->more_errno |= ((buffer[1] - '0')*10 + buffer[2] - '0') << 8;
+      }
+    goto RESPONSE_FAILED;
+    }
   pending_MAIL = FALSE;
   break;
   }
@@ -1521,8 +1542,16 @@ if (!ok) ok = TRUE; else
   /* For SMTP, we now read a single response that applies to the whole message.
   If it is OK, then all the addresses have been delivered. */
 
-  if (!lmtp) ok = smtp_read_response(&inblock, buffer, sizeof(buffer), '2',
-    ob->final_timeout);
+  if (!lmtp)
+    {
+    ok = smtp_read_response(&inblock, buffer, sizeof(buffer), '2',
+      ob->final_timeout);
+    if (!ok && errno == 0 && buffer[0] == '4')
+      {
+      errno = ERRNO_DATA4XX;
+      addrlist->more_errno |= ((buffer[1] - '0')*10 + buffer[2] - '0') << 8;
+      }
+    }
 
   /* For LMTP, we get back a response for every RCPT command that we sent;
   some may be accepted and some rejected. For those that get a response, their
@@ -1590,6 +1619,8 @@ if (!ok) ok = TRUE; else
             addr->transport_return = FAIL;
           else
             {
+            errno = ERRNO_DATA4XX;
+            addr->more_errno |= ((buffer[1] - '0')*10 + buffer[2] - '0') << 8;
             addr->transport_return = DEFER;
             retry_add_item(addr, addr->address_retry_key, 0);
             }
@@ -1694,61 +1725,83 @@ if (!ok)
       }
     }
 
-  /* If there was an I/O error or timeout or other transportation error,
-  indicated by errno being non-zero, defer all addresses and yield DEFER,
-  except for the case of failed add_headers expansion, or a transport filter
-  failure, when the yield should be ERROR, to stop it trying other hosts.
-
-  However, handle timeouts after MAIL FROM or "." and loss of connection after
+  /* We want to handle timeouts after MAIL or "." and loss of connection after
   "." specially. They can indicate a problem with the sender address or with
-  the contents of the message rather than a real error on the connection.
-  Therefore, treat these cases in the same way as a 4xx response.
+  the contents of the message rather than a real error on the connection. These
+  cases are treated in the same way as a 4xx response. This next bit of code
+  does the classification. */
 
-  The following condition tests for NOT these special cases. */
-
-  else if (save_errno != 0 &&
-           (save_errno != ETIMEDOUT ||
-             (Ustrncmp(smtp_command,"MAIL",4) != 0 &&
-              Ustrncmp(smtp_command,"end ",4) != 0)) &&
-           (save_errno != ERRNO_SMTPCLOSED ||
-              Ustrncmp(smtp_command,"end ",4) != 0))
+  else
     {
-    yield = (save_errno == ERRNO_CHHEADER_FAIL ||
-             save_errno == ERRNO_FILTER_FAIL)? ERROR : DEFER;
-    set_errno(addrlist, save_errno, message, DEFER, pass_message);
-    }
+    BOOL message_error;
 
-  /* Otherwise we have a message-specific error response from the remote
-  host. This is one of
-    (a) negative response or timeout after "mail from"
-    (b) negative response after "data"
-    (c) negative response or timeout or dropped connection after "."
-  It won't be a negative response or timeout after "rcpt to", as that is dealt
-  with separately above. The action in all cases is to set an appropriate
-  error code for all the addresses, but to leave yield set to OK because
-  the host itself has not failed. [It might in practice have failed for a
-  timeout after MAIL FROM, or "." but if so, we'll discover that at the next
-  delivery attempt.] For a temporary error, set the message_defer flag, and
-  write to the logs for information if this is not the last host. The error for
-  the last host will be logged as part of the address's log line. */
+    switch(save_errno)
+      {
+      case 0:
+      case ERRNO_MAIL4XX:
+      case ERRNO_DATA4XX:
+      message_error = TRUE;
+      break;
 
-  else
-    {
-    if (mua_wrapper) code = '5';  /* Force hard failure in wrapper mode */
+      case ETIMEDOUT:
+      message_error = Ustrncmp(smtp_command,"MAIL",4) == 0 ||
+                      Ustrncmp(smtp_command,"end ",4) == 0;
+      break;
+
+      case ERRNO_SMTPCLOSED:
+      message_error = Ustrncmp(smtp_command,"end ",4) == 0;
+      break;
+
+      default:
+      message_error = FALSE;
+      break;
+      }
 
-    set_errno(addrlist, save_errno, message, (code == '5')? FAIL : DEFER,
-      pass_message);
+    /* Handle the cases that are treated as message errors. These are:
 
-    /* If there's an errno, the message contains just the identity of
-    the host. */
+      (a) negative response or timeout after MAIL
+      (b) negative response after DATA
+      (c) negative response or timeout or dropped connection after "."
 
-    if (code != '5')     /* Anything other than 5 is treated as temporary */
+    It won't be a negative response or timeout after RCPT, as that is dealt
+    with separately above. The action in all cases is to set an appropriate
+    error code for all the addresses, but to leave yield set to OK because the
+    host itself has not failed. Of course, it might in practice have failed
+    when we've had a timeout, but if so, we'll discover that at the next
+    delivery attempt. For a temporary error, set the message_defer flag, and
+    write to the logs for information if this is not the last host. The error
+    for the last host will be logged as part of the address's log line. */
+
+    if (message_error)
       {
-      if (save_errno > 0)
-        message = US string_sprintf("%s: %s", message, strerror(save_errno));
-      if (host->next != NULL) log_write(0, LOG_MAIN, "%s", message);
-      deliver_msglog("%s %s\n", tod_stamp(tod_log), message);
-      *message_defer = TRUE;
+      if (mua_wrapper) code = '5';  /* Force hard failure in wrapper mode */
+      set_errno(addrlist, save_errno, message, (code == '5')? FAIL : DEFER,
+        pass_message);
+
+      /* If there's an errno, the message contains just the identity of
+      the host. */
+
+      if (code != '5')     /* Anything other than 5 is treated as temporary */
+        {
+        if (save_errno > 0)
+          message = US string_sprintf("%s: %s", message, strerror(save_errno));
+        if (host->next != NULL) log_write(0, LOG_MAIN, "%s", message);
+        deliver_msglog("%s %s\n", tod_stamp(tod_log), message);
+        *message_defer = TRUE;
+        }
+      }
+
+    /* Otherwise, we have an I/O error or a timeout other than after MAIL or
+    ".", or some other transportation error. We defer all addresses and yield
+    DEFER, except for the case of failed add_headers expansion, or a transport
+    filter failure, when the yield should be ERROR, to stop it trying other
+    hosts. */
+
+    else
+      {
+      yield = (save_errno == ERRNO_CHHEADER_FAIL ||
+               save_errno == ERRNO_FILTER_FAIL)? ERROR : DEFER;
+      set_errno(addrlist, save_errno, message, DEFER, pass_message);
       }
     }
   }
diff --git a/test/aux-fixed/5100.script.10 b/test/aux-fixed/5100.script.10
new file mode 100644 (file)
index 0000000..592cdd8
--- /dev/null
@@ -0,0 +1,14 @@
+220 Welcome to this LMTP simulation
+LHLO
+250-Hello there
+250 SIZE
+MAIL FROM
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+DATA
+450 Temporary error
+QUIT
+220 OK
index 4777bd2..23748ae 100644 (file)
@@ -17,6 +17,11 @@ gecos_name = CALLER_NAME
 
 begin routers
 
+r0:
+  driver = redirect
+  senders = :
+  data = :blackhole: discard bounces
+
 r1:
   driver = accept
   transport = t1
@@ -37,7 +42,10 @@ t1:
 
 begin retry
 
+*  lost_connection
+*  mail_4xx
 *  rcpt_4xx
+*  data_4xx
 *  *         F,1d,15m
 
 
index bda63bb..c08d4ce 100644 (file)
@@ -1,6 +1,7 @@
 # Exim test configuration 2010
 
 SERVER =
+HOSTS = 127.0.0.1 : HOSTIPV4
 
 exim_path = EXIM_PATH
 host_lookup_order = bydns
@@ -44,8 +45,16 @@ begin transports
 send_to_server:
   driver = smtp
   allow_localhost
-  hosts = 127.0.0.1 : HOSTIPV4
+  hosts = HOSTS
   hosts_require_tls = *
   port = PORT_D
 
+
+# ----- Retry -----
+
+begin retry
+
+* tls_required
+* *  F,1d,5m
+
 # End
index dc16568..1eb7ecb 100644 (file)
@@ -1,6 +1,7 @@
 # Exim test configuration 2110
 
 SERVER =
+HOSTS = 127.0.0.1 : HOSTIPV4
 
 exim_path = EXIM_PATH
 host_lookup_order = bydns
@@ -44,8 +45,16 @@ begin transports
 send_to_server:
   driver = smtp
   allow_localhost
-  hosts = 127.0.0.1 : HOSTIPV4
+  hosts = HOSTS
   hosts_require_tls = *
   port = PORT_D
 
+
+# ----- Retry -----
+
+begin retry
+
+* tls_required
+* *  F,1d,5m
+
 # End
index a1b5c67..09a3dc8 100644 (file)
@@ -51,6 +51,7 @@ lmtp:
 
 begin retry
 
+*  mail_4xx
 *  rcpt_4xx   F,1d,1m
 *  *          F,5d,1d
 
index 14321f4..4913cb0 100644 (file)
@@ -12,8 +12,8 @@
 1999-03-02 09:44:33 10HmaZ-0005vi-00 == b@test.ex R=client T=send_to_server defer (dd): Connection timed out: SMTP timeout while connected to 127.0.0.1 [127.0.0.1] after RCPT TO:<b@test.ex>
 1999-03-02 09:44:33 10HmaZ-0005vi-00 == c@test.ex R=client T=send_to_server defer (dd): Connection timed out: SMTP timeout while connected to 127.0.0.1 [127.0.0.1] after RCPT TO:<b@test.ex>
 1999-03-02 09:44:33 10HmbA-0005vi-00 <= CALLER@test.ex U=CALLER P=local S=sss
-1999-03-02 09:44:33 10HmbA-0005vi-00 == a@test.ex R=client T=send_to_server defer (0): SMTP error from remote mail server after MAIL FROM:<CALLER@test.ex>: host 127.0.0.1 [127.0.0.1]: 451 Temp error
-1999-03-02 09:44:33 10HmbA-0005vi-00 == b@test.ex R=client T=send_to_server defer (0): SMTP error from remote mail server after MAIL FROM:<CALLER@test.ex>: host 127.0.0.1 [127.0.0.1]: 451 Temp error
+1999-03-02 09:44:33 10HmbA-0005vi-00 == a@test.ex R=client T=send_to_server defer (-45): SMTP error from remote mail server after MAIL FROM:<CALLER@test.ex>: host 127.0.0.1 [127.0.0.1]: 451 Temp error
+1999-03-02 09:44:33 10HmbA-0005vi-00 == b@test.ex R=client T=send_to_server defer (-45): SMTP error from remote mail server after MAIL FROM:<CALLER@test.ex>: host 127.0.0.1 [127.0.0.1]: 451 Temp error
 1999-03-02 09:44:33 10HmbB-0005vi-00 <= CALLER@test.ex U=CALLER P=local S=sss
 1999-03-02 09:44:33 10HmbB-0005vi-00 ** a@test.ex R=client T=send_to_server: SMTP error from remote mail server after MAIL FROM:<CALLER@test.ex>: host 127.0.0.1 [127.0.0.1]: 550 Perm error
 1999-03-02 09:44:33 10HmbB-0005vi-00 ** b@test.ex R=client T=send_to_server: SMTP error from remote mail server after MAIL FROM:<CALLER@test.ex>: host 127.0.0.1 [127.0.0.1]: 550 Perm error
 1999-03-02 09:44:33 10HmbJ-0005vi-00 Completed
 1999-03-02 09:44:33 10HmbI-0005vi-00 Completed
 1999-03-02 09:44:33 10HmbK-0005vi-00 <= CALLER@test.ex U=CALLER P=local S=sss
-1999-03-02 09:44:33 10HmbK-0005vi-00 == a@test.ex R=client T=send_to_server defer (0): SMTP error from remote mail server after pipelined DATA: host 127.0.0.1 [127.0.0.1]: 403 Sorry temp data error
-1999-03-02 09:44:33 10HmbK-0005vi-00 == b@test.ex R=client T=send_to_server defer (0): SMTP error from remote mail server after pipelined DATA: host 127.0.0.1 [127.0.0.1]: 403 Sorry temp data error
+1999-03-02 09:44:33 10HmbK-0005vi-00 == a@test.ex R=client T=send_to_server defer (-46): SMTP error from remote mail server after pipelined DATA: host 127.0.0.1 [127.0.0.1]: 403 Sorry temp data error
+1999-03-02 09:44:33 10HmbK-0005vi-00 == b@test.ex R=client T=send_to_server defer (-46): SMTP error from remote mail server after pipelined DATA: host 127.0.0.1 [127.0.0.1]: 403 Sorry temp data error
 1999-03-02 09:44:33 10HmbL-0005vi-00 <= CALLER@test.ex U=CALLER P=local S=sss
-1999-03-02 09:44:33 10HmbL-0005vi-00 == a@test.ex R=client T=send_to_server defer (0): SMTP error from remote mail server after pipelined DATA: host 127.0.0.1 [127.0.0.1]: 403 Sorry temp data error
+1999-03-02 09:44:33 10HmbL-0005vi-00 == a@test.ex R=client T=send_to_server defer (-46): SMTP error from remote mail server after pipelined DATA: host 127.0.0.1 [127.0.0.1]: 403 Sorry temp data error
 1999-03-02 09:44:33 10HmbL-0005vi-00 ** b@test.ex R=client T=send_to_server: SMTP error from remote mail server after RCPT TO:<b@test.ex>: host 127.0.0.1 [127.0.0.1]: 550 NO
 1999-03-02 09:44:33 10HmbL-0005vi-00 ** c@test.ex R=client T=send_to_server: SMTP error from remote mail server after RCPT TO:<c@test.ex>: host 127.0.0.1 [127.0.0.1]: 550 NO
 1999-03-02 09:44:33 10HmbL-0005vi-00 ** d@test.ex R=client T=send_to_server: SMTP error from remote mail server after RCPT TO:<d@test.ex>: host 127.0.0.1 [127.0.0.1]: 550 NO
index 8bd74c4..61f08ff 100644 (file)
@@ -1,7 +1,64 @@
 1999-03-02 09:44:33 10HmaX-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
-1999-03-02 09:44:33 10HmaX-0005vi-00 == userx@x.y R=r1 T=t1 defer (-44): SMTP error from remote mail server after RCPT TO:<userx@x.y>: host 127.0.0.1 [127.0.0.1]: 452 temporary error
+1999-03-02 09:44:33 10HmaX-0005vi-00 == userx@x.y R=r1 T=t1 defer (-45): SMTP error from remote mail server after MAIL FROM:<CALLER@myhost.test.ex>: host 127.0.0.1 [127.0.0.1]: 452 temporary error
 1999-03-02 09:44:33 10HmaX-0005vi-00 ** userx@x.y: retry timeout exceeded
 1999-03-02 09:44:33 10HmaY-0005vi-00 <= <> R=10HmaX-0005vi-00 U=EXIMUSER P=local S=sss
-1999-03-02 09:44:33 10HmaY-0005vi-00 127.0.0.1 [127.0.0.1] Connection refused
-1999-03-02 09:44:33 10HmaY-0005vi-00 == CALLER@myhost.test.ex R=r1 T=t1 defer (dd): Connection refused
+1999-03-02 09:44:33 10HmaY-0005vi-00 => :blackhole: <CALLER@myhost.test.ex> R=r0
+1999-03-02 09:44:33 10HmaY-0005vi-00 Completed
 1999-03-02 09:44:33 10HmaX-0005vi-00 Completed
+1999-03-02 09:44:33 10HmaZ-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
+1999-03-02 09:44:33 10HmaZ-0005vi-00 == userx@x.y R=r1 T=t1 defer (-44): SMTP error from remote mail server after RCPT TO:<userx@x.y>: host 127.0.0.1 [127.0.0.1]: 452 temporary error
+1999-03-02 09:44:33 10HmaZ-0005vi-00 ** userx@x.y: retry timeout exceeded
+1999-03-02 09:44:33 10HmbA-0005vi-00 <= <> R=10HmaZ-0005vi-00 U=EXIMUSER P=local S=sss
+1999-03-02 09:44:33 10HmbA-0005vi-00 => :blackhole: <CALLER@myhost.test.ex> R=r0
+1999-03-02 09:44:33 10HmbA-0005vi-00 Completed
+1999-03-02 09:44:33 10HmaZ-0005vi-00 Completed
+1999-03-02 09:44:33 10HmbB-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
+1999-03-02 09:44:33 10HmbB-0005vi-00 == userx@x.y R=r1 T=t1 defer (-46): SMTP error from remote mail server after DATA: host 127.0.0.1 [127.0.0.1]: 452 temporary error
+1999-03-02 09:44:33 10HmbB-0005vi-00 ** userx@x.y: retry timeout exceeded
+1999-03-02 09:44:33 10HmbC-0005vi-00 <= <> R=10HmbB-0005vi-00 U=EXIMUSER P=local S=sss
+1999-03-02 09:44:33 10HmbC-0005vi-00 => :blackhole: <CALLER@myhost.test.ex> R=r0
+1999-03-02 09:44:33 10HmbC-0005vi-00 Completed
+1999-03-02 09:44:33 10HmbB-0005vi-00 Completed
+1999-03-02 09:44:33 10HmbD-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
+1999-03-02 09:44:33 10HmbD-0005vi-00 == userx@x.y R=r1 T=t1 defer (-46): SMTP error from remote mail server after end of data: host 127.0.0.1 [127.0.0.1]: 452 temporary error
+1999-03-02 09:44:33 10HmbD-0005vi-00 ** userx@x.y: retry timeout exceeded
+1999-03-02 09:44:33 10HmbE-0005vi-00 <= <> R=10HmbD-0005vi-00 U=EXIMUSER P=local S=sss
+1999-03-02 09:44:33 10HmbE-0005vi-00 => :blackhole: <CALLER@myhost.test.ex> R=r0
+1999-03-02 09:44:33 10HmbE-0005vi-00 Completed
+1999-03-02 09:44:33 10HmbD-0005vi-00 Completed
+1999-03-02 09:44:33 10HmbF-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
+1999-03-02 09:44:33 10HmbF-0005vi-00 == userx@x.y R=r1 T=t1 defer (-45): SMTP error from remote mail server after MAIL FROM:<CALLER@myhost.test.ex>: host 127.0.0.1 [127.0.0.1]: 452 temporary error
+1999-03-02 09:44:33 10HmbF-0005vi-00 ** userx@x.y: retry timeout exceeded
+1999-03-02 09:44:33 10HmbG-0005vi-00 <= <> R=10HmbF-0005vi-00 U=EXIMUSER P=local S=sss
+1999-03-02 09:44:33 10HmbG-0005vi-00 => :blackhole: <CALLER@myhost.test.ex> R=r0
+1999-03-02 09:44:33 10HmbG-0005vi-00 Completed
+1999-03-02 09:44:33 10HmbF-0005vi-00 Completed
+1999-03-02 09:44:33 10HmbH-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
+1999-03-02 09:44:33 10HmbH-0005vi-00 == userx@x.y R=r1 T=t1 defer (-44): SMTP error from remote mail server after RCPT TO:<userx@x.y>: host 127.0.0.1 [127.0.0.1]: 452 temporary error
+1999-03-02 09:44:33 10HmbH-0005vi-00 ** userx@x.y: retry timeout exceeded
+1999-03-02 09:44:33 10HmbI-0005vi-00 <= <> R=10HmbH-0005vi-00 U=EXIMUSER P=local S=sss
+1999-03-02 09:44:33 10HmbI-0005vi-00 => :blackhole: <CALLER@myhost.test.ex> R=r0
+1999-03-02 09:44:33 10HmbI-0005vi-00 Completed
+1999-03-02 09:44:33 10HmbH-0005vi-00 Completed
+1999-03-02 09:44:33 10HmbJ-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
+1999-03-02 09:44:33 10HmbJ-0005vi-00 == userx@x.y R=r1 T=t1 defer (-46): SMTP error from remote mail server after pipelined DATA: host 127.0.0.1 [127.0.0.1]: 452 temporary error
+1999-03-02 09:44:33 10HmbJ-0005vi-00 ** userx@x.y: retry timeout exceeded
+1999-03-02 09:44:33 10HmbK-0005vi-00 <= <> R=10HmbJ-0005vi-00 U=EXIMUSER P=local S=sss
+1999-03-02 09:44:33 10HmbK-0005vi-00 => :blackhole: <CALLER@myhost.test.ex> R=r0
+1999-03-02 09:44:33 10HmbK-0005vi-00 Completed
+1999-03-02 09:44:33 10HmbJ-0005vi-00 Completed
+1999-03-02 09:44:33 10HmbL-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
+1999-03-02 09:44:33 10HmbL-0005vi-00 == userx@x.y R=r1 T=t1 defer (-46): SMTP error from remote mail server after end of data: host 127.0.0.1 [127.0.0.1]: 452 temporary error
+1999-03-02 09:44:33 10HmbL-0005vi-00 ** userx@x.y: retry timeout exceeded
+1999-03-02 09:44:33 10HmbM-0005vi-00 <= <> R=10HmbL-0005vi-00 U=EXIMUSER P=local S=sss
+1999-03-02 09:44:33 10HmbM-0005vi-00 => :blackhole: <CALLER@myhost.test.ex> R=r0
+1999-03-02 09:44:33 10HmbM-0005vi-00 Completed
+1999-03-02 09:44:33 10HmbL-0005vi-00 Completed
+1999-03-02 09:44:33 10HmbN-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
+1999-03-02 09:44:33 10HmbN-0005vi-00 Remote host 127.0.0.1 [127.0.0.1] closed connection in response to RCPT TO:<userx@x.y>
+1999-03-02 09:44:33 10HmbN-0005vi-00 == userx@x.y R=r1 T=t1 defer (-18): Remote host 127.0.0.1 [127.0.0.1] closed connection in response to RCPT TO:<userx@x.y>
+1999-03-02 09:44:33 10HmbN-0005vi-00 ** userx@x.y: retry timeout exceeded
+1999-03-02 09:44:33 10HmbO-0005vi-00 <= <> R=10HmbN-0005vi-00 U=EXIMUSER P=local S=sss
+1999-03-02 09:44:33 10HmbO-0005vi-00 => :blackhole: <CALLER@myhost.test.ex> R=r0
+1999-03-02 09:44:33 10HmbO-0005vi-00 Completed
+1999-03-02 09:44:33 10HmbN-0005vi-00 Completed
index 62178db..ae2dd0f 100644 (file)
@@ -1,5 +1,5 @@
 1999-03-02 09:44:33 10HmaX-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
-1999-03-02 09:44:33 10HmaX-0005vi-00 == userx@x.y R=r1 T=t1 defer (0): SMTP error from remote mail server after MAIL FROM:<CALLER@myhost.test.ex>: host 127.0.0.1 [127.0.0.1]: 450 DELAY
+1999-03-02 09:44:33 10HmaX-0005vi-00 == userx@x.y R=r1 T=t1 defer (-45): SMTP error from remote mail server after MAIL FROM:<CALLER@myhost.test.ex>: host 127.0.0.1 [127.0.0.1]: 450 DELAY
 1999-03-02 09:44:33 Start queue run: pid=pppp
 1999-03-02 09:44:33 10HmaX-0005vi-00 == userx@x.y R=r1 T=t1 defer (dd): Connection timed out: SMTP timeout while connected to 127.0.0.1 [127.0.0.1] after end of data (ddd bytes written)
 1999-03-02 09:44:33 10HmaX-0005vi-00 ** userx@x.y: retry timeout exceeded
index e140c6e..1e5f075 100644 (file)
@@ -1,3 +1,3 @@
 1999-03-02 09:44:33 10HmaX-0005vi-00 <= CALLER@the.local.host.name U=CALLER P=local S=sss
 1999-03-02 09:44:33 10HmaX-0005vi-00 SMTP error from remote mail server after MAIL FROM:<CALLER@the.local.host.name>: host 127.0.0.1 [127.0.0.1]: 450 Temporary error
-1999-03-02 09:44:33 10HmaX-0005vi-00 == userx@test.ex R=r1 T=t1 defer (0): SMTP error from remote mail server after MAIL FROM:<CALLER@the.local.host.name>: host ::1 [::1]: 450 Temporary error
+1999-03-02 09:44:33 10HmaX-0005vi-00 == userx@test.ex R=r1 T=t1 defer (-45): SMTP error from remote mail server after MAIL FROM:<CALLER@the.local.host.name>: host ::1 [::1]: 450 Temporary error
index 713adc4..134d5e7 100644 (file)
@@ -4,6 +4,13 @@
 1999-03-02 09:44:33 10HmaX-0005vi-00 => userx@test.ex R=client T=send_to_server H=ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4] X=TLS-1.0:RSA_AES_256_CBC_SHA1:32
 1999-03-02 09:44:33 10HmaX-0005vi-00 Completed
 1999-03-02 09:44:33 End queue run: pid=pppp -qf
+1999-03-02 09:44:33 Start queue run: pid=pppp -qf
+1999-03-02 09:44:33 10HmaY-0005vi-00 a TLS session is required for 127.0.0.1 [127.0.0.1], but the server did not offer TLS support
+1999-03-02 09:44:33 10HmaY-0005vi-00 == userx@test.ex R=client T=send_to_server defer (-38): a TLS session is required for 127.0.0.1 [127.0.0.1], but the server did not offer TLS support
+1999-03-02 09:44:33 10HmaY-0005vi-00 ** userx@test.ex: retry timeout exceeded
+1999-03-02 09:44:33 10HmaZ-0005vi-00 <= <> R=10HmaY-0005vi-00 U=EXIMUSER P=local S=sss
+1999-03-02 09:44:33 10HmaY-0005vi-00 Completed
+1999-03-02 09:44:33 End queue run: pid=pppp -qf
 
 ******** SERVER ********
 1999-03-02 09:44:33 exim x.yz daemon started: pid=pppp, no queue runs, listening for SMTP on port 1225
index 675b2b4..b863b37 100644 (file)
@@ -4,6 +4,13 @@
 1999-03-02 09:44:33 10HmaX-0005vi-00 => userx@test.ex R=client T=send_to_server H=ip4.ip4.ip4.ip4 [ip4.ip4.ip4.ip4] X=TLSv1:AES256-SHA:256
 1999-03-02 09:44:33 10HmaX-0005vi-00 Completed
 1999-03-02 09:44:33 End queue run: pid=pppp -qf
+1999-03-02 09:44:33 Start queue run: pid=pppp -qf
+1999-03-02 09:44:33 10HmaY-0005vi-00 a TLS session is required for 127.0.0.1 [127.0.0.1], but the server did not offer TLS support
+1999-03-02 09:44:33 10HmaY-0005vi-00 == userx@test.ex R=client T=send_to_server defer (-38): a TLS session is required for 127.0.0.1 [127.0.0.1], but the server did not offer TLS support
+1999-03-02 09:44:33 10HmaY-0005vi-00 ** userx@test.ex: retry timeout exceeded
+1999-03-02 09:44:33 10HmaZ-0005vi-00 <= <> R=10HmaY-0005vi-00 U=EXIMUSER P=local S=sss
+1999-03-02 09:44:33 10HmaY-0005vi-00 Completed
+1999-03-02 09:44:33 End queue run: pid=pppp -qf
 
 ******** SERVER ********
 1999-03-02 09:44:33 exim x.yz daemon started: pid=pppp, no queue runs, listening for SMTP on port 1225
index 4c8fa32..ec4a807 100644 (file)
@@ -32,8 +32,13 @@ MAIL FROM
 QUIT
 <<< QUIT
 250 OK
-1999-03-02 09:44:33 10HmbB-0005vi-00 == userx@myhost.test.ex R=smartuser T=lmtp defer (-1): LMTP error after MAIL FROM:<CALLER@myhost.test.ex>: 450 Don't like that sender just at the moment
-1999-03-02 09:44:33 10HmbC-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
+1999-03-02 09:44:33 10HmbB-0005vi-00 == userx@myhost.test.ex R=smartuser T=lmtp defer (-45): LMTP error after MAIL FROM:<CALLER@myhost.test.ex>: 450 Don't like that sender just at the moment
+1999-03-02 09:44:33 10HmbB-0005vi-00 ** userx@myhost.test.ex: retry timeout exceeded
+1999-03-02 09:44:33 10HmbC-0005vi-00 <= <> R=10HmbB-0005vi-00 U=EXIMUSER P=local S=sss
+1999-03-02 09:44:33 10HmbC-0005vi-00 => :blackhole: <CALLER@myhost.test.ex> R=bounces
+1999-03-02 09:44:33 10HmbC-0005vi-00 Completed
+1999-03-02 09:44:33 10HmbB-0005vi-00 Completed
+1999-03-02 09:44:33 10HmbD-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
 220 Welcome to this LMTP simulation
 LHLO
 <<< LHLO myhost.test.ex
@@ -66,9 +71,9 @@ DATA
 .
 <<< Received: from CALLER by myhost.test.ex with local (Exim x.yz)
 <<<    (envelope-from <CALLER@myhost.test.ex>)
-<<<    id 10HmbC-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000
+<<<    id 10HmbD-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000
 <<< script: 05
-<<< Message-Id: <E10HmbC-0005vi-00@myhost.test.ex>
+<<< Message-Id: <E10HmbD-0005vi-00@myhost.test.ex>
 <<< From: CALLER_NAME <CALLER@myhost.test.ex>
 <<< Date: Tue, 2 Mar 1999 09:44:33 +0000
 <<< 
@@ -81,16 +86,16 @@ DATA
 QUIT
 <<< QUIT
 250 OK
-1999-03-02 09:44:33 10HmbC-0005vi-00 => userx <userx@myhost.test.ex> R=smartuser T=lmtp
-1999-03-02 09:44:33 10HmbC-0005vi-00 == jack@myhost.test.ex R=smartuser T=lmtp defer (-1): LMTP error after end of data: 450 Number 2 is now delayed
-1999-03-02 09:44:33 10HmbC-0005vi-00 ** jill@myhost.test.ex R=smartuser T=lmtp: LMTP error after end of data: 550 Number 3 is now rejected
-1999-03-02 09:44:33 10HmbC-0005vi-00 == tom@myhost.test.ex R=smartuser T=lmtp defer (-44): LMTP error after RCPT TO:<tom@myhost.test.ex>: 450 This one is delayed on RCPT
-1999-03-02 09:44:33 10HmbC-0005vi-00 ** dick@myhost.test.ex R=smartuser T=lmtp: LMTP error after RCPT TO:<dick@myhost.test.ex>: 550 This one is unknown on RCPT
-1999-03-02 09:44:33 10HmbC-0005vi-00 -> harry <harry@myhost.test.ex> R=smartuser T=lmtp
-1999-03-02 09:44:33 10HmbD-0005vi-00 <= <> R=10HmbC-0005vi-00 U=EXIMUSER P=local S=sss
-1999-03-02 09:44:33 10HmbD-0005vi-00 => :blackhole: <CALLER@myhost.test.ex> R=bounces
-1999-03-02 09:44:33 10HmbD-0005vi-00 Completed
-1999-03-02 09:44:33 10HmbE-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
+1999-03-02 09:44:33 10HmbD-0005vi-00 => userx <userx@myhost.test.ex> R=smartuser T=lmtp
+1999-03-02 09:44:33 10HmbD-0005vi-00 == jack@myhost.test.ex R=smartuser T=lmtp defer (-46): LMTP error after end of data: 450 Number 2 is now delayed
+1999-03-02 09:44:33 10HmbD-0005vi-00 ** jill@myhost.test.ex R=smartuser T=lmtp: LMTP error after end of data: 550 Number 3 is now rejected
+1999-03-02 09:44:33 10HmbD-0005vi-00 == tom@myhost.test.ex R=smartuser T=lmtp defer (-44): LMTP error after RCPT TO:<tom@myhost.test.ex>: 450 This one is delayed on RCPT
+1999-03-02 09:44:33 10HmbD-0005vi-00 ** dick@myhost.test.ex R=smartuser T=lmtp: LMTP error after RCPT TO:<dick@myhost.test.ex>: 550 This one is unknown on RCPT
+1999-03-02 09:44:33 10HmbD-0005vi-00 -> harry <harry@myhost.test.ex> R=smartuser T=lmtp
+1999-03-02 09:44:33 10HmbE-0005vi-00 <= <> R=10HmbD-0005vi-00 U=EXIMUSER P=local S=sss
+1999-03-02 09:44:33 10HmbE-0005vi-00 => :blackhole: <CALLER@myhost.test.ex> R=bounces
+1999-03-02 09:44:33 10HmbE-0005vi-00 Completed
+1999-03-02 09:44:33 10HmbF-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
 220 Welcome to this LMTP simulation
 LHLO
 <<< LHLO myhost.test.ex
@@ -123,25 +128,25 @@ DATA
 .
 <<< Received: from CALLER by myhost.test.ex with local (Exim x.yz)
 <<<    (envelope-from <CALLER@myhost.test.ex>)
-<<<    id 10HmbE-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000
+<<<    id 10HmbF-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000
 <<< script: 06
-<<< Message-Id: <E10HmbE-0005vi-00@myhost.test.ex>
+<<< Message-Id: <E10HmbF-0005vi-00@myhost.test.ex>
 <<< From: CALLER_NAME <CALLER@myhost.test.ex>
 <<< Date: Tue, 2 Mar 1999 09:44:33 +0000
 <<< 
 <<< This is a test message.
 <<< .
 250 Number 1 is OK
-1999-03-02 09:44:33 10HmbE-0005vi-00 => userx <userx@myhost.test.ex> R=smartuser T=lmtp
-1999-03-02 09:44:33 10HmbE-0005vi-00 == jack@myhost.test.ex R=smartuser T=lmtp defer (-1): LMTP timeout after end of data (ddd bytes written)
-1999-03-02 09:44:33 10HmbE-0005vi-00 == jill@myhost.test.ex R=smartuser T=lmtp defer (-1): LMTP timeout after end of data (ddd bytes written)
-1999-03-02 09:44:33 10HmbE-0005vi-00 == tom@myhost.test.ex R=smartuser T=lmtp defer (-44): LMTP error after RCPT TO:<tom@myhost.test.ex>: 450 This one is delayed on RCPT
-1999-03-02 09:44:33 10HmbE-0005vi-00 ** dick@myhost.test.ex R=smartuser T=lmtp: LMTP error after RCPT TO:<dick@myhost.test.ex>: 550 This one is unknown on RCPT
-1999-03-02 09:44:33 10HmbE-0005vi-00 == harry@myhost.test.ex R=smartuser T=lmtp defer (-1): LMTP timeout after end of data (ddd bytes written)
-1999-03-02 09:44:33 10HmbF-0005vi-00 <= <> R=10HmbE-0005vi-00 U=EXIMUSER P=local S=sss
-1999-03-02 09:44:33 10HmbF-0005vi-00 => :blackhole: <CALLER@myhost.test.ex> R=bounces
-1999-03-02 09:44:33 10HmbF-0005vi-00 Completed
-1999-03-02 09:44:33 10HmbG-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
+1999-03-02 09:44:33 10HmbF-0005vi-00 => userx <userx@myhost.test.ex> R=smartuser T=lmtp
+1999-03-02 09:44:33 10HmbF-0005vi-00 == jack@myhost.test.ex R=smartuser T=lmtp defer (-1): LMTP timeout after end of data (ddd bytes written)
+1999-03-02 09:44:33 10HmbF-0005vi-00 == jill@myhost.test.ex R=smartuser T=lmtp defer (-1): LMTP timeout after end of data (ddd bytes written)
+1999-03-02 09:44:33 10HmbF-0005vi-00 == tom@myhost.test.ex R=smartuser T=lmtp defer (-44): LMTP error after RCPT TO:<tom@myhost.test.ex>: 450 This one is delayed on RCPT
+1999-03-02 09:44:33 10HmbF-0005vi-00 ** dick@myhost.test.ex R=smartuser T=lmtp: LMTP error after RCPT TO:<dick@myhost.test.ex>: 550 This one is unknown on RCPT
+1999-03-02 09:44:33 10HmbF-0005vi-00 == harry@myhost.test.ex R=smartuser T=lmtp defer (-1): LMTP timeout after end of data (ddd bytes written)
+1999-03-02 09:44:33 10HmbG-0005vi-00 <= <> R=10HmbF-0005vi-00 U=EXIMUSER P=local S=sss
+1999-03-02 09:44:33 10HmbG-0005vi-00 => :blackhole: <CALLER@myhost.test.ex> R=bounces
+1999-03-02 09:44:33 10HmbG-0005vi-00 Completed
+1999-03-02 09:44:33 10HmbH-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
 220 Welcome to this LMTP simulation
 LHLO
 <<< LHLO myhost.test.ex
@@ -169,13 +174,13 @@ RCPT TO
 <<< RCPT TO:<harry@myhost.test.ex>
 250 OK
 DATA
-1999-03-02 09:44:33 10HmbG-0005vi-00 == userx@myhost.test.ex R=smartuser T=lmtp defer (-1): LMTP timeout after DATA
-1999-03-02 09:44:33 10HmbG-0005vi-00 == jack@myhost.test.ex R=smartuser T=lmtp defer (-1): LMTP timeout after DATA
-1999-03-02 09:44:33 10HmbG-0005vi-00 == jill@myhost.test.ex R=smartuser T=lmtp defer (-1): LMTP timeout after DATA
-1999-03-02 09:44:33 10HmbG-0005vi-00 == tom@myhost.test.ex R=smartuser T=lmtp defer (-1): LMTP timeout after DATA
-1999-03-02 09:44:33 10HmbG-0005vi-00 == dick@myhost.test.ex R=smartuser T=lmtp defer (-1): LMTP timeout after DATA
-1999-03-02 09:44:33 10HmbG-0005vi-00 == harry@myhost.test.ex R=smartuser T=lmtp defer (-1): LMTP timeout after DATA
-1999-03-02 09:44:33 10HmbH-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
+1999-03-02 09:44:33 10HmbH-0005vi-00 == userx@myhost.test.ex R=smartuser T=lmtp defer (-1): LMTP timeout after DATA
+1999-03-02 09:44:33 10HmbH-0005vi-00 == jack@myhost.test.ex R=smartuser T=lmtp defer (-1): LMTP timeout after DATA
+1999-03-02 09:44:33 10HmbH-0005vi-00 == jill@myhost.test.ex R=smartuser T=lmtp defer (-1): LMTP timeout after DATA
+1999-03-02 09:44:33 10HmbH-0005vi-00 == tom@myhost.test.ex R=smartuser T=lmtp defer (-1): LMTP timeout after DATA
+1999-03-02 09:44:33 10HmbH-0005vi-00 == dick@myhost.test.ex R=smartuser T=lmtp defer (-1): LMTP timeout after DATA
+1999-03-02 09:44:33 10HmbH-0005vi-00 == harry@myhost.test.ex R=smartuser T=lmtp defer (-1): LMTP timeout after DATA
+1999-03-02 09:44:33 10HmbI-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
 220 Welcome to this LMTP simulation
 LHLO
 <<< LHLO myhost.test.ex
@@ -196,9 +201,9 @@ DATA
 .
 <<< Received: from CALLER by myhost.test.ex with local (Exim x.yz)
 <<<    (envelope-from <CALLER@myhost.test.ex>)
-<<<    id 10HmbH-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000
+<<<    id 10HmbI-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000
 <<< script: 08
-<<< Message-Id: <E10HmbH-0005vi-00@myhost.test.ex>
+<<< Message-Id: <E10HmbI-0005vi-00@myhost.test.ex>
 <<< From: CALLER_NAME <CALLER@myhost.test.ex>
 <<< Date: Tue, 2 Mar 1999 09:44:33 +0000
 <<< 
@@ -209,10 +214,10 @@ DATA
 QUIT
 <<< QUIT
 220 OK
-1999-03-02 09:44:33 10HmbH-0005vi-00 => jack <jack@myhost.test.ex> R=smartuser T=lmtp
-1999-03-02 09:44:33 10HmbH-0005vi-00 -> jill <jill@myhost.test.ex> R=smartuser T=lmtp
-1999-03-02 09:44:33 10HmbH-0005vi-00 Completed
-1999-03-02 09:44:33 10HmbI-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
+1999-03-02 09:44:33 10HmbI-0005vi-00 => jack <jack@myhost.test.ex> R=smartuser T=lmtp
+1999-03-02 09:44:33 10HmbI-0005vi-00 -> jill <jill@myhost.test.ex> R=smartuser T=lmtp
+1999-03-02 09:44:33 10HmbI-0005vi-00 Completed
+1999-03-02 09:44:33 10HmbJ-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
 220 Welcome to this LMTP simulation
 LHLO
 <<< LHLO myhost.test.ex
@@ -234,9 +239,9 @@ DATA
 .
 <<< Received: from CALLER by myhost.test.ex with local (Exim x.yz)
 <<<    (envelope-from <CALLER@myhost.test.ex>)
-<<<    id 10HmbI-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000
+<<<    id 10HmbJ-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000
 <<< script: 09
-<<< Message-Id: <E10HmbI-0005vi-00@myhost.test.ex>
+<<< Message-Id: <E10HmbJ-0005vi-00@myhost.test.ex>
 <<< From: CALLER_NAME <CALLER@myhost.test.ex>
 <<< Date: Tue, 2 Mar 1999 09:44:33 +0000
 <<< 
@@ -247,6 +252,29 @@ DATA
 QUIT
 <<< QUIT
 220 OK
-1999-03-02 09:44:33 10HmbI-0005vi-00 => jack <jack@myhost.test.ex> R=smartuser T=lmtp
-1999-03-02 09:44:33 10HmbI-0005vi-00 -> jill <jill@myhost.test.ex> R=smartuser T=lmtp
-1999-03-02 09:44:33 10HmbI-0005vi-00 Completed
+1999-03-02 09:44:33 10HmbJ-0005vi-00 => jack <jack@myhost.test.ex> R=smartuser T=lmtp
+1999-03-02 09:44:33 10HmbJ-0005vi-00 -> jill <jill@myhost.test.ex> R=smartuser T=lmtp
+1999-03-02 09:44:33 10HmbJ-0005vi-00 Completed
+1999-03-02 09:44:33 10HmbK-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
+220 Welcome to this LMTP simulation
+LHLO
+<<< LHLO myhost.test.ex
+250-Hello there
+250 SIZE
+MAIL FROM
+<<< MAIL FROM:<CALLER@myhost.test.ex>
+250 OK
+RCPT TO
+<<< RCPT TO:<userx@myhost.test.ex>
+250 OK
+RCPT TO
+<<< RCPT TO:<usery@myhost.test.ex>
+250 OK
+DATA
+<<< DATA
+450 Temporary error
+QUIT
+<<< QUIT
+220 OK
+1999-03-02 09:44:33 10HmbK-0005vi-00 == userx@myhost.test.ex R=smartuser T=lmtp defer (-46): LMTP error after DATA: 450 Temporary error
+1999-03-02 09:44:33 10HmbK-0005vi-00 == usery@myhost.test.ex R=smartuser T=lmtp defer (-46): LMTP error after DATA: 450 Temporary error
index 4d4bc3f..66076a0 100644 (file)
@@ -15,7 +15,7 @@
 1999-03-02 09:44:33 End queue run: pid=pppp -qf
 1999-03-02 09:44:33 10HmbA-0005vi-00 <= CALLER@myhost.test.ex U=CALLER P=local S=sss
 1999-03-02 09:44:33 10HmbA-0005vi-00 => lp1 <lp1@myhost.test.ex> R=smartuser T=lmtp
-1999-03-02 09:44:33 10HmbA-0005vi-00 == lp2@myhost.test.ex R=smartuser T=lmtp defer (-1): LMTP error after end of data: 450 Number 2 is now delayed
+1999-03-02 09:44:33 10HmbA-0005vi-00 == lp2@myhost.test.ex R=smartuser T=lmtp defer (-46): LMTP error after end of data: 450 Number 2 is now delayed
 1999-03-02 09:44:33 10HmbA-0005vi-00 ** lp3@myhost.test.ex R=smartuser T=lmtp: LMTP error after end of data: 550 Number 3 is now rejected
 1999-03-02 09:44:33 10HmbA-0005vi-00 == lp4@myhost.test.ex R=smartuser T=lmtp defer (-44): LMTP error after RCPT TO:<lp4@myhost.test.ex>: 450 This one is delayed on RCPT
 1999-03-02 09:44:33 10HmbA-0005vi-00 ** lp5@myhost.test.ex R=smartuser T=lmtp: LMTP error after RCPT TO:<lp5@myhost.test.ex>: 550 This one is unknown on RCPT
index 288fa3e..43549c1 100644 (file)
@@ -14,4 +14,4 @@ DATA
 <<< DATA
 354 Send it
 .
-1999-03-02 09:44:33 10HmaX-0005vi-00 == userx@myhost.test.ex R=r1 T=t1 defer (-1): transport filter process failed (127): unable to execute command
+1999-03-02 09:44:33 10HmaX-0005vi-00 == userx@myhost.test.ex R=r1 T=t1 defer (-24): transport filter process failed (127): unable to execute command
index 1465afe..8e7e549 100644 (file)
@@ -1,5 +1,22 @@
-# rcpt_4xx from server with no retry
+# mail_4xx, rcpt_4xx, data_4xx, lost_connection
 need_ipv4
+# MAIL, no pipelining
+#
+server PORT_S
+220 Server ready
+EHLO
+250-server id
+250 OK
+MAIL FROM
+452 temporary error
+QUIT
+250 OK
+****
+exim -odi userx@x.y
+****
+dump retry
+sudo rm DIR/spool/db/*
+# RCPT, no pipelining
 #
 server PORT_S
 220 Server ready
@@ -16,4 +33,127 @@ QUIT
 exim -odi userx@x.y
 ****
 dump retry
-no_message_check
+# DATA start, no pipelining
+#
+server PORT_S
+220 Server ready
+EHLO
+250-server id
+250 OK
+MAIL FROM
+250 OK
+RCPT TO
+250 OK
+DATA
+452 temporary error
+QUIT
+250 OK
+****
+exim -odi userx@x.y
+****
+# DATA end, no pipelining
+#
+server PORT_S
+220 Server ready
+EHLO
+250-server id
+250 OK
+MAIL FROM
+250 OK
+RCPT TO
+250 OK
+DATA
+352 GO AHEAD
+.
+452 temporary error
+QUIT
+250 OK
+****
+exim -odi userx@x.y
+****
+# MAIL, pipelining
+#
+server PORT_S
+220 Server ready
+EHLO
+250-server id
+250-PIPELINING
+250 OK
+MAIL FROM
+452 temporary error
+QUIT
+250 OK
+****
+exim -odi userx@x.y
+****
+# RCPT, pipelining
+#
+server PORT_S
+220 Server ready
+EHLO
+250-server id
+250-PIPELINING
+250 OK
+MAIL FROM
+250 OK
+RCPT TO
+452 temporary error
+QUIT
+250 OK
+****
+exim -odi userx@x.y
+****
+# DATA start, pipelining
+#
+server PORT_S
+220 Server ready
+EHLO
+250-server id
+250-PIPELINING
+250 OK
+MAIL FROM
+250 OK
+RCPT TO
+250 OK
+DATA
+452 temporary error
+QUIT
+250 OK
+****
+exim -odi userx@x.y
+****
+# DATA end, pipelining
+#
+server PORT_S
+220 Server ready
+EHLO
+250-server id
+250-PIPELINING
+250 OK
+MAIL FROM
+250 OK
+RCPT TO
+250 OK
+DATA
+352 GO AHEAD
+.
+452 temporary error
+QUIT
+250 OK
+****
+exim -odi userx@x.y
+****
+# lost connection
+#
+server PORT_S
+220 Server ready
+EHLO
+250-server id
+250-PIPELINING
+250 OK
+MAIL FROM
+250 OK
+RCPT TO
+****
+exim -odi userx@x.y
+****
index 06e2595..02c82ea 100644 (file)
@@ -7,5 +7,7 @@ Test message
 ****
 exim -qf
 ****
+exim -DHOSTS=127.0.0.1 -qf
+****
 killdaemon
 no_msglog_check
index fe197fa..e8a5535 100644 (file)
@@ -6,5 +6,7 @@ Test message
 ****
 exim -qf
 ****
+exim -DHOSTS=127.0.0.1 -qf
+****
 killdaemon
 no_msglog_check
index 224943d..36f45e1 100644 (file)
@@ -36,4 +36,8 @@ exim -odi -DIGNORE_QUOTA=true jack jill
 script: 09
 This is a test message.
 ****
+exim -odi userx usery
+script: 10
+This is a test message.
+****
 no_msglog_check
index 442906e..30ab686 100644 (file)
@@ -116,7 +116,7 @@ Connecting to 127.0.0.1 [127.0.0.1]:1224 ... connected
   SMTP<< 403 Sorry temp data error
   SMTP>> QUIT
 LOG: MAIN
-  == a@test.ex R=client T=send_to_server defer (0): SMTP error from remote mail server after pipelined DATA: host 127.0.0.1 [127.0.0.1]: 403 Sorry temp data error
+  == a@test.ex R=client T=send_to_server defer (-46): SMTP error from remote mail server after pipelined DATA: host 127.0.0.1 [127.0.0.1]: 403 Sorry temp data error
 LOG: MAIN
   ** b@test.ex R=client T=send_to_server: SMTP error from remote mail server after RCPT TO:<b@test.ex>: host 127.0.0.1 [127.0.0.1]: 550 NO
 LOG: MAIN
index 1b0cdbc..6755d42 100644 (file)
@@ -1,8 +1,9 @@
 +++++++++++++++++++++++++++
+  T:127.0.0.1:127.0.0.1:1224:10HmaX-0005vi-00 -45 13377 SMTP error from remote mail server after MAIL FROM:<CALLER@myhost.test.ex>: host 127.0.0.1 [127.0.0.1]: 452 temporary error
+first failed = time last try = time2 next try = time2 + 0 *
++++++++++++++++++++++++++++
   R:userx@x.y -44 13377 SMTP error from remote mail server after RCPT TO:<userx@x.y>: host 127.0.0.1 [127.0.0.1]: 452 temporary error
 first failed = time last try = time2 next try = time2 + 0 *
-  T:127.0.0.1:127.0.0.1:1224 dd 65 Connection refused
-first failed = time last try = time2 next try = time2 + 900
 
 ******** SERVER ********
 Listening on port 1224 ... 
@@ -12,9 +13,139 @@ EHLO myhost.test.ex
 250-server id
 250 OK
 MAIL FROM:<CALLER@myhost.test.ex>
+452 temporary error
+QUIT
+250 OK
+End of script
+Listening on port 1224 ... 
+Connection request from [127.0.0.1]
+220 Server ready
+EHLO myhost.test.ex
+250-server id
+250 OK
+MAIL FROM:<CALLER@myhost.test.ex>
+250 OK
+RCPT TO:<userx@x.y>
+452 temporary error
+QUIT
+250 OK
+End of script
+Listening on port 1224 ... 
+Connection request from [127.0.0.1]
+220 Server ready
+EHLO myhost.test.ex
+250-server id
+250 OK
+MAIL FROM:<CALLER@myhost.test.ex>
+250 OK
+RCPT TO:<userx@x.y>
+250 OK
+DATA
+452 temporary error
+QUIT
+250 OK
+End of script
+Listening on port 1224 ... 
+Connection request from [127.0.0.1]
+220 Server ready
+EHLO myhost.test.ex
+250-server id
+250 OK
+MAIL FROM:<CALLER@myhost.test.ex>
+250 OK
+RCPT TO:<userx@x.y>
+250 OK
+DATA
+352 GO AHEAD
+Received: from CALLER by myhost.test.ex with local (Exim x.yz)
+       (envelope-from <CALLER@myhost.test.ex>)
+       id 10HmbD-0005vi-00
+       for userx@x.y; Tue, 2 Mar 1999 09:44:33 +0000
+Message-Id: <E10HmbD-0005vi-00@myhost.test.ex>
+From: CALLER_NAME <CALLER@myhost.test.ex>
+Date: Tue, 2 Mar 1999 09:44:33 +0000
+
+.
+452 temporary error
+QUIT
+250 OK
+End of script
+Listening on port 1224 ... 
+Connection request from [127.0.0.1]
+220 Server ready
+EHLO myhost.test.ex
+250-server id
+250-PIPELINING
+250 OK
+MAIL FROM:<CALLER@myhost.test.ex>
+452 temporary error
+RCPT TO:<userx@x.y>
+Comparison failed - bailing out
+Expected: QUIT
+Listening on port 1224 ... 
+Connection request from [127.0.0.1]
+220 Server ready
+EHLO myhost.test.ex
+250-server id
+250-PIPELINING
+250 OK
+MAIL FROM:<CALLER@myhost.test.ex>
+250 OK
+RCPT TO:<userx@x.y>
+452 temporary error
+DATA
+Comparison failed - bailing out
+Expected: QUIT
+Listening on port 1224 ... 
+Connection request from [127.0.0.1]
+220 Server ready
+EHLO myhost.test.ex
+250-server id
+250-PIPELINING
+250 OK
+MAIL FROM:<CALLER@myhost.test.ex>
+250 OK
+RCPT TO:<userx@x.y>
+250 OK
+DATA
+452 temporary error
+QUIT
+250 OK
+End of script
+Listening on port 1224 ... 
+Connection request from [127.0.0.1]
+220 Server ready
+EHLO myhost.test.ex
+250-server id
+250-PIPELINING
+250 OK
+MAIL FROM:<CALLER@myhost.test.ex>
 250 OK
 RCPT TO:<userx@x.y>
+250 OK
+DATA
+352 GO AHEAD
+Received: from CALLER by myhost.test.ex with local (Exim x.yz)
+       (envelope-from <CALLER@myhost.test.ex>)
+       id 10HmbL-0005vi-00
+       for userx@x.y; Tue, 2 Mar 1999 09:44:33 +0000
+Message-Id: <E10HmbL-0005vi-00@myhost.test.ex>
+From: CALLER_NAME <CALLER@myhost.test.ex>
+Date: Tue, 2 Mar 1999 09:44:33 +0000
+
+.
 452 temporary error
 QUIT
 250 OK
 End of script
+Listening on port 1224 ... 
+Connection request from [127.0.0.1]
+220 Server ready
+EHLO myhost.test.ex
+250-server id
+250-PIPELINING
+250 OK
+MAIL FROM:<CALLER@myhost.test.ex>
+250 OK
+RCPT TO:<userx@x.y>
+End of script
index d3811ad..f1448ba 100644 (file)
@@ -1,5 +1,5 @@
 +++++++++++++++++++++++++++
-  T:127.0.0.1:127.0.0.1:1224:10HmaX-0005vi-00 65 SMTP error from remote mail server after MAIL FROM:<CALLER@myhost.test.ex>: host 127.0.0.1 [127.0.0.1]: 450 DELAY
+  T:127.0.0.1:127.0.0.1:1224:10HmaX-0005vi-00 -45 12865 SMTP error from remote mail server after MAIL FROM:<CALLER@myhost.test.ex>: host 127.0.0.1 [127.0.0.1]: 450 DELAY
 first failed = time last try = time2 next try = time2 + 10
 
 ******** SERVER ********
index 76982ea..e2c7913 100644 (file)
@@ -1,18 +1,18 @@
 +++++++++++++++++++++++++++
-  T:127.0.0.1:127.0.0.1:1224:10HmaX-0005vi-00 65 SMTP error from remote mail server after MAIL FROM:<CALLER@the.local.host.name>: host 127.0.0.1 [127.0.0.1]: 450 Temporary error
+  T:127.0.0.1:127.0.0.1:1224:10HmaX-0005vi-00 -45 12865 SMTP error from remote mail server after MAIL FROM:<CALLER@the.local.host.name>: host 127.0.0.1 [127.0.0.1]: 450 Temporary error
 first failed = time last try = time2 next try = time2 + 7200
-  T:::1:::1:1224:10HmaX-0005vi-00 65 SMTP error from remote mail server after MAIL FROM:<CALLER@the.local.host.name>: host ::1 [::1]: 450 Temporary error
+  T:::1:::1:1224:10HmaX-0005vi-00 -45 12865 SMTP error from remote mail server after MAIL FROM:<CALLER@the.local.host.name>: host ::1 [::1]: 450 Temporary error
 first failed = time last try = time2 next try = time2 + 7200
-Transport: 127.0.0.1 [127.0.0.1]:1111 10HmaX-0005vi-00 error 0: SMTP error from remote mail server after MAIL FROM:<CALLER@the.local.host.name>: host 127.0.0.1 [127.0.0.1]: 450 Temporary error
+Transport: 127.0.0.1 [127.0.0.1]:1111 10HmaX-0005vi-00 error -45: SMTP error from remote mail server after MAIL FROM:<CALLER@the.local.host.name>: host 127.0.0.1 [127.0.0.1]: 450 Temporary error
   first failed: 07-Mar-2000 12:21:52
   last tried:   07-Mar-2000 12:21:52
   next try at:  07-Mar-2000 12:21:52
-Transport: ::1 [::1]:1111 10HmaX-0005vi-00 error 0: SMTP error from remote mail server after MAIL FROM:<CALLER@the.local.host.name>: host ::1 [::1]: 450 Temporary error
+Transport: ::1 [::1]:1111 10HmaX-0005vi-00 error -45: SMTP error from remote mail server after MAIL FROM:<CALLER@the.local.host.name>: host ::1 [::1]: 450 Temporary error
   first failed: 07-Mar-2000 12:21:52
   last tried:   07-Mar-2000 12:21:52
   next try at:  07-Mar-2000 12:21:52
 exinext exit code = 0
-Transport: ::1 [::1]:1111 10HmaX-0005vi-00 error 0: SMTP error from remote mail server after MAIL FROM:<CALLER@the.local.host.name>: host ::1 [::1]: 450 Temporary error
+Transport: ::1 [::1]:1111 10HmaX-0005vi-00 error -45: SMTP error from remote mail server after MAIL FROM:<CALLER@the.local.host.name>: host ::1 [::1]: 450 Temporary error
   first failed: 07-Mar-2000 12:21:52
   last tried:   07-Mar-2000 12:21:52
   next try at:  07-Mar-2000 12:21:52
index b7255ca..cf34121 100644 (file)
@@ -1,5 +1,5 @@
 +++++++++++++++++++++++++++
-  T:jack@myhost.test.ex -0 LMTP error after end of data: 450 Number 2 is now delayed
+  T:jack@myhost.test.ex -46 12800 LMTP error after end of data: 450 Number 2 is now delayed
 first failed = time last try = time2 next try = time2 + 0
   T:tom@myhost.test.ex -44 12800 LMTP error after RCPT TO:<tom@myhost.test.ex>: 450 This one is delayed on RCPT
 first failed = time last try = time2 next try = time2 + 60