Avoid sending DSN when message was accepted under fakereject or fakedefer. Bug 3016
authorJeremy Harris <jgh146exb@wizmail.org>
Thu, 31 Aug 2023 14:16:09 +0000 (15:16 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Thu, 31 Aug 2023 15:50:03 +0000 (16:50 +0100)
doc/doc-txt/ChangeLog
src/src/acl.c
src/src/deliver.c
src/src/receive.c
test/confs/0612
test/log/0612
test/mail/0612.rmt_fakereject [new file with mode: 0644]
test/scripts/0000-Basic/0612
test/stdout/0612

index 625c6d426879c48102880b8bedbff8b6b16ac10f..f2802d2fb87e7f696348532a3a91a1ca3e13d130 100644 (file)
@@ -179,7 +179,11 @@ JH/34 Bug 3013: Fix use of $recipients within arguments for ${run...}.
 JH/35 Bug 3014: GnuTLS: fix expiry date for an auto-generated server
       certificate.  Find and fix by Andreas Metzler.
 
-JH/36 Add ARC info to DMARC hostory recordsl
+JH/36 Add ARC info to DMARC hostory records.
+
+JH/37 Bug 3016: Avoid sending DSN when message was accepted under fakereject
+      or fakedefer.  Previously the sender could discover that the message
+      had in fact been accepted.
 
 
 Exim version 4.96
index ab991ef413ee659a54e2396ef38ddcf5d669805c..118e4b35db422c18326cac1727346464685a7158 100644 (file)
@@ -3428,7 +3428,7 @@ for (; cb; cb = cb->next)
        case CONTROL_FAKEREJECT:
          cancel_cutthrough_connection(TRUE, US"fakereject");
        case CONTROL_FAKEDEFER:
-         fake_response = (control_type == CONTROL_FAKEDEFER) ? DEFER : FAIL;
+         fake_response = control_type == CONTROL_FAKEDEFER ? DEFER : FAIL;
          if (*p == '/')
            {
            const uschar *pp = p + 1;
index 52270368ee3b7fc4eaacd991a303529772e2ce0f..c9a1d074b311bebc0bc0b1d81bf115ea864e6d29 100644 (file)
@@ -6193,11 +6193,11 @@ return child_close(pid, 0) == 0;
 *************************************************/
 
 static void
-maybe_send_dsn(void)
+maybe_send_dsn(const address_item * const addr_succeed)
 {
 address_item * addr_senddsn = NULL;
 
-for (address_item * a = addr_succeed; a; a = a->next)
+for (const address_item * a = addr_succeed; a; a = a->next)
   {
   /* af_ignore_error not honored here. it's not an error */
   DEBUG(D_deliver) debug_printf("DSN: processing router : %s\n"
@@ -8136,7 +8136,7 @@ else if (!f.dont_deliver)
 
 /* Send DSN for successful messages if requested */
 
-maybe_send_dsn();
+maybe_send_dsn(addr_succeed);
 
 /* If any addresses failed, we must send a message to somebody, unless
 af_ignore_error is set, in which case no action is taken. It is possible for
index 14038f2ecd4dc528357292590ccbfe678ec00a37..3c139b3aff9750a325f8209093c994c462928edf 100644 (file)
@@ -514,7 +514,7 @@ Returns:      nothing
 */
 
 void
-receive_add_recipient(uschar *recipient, int pno)
+receive_add_recipient(uschar * recipient, int pno)
 {
 if (recipients_count >= recipients_list_max)
   {
@@ -2669,7 +2669,7 @@ if (extract_recip)
         that this has happened, in order to give a better error if there are
         no recipients left. */
 
-        else if (recipient != NULL)
+        else if (recipient)
           {
           if (tree_search(tree_nonrecipients, recipient) == NULL)
             receive_add_recipient(recipient, -1);
@@ -2679,7 +2679,7 @@ if (extract_recip)
 
         /* Move on past this address */
 
-        s = ss + (*ss? 1:0);
+        s = ss + (*ss ? 1 : 0);
         while (isspace(*s)) s++;
         }    /* Next address */
 
@@ -3861,10 +3861,10 @@ the spool file gets corrupted. Ensure that all recipients are qualified. */
 if (rc == LOCAL_SCAN_ACCEPT)
   {
   if (local_scan_data)
-    for (uschar * s = local_scan_data; *s != 0; s++) if (*s == '\n') *s = ' ';
-  for (int i = 0; i < recipients_count; i++)
+    for (uschar * s = local_scan_data; *s; s++) if (*s == '\n') *s = ' ';
+  for (recipient_item * r = recipients_list;
+       r < recipients_list + recipients_count; r++)
     {
-    recipient_item *r = recipients_list + i;
     r->address = rewrite_address_qualify(r->address, TRUE);
     if (r->errors_to)
       r->errors_to = rewrite_address_qualify(r->errors_to, TRUE);
@@ -3946,6 +3946,19 @@ signal(SIGTERM, SIG_IGN);
 signal(SIGINT, SIG_IGN);
 #endif /* HAVE_LOCAL_SCAN */
 
+/* If we are faking a reject or defer, avoid sennding a DSN for the
+actually-accepted message */
+
+if (fake_response != OK)
+  for (recipient_item * r = recipients_list;
+       r < recipients_list + recipients_count; r++)
+    {
+    DEBUG(D_receive) if (r->dsn_flags & (rf_notify_success | rf_notify_delay))
+      debug_printf("DSN: clearing flags due to fake-response for message\n");
+    r->dsn_flags = r->dsn_flags & ~(rf_notify_success | rf_notify_delay)
+                   | rf_notify_never;
+    }
+
 
 /* Ensure the first time flag is set in the newly-received message. */
 
index b3174aabcc3749cd8e791c81a2ff1803f88f3b2a..786b2e58eac82d6d608f70945c26049044c3db6e 100644 (file)
@@ -34,10 +34,12 @@ ev_log:
   accept logwrite = event $event_name
 
 rcpt:
-  accept hosts =       HOSTIPV4
+  accept       hosts = HOSTIPV4
 
-  deny local_parts =   rmt_reject
-  defer        local_parts =   rmt_defer
+  deny         local_parts =   rmt_reject
+  defer                local_parts =   rmt_defer
+  accept       local_parts =   rmt_fakereject
+               control =       fakereject
   accept
 
 # ----- Routers -----
index 060240719a59ceb28cda0daa3d1f91f8fe4fb277..e022b5071877d248bac866b89c4fafcb231993b0 100644 (file)
 1999-03-02 09:44:33 10HmbA-000000005vi-0000 Completed
 1999-03-02 09:44:33 10HmbA-000000005vi-0000 event msg:complete
 1999-03-02 09:44:33 End queue run: pid=p1237
-1999-03-02 09:44:33 defer/delay
+1999-03-02 09:44:33 fakereject/success
 1999-03-02 09:44:33 Start queue run: pid=p1238
 1999-03-02 09:44:33 10HmbB-000000005vi-0000 event tcp:connect
 1999-03-02 09:44:33 10HmbB-000000005vi-0000 event smtp:connect
 1999-03-02 09:44:33 10HmbB-000000005vi-0000 event smtp:ehlo
-1999-03-02 09:44:33 10HmbB-000000005vi-0000 event msg:rcpt:host:defer
-1999-03-02 09:44:33 10HmbB-000000005vi-0000 event msg:rcpt:defer
 1999-03-02 09:44:33 10HmbB-000000005vi-0000 event tcp:close
-1999-03-02 09:44:33 10HmbB-000000005vi-0000 == rmt_defer@test.ex R=r2 T=smtp defer (-44) H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after RCPT TO:<rmt_defer@test.ex>: 451 Temporary local problem - please try later
+1999-03-02 09:44:33 10HmbB-000000005vi-0000 ** rmt_fakereject@test.ex R=r2 T=smtp H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after end of data: 550-Your message has been rejected but is being kept for evaluation.\n550-If it was a legitimate message, it may still be delivered to the target\n550 recipient(s).
+1999-03-02 09:44:33 10HmbB-000000005vi-0000 event msg:fail:delivery
+1999-03-02 09:44:33 10HmbB-000000005vi-0000 rmt_fakereject@test.ex: error ignored: RFC 3461 DSN, failure notify not requested
+1999-03-02 09:44:33 10HmbB-000000005vi-0000 Completed
+1999-03-02 09:44:33 10HmbB-000000005vi-0000 event msg:complete
 1999-03-02 09:44:33 End queue run: pid=p1238
-1999-03-02 09:44:33 defer/never
 1999-03-02 09:44:33 Start queue run: pid=p1239
-1999-03-02 09:44:33 10HmbB-000000005vi-0000 == rmt_defer@test.ex routing defer (-52): retry time not reached
-1999-03-02 09:44:33 10HmbC-000000005vi-0000 event tcp:connect
-1999-03-02 09:44:33 10HmbC-000000005vi-0000 event smtp:connect
-1999-03-02 09:44:33 10HmbC-000000005vi-0000 event smtp:ehlo
-1999-03-02 09:44:33 10HmbC-000000005vi-0000 event msg:rcpt:host:defer
-1999-03-02 09:44:33 10HmbC-000000005vi-0000 event msg:rcpt:defer
-1999-03-02 09:44:33 10HmbC-000000005vi-0000 event tcp:close
-1999-03-02 09:44:33 10HmbC-000000005vi-0000 == rmt_defer@test.ex R=r2 T=smtp defer (-44) H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after RCPT TO:<rmt_defer@test.ex>: 451 Temporary local problem - please try later
+1999-03-02 09:44:33 10HmbC-000000005vi-0000 => rmt_fakereject <rmt_fakereject@test.ex> R=r1 T=tofile
+1999-03-02 09:44:33 10HmbC-000000005vi-0000 event msg:delivery
+1999-03-02 09:44:33 10HmbC-000000005vi-0000 Completed
+1999-03-02 09:44:33 10HmbC-000000005vi-0000 event msg:complete
 1999-03-02 09:44:33 End queue run: pid=p1239
-1999-03-02 09:44:33 playout
 1999-03-02 09:44:33 Start queue run: pid=p1240
-1999-03-02 09:44:33 10HmbB-000000005vi-0000 == rmt_defer@test.ex routing defer (-52): retry time not reached
-1999-03-02 09:44:33 10HmbD-000000005vi-0000 <= <> R=10HmbB-000000005vi-0000 U=EXIMUSER P=local S=sss for c@dump.ex
-1999-03-02 09:44:33 10HmbC-000000005vi-0000 == rmt_defer@test.ex routing defer (-52): retry time not reached
 1999-03-02 09:44:33 End queue run: pid=p1240
-1999-03-02 09:44:33 10HmbB-000000005vi-0000 event msg:fail:internal
-1999-03-02 09:44:33 10HmbB-000000005vi-0000 event msg:complete
-1999-03-02 09:44:33 10HmbB-000000005vi-0000 removed by CALLER
-1999-03-02 09:44:33 10HmbB-000000005vi-0000 Completed
-1999-03-02 09:44:33 10HmbC-000000005vi-0000 event msg:fail:internal
-1999-03-02 09:44:33 10HmbC-000000005vi-0000 event msg:complete
-1999-03-02 09:44:33 10HmbC-000000005vi-0000 removed by CALLER
-1999-03-02 09:44:33 10HmbC-000000005vi-0000 Completed
-1999-03-02 09:44:33 rej/failure+delay
+1999-03-02 09:44:33 defer/delay
 1999-03-02 09:44:33 Start queue run: pid=p1241
-1999-03-02 09:44:33 10HmbD-000000005vi-0000 => :blackhole: <c@dump.ex> R=r_dump
-1999-03-02 09:44:33 10HmbD-000000005vi-0000 Completed
-1999-03-02 09:44:33 10HmbD-000000005vi-0000 event msg:complete
+1999-03-02 09:44:33 10HmbD-000000005vi-0000 event tcp:connect
+1999-03-02 09:44:33 10HmbD-000000005vi-0000 event smtp:connect
+1999-03-02 09:44:33 10HmbD-000000005vi-0000 event smtp:ehlo
+1999-03-02 09:44:33 10HmbD-000000005vi-0000 event msg:rcpt:host:defer
+1999-03-02 09:44:33 10HmbD-000000005vi-0000 event msg:rcpt:defer
+1999-03-02 09:44:33 10HmbD-000000005vi-0000 event tcp:close
+1999-03-02 09:44:33 10HmbD-000000005vi-0000 == rmt_defer@test.ex R=r2 T=smtp defer (-44) H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after RCPT TO:<rmt_defer@test.ex>: 451 Temporary local problem - please try later
+1999-03-02 09:44:33 End queue run: pid=p1241
+1999-03-02 09:44:33 defer/never
+1999-03-02 09:44:33 Start queue run: pid=p1242
+1999-03-02 09:44:33 10HmbD-000000005vi-0000 == rmt_defer@test.ex routing defer (-52): retry time not reached
 1999-03-02 09:44:33 10HmbE-000000005vi-0000 event tcp:connect
 1999-03-02 09:44:33 10HmbE-000000005vi-0000 event smtp:connect
 1999-03-02 09:44:33 10HmbE-000000005vi-0000 event smtp:ehlo
+1999-03-02 09:44:33 10HmbE-000000005vi-0000 event msg:rcpt:host:defer
+1999-03-02 09:44:33 10HmbE-000000005vi-0000 event msg:rcpt:defer
 1999-03-02 09:44:33 10HmbE-000000005vi-0000 event tcp:close
-1999-03-02 09:44:33 10HmbE-000000005vi-0000 ** rmt_reject@test.ex R=r2 T=smtp H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after RCPT TO:<rmt_reject@test.ex>: 550 Administrative prohibition
-1999-03-02 09:44:33 10HmbF-000000005vi-0000 <= <> R=10HmbE-000000005vi-0000 U=EXIMUSER P=local S=sss for e@dump.ex
-1999-03-02 09:44:33 10HmbE-000000005vi-0000 Completed
+1999-03-02 09:44:33 10HmbE-000000005vi-0000 == rmt_defer@test.ex R=r2 T=smtp defer (-44) H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after RCPT TO:<rmt_defer@test.ex>: 451 Temporary local problem - please try later
+1999-03-02 09:44:33 End queue run: pid=p1242
+1999-03-02 09:44:33 playout
+1999-03-02 09:44:33 Start queue run: pid=p1243
+1999-03-02 09:44:33 10HmbD-000000005vi-0000 == rmt_defer@test.ex routing defer (-52): retry time not reached
+1999-03-02 09:44:33 10HmbF-000000005vi-0000 <= <> R=10HmbD-000000005vi-0000 U=EXIMUSER P=local S=sss for c@dump.ex
+1999-03-02 09:44:33 10HmbE-000000005vi-0000 == rmt_defer@test.ex routing defer (-52): retry time not reached
+1999-03-02 09:44:33 End queue run: pid=p1243
+1999-03-02 09:44:33 10HmbD-000000005vi-0000 event msg:fail:internal
+1999-03-02 09:44:33 10HmbD-000000005vi-0000 event msg:complete
+1999-03-02 09:44:33 10HmbD-000000005vi-0000 removed by CALLER
+1999-03-02 09:44:33 10HmbD-000000005vi-0000 Completed
+1999-03-02 09:44:33 10HmbE-000000005vi-0000 event msg:fail:internal
 1999-03-02 09:44:33 10HmbE-000000005vi-0000 event msg:complete
-1999-03-02 09:44:33 End queue run: pid=p1241
-1999-03-02 09:44:33 deliver DSN
-1999-03-02 09:44:33 Start queue run: pid=p1242
-1999-03-02 09:44:33 10HmbF-000000005vi-0000 => :blackhole: <e@dump.ex> R=r_dump
+1999-03-02 09:44:33 10HmbE-000000005vi-0000 removed by CALLER
+1999-03-02 09:44:33 10HmbE-000000005vi-0000 Completed
+1999-03-02 09:44:33 rej/failure+delay
+1999-03-02 09:44:33 Start queue run: pid=p1244
+1999-03-02 09:44:33 10HmbF-000000005vi-0000 => :blackhole: <c@dump.ex> R=r_dump
 1999-03-02 09:44:33 10HmbF-000000005vi-0000 Completed
 1999-03-02 09:44:33 10HmbF-000000005vi-0000 event msg:complete
-1999-03-02 09:44:33 End queue run: pid=p1242
+1999-03-02 09:44:33 10HmbG-000000005vi-0000 event tcp:connect
+1999-03-02 09:44:33 10HmbG-000000005vi-0000 event smtp:connect
+1999-03-02 09:44:33 10HmbG-000000005vi-0000 event smtp:ehlo
+1999-03-02 09:44:33 10HmbG-000000005vi-0000 event tcp:close
+1999-03-02 09:44:33 10HmbG-000000005vi-0000 ** rmt_reject@test.ex R=r2 T=smtp H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after RCPT TO:<rmt_reject@test.ex>: 550 Administrative prohibition
+1999-03-02 09:44:33 10HmbH-000000005vi-0000 <= <> R=10HmbG-000000005vi-0000 U=EXIMUSER P=local S=sss for e@dump.ex
+1999-03-02 09:44:33 10HmbG-000000005vi-0000 Completed
+1999-03-02 09:44:33 10HmbG-000000005vi-0000 event msg:complete
+1999-03-02 09:44:33 End queue run: pid=p1244
+1999-03-02 09:44:33 deliver DSN
+1999-03-02 09:44:33 Start queue run: pid=p1245
+1999-03-02 09:44:33 10HmbH-000000005vi-0000 => :blackhole: <e@dump.ex> R=r_dump
+1999-03-02 09:44:33 10HmbH-000000005vi-0000 Completed
+1999-03-02 09:44:33 10HmbH-000000005vi-0000 event msg:complete
+1999-03-02 09:44:33 End queue run: pid=p1245
 
 ******** SERVER ********
-1999-03-02 09:44:33 exim x.yz daemon started: pid=p1243, no queue runs, listening for SMTP on port PORT_D
-1999-03-02 09:44:33 exim x.yz daemon started: pid=p1244, no queue runs, listening for SMTP on port PORT_D
+1999-03-02 09:44:33 exim x.yz daemon started: pid=p1246, no queue runs, listening for SMTP on port PORT_D
+1999-03-02 09:44:33 exim x.yz daemon started: pid=p1247, no queue runs, listening for SMTP on port PORT_D
 1999-03-02 09:44:33 10HmaX-000000005vi-0000 <= a@dump.ex H=(testclient) [ip4.ip4.ip4.ip4] P=esmtp S=sss for rmt_reject@test.ex
 1999-03-02 09:44:33 H=localhost (myhost.test.ex) [127.0.0.1] F=<a@dump.ex> rejected RCPT <rmt_reject@test.ex>
 1999-03-02 09:44:33 10HmaY-000000005vi-0000 <= b@dump.ex H=(testclient) [ip4.ip4.ip4.ip4] P=esmtp S=sss for rmt_accept@test.ex
 1999-03-02 09:44:33 10HmaZ-000000005vi-0000 <= b@dump.ex H=localhost (myhost.test.ex) [127.0.0.1] P=esmtp S=sss for rmt_accept@test.ex
-1999-03-02 09:44:33 10HmbB-000000005vi-0000 <= c@dump.ex H=(testclient) [ip4.ip4.ip4.ip4] P=esmtp S=sss for rmt_defer@test.ex
+1999-03-02 09:44:33 10HmbB-000000005vi-0000 <= b2@dump.ex H=(testclient) [ip4.ip4.ip4.ip4] P=esmtp S=sss for rmt_fakereject@test.ex
+1999-03-02 09:44:33 10HmbC-000000005vi-0000 (= b2@dump.ex H=localhost (myhost.test.ex) [127.0.0.1] P=esmtp S=sss for rmt_fakereject@test.ex
+1999-03-02 09:44:33 10HmbD-000000005vi-0000 <= c@dump.ex H=(testclient) [ip4.ip4.ip4.ip4] P=esmtp S=sss for rmt_defer@test.ex
 1999-03-02 09:44:33 H=localhost (myhost.test.ex) [127.0.0.1] F=<c@dump.ex> temporarily rejected RCPT <rmt_defer@test.ex>
-1999-03-02 09:44:33 10HmbC-000000005vi-0000 <= d@dump.ex H=(testclient) [ip4.ip4.ip4.ip4] P=esmtp S=sss for rmt_defer@test.ex
+1999-03-02 09:44:33 10HmbE-000000005vi-0000 <= d@dump.ex H=(testclient) [ip4.ip4.ip4.ip4] P=esmtp S=sss for rmt_defer@test.ex
 1999-03-02 09:44:33 H=localhost (myhost.test.ex) [127.0.0.1] F=<d@dump.ex> temporarily rejected RCPT <rmt_defer@test.ex>
-1999-03-02 09:44:33 10HmbE-000000005vi-0000 <= e@dump.ex H=(testclient) [ip4.ip4.ip4.ip4] P=esmtp S=sss for rmt_reject@test.ex
+1999-03-02 09:44:33 10HmbG-000000005vi-0000 <= e@dump.ex H=(testclient) [ip4.ip4.ip4.ip4] P=esmtp S=sss for rmt_reject@test.ex
 1999-03-02 09:44:33 H=localhost (myhost.test.ex) [127.0.0.1] F=<e@dump.ex> rejected RCPT <rmt_reject@test.ex>
diff --git a/test/mail/0612.rmt_fakereject b/test/mail/0612.rmt_fakereject
new file mode 100644 (file)
index 0000000..1eb2c33
--- /dev/null
@@ -0,0 +1,16 @@
+From b2@dump.ex Tue Mar 02 09:44:33 1999
+Received: from localhost ([127.0.0.1] helo=myhost.test.ex)
+       by myhost.test.ex with esmtp (Exim x.yz)
+       (envelope-from <b2@dump.ex>)
+       id 10HmbC-000000005vi-0000
+       for rmt_fakereject@test.ex;
+       Tue, 2 Mar 1999 09:44:33 +0000
+Received: from [ip4.ip4.ip4.ip4] (helo=testclient)
+       by myhost.test.ex with esmtp (Exim x.yz)
+       (envelope-from <b2@dump.ex>)
+       id 10HmbB-000000005vi-0000
+       for rmt_fakereject@test.ex;
+       Tue, 2 Mar 1999 09:44:33 +0000
+Subject: test
+
+
index 69a53c6918120cc8a7d7f7d51838c6d193228a05..c5e3bfba10cd622306c82405183b00b4c6c40f9d 100644 (file)
@@ -74,6 +74,41 @@ exim -q
 exim -q
 ****
 #
+# Client requests delivery notification; the MSA & MDA supports DSN
+# but MDA fake-rejects msg.
+# The MDA should not send a delivery notification for this case.
+exim -z fakereject/success
+****
+client HOSTIPV4 PORT_D
+??? 220
+EHLO testclient
+??? 250-
+??? 250-SIZE
+??? 250-DSN
+??? 250 HELP
+MAIL FROM:<b2@dump.ex>
+??? 250
+RCPT TO:<rmt_fakereject@test.ex> NOTIFY=success
+??? 250
+DATA
+??? 354
+Subject: test
+.
+??? 250
+QUIT
+??? 221
+****
+# MSA (try to) send msg to MDA; should see a reject
+exim -q
+****
+# due to fake, should be a msg to deliver at MDA
+# no DSN should be generated
+exim -q
+****
+# should be no notification to deliver from MDA
+exim -q
+****
+#
 # Client requests notification of deferral.  First time of trying, we get
 # a defer but queue-time probably has not hit the 1st retry time yet, so no DSN
 # will be sent and the message remains queued.  Then, claiming time has elapsed,
index 74c73019ba8a804e2dd3adda003262b9c4188c51..92b95b4e5b810c8a90c553b97d8ff0deccdf2a2f 100644 (file)
@@ -82,6 +82,35 @@ Connecting to ip4.ip4.ip4.ip4 port 1225 ... connected
 <<< 250-DSN
 ??? 250 HELP
 <<< 250 HELP
+>>> MAIL FROM:<b2@dump.ex>
+??? 250
+<<< 250 OK
+>>> RCPT TO:<rmt_fakereject@test.ex> NOTIFY=success
+??? 250
+<<< 250 Accepted
+>>> DATA
+??? 354
+<<< 354 Enter message, ending with "." on a line by itself
+>>> Subject: test
+>>> .
+??? 250
+<<< 250 OK id=10HmbB-000000005vi-0000
+>>> QUIT
+??? 221
+<<< 221 myhost.test.ex closing connection
+End of script
+Connecting to ip4.ip4.ip4.ip4 port 1225 ... connected
+??? 220
+<<< 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+>>> EHLO testclient
+??? 250-
+<<< 250-myhost.test.ex Hello testclient [ip4.ip4.ip4.ip4]
+??? 250-SIZE
+<<< 250-SIZE 52428800
+??? 250-DSN
+<<< 250-DSN
+??? 250 HELP
+<<< 250 HELP
 >>> MAIL FROM:<c@dump.ex>
 ??? 250
 <<< 250 OK
@@ -94,7 +123,7 @@ Connecting to ip4.ip4.ip4.ip4 port 1225 ... connected
 >>> Subject: test
 >>> .
 ??? 250
-<<< 250 OK id=10HmbB-000000005vi-0000
+<<< 250 OK id=10HmbD-000000005vi-0000
 >>> QUIT
 ??? 221
 <<< 221 myhost.test.ex closing connection
@@ -123,13 +152,13 @@ Connecting to ip4.ip4.ip4.ip4 port 1225 ... connected
 >>> Subject: test
 >>> .
 ??? 250
-<<< 250 OK id=10HmbC-000000005vi-0000
+<<< 250 OK id=10HmbE-000000005vi-0000
 >>> QUIT
 ??? 221
 <<< 221 myhost.test.ex closing connection
 End of script
-Message 10HmbB-000000005vi-0000 has been removed
-Message 10HmbC-000000005vi-0000 has been removed
+Message 10HmbD-000000005vi-0000 has been removed
+Message 10HmbE-000000005vi-0000 has been removed
 Connecting to ip4.ip4.ip4.ip4 port 1225 ... connected
 ??? 220
 <<< 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
@@ -154,7 +183,7 @@ Connecting to ip4.ip4.ip4.ip4 port 1225 ... connected
 >>> Subject: test
 >>> .
 ??? 250
-<<< 250 OK id=10HmbE-000000005vi-0000
+<<< 250 OK id=10HmbG-000000005vi-0000
 >>> QUIT
 ??? 221
 <<< 221 myhost.test.ex closing connection