[exim-cvs] Debug: option access for expansion

Góra strony
Delete this message
Reply to this message
Autor: Exim Git Commits Mailing List
Data:  
Dla: exim-cvs
Temat: [exim-cvs] Debug: option access for expansion
Gitweb: https://git.exim.org/exim.git/commitdiff/90bd3832bc0ff090ac5e37dfc66b30cabb9cfc1a
Commit:     90bd3832bc0ff090ac5e37dfc66b30cabb9cfc1a
Parent:     44b3172e369435c2c1baa4e9c837252f729d2905
Author:     Jeremy Harris <jgh146exb@???>
AuthorDate: Fri Feb 16 23:16:29 2024 +0000
Committer:  Jeremy Harris <jgh146exb@???>
CommitDate: Fri Feb 16 23:16:29 2024 +0000

    Debug: option access for expansion
---
 src/src/daemon.c                        |   9 +-
 src/src/deliver.c                       | 162 ++++++++++++++++++--------------
 src/src/dkim.c                          |   8 ++
 src/src/dkim_transport.c                |   1 +
 src/src/exim.c                          |  36 ++++---
 src/src/expand.c                        |  12 ++-
 src/src/macros.h                        |   4 +
 src/src/moan.c                          |  11 ++-
 src/src/receive.c                       | 145 +++++++++++++++-------------
 src/src/route.c                         |  55 ++++++-----
 src/src/routers/dnslookup.c             |  17 ++--
 src/src/routers/iplookup.c              |  19 ++--
 src/src/routers/manualroute.c           |   5 +-
 src/src/routers/queryprogram.c          |   1 +
 src/src/routers/redirect.c              |  23 +++--
 src/src/routers/rf_expand_data.c        |   2 +-
 src/src/routers/rf_get_errors_address.c |   9 +-
 src/src/routers/rf_get_transport.c      |   1 +
 src/src/smtp_in.c                       |  44 +++++++--
 src/src/smtp_out.c                      |   1 +
 src/src/spf.c                           |  11 ++-
 src/src/transports/appendfile.c         |  79 ++++++++++------
 src/src/transports/autoreply.c          |  25 ++---
 src/src/transports/pipe.c               |  17 +++-
 src/src/transports/queuefile.c          |   1 +
 src/src/transports/smtp.c               |  27 ++++--
 src/src/transports/smtp_socks.c         |   1 +
 src/src/verify.c                        |  10 +-
 test/stderr/0002                        |  12 +++
 test/stderr/0092                        |  13 +++
 test/stderr/0402                        |  89 ++++++++++++++++++
 test/stderr/0544                        |  41 ++++++++
 test/stderr/0620                        |  24 +++++
 test/stderr/0628                        |   8 ++
 test/stderr/0632                        |  36 +++++++
 test/stderr/3000                        |   3 +
 test/stderr/5410                        |  93 +++++++++++++++++-
 test/stderr/5420                        | 123 +++++++++++++++++++++++-
 38 files changed, 889 insertions(+), 289 deletions(-)

diff --git a/src/src/daemon.c b/src/src/daemon.c
index 704ede24e..3c63c6368 100644
--- a/src/src/daemon.c
+++ b/src/src/daemon.c
@@ -298,9 +298,10 @@ to provide host-specific limits according to $sender_host address, but because
 this is in the daemon mainline, only fast expansions (such as inline address
 checks) should be used. The documentation is full of warnings. */
 
+GET_OPTION("smtp_accept_max_per_host");
 if (smtp_accept_max_per_host)
   {
-  uschar *expanded = expand_string(smtp_accept_max_per_host);
+  uschar * expanded = expand_string(smtp_accept_max_per_host);
   if (!expanded)
     {
     if (!f.expand_string_forcedfail)
@@ -434,6 +435,7 @@ if (pid == 0)
   likely what it depends on.) */
 
   smtp_active_hostname = primary_hostname;
+  GET_OPTION("smtp_active_hostname");
   if (raw_active_hostname)
     {
     uschar * nah = expand_string(raw_active_hostname);
@@ -1165,6 +1167,7 @@ return offsetof(struct sockaddr_un, sun_path)
 ssize_t
 daemon_notifier_sockname(struct sockaddr_un * sup)
 {
+GET_OPTION("notifier_socket");
 #ifdef EXIM_HAVE_ABSTRACT_UNIX_SOCKETS
 sup->sun_path[0] = 0;  /* Abstract local socket addr - Linux-specific? */
 return offsetof(struct sockaddr_un, sun_path) + 1
@@ -1709,12 +1712,13 @@ time_t last_connection_time = (time_t)0;
 int local_queue_run_max = 0;
 
 if (is_multiple_qrun())
-
+  {
   /* Nuber of runner-tracking structs needed:  If the option queue_run_max has
   no expandable elements then it is the overall maximum; else we assume it
   depends on the queue name, and add them up to get the maximum.
   Evaluate both that and the individual limits. */
 
+  GET_OPTION("queue_run_max");
   if (Ustrchr(queue_run_max, '$') != NULL)
     {
     for (qrunner * q = qrunners; q; q = q->next)
@@ -1731,6 +1735,7 @@ if (is_multiple_qrun())
     for (qrunner * q = qrunners; q; q = q->next)
       q->run_max = local_queue_run_max;
     }
+  }
 
 process_purpose = US"daemon";
 
diff --git a/src/src/deliver.c b/src/src/deliver.c
index 2cef3d731..70f44535f 100644
--- a/src/src/deliver.c
+++ b/src/src/deliver.c
@@ -1858,8 +1858,9 @@ if (tp->gid_set)
   }
 else if (tp->expand_gid)
   {
+  GET_OPTION("group");
   if (!route_find_expanded_group(tp->expand_gid, tp->name, US"transport", gidp,
-    &(addr->message)))
+    &addr->message))
     {
     common_error(FALSE, addr, ERRNO_GIDFAIL, NULL);
     return FALSE;
@@ -1885,6 +1886,7 @@ it does not provide a passwd value from which a gid can be taken. */
 else if (tp->expand_uid)
   {
   struct passwd *pw;
+  GET_OPTION("user");
   if (!route_find_expanded_user(tp->expand_uid, tp->name, US"transport", &pw,
        uidp, &(addr->message)))
     {
@@ -1988,6 +1990,7 @@ check_message_size(transport_instance *tp, address_item *addr)
 int rc = OK;
 int size_limit;
 
+GET_OPTION("message_size_limit");
 deliver_set_expansions(addr);
 size_limit = expand_string_integer(tp->message_size_limit, TRUE);
 deliver_set_expansions(NULL);
@@ -2150,6 +2153,7 @@ if(addr->prop.errors_address)
 else
   return_path = sender_address;
 
+GET_OPTION("return_path");
 if (tp->return_path)
   {
   uschar * new_return_path = expand_string(tp->return_path);
@@ -2179,6 +2183,7 @@ if (!findugid(addr, tp, &uid, &gid, &use_initgroups)) return;
 home directory set in the address may already be expanded; a flag is set to
 indicate that. In other cases we must expand it. */
 
+GET_OPTION("home_directory");
 if (  (deliver_home = tp->home_dir)        /* Set in transport, or */
    || (  (deliver_home = addr->home_dir)    /* Set in address and */
       && !testflag(addr, af_home_expanded)    /*   not expanded */
@@ -2208,6 +2213,7 @@ all users have access. It is necessary to be in a visible directory for some
 operating systems when running pipes, as some commands (e.g. "rm" under Solaris
 2.5) require this. */
 
+GET_OPTION("current_directory");
 working_directory = tp->current_dir ? tp->current_dir : addr->current_dir;
 if (working_directory)
   {
@@ -2605,36 +2611,40 @@ if ((status & 0xffff) != 0)
 
 /* If SPECIAL_WARN is set in the top address, send a warning message. */
 
-if (addr->special_action == SPECIAL_WARN && addr->transport->warn_message)
+if (addr->special_action == SPECIAL_WARN)
   {
-  int fd;
-  uschar *warn_message;
-  pid_t pid;
+  uschar * warn_message = addr->transport->warn_message;
+  GET_OPTION("quota_warn_message");
+  if (warn_message)
+    {
+    int fd;
+    pid_t pid;
 
-  DEBUG(D_deliver) debug_printf("Warning message requested by transport\n");
+    DEBUG(D_deliver) debug_printf("Warning message requested by transport\n");
 
-  if (!(warn_message = expand_string(addr->transport->warn_message)))
-    log_write(0, LOG_MAIN|LOG_PANIC, "Failed to expand \"%s\" (warning "
-      "message for %s transport): %s", addr->transport->warn_message,
-      addr->transport->name, expand_string_message);
+    if (!(warn_message = expand_string(warn_message)))
+      log_write(0, LOG_MAIN|LOG_PANIC, "Failed to expand \"%s\" (warning "
+    "message for %s transport): %s", addr->transport->warn_message,
+    addr->transport->name, expand_string_message);
 
-  else if ((pid = child_open_exim(&fd, US"tpt-warning-message")) > 0)
-    {
-    FILE *f = fdopen(fd, "wb");
-    if (errors_reply_to && !contains_header(US"Reply-To", warn_message))
-      fprintf(f, "Reply-To: %s\n", errors_reply_to);
-    fprintf(f, "Auto-Submitted: auto-replied\n");
-    if (!contains_header(US"From", warn_message))
-      moan_write_from(f);
-    fprintf(f, "%s", CS warn_message);
+    else if ((pid = child_open_exim(&fd, US"tpt-warning-message")) > 0)
+      {
+      FILE * f = fdopen(fd, "wb");
+      if (errors_reply_to && !contains_header(US"Reply-To", warn_message))
+    fprintf(f, "Reply-To: %s\n", errors_reply_to);
+      fprintf(f, "Auto-Submitted: auto-replied\n");
+      if (!contains_header(US"From", warn_message))
+    moan_write_from(f);
+      fprintf(f, "%s", CS warn_message);
 
-    /* Close and wait for child process to complete, without a timeout. */
+      /* Close and wait for child process to complete, without a timeout. */
 
-    (void)fclose(f);
-    (void)child_close(pid, 0);
-    }
+      (void)fclose(f);
+      (void)child_close(pid, 0);
+      }
 
-  addr->special_action = SPECIAL_NONE;
+    addr->special_action = SPECIAL_NONE;
+    }
   }
 }
 
@@ -2650,6 +2660,7 @@ tpt_parallel_check(transport_instance * tp, address_item * addr, uschar ** key)
 {
 unsigned max_parallel;
 
+GET_OPTION("max_parallel");
 if (!tp->max_parallel) return FALSE;
 
 max_parallel = (unsigned) expand_string_integer(tp->max_parallel, TRUE);
@@ -2773,6 +2784,7 @@ while (addr_local)
     /* Expand the batch_id string for comparison with other addresses.
     Expansion failure suppresses batching. */
 
+    GET_OPTION("batch_id");
     if (tp->batch_id)
       {
       deliver_set_expansions(addr);
@@ -2827,11 +2839,12 @@ while (addr_local)
 
       if (ok && batch_id)
         {
-        uschar *bid;
-        address_item *save_nextnext = next->next;
+        uschar * bid;
+        address_item * save_nextnext = next->next;
         next->next = NULL;            /* Expansion for a single address */
         deliver_set_expansions(next);
         next->next = save_nextnext;
+    GET_OPTION("batch_id");
         bid = expand_string(tp->batch_id);
         deliver_set_expansions(NULL);
         if (!bid)
@@ -4454,9 +4467,10 @@ nonmatch domains
   else
     return_path = sender_address;
 
+  GET_OPTION("return_path");
   if (tp->return_path)
     {
-    uschar *new_return_path = expand_string(tp->return_path);
+    uschar * new_return_path = expand_string(tp->return_path);
     if (new_return_path)
       return_path = new_return_path;
     else if (!f.expand_string_forcedfail)
@@ -5557,18 +5571,18 @@ return actual_time;
 
 static FILE *
 expand_open(const uschar * filename,
-  const uschar * varname, const uschar * reason)
+  const uschar * optname, const uschar * reason)
 {
 const uschar * s = expand_cstring(filename);
 FILE * fp = NULL;
 
 if (!s || !*s)
   log_write(0, LOG_MAIN|LOG_PANIC,
-    "Failed to expand %s: '%s'\n", varname, filename);
+    "Failed to expand %s: '%s'\n", optname, filename);
 else if (*s != '/' || is_tainted(s))
   log_write(0, LOG_MAIN|LOG_PANIC,
     "%s is not %s after expansion: '%s'\n",
-    varname, *s == '/' ? "untainted" : "absolute", s);
+    optname, *s == '/' ? "untainted" : "absolute", s);
 else if (!(fp = Ufopen(s, "rb")))
   log_write(0, LOG_MAIN|LOG_PANIC, "Failed to open %s for %s "
     "message texts: %s", s, reason, strerror(errno));
@@ -5699,6 +5713,7 @@ else
   /* Open a template file if one is provided. Log failure to open, but
   carry on - default texts will be used. */
 
+  GET_OPTION("bounce_message_file");
   if (bounce_message_file)
     emf = expand_open(bounce_message_file,
         US"bounce_message_file", US"error");
@@ -6058,6 +6073,7 @@ transport_ctx tctx = {{0}};
 
 if (pid <= 0) return FALSE;
 
+GET_OPTION("warn_message_file");
 if (warn_message_file)
   wmf = expand_open(warn_message_file,
       US"warn_message_file", US"warning");
@@ -6757,6 +6773,7 @@ else if (system_filter && process_recipients != RECIP_FAIL_TIMEOUT)
 
   /* Any error in the filter file causes a delivery to be abandoned. */
 
+  GET_OPTION("system_filter");
   redirect.string = system_filter;
   redirect.isfile = TRUE;
   redirect.check_owner = redirect.check_group = FALSE;
@@ -6936,12 +6953,14 @@ else if (system_filter && process_recipients != RECIP_FAIL_TIMEOUT)
         if (p->address[0] == '|')
           {
           type = US"pipe";
+      GET_OPTION("system_filter_pipe_transport");
           tpname = system_filter_pipe_transport;
           address_pipe = p->address;
           }
         else if (p->address[0] == '>')
           {
           type = US"reply";
+      GET_OPTION("system_filter_reply_transport");
           tpname = system_filter_reply_transport;
           }
         else
@@ -6949,11 +6968,13 @@ else if (system_filter && process_recipients != RECIP_FAIL_TIMEOUT)
           if (p->address[Ustrlen(p->address)-1] == '/')
             {
             type = US"directory";
+        GET_OPTION("system_filter_directory_transport");
             tpname = system_filter_directory_transport;
             }
           else
             {
             type = US"file";
+        GET_OPTION("system_filter_file_transport");
             tpname = system_filter_file_transport;
             }
           address_file = p->address;
@@ -8437,54 +8458,57 @@ else if (addr_defer != (address_item *)(+1))
         || addr_defer->dsn_flags & rf_notify_delay
     )
      && delay_warning[1] > 0
-     && sender_address[0] != 0
-     && (  !delay_warning_condition
-        || expand_check_condition(delay_warning_condition,
-            US"delay_warning", US"option")
-    )
-     )
+     && sender_address[0] != 0)
     {
-    int count;
-    int show_time;
-    int queue_time = time(NULL) - received_time.tv_sec;
-
-    queue_time = test_harness_fudged_queue_time(queue_time);
-
-    /* See how many warnings we should have sent by now */
+    GET_OPTION("delay_warning_condition");
+    if ( (  !delay_warning_condition
+        || expand_check_condition(delay_warning_condition,
+        US"delay_warning", US"option")
+      )
+       )
+      {
+      int count;
+      int show_time;
+      int queue_time = time(NULL) - received_time.tv_sec;
 
-    for (count = 0; count < delay_warning[1]; count++)
-      if (queue_time < delay_warning[count+2]) break;
+      queue_time = test_harness_fudged_queue_time(queue_time);
 
-    show_time = delay_warning[count+1];
+      /* See how many warnings we should have sent by now */
 
-    if (count >= delay_warning[1])
-      {
-      int extra;
-      int last_gap = show_time;
-      if (count > 1) last_gap -= delay_warning[count];
-      extra = (queue_time - delay_warning[count+1])/last_gap;
-      show_time += last_gap * extra;
-      count += extra;
-      }
+      for (count = 0; count < delay_warning[1]; count++)
+    if (queue_time < delay_warning[count+2]) break;
 
-    DEBUG(D_deliver)
-      {
-      debug_printf("time on queue = %s  id %s  addr %s\n",
-    readconf_printtime(queue_time), message_id, addr_defer->address);
-      debug_printf("warning counts: required %d done %d\n", count,
-        warning_count);
-      }
+      show_time = delay_warning[count+1];
 
-    /* We have computed the number of warnings there should have been by now.
-    If there haven't been enough, send one, and up the count to what it should
-    have been. */
+      if (count >= delay_warning[1])
+    {
+    int extra;
+    int last_gap = show_time;
+    if (count > 1) last_gap -= delay_warning[count];
+    extra = (queue_time - delay_warning[count+1])/last_gap;
+    show_time += last_gap * extra;
+    count += extra;
+    }
 
-    if (warning_count < count)
-      if (send_warning_message(recipients, queue_time, show_time))
+      DEBUG(D_deliver)
     {
-    warning_count = count;
-    update_spool = TRUE;    /* Ensure spool rewritten */
+    debug_printf("time on queue = %s  id %s  addr %s\n",
+      readconf_printtime(queue_time), message_id, addr_defer->address);
+    debug_printf("warning counts: required %d done %d\n", count,
+      warning_count);
     }
+
+      /* We have computed the number of warnings there should have been by now.
+      If there haven't been enough, send one, and up the count to what it should
+      have been. */
+
+      if (warning_count < count)
+    if (send_warning_message(recipients, queue_time, show_time))
+      {
+      warning_count = count;
+      update_spool = TRUE;    /* Ensure spool rewritten */
+      }
+      }
     }
 
   /* Clear deliver_domain */
diff --git a/src/src/dkim.c b/src/src/dkim.c
index 63b16af39..9e76c51a0 100644
--- a/src/src/dkim.c
+++ b/src/src/dkim.c
@@ -624,6 +624,7 @@ if (dkim->dot_stuffed)
 
 store_pool = POOL_MAIN;
 
+GET_OPTION("dkim_domain");
 if ((s = dkim->dkim_domain) && !(dkim_domain = expand_cstring(s)))
   /* expansion error, do not send message. */
   { errwhen = US"dkim_domain"; goto expand_bad; }
@@ -652,6 +653,7 @@ if (dkim_domain)
   /* Set $dkim_selector expansion variable to each selector in list,
   for this domain. */
 
+  GET_OPTION("dkim_selector");
   if (!(dkim_sel = expand_string(dkim->dkim_selector)))
     { errwhen = US"dkim_selector"; goto expand_bad; }
 
@@ -669,6 +671,7 @@ if (dkim_domain)
 
     /* Get canonicalization to use */
 
+    GET_OPTION("dkim_canon");
     dkim_canon_expanded = dkim->dkim_canon
       ? expand_string(dkim->dkim_canon) : US"relaxed";
     if (!dkim_canon_expanded)    /* expansion error, do not send message. */
@@ -686,6 +689,7 @@ if (dkim_domain)
       pdkim_canon = PDKIM_CANON_RELAXED;
       }
 
+    GET_OPTION("dkim_sign_headers");
     if (  dkim->dkim_sign_headers
        && !(dkim_sign_headers_expanded = expand_string(dkim->dkim_sign_headers)))
       { errwhen = US"dkim_sign_header"; goto expand_bad; }
@@ -693,6 +697,7 @@ if (dkim_domain)
 
     /* Get private key to use. */
 
+    GET_OPTION("dkim_private_key");
     if (!(dkim_private_key_expanded = expand_string(dkim->dkim_private_key)))
       { errwhen = US"dkim_private_key"; goto expand_bad; }
 
@@ -707,15 +712,18 @@ if (dkim_domain)
          expand_file_big_buffer(dkim_private_key_expanded)))
       goto bad;
 
+    GET_OPTION("dkim_hash");
     if (!(dkim_hash_expanded = expand_string(dkim->dkim_hash)))
       { errwhen = US"dkim_hash"; goto expand_bad; }
 
+    GET_OPTION("dkim_identity");
     if (dkim->dkim_identity)
       if (!(dkim_identity_expanded = expand_string(dkim->dkim_identity)))
     { errwhen = US"dkim_identity"; goto expand_bad; }
       else if (!*dkim_identity_expanded)
     dkim_identity_expanded = NULL;
 
+    GET_OPTION("dkim_timestamps");
     if (dkim->dkim_timestamps)
       if (!(dkim_timestamps_expanded = expand_string(dkim->dkim_timestamps)))
     { errwhen = US"dkim_timestamps"; goto expand_bad; }
diff --git a/src/src/dkim_transport.c b/src/src/dkim_transport.c
index 38f849af6..8c8d9b41a 100644
--- a/src/src/dkim_transport.c
+++ b/src/src/dkim_transport.c
@@ -18,6 +18,7 @@
 static BOOL
 dkt_sign_fail(struct ob_dkim * dkim, int * errp)
 {
+GET_OPTION("dkim_strict");
 if (dkim->dkim_strict)
   {
   uschar * dkim_strict_result = expand_string(dkim->dkim_strict);
diff --git a/src/src/exim.c b/src/src/exim.c
index 10fc98963..c591ee60c 100644
--- a/src/src/exim.c
+++ b/src/src/exim.c
@@ -5063,6 +5063,8 @@ for (i = 0;;)
         /* If a pattern for matching the gecos field was supplied, apply
         it and then expand the name string. */
 
+    GET_OPTION("gecos_pattern");
+    GET_OPTION("gecos_name");
         if (gecos_pattern && gecos_name)
           {
           const pcre2_code *re;
@@ -5108,6 +5110,7 @@ any setting of unknown_login overrides the actual name. */
 
 if (!originator_login || f.running_in_test_harness)
   {
+  GET_OPTION("unknown_login");
   if (unknown_login)
     {
     originator_login = expand_string(unknown_login);
@@ -5407,17 +5410,18 @@ for hosts that want to play several parts at once. We need to ensure that it is
 set for host checking, and for receiving messages. */
 
 smtp_active_hostname = primary_hostname;
-if (raw_active_hostname != NULL)
+GET_OPTION("smtp_active_hostname");
+if (raw_active_hostname)
   {
-  uschar *nah = expand_string(raw_active_hostname);
-  if (nah == NULL)
+  uschar * nah = expand_string(raw_active_hostname);
+  if (!nah)
     {
     if (!f.expand_string_forcedfail)
       log_write(0, LOG_MAIN|LOG_PANIC_DIE, "failed to expand \"%s\" "
         "(smtp_active_hostname): %s", raw_active_hostname,
         expand_string_message);
     }
-  else if (nah[0] != 0) smtp_active_hostname = nah;
+  else if (nah[0]) smtp_active_hostname = nah;
   }
 
 /* Handle host checking: this facility mocks up an incoming SMTP call from a
@@ -5675,6 +5679,7 @@ if (smtp_input)
 
 else
   {
+  GET_OPTION("message_size_limit");
   thismessage_size_limit = expand_string_integer(message_size_limit, TRUE);
   if (expand_string_message)
     if (thismessage_size_limit == -1)
@@ -5767,14 +5772,18 @@ for (BOOL more = TRUE; more; )
       the very end. The result of the ACL is ignored (as for other non-SMTP
       messages). It is run for its potential side effects. */
 
-      if (smtp_batched_input && acl_not_smtp_start != NULL)
-        {
-        uschar *user_msg, *log_msg;
-        f.enable_dollar_recipients = TRUE;
-        (void)acl_check(ACL_WHERE_NOTSMTP_START, NULL, acl_not_smtp_start,
-          &user_msg, &log_msg);
-        f.enable_dollar_recipients = FALSE;
-        }
+      if (smtp_batched_input)
+    {
+    GET_OPTION("acl_not_smtp_start");
+    if (acl_not_smtp_start)
+      {
+      uschar * user_msg, * log_msg;
+      f.enable_dollar_recipients = TRUE;
+      (void)acl_check(ACL_WHERE_NOTSMTP_START, NULL, acl_not_smtp_start,
+        &user_msg, &log_msg);
+      f.enable_dollar_recipients = FALSE;
+      }
+    }
 
       /* Now get the data for the message */
 
@@ -5928,9 +5937,10 @@ for (BOOL more = TRUE; more; )
     ignored; rejecting here would just add complication, and it can just as
     well be done later. Allow $recipients to be visible in the ACL. */
 
+    GET_OPTION("acl_not_smtp_start");
     if (acl_not_smtp_start)
       {
-      uschar *user_msg, *log_msg;
+      uschar * user_msg, * log_msg;
       f.enable_dollar_recipients = TRUE;
       (void)acl_check(ACL_WHERE_NOTSMTP_START, NULL, acl_not_smtp_start,
         &user_msg, &log_msg);
diff --git a/src/src/expand.c b/src/src/expand.c
index f9813133d..6be5cca0e 100644
--- a/src/src/expand.c
+++ b/src/src/expand.c
@@ -8737,12 +8737,14 @@ Returns:     OK     value placed in rvalue
 */
 
 int
-exp_bool(address_item *addr,
-  uschar *mtype, uschar *mname, unsigned dbg_opt,
-  uschar *oname, BOOL bvalue,
-  uschar *svalue, BOOL *rvalue)
+exp_bool(address_item * addr,
+  uschar * mtype, uschar * mname, unsigned dbg_opt,
+  uschar * oname, BOOL bvalue,
+  uschar * svalue, BOOL * rvalue)
 {
-uschar *expanded;
+uschar * expanded;
+
+DEBUG(D_expand) debug_printf("try option %s\n", oname);
 if (!svalue) { *rvalue = bvalue; return OK; }
 
 if (!(expanded = expand_string(svalue)))
diff --git a/src/src/macros.h b/src/src/macros.h
index 8aed335b5..902cdd165 100644
--- a/src/src/macros.h
+++ b/src/src/macros.h
@@ -1190,4 +1190,8 @@ When doing en extended loop of matching, release store periodically. */
 
 #define    REGEX_LOOPCOUNT_STORE_RESET    1000
 
+/* Debug an option access. Use for non-list ones about to be expanded. */
+#define GET_OPTION(name) \
+  DEBUG(D_expand) debug_printf("try option " name "\n");
+
 /* End of macros.h */
diff --git a/src/src/moan.c b/src/src/moan.c
index a3c8e0aba..6fe82b29c 100644
--- a/src/src/moan.c
+++ b/src/src/moan.c
@@ -30,8 +30,9 @@ Returns:    nothing
 void
 moan_write_from(FILE *f)
 {
-uschar * s = expand_string(dsn_from);
-if (!s)
+uschar * s;
+GET_OPTION("dsn_from");
+if (!(s = expand_string(dsn_from)))
   {
   log_write(0, LOG_MAIN|LOG_PANIC,
     "Failed to expand dsn_from (using default): %s", expand_string_message);
@@ -175,6 +176,7 @@ uschar * s, * s2;
 /* For DMARC if there is a specific sender set, expand the variable for the
 header From: and grab the address from that for the envelope FROM. */
 
+GET_OPTION("dmarc_forensic_sender");
 if (  ident == ERRMESS_DMARC_FORENSIC
    && dmarc_forensic_sender
    && (s = expand_string(dmarc_forensic_sender))
@@ -513,9 +515,12 @@ if (check_sender && message_file && f.trusted_caller &&
   {
   uschar *new_sender = NULL;
   if (regex_match_and_setup(regex_From, big_buffer, 0, -1))
+    {
+    GET_OPTION("uucp_from_sender");
     new_sender = expand_string(uucp_from_sender);
+    }
   if (new_sender) sender_address = new_sender;
-    else firstline = big_buffer;
+  else firstline = big_buffer;
   }
 
 /* If viable sender address, send a message */
diff --git a/src/src/receive.c b/src/src/receive.c
index 990b9c22e..abac05c56 100644
--- a/src/src/receive.c
+++ b/src/src/receive.c
@@ -1574,6 +1574,7 @@ uschar * timestamp = expand_string(US"${tod_full}");
 header_line * received_header= header_list;
 
 if (recipients_count == 1) received_for = recipients_list[0].address;
+GET_OPTION("received_header_text");
 received = expand_string(received_header_text);
 received_for = NULL;
 
@@ -2201,8 +2202,9 @@ OVERSIZE:
     {
     if (!f.sender_address_forced)
       {
-      uschar *uucp_sender = expand_string(uucp_from_sender);
-      if (!uucp_sender)
+      uschar * uucp_sender;
+      GET_OPTION("uucp_from_sender");
+      if (!(uucp_sender = expand_string(uucp_from_sender)))
         log_write(0, LOG_MAIN|LOG_PANIC,
           "expansion of \"%s\" failed after matching "
           "\"From \" line: %s", uucp_from_sender, expand_string_message);
@@ -2821,6 +2823,7 @@ if (  !msgid_header
 
   /* Permit only letters, digits, dots, and hyphens in the domain */
 
+  GET_OPTION("message_id_header_domain");
   if (message_id_domain)
     {
     uschar *new_id_domain = expand_string(message_id_domain);
@@ -2842,6 +2845,7 @@ if (  !msgid_header
   /* Permit all characters except controls and RFC 2822 specials in the
   additional text part. */
 
+  GET_OPTION("message_id_header_text");
   if (message_id_text)
     {
     uschar *new_id_text = expand_string(message_id_text);
@@ -3517,6 +3521,7 @@ else
       dkim_exim_verify_finish();
 
       /* Check if we must run the DKIM ACL */
+      GET_OPTION("acl_smtp_dkim");
       if (acl_smtp_dkim && dkim_verify_signers && *dkim_verify_signers)
         {
         uschar * dkim_verify_signers_expanded =
@@ -3606,11 +3611,14 @@ else
 #endif /* DISABLE_DKIM */
 
 #ifdef WITH_CONTENT_SCAN
-    if (  recipients_count > 0
-       && acl_smtp_mime
-       && !run_mime_acl(acl_smtp_mime, &smtp_yield, &smtp_reply, &blackholed_by)
-       )
-      goto TIDYUP;
+    if (recipients_count > 0)
+      {
+      GET_OPTION("acl_smtp_mime");
+      if (acl_smtp_mime
+     && !run_mime_acl(acl_smtp_mime, &smtp_yield, &smtp_reply, &blackholed_by)
+     )
+    goto TIDYUP;
+      }
 #endif /* WITH_CONTENT_SCAN */
 
 #ifdef SUPPORT_DMARC
@@ -3618,67 +3626,73 @@ else
 #endif
 
 #ifndef DISABLE_PRDR
-    if (prdr_requested && recipients_count > 1 && acl_smtp_data_prdr)
+    if (prdr_requested && recipients_count > 1)
       {
-      int all_pass = OK;
-      int all_fail = FAIL;
+      GET_OPTION("acl_smtp_data_prdr");
+      if (acl_smtp_data_prdr)
+    {
+    int all_pass = OK;
+    int all_fail = FAIL;
 
-      smtp_printf("353 PRDR content analysis beginning\r\n", SP_MORE);
-      /* Loop through recipients, responses must be in same order received */
-      for (unsigned int c = 0; recipients_count > c; c++)
-        {
-    const uschar * addr = recipients_list[c].address;
-    uschar * msg= US"PRDR R=<%s> %s";
-    uschar * code;
-        DEBUG(D_receive)
-          debug_printf("PRDR processing recipient %s (%d of %d)\n",
-                       addr, c+1, recipients_count);
-        rc = acl_check(ACL_WHERE_PRDR, addr,
-                       acl_smtp_data_prdr, &user_msg, &log_msg);
-
-        /* If any recipient rejected content, indicate it in final message */
-        all_pass |= rc;
-        /* If all recipients rejected, indicate in final message */
-        all_fail &= rc;
-
-        switch (rc)
-          {
-          case OK: case DISCARD: code = US"250"; break;
-          case DEFER:            code = US"450"; break;
-          default:               code = US"550"; break;
-          }
-    if (user_msg != NULL)
-      smtp_user_msg(code, user_msg);
-    else
+    smtp_printf("353 PRDR content analysis beginning\r\n", SP_MORE);
+    /* Loop through recipients, responses must be in same order received */
+    for (unsigned int c = 0; recipients_count > c; c++)
       {
+      const uschar * addr = recipients_list[c].address;
+      uschar * msg= US"PRDR R=<%s> %s";
+      uschar * code;
+      DEBUG(D_receive)
+        debug_printf("PRDR processing recipient %s (%d of %d)\n",
+             addr, c+1, recipients_count);
+      rc = acl_check(ACL_WHERE_PRDR, addr,
+             acl_smtp_data_prdr, &user_msg, &log_msg);
+
+      /* If any recipient rejected content, indicate it in final message */
+      all_pass |= rc;
+      /* If all recipients rejected, indicate in final message */
+      all_fail &= rc;
+
       switch (rc)
-            {
-            case OK: case DISCARD:
-              msg = string_sprintf(CS msg, addr, "acceptance");        break;
-            case DEFER:
-              msg = string_sprintf(CS msg, addr, "temporary refusal"); break;
-            default:
-              msg = string_sprintf(CS msg, addr, "refusal");           break;
-            }
-          smtp_user_msg(code, msg);
-      }
-    if (log_msg)       log_write(0, LOG_MAIN, "PRDR %s %s", addr, log_msg);
-    else if (user_msg) log_write(0, LOG_MAIN, "PRDR %s %s", addr, user_msg);
-    else               log_write(0, LOG_MAIN, "%s", CS msg);
+        {
+        case OK: case DISCARD: code = US"250"; break;
+        case DEFER:            code = US"450"; break;
+        default:               code = US"550"; break;
+        }
+      if (user_msg != NULL)
+        smtp_user_msg(code, user_msg);
+      else
+        {
+        switch (rc)
+          {
+          case OK: case DISCARD:
+        msg = string_sprintf(CS msg, addr, "acceptance");        break;
+          case DEFER:
+        msg = string_sprintf(CS msg, addr, "temporary refusal"); break;
+          default:
+        msg = string_sprintf(CS msg, addr, "refusal");           break;
+          }
+        smtp_user_msg(code, msg);
+        }
+      if (log_msg)       log_write(0, LOG_MAIN, "PRDR %s %s", addr, log_msg);
+      else if (user_msg) log_write(0, LOG_MAIN, "PRDR %s %s", addr, user_msg);
+      else               log_write(0, LOG_MAIN, "%s", CS msg);
 
-    if (rc != OK) { receive_remove_recipient(addr); c--; }
-        }
-      /* Set up final message, used if data acl gives OK */
-      smtp_reply = string_sprintf("%s id=%s message %s",
-               all_fail == FAIL ? US"550" : US"250",
-               message_id,
-                       all_fail == FAIL
-                 ? US"rejected for all recipients"
-             : all_pass == OK
-               ? US"accepted"
-               : US"accepted for some recipients");
-      if (recipients_count == 0)
-    goto NOT_ACCEPTED;
+      if (rc != OK) { receive_remove_recipient(addr); c--; }
+      }
+    /* Set up final message, used if data acl gives OK */
+    smtp_reply = string_sprintf("%s id=%s message %s",
+             all_fail == FAIL ? US"550" : US"250",
+             message_id,
+             all_fail == FAIL
+               ? US"rejected for all recipients"
+               : all_pass == OK
+                 ? US"accepted"
+                 : US"accepted for some recipients");
+    if (recipients_count == 0)
+      goto NOT_ACCEPTED;
+    }
+      else
+    prdr_requested = FALSE;
       }
     else
       prdr_requested = FALSE;
@@ -3687,6 +3701,7 @@ else
     /* Check the recipients count again, as the MIME ACL might have changed
     them. */
 
+    GET_OPTION("acl_smtp_data");
     if (acl_smtp_data && recipients_count > 0)
       {
       rc = acl_check(ACL_WHERE_DATA, NULL, acl_smtp_data, &user_msg, &log_msg);
@@ -3724,6 +3739,7 @@ else
     {
 
 #ifdef WITH_CONTENT_SCAN
+    GET_OPTION("acl_not_smtp_mime");
     if (  acl_not_smtp_mime
        && !run_mime_acl(acl_not_smtp_mime, &smtp_yield, &smtp_reply,
           &blackholed_by)
@@ -3731,9 +3747,10 @@ else
       goto TIDYUP;
 #endif /* WITH_CONTENT_SCAN */
 
+    GET_OPTION("acl_not_smtp");
     if (acl_not_smtp)
       {
-      uschar *user_msg, *log_msg;
+      uschar * user_msg, * log_msg;
       f.authentication_local = TRUE;
       rc = acl_check(ACL_WHERE_NOTSMTP, NULL, acl_not_smtp, &user_msg, &log_msg);
       if (rc == DISCARD)
diff --git a/src/src/route.c b/src/src/route.c
index 3401f15b4..0fdcdf2ed 100644
--- a/src/src/route.c
+++ b/src/src/route.c
@@ -616,7 +616,7 @@ uschar *check;
 
 if (!s) return OK;
 
-DEBUG(D_route) debug_printf("checking require_files\n");
+DEBUG(D_route|D_expand) debug_printf("checking require_files\n");
 
 listptr = s;
 while ((check = string_nextinlist(&listptr, &sep, NULL, 0)))
@@ -637,7 +637,7 @@ while ((check = string_nextinlist(&listptr, &sep, NULL, 0)))
 
   /* Empty items are just skipped */
 
-  if (*ss == 0) continue;
+  if (!*ss) continue;
 
   /* If there are no slashes in the string, we have a user name or uid, with
   optional group/gid. */
@@ -651,9 +651,9 @@ while ((check = string_nextinlist(&listptr, &sep, NULL, 0)))
     /* If there's a comma, temporarily terminate the user name/number
     at that point. Then set the uid. */
 
-    if (comma != NULL) *comma = 0;
+    if (comma) *comma = 0;
     ok = route_finduser(ss, &pw, &uid);
-    if (comma != NULL) *comma = ',';
+    if (comma) *comma = ',';
 
     if (!ok)
       {
@@ -663,24 +663,22 @@ while ((check = string_nextinlist(&listptr, &sep, NULL, 0)))
 
     /* If there was no comma, the gid is that associated with the user. */
 
-    if (comma == NULL)
-      {
-      if (pw != NULL) gid = pw->pw_gid; else
+    if (!comma)
+      if (pw)
+    gid = pw->pw_gid;
+      else
         {
         *perror = string_sprintf("group missing after numerical uid %d for "
           "require_files", (int)uid);
         goto RETURN_DEFER;
         }
-      }
     else
-      {
       if (!route_findgroup(comma + 1, &gid))
         {
         *perror = string_sprintf("group \"%s\" for require_files not found\n",
           comma + 1);
         goto RETURN_DEFER;
         }
-      }
 
     /* Note that we have values set, and proceed to next item */
 
@@ -974,6 +972,7 @@ check_local_user before any subsequent expansions are done. Otherwise, $home
 could mean different things for different options, which would be extremely
 confusing. */
 
+GET_OPTION("router_home_directory");
 if (r->router_home_directory)
   {
   uschar * router_home = expand_string(r->router_home_directory);
@@ -1018,7 +1017,8 @@ if ((rc = check_files(r->require_files, perror)) != OK)
 
 if (r->condition)
   {
-  DEBUG(D_route) debug_printf("checking \"condition\" \"%.80s\"...\n", r->condition);
+  DEBUG(D_route|D_expand)
+    debug_printf("checking \"condition\" \"%.80s\"...\n", r->condition);
   if (!expand_check_condition(r->condition, r->name, US"router"))
     {
     if (f.search_find_defer)
@@ -1440,6 +1440,7 @@ const uschar * varlist = r->set;
 tree_node ** root = (tree_node **) &addr->prop.variables;
 int sep = ';';
 
+GET_OPTION("set");
 if (!varlist) return OK;
 
 /* Walk the varlist, creating variables */
@@ -1474,6 +1475,7 @@ for (uschar * ele; (ele = string_nextinlist(&varlist, &sep, NULL, 0)); )
 
       /* Expand "more" if necessary; DEFER => an expansion failed */
 
+      GET_OPTION("more");
       yield = exp_bool(addr, US"router", r->name, D_route,
               US"more", r->more, r->expand_more, &more);
       if (yield != OK) return yield;
@@ -1754,7 +1756,7 @@ for (r = addr->start_router ? addr->start_router : routers; r; r = nextr)
 
   if (r->address_data)
     {
-    DEBUG(D_route) debug_printf("processing address_data\n");
+    DEBUG(D_route|D_expand) debug_printf("processing address_data\n");
     if (!(deliver_address_data = expand_string(r->address_data)))
       {
       if (f.expand_string_forcedfail)
@@ -1764,6 +1766,7 @@ for (r = addr->start_router ? addr->start_router : routers; r; r = nextr)
 
         /* Expand "more" if necessary; DEFER => an expansion failed */
 
+    GET_OPTION("more");
         yield = exp_bool(addr, US"router", r->name, D_route,
             US"more", r->more, r->expand_more, &more);
         if (yield != OK) goto ROUTE_EXIT;
@@ -1872,6 +1875,7 @@ for (r = addr->start_router ? addr->start_router : routers; r; r = nextr)
     {
     /* Expand "more" if necessary */
 
+    GET_OPTION("more");
     yield = exp_bool(addr, US"router", r->name, D_route,
                    US"more", r->more, r->expand_more, &more);
     if (yield != OK) goto ROUTE_EXIT;
@@ -1897,18 +1901,21 @@ if (!r)
   HDEBUG(D_route) debug_printf("no more routers\n");
   if (!addr->message)
     {
-    uschar *message = US"Unrouteable address";
-    if (addr->router && addr->router->cannot_route_message)
+    uschar * message = US"Unrouteable address";
+    if (addr->router)
       {
-      uschar *expmessage = expand_string(addr->router->cannot_route_message);
-      if (!expmessage)
-        {
-        if (!f.expand_string_forcedfail)
-          log_write(0, LOG_MAIN|LOG_PANIC, "failed to expand "
-            "cannot_route_message in %s router: %s", addr->router->name,
-            expand_string_message);
-        }
-      else message = expmessage;
+      uschar * s = addr->router->cannot_route_message;
+      GET_OPTION("cannot_route_message");
+      if (s)
+    {
+    if ((s = expand_string(s)))
+      message = s;
+    else
+      if (!f.expand_string_forcedfail)
+        log_write(0, LOG_MAIN|LOG_PANIC, "failed to expand "
+          "cannot_route_message in %s router: %s", addr->router->name,
+          expand_string_message);
+    }
       }
     addr->user_message = addr->message = message;
     }
@@ -1950,6 +1957,7 @@ networking, so it is included in the binary only if requested. */
 
 #ifdef SUPPORT_TRANSLATE_IP_ADDRESS
 
+GET_OPTION("translate_ip_address");
 if (r->translate_ip_address)
   {
   int rc;
@@ -2008,6 +2016,7 @@ if (r->translate_ip_address)
 /* See if this is an unseen routing; first expand the option if necessary.
 DEFER can be given if the expansion fails */
 
+GET_OPTION("unseen");
 yield = exp_bool(addr, US"router", r->name, D_route,
                US"unseen", r->unseen, r->expand_unseen, &unseen);
 if (yield != OK) goto ROUTE_EXIT;
diff --git a/src/src/routers/dnslookup.c b/src/src/routers/dnslookup.c
index d27757c7e..671e8c93f 100644
--- a/src/src/routers/dnslookup.c
+++ b/src/src/routers/dnslookup.c
@@ -151,14 +151,11 @@ host_item h;
 int rc;
 int widen_sep = 0;
 int whichrrs = HOST_FIND_BY_MX | HOST_FIND_BY_A | HOST_FIND_BY_AAAA;
-dnslookup_router_options_block *ob =
+dnslookup_router_options_block * ob =
   (dnslookup_router_options_block *)(rblock->options_block);
-uschar *srv_service = NULL;
-uschar *widen = NULL;
-const uschar *pre_widen = addr->domain;
-const uschar *post_widen = NULL;
-const uschar *fully_qualified_name;
-const uschar *listptr;
+uschar * srv_service = NULL, * widen = NULL;
+const uschar * pre_widen = addr->domain, * post_widen = NULL;
+const uschar * fully_qualified_name, * listptr;
 uschar widen_buffer[256];
 
 DEBUG(D_route)
@@ -167,8 +164,8 @@ DEBUG(D_route)
 
 /* If an SRV check is required, expand the service name */
 
+GET_OPTION("check_srv");
 if (ob->check_srv)
-  {
   if (  !(srv_service = expand_string(ob->check_srv))
      && !f.expand_string_forcedfail)
     {
@@ -176,8 +173,8 @@ if (ob->check_srv)
       rblock->name, ob->check_srv, expand_string_message);
     return DEFER;
     }
-  else whichrrs |= HOST_FIND_BY_SRV;
-  }
+  else
+    whichrrs |= HOST_FIND_BY_SRV;
 
 /* Set up the first of any widening domains. The code further down copes with
 either pre- or post-widening, but at present there is no way to turn on
diff --git a/src/src/routers/iplookup.c b/src/src/routers/iplookup.c
index a6dc0fc87..f9966bcc0 100644
--- a/src/src/routers/iplookup.c
+++ b/src/src/routers/iplookup.c
@@ -178,19 +178,17 @@ reply = store_get(256, GET_TAINTED);
 /* Build the query string to send. If not explicitly given, a default of
 "user@domain user@domain" is used. */
 
-if (ob->query == NULL)
+GET_OPTION("query");
+if (!ob->query)
   query = string_sprintf("%s@%s %s@%s", addr->local_part, addr->domain,
     addr->local_part, addr->domain);
 else
-  {
-  query = expand_string(ob->query);
-  if (query == NULL)
+  if (!(query = expand_string(ob->query)))
     {
     addr->message = string_sprintf("%s router: failed to expand %s: %s",
       rblock->name, ob->query, expand_string_message);
     return DEFER;
     }
-  }
 
 query_len = Ustrlen(query);
 DEBUG(D_route) debug_printf("%s router query is \"%s\"\n", rblock->name,
@@ -362,23 +360,24 @@ else
 /* If an explicit rerouting string is specified, expand it. Otherwise, use
 what was sent back verbatim. */
 
-if (ob->reroute != NULL)
+GET_OPTION("reroute");
+if (ob->reroute)
   {
   reroute = expand_string(ob->reroute);
   expand_nmax = -1;
-  if (reroute == NULL)
+  if (!reroute)
     {
     addr->message = string_sprintf("%s router: failed to expand %s: %s",
       rblock->name, ob->reroute, expand_string_message);
     return DEFER;
     }
   }
-else reroute = reply;
+else
+  reroute = reply;
 
 /* We should now have a new address in the form user@domain. */
 
-domain = Ustrchr(reroute, '@');
-if (domain == NULL)
+if (!(domain = Ustrchr(reroute, '@')))
   {
   log_write(0, LOG_MAIN, "%s router: reroute string %s is not of the form "
     "user@domain", rblock->name, reroute);
diff --git a/src/src/routers/manualroute.c b/src/src/routers/manualroute.c
index 160c866b9..200e0206e 100644
--- a/src/src/routers/manualroute.c
+++ b/src/src/routers/manualroute.c
@@ -118,8 +118,8 @@ if (ob->hai_code < 0)
 
 /* One of route_list or route_data must be specified */
 
-if ((ob->route_list == NULL && ob->route_data == NULL) ||
-    (ob->route_list != NULL && ob->route_data != NULL))
+if (  !ob->route_list && !ob->route_data
+   || ob->route_list && ob->route_data)
   log_write(0, LOG_PANIC_DIE|LOG_CONFIG_FOR, "%s router:\n  "
     "route_list or route_data (but not both) must be specified",
     rblock->name);
@@ -291,6 +291,7 @@ string, decline. */
 
 else
   {
+  GET_OPTION("route_data");
   if (!(route_item = rf_expand_data(addr, ob->route_data, &rc)))
     return rc;
   (void) parse_route_item(route_item, NULL, &hostlist, &options);
diff --git a/src/src/routers/queryprogram.c b/src/src/routers/queryprogram.c
index 2a6a73eb6..dd5e24b93 100644
--- a/src/src/routers/queryprogram.c
+++ b/src/src/routers/queryprogram.c
@@ -287,6 +287,7 @@ if (curr_uid != root_uid && (uid != curr_uid || gid != curr_gid))
 
 /* Set up the command to run */
 
+GET_OPTION("command");
 if (!transport_set_up_command(&argvptr, /* anchor for arg list */
     ob->command,                        /* raw command */
     TSUC_EXPAND_ARGS,                   /* arguments expanded but must not be tainted */
diff --git a/src/src/routers/redirect.c b/src/src/routers/redirect.c
index 4c8e30563..6b27c82b0 100644
--- a/src/src/routers/redirect.c
+++ b/src/src/routers/redirect.c
@@ -370,12 +370,11 @@ while (generated)
     in \N...\N to avoid expansion later. In Cygwin, home directories can
     contain $ characters. */
 
-    if (rblock->home_directory != NULL)
+    if (rblock->home_directory)
       next->home_dir = rblock->home_directory;
     else if (rblock->check_local_user)
       next->home_dir = string_sprintf("\\N%s\\N", pw->pw_dir);
-    else if (rblock->router_home_directory != NULL &&
-             testflag(addr, af_home_expanded))
+    else if (rblock->router_home_directory && testflag(addr, af_home_expanded))
       {
       next->home_dir = deliver_home;
       setflag(next, af_home_expanded);
@@ -395,6 +394,7 @@ while (generated)
     if (next->address[0] == '|')
       {
       address_pipe = next->address;
+      GET_OPTION("pipe_transport");
       if (rf_get_transport(ob->pipe_transport_name, &ob->pipe_transport,
           next, rblock->name, US"pipe_transport"))
         next->transport = ob->pipe_transport;
@@ -402,6 +402,7 @@ while (generated)
       }
     else if (next->address[0] == '>')
       {
+      GET_OPTION("reply_transport");
       if (rf_get_transport(ob->reply_transport_name, &ob->reply_transport,
           next, rblock->name, US"reply_transport"))
         next->transport = ob->reply_transport;
@@ -412,15 +413,19 @@ while (generated)
       address_file = next->address;
       if (next->address[len-1] == '/')
         {
+    GET_OPTION("directory_transport");
         if (rf_get_transport(ob->directory_transport_name,
             &(ob->directory_transport), next, rblock->name,
             US"directory_transport"))
           next->transport = ob->directory_transport;
         }
       else
+    {
+    GET_OPTION("file_transport");
         if (rf_get_transport(ob->file_transport_name, &ob->file_transport,
             next, rblock->name, US"file_transport"))
           next->transport = ob->file_transport;
+    }
 
       address_file = NULL;
       }
@@ -566,11 +571,15 @@ address. Otherwise, if a local qualify_domain is provided, set that up. */
 
 if (ob->qualify_preserve_domain)
   qualify_domain_recipient = addr->domain;
-else if (ob->qualify_domain)
+else
   {
-  uschar *new_qdr = rf_expand_data(addr, ob->qualify_domain, &xrc);
-  if (!new_qdr) return xrc;
-  qualify_domain_recipient = new_qdr;
+  GET_OPTION("qualify_domain");
+  if (ob->qualify_domain)
+    {
+    uschar *new_qdr = rf_expand_data(addr, ob->qualify_domain, &xrc);
+    if (!new_qdr) return xrc;
+    qualify_domain_recipient = new_qdr;
+    }
   }
 
 redirect.owners = ob->owners;
diff --git a/src/src/routers/rf_expand_data.c b/src/src/routers/rf_expand_data.c
index 9892567f0..6ba613215 100644
--- a/src/src/routers/rf_expand_data.c
+++ b/src/src/routers/rf_expand_data.c
@@ -31,7 +31,7 @@ uschar *
 rf_expand_data(address_item *addr, uschar *s, int *prc)
 {
 uschar *yield = expand_string(s);
-if (yield != NULL) return yield;
+if (yield) return yield;
 if (f.expand_string_forcedfail)
   {
   DEBUG(D_route) debug_printf("forced failure for expansion of \"%s\"\n", s);
diff --git a/src/src/routers/rf_get_errors_address.c b/src/src/routers/rf_get_errors_address.c
index 222d157d8..792b9b5f3 100644
--- a/src/src/routers/rf_get_errors_address.c
+++ b/src/src/routers/rf_get_errors_address.c
@@ -38,14 +38,13 @@ int
 rf_get_errors_address(address_item * addr, router_instance * rblock,
   int verify, const uschar ** errors_to)
 {
-uschar *s;
+uschar * s;
 
 *errors_to = addr->prop.errors_address;
 if (!rblock->errors_to) return OK;
 
-s = expand_string(rblock->errors_to);
-
-if (s == NULL)
+GET_OPTION("errors_to");
+if (!(s = expand_string(rblock->errors_to)))
   {
   if (f.expand_string_forcedfail)
     {
@@ -60,7 +59,7 @@ if (s == NULL)
 
 /* If the errors_to address is empty, it means "ignore errors" */
 
-if (*s == 0)
+if (!*s)
   {
   addr->prop.ignore_error = TRUE;   /* For locally detected errors */
   *errors_to = US"";                   /* Return path for SMTP */
diff --git a/src/src/routers/rf_get_transport.c b/src/src/routers/rf_get_transport.c
index d54e3c296..d37966865 100644
--- a/src/src/routers/rf_get_transport.c
+++ b/src/src/routers/rf_get_transport.c
@@ -47,6 +47,7 @@ rf_get_transport(uschar *tpname, transport_instance **tpptr, address_item *addr,
 uschar *ss;
 BOOL expandable;
 
+GET_OPTION("transport");
 if (!tpname)
   {
   if (!require_name) return TRUE;
diff --git a/src/src/smtp_in.c b/src/src/smtp_in.c
index 2d977b975..ff768e94c 100644
--- a/src/src/smtp_in.c
+++ b/src/src/smtp_in.c
@@ -2172,6 +2172,7 @@ lwr_receive_ungetc = NULL;
 
 /* Set up the message size limit; this may be host-specific */
 
+GET_OPTION("message_size_limit");
 thismessage_size_limit = expand_string_integer(message_size_limit, TRUE);
 if (expand_string_message)
   {
@@ -2569,6 +2570,7 @@ if (proxy_protocol_host())
 /* Run the connect ACL if it exists */
 
 user_msg = NULL;
+GET_OPTION("acl_smtp_connect");
 if (acl_smtp_connect)
   {
   int rc;
@@ -2615,16 +2617,20 @@ if (user_msg)
     esclen = codelen - 4;
     }
   }
-else if (!(s = expand_string(smtp_banner)))
+else
   {
-  log_write(0, f.expand_string_forcedfail ? LOG_MAIN : LOG_MAIN|LOG_PANIC_DIE,
-    "Expansion of \"%s\" (smtp_banner) failed: %s",
-    smtp_banner, expand_string_message);
-  /* for force-fail */
-#ifndef DISABLE_TLS
-  if (tls_in.on_connect) tls_close(NULL, TLS_SHUTDOWN_WAIT);
-#endif
-  return FALSE;
+  GET_OPTION("smtp_banner");
+  if (!(s = expand_string(smtp_banner)))
+    {
+    log_write(0, f.expand_string_forcedfail ? LOG_MAIN : LOG_MAIN|LOG_PANIC_DIE,
+      "Expansion of \"%s\" (smtp_banner) failed: %s",
+      smtp_banner, expand_string_message);
+    /* for force-fail */
+  #ifndef DISABLE_TLS
+    if (tls_in.on_connect) tls_close(NULL, TLS_SHUTDOWN_WAIT);
+  #endif
+    return FALSE;
+    }
   }
 
 /* Remove any terminating newlines; might as well remove trailing space too */
@@ -3185,6 +3191,7 @@ fl.smtp_exit_function_called = TRUE;
 
 /* Call the not-QUIT ACL, if there is one, unless no reason is given. */
 
+GET_OPTION("acl_smtp_notquit");
 if (acl_smtp_notquit && reason)
   {
   smtp_notquit_reason = reason;
@@ -3521,6 +3528,7 @@ smtp_quit_handler(uschar ** user_msgp, uschar ** log_msgp)
 HAD(SCH_QUIT);
 f.smtp_in_quit = TRUE;
 incomplete_transaction_log(US"QUIT");
+GET_OPTION("acl_smtp_quit");
 if (  acl_smtp_quit
    && acl_check(ACL_WHERE_QUIT, NULL, acl_smtp_quit, user_msgp, log_msgp)
     == ERROR)
@@ -3694,6 +3702,7 @@ while (done <= 0)
     for (auth_instance * au = auths; au; au = au->next)
       if (strcmpic(US"tls", au->driver_name) == 0)
     {
+    GET_OPTION("acl_smtp_auth");
     if (  acl_smtp_auth
        && (rc = acl_check(ACL_WHERE_AUTH, NULL, acl_smtp_auth,
               &user_msg, &log_msg)) != OK
@@ -3772,6 +3781,7 @@ while (done <= 0)
 
       /* Check the ACL */
 
+      GET_OPTION("acl_smtp_auth");
       if (  acl_smtp_auth
      && (rc = acl_check(ACL_WHERE_AUTH, NULL, acl_smtp_auth,
             &user_msg, &log_msg)) != OK
@@ -3966,6 +3976,7 @@ while (done <= 0)
       /* Apply an ACL check if one is defined; afterwards, recheck
       synchronization in case the client started sending in a delay. */
 
+      GET_OPTION("acl_smtp_helo");
       if (acl_smtp_helo)
     if ((rc = acl_check(ACL_WHERE_HELO, NULL, acl_smtp_helo,
           &user_msg, &log_msg)) != OK)
@@ -4097,16 +4108,19 @@ while (done <= 0)
     /* Advertise ETRN/VRFY/EXPN if there's are ACL checking whether a host is
     permitted to issue them; a check is made when any host actually tries. */
 
+    GET_OPTION("acl_smtp_etrn");
     if (acl_smtp_etrn)
       {
       g = string_catn(g, smtp_code, 3);
       g = string_catn(g, US"-ETRN\r\n", 7);
       }
+    GET_OPTION("acl_smtp_vrfy");
     if (acl_smtp_vrfy)
       {
       g = string_catn(g, smtp_code, 3);
       g = string_catn(g, US"-VRFY\r\n", 7);
       }
+    GET_OPTION("acl_smtp_expn");
     if (acl_smtp_expn)
       {
       g = string_catn(g, smtp_code, 3);
@@ -4502,6 +4516,7 @@ while (done <= 0)
           US"invalid data for AUTH");
         goto COMMAND_LOOP;
         }
+          GET_OPTION("acl_smtp_mailauth");
           if (!acl_smtp_mailauth)
         {
         ignore_msg = US"client not authenticated";
@@ -4698,6 +4713,7 @@ while (done <= 0)
       when pipelining is not advertised, do another sync check in case the ACL
       delayed and the client started sending in the meantime. */
 
+      GET_OPTION("acl_smtp_mail");
       if (acl_smtp_mail)
     {
     rc = acl_check(ACL_WHERE_MAIL, NULL, acl_smtp_mail, &user_msg, &log_msg);
@@ -4953,10 +4969,13 @@ while (done <= 0)
       if (f.recipients_discarded)
     rc = DISCARD;
       else
+    {
+    GET_OPTION("acl_smtp_rcpt");
     if (  (rc = acl_check(ACL_WHERE_RCPT, recipient, acl_smtp_rcpt, &user_msg,
               &log_msg)) == OK
        && !f.smtp_in_pipelining_advertised && !check_sync())
       goto SYNC_FAILURE;
+    }
 
       /* The ACL was happy */
 
@@ -5119,6 +5138,7 @@ while (done <= 0)
     since the ACL may have delayed.  To handle cutthrough delivery enforce a
     dummy call to get the DATA command sent. */
 
+    GET_OPTION("acl_smtp_predata");
     if (!acl_smtp_predata && cutthrough.cctx.sock < 0)
       rc = OK;
     else
@@ -5177,6 +5197,7 @@ while (done <= 0)
                     US"verify")))
       break;
 
+      GET_OPTION("acl_smtp_vrfy");
       if ((rc = acl_check(ACL_WHERE_VRFY, address, acl_smtp_vrfy,
             &user_msg, &log_msg)) != OK)
     done = smtp_handle_acl_fail(ACL_WHERE_VRFY, rc, user_msg, log_msg);
@@ -5215,6 +5236,7 @@ while (done <= 0)
 
     case EXPN_CMD:
       HAD(SCH_EXPN);
+      GET_OPTION("acl_smtp_expn");
       rc = acl_check(ACL_WHERE_EXPN, NULL, acl_smtp_expn, &user_msg, &log_msg);
       if (rc != OK)
     done = smtp_handle_acl_fail(ACL_WHERE_EXPN, rc, user_msg, log_msg);
@@ -5244,6 +5266,7 @@ while (done <= 0)
 
       /* Apply an ACL check if one is defined */
 
+      GET_OPTION("acl_smtp_starttls");
       if (  acl_smtp_starttls
      && (rc = acl_check(ACL_WHERE_STARTTLS, NULL, acl_smtp_starttls,
             &user_msg, &log_msg)) != OK
@@ -5362,6 +5385,7 @@ while (done <= 0)
     case QUIT_CMD:
       f.smtp_in_quit = TRUE;
       user_msg = NULL;
+      GET_OPTION("acl_smtp_quit");
       if (  acl_smtp_quit
          && ((rc = acl_check(ACL_WHERE_QUIT, NULL, acl_smtp_quit, &user_msg,
                 &log_msg)) == ERROR))
@@ -5481,6 +5505,7 @@ while (done <= 0)
       log_write(L_etrn, LOG_MAIN, "ETRN %s received from %s", smtp_cmd_argument,
     host_and_ident(FALSE));
 
+      GET_OPTION("acl_smtp_etrn");
       if ((rc = acl_check(ACL_WHERE_ETRN, NULL, acl_smtp_etrn,
           &user_msg, &log_msg)) != OK)
     {
@@ -5497,6 +5522,7 @@ while (done <= 0)
       since that is strictly the only kind of ETRN that can be implemented
       according to the RFC. */
 
+      GET_OPTION("smtp_etrn_command");
       if (smtp_etrn_command)
     {
     uschar *error;
diff --git a/src/src/smtp_out.c b/src/src/smtp_out.c
index 62557072e..895b594fc 100644
--- a/src/src/smtp_out.c
+++ b/src/src/smtp_out.c
@@ -278,6 +278,7 @@ if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, US &on, sizeof(on)))
 /* Set DSCP value, if we can. For now, if we fail to set the value, we don't
 bomb out, just log it and continue in default traffic class. */
 
+GET_OPTION("dscp");
 if (dscp && dscp_lookup(dscp, sc->host_af, &dscp_level, &dscp_option, &dscp_value))
   {
   HDEBUG(D_transport|D_acl|D_v)
diff --git a/src/src/spf.c b/src/src/spf.c
index 2e3f861eb..cc36463e4 100644
--- a/src/src/spf.c
+++ b/src/src/spf.c
@@ -253,10 +253,13 @@ if (!(spf_server = SPF_server_new_dns(dc, debug)))
   DEBUG(D_receive) debug_printf("spf: SPF_server_new() failed.\n");
   return FALSE;
   }
-  /* Override the outdated explanation URL.
-  See https://www.mail-archive.com/mailop@mailop.org/msg08019.html
-  Used to work as "Please%_see%_http://www.open-spf.org/Why?id=%{S}&ip=%{C}&receiver=%{R}",
-  but is broken now (May 18th, 2020) */
+
+/* Override the outdated explanation URL.
+See https://www.mail-archive.com/mailop@mailop.org/msg08019.html
+Used to work as "Please%_see%_http://www.open-spf.org/Why?id=%{S}&ip=%{C}&receiver=%{R}",
+but is broken now (May 18th, 2020) */
+
+GET_OPTION("spf_smtp_comment_template");
 if (!(s = expand_string(spf_smtp_comment_template)))
   log_write(0, LOG_MAIN|LOG_PANIC_DIE, "expansion of spf_smtp_comment_template failed");
 
diff --git a/src/src/transports/appendfile.c b/src/src/transports/appendfile.c
index ce52cc6ff..72c96f0d0 100644
--- a/src/src/transports/appendfile.c
+++ b/src/src/transports/appendfile.c
@@ -178,18 +178,24 @@ static int
 appendfile_transport_setup(transport_instance *tblock, address_item *addrlist,
   transport_feedback *dummy, uid_t uid, gid_t gid, uschar **errmsg)
 {
-appendfile_transport_options_block *ob =
+appendfile_transport_options_block * ob =
   (appendfile_transport_options_block *)(tblock->options_block);
-uschar *q = ob->quota;
+uschar * q;
 double default_value = 0.0;
 
 if (ob->expand_maildir_use_size_file)
-    ob->maildir_use_size_file = expand_check_condition(ob->expand_maildir_use_size_file,
+  {
+  GET_OPTION("maildir_use_size_file");
+  ob->maildir_use_size_file =
+    expand_check_condition(ob->expand_maildir_use_size_file,
         US"`maildir_use_size_file` in transport", tblock->name);
+  }
 
 /* Loop for quota, quota_filecount, quota_warn_threshold, mailbox_size,
 mailbox_filecount */
 
+GET_OPTION("quota");
+q = ob->quota;
 for (int i = 0; i < 5; i++)
   {
   double d = default_value;
@@ -258,6 +264,7 @@ for (int i = 0; i < 5; i++)
     which = US"quota";
       ob->quota_value = (off_t)d;
       ob->quota_no_check = no_check;
+      GET_OPTION("quota_filecount");
       q = ob->quota_filecount;
       break;
 
@@ -266,6 +273,7 @@ for (int i = 0; i < 5; i++)
     which = US"quota_filecount";
       ob->quota_filecount_value = (int)d;
       ob->quota_filecount_no_check = no_check;
+      GET_OPTION("quota_warn_threshold");
       q = ob->quota_warn_threshold;
       break;
 
@@ -273,6 +281,7 @@ for (int i = 0; i < 5; i++)
       if (d >= 2.0*1024.0*1024.0*1024.0 && sizeof(off_t) <= 4)
       which = US"quota_warn_threshold";
       ob->quota_warn_threshold_value = (off_t)d;
+      GET_OPTION("mailbox_size");
       q = ob->mailbox_size_string;
       default_value = -1.0;
       break;
@@ -281,6 +290,7 @@ for (int i = 0; i < 5; i++)
       if (d >= 2.0*1024.0*1024.0*1024.0 && sizeof(off_t) <= 4)
     which = US"mailbox_size";;
       ob->mailbox_size_value = (off_t)d;
+      GET_OPTION("mailbox_filecount");
       q = ob->mailbox_filecount_string;
       break;
 
@@ -399,10 +409,10 @@ if (ob->dirname)
   if (ob->maildir_format && ob->mailstore_format)
     log_write(0, LOG_PANIC_DIE|LOG_CONFIG_FOR, "%s transport:\n  "
       "only one of maildir and mailstore may be specified", tblock->name);
-  if (ob->quota_filecount != NULL && ob->quota == NULL)
+  if (ob->quota_filecount != NULL && !ob->quota)
     log_write(0, LOG_PANIC_DIE|LOG_CONFIG_FOR, "%s transport:\n  "
       "quota must be set if quota_filecount is set", tblock->name);
-  if (ob->quota_directory != NULL && ob->quota == NULL)
+  if (ob->quota_directory != NULL && !ob->quota)
     log_write(0, LOG_PANIC_DIE|LOG_CONFIG_FOR, "%s transport:\n  "
       "quota must be set if quota_directory is set", tblock->name);
   }
@@ -1221,6 +1231,7 @@ if (!fdname)
   {
   if (!(fdname = ob->filename))
     {
+    GET_OPTION("directory");
     fdname = ob->dirname;
     isdirectory = TRUE;
     }
@@ -2234,6 +2245,7 @@ else
 
     /* Use an explicitly configured directory if set */
 
+    GET_OPTION("quota_directory");
     if (ob->quota_directory)
       {
       if (!(check_path = expand_string(ob->quota_directory)))
@@ -2431,6 +2443,7 @@ else
     DEBUG(D_transport)
       debug_printf("delivering in maildir format in %s\n", path);
 
+    GET_OPTION("maildir_tag");
     nametag = ob->maildir_tag;
 
     /* Check that nametag expands successfully; a hard failure causes a panic
@@ -2567,9 +2580,10 @@ else
 
     /* Write the envelope file, then close it. */
 
+    GET_OPTION("mailstore_prefix");
     if (ob->mailstore_prefix)
       {
-      uschar *s = expand_string(ob->mailstore_prefix);
+      uschar * s = expand_string(ob->mailstore_prefix);
       if (!s)
         {
         if (!f.expand_string_forcedfail)
@@ -2595,9 +2609,10 @@ else
     for (address_item * taddr = addr; taddr; taddr = taddr->next)
       fprintf(env_file, "%s@%s\n", taddr->local_part, taddr->domain);
 
+    GET_OPTION("mailstore_suffix");
     if (ob->mailstore_suffix)
       {
-      uschar *s = expand_string(ob->mailstore_suffix);
+      uschar * s = expand_string(ob->mailstore_suffix);
       if (!s)
         {
         if (!f.expand_string_forcedfail)
@@ -2757,18 +2772,21 @@ transport_newlines = 0;
 
 /* Write any configured prefix text first */
 
-if (yield == OK && ob->message_prefix && *ob->message_prefix)
+if (yield == OK)
   {
-  uschar *prefix = expand_string(ob->message_prefix);
-  if (!prefix)
-    {
-    errno = ERRNO_EXPANDFAIL;
-    addr->transport_return = PANIC;
-    addr->message = string_sprintf("Expansion of \"%s\" (prefix for %s "
-      "transport) failed", ob->message_prefix, tblock->name);
-    yield = DEFER;
-    }
-  else if (!transport_write_string(fd, "%s", prefix)) yield = DEFER;
+  uschar * prefix = ob->message_prefix;
+  GET_OPTION("message_prefix");
+  if (prefix && *prefix)
+    if (!(prefix = expand_string(prefix)))
+      {
+      errno = ERRNO_EXPANDFAIL;
+      addr->transport_return = PANIC;
+      addr->message = string_sprintf("Expansion of \"%s\" (prefix for %s "
+    "transport) failed", ob->message_prefix, tblock->name);
+      yield = DEFER;
+      }
+    else if (!transport_write_string(fd, "%s", prefix))
+      yield = DEFER;
   }
 
 /* If the use_bsmtp option is on, we need to write SMTP prefix information. The
@@ -2820,18 +2838,21 @@ if (yield == OK)
 
 /* Now a configured suffix. */
 
-if (yield == OK && ob->message_suffix && *ob->message_suffix)
+if (yield == OK)
   {
-  uschar *suffix = expand_string(ob->message_suffix);
-  if (!suffix)
-    {
-    errno = ERRNO_EXPANDFAIL;
-    addr->transport_return = PANIC;
-    addr->message = string_sprintf("Expansion of \"%s\" (suffix for %s "
-      "transport) failed", ob->message_suffix, tblock->name);
-    yield = DEFER;
-    }
-  else if (!transport_write_string(fd, "%s", suffix)) yield = DEFER;
+  uschar * suffix = ob->message_suffix;
+  GET_OPTION("message_suffix");
+  if (suffix && *suffix)
+    if (!(suffix = expand_string(suffix)))
+      {
+      errno = ERRNO_EXPANDFAIL;
+      addr->transport_return = PANIC;
+      addr->message = string_sprintf("Expansion of \"%s\" (suffix for %s "
+    "transport) failed", ob->message_suffix, tblock->name);
+      yield = DEFER;
+      }
+    else if (!transport_write_string(fd, "%s", suffix))
+      yield = DEFER;
   }
 
 /* If batch smtp, write the terminating dot. */
diff --git a/src/src/transports/autoreply.c b/src/src/transports/autoreply.c
index fa884cec4..3755ba284 100644
--- a/src/src/transports/autoreply.c
+++ b/src/src/transports/autoreply.c
@@ -314,20 +314,21 @@ if (addr->reply)
   }
 else
   {
-  uschar *oncerepeat = ob->once_repeat;
+  uschar * oncerepeat;
 
   DEBUG(D_transport) debug_printf("taking data from transport\n");
-  from = ob->from;
-  reply_to = ob->reply_to;
-  to = ob->to;
-  cc = ob->cc;
-  bcc = ob->bcc;
-  subject = ob->subject;
-  headers = ob->headers;
-  text = ob->text;
-  file = ob->file;
-  logfile = ob->logfile;
-  oncelog = ob->oncelog;
+  GET_OPTION("once_repeat");    oncerepeat = ob->once_repeat;
+  GET_OPTION("from");         from = ob->from;
+  GET_OPTION("reply_to");    reply_to = ob->reply_to;
+  GET_OPTION("to");        to = ob->to;
+  GET_OPTION("cc");        cc = ob->cc;
+  GET_OPTION("bcc");        bcc = ob->bcc;
+  GET_OPTION("subject");    subject = ob->subject;
+  GET_OPTION("headers");     headers = ob->headers;
+  GET_OPTION("text");        text = ob->text;
+  GET_OPTION("file");        file = ob->file;
+  GET_OPTION("log");        logfile = ob->logfile;
+  GET_OPTION("once");        oncelog = ob->oncelog;
   file_expand = ob->file_expand;
   return_message = ob->return_message;
 
diff --git a/src/src/transports/pipe.c b/src/src/transports/pipe.c
index 64c70e719..157d2368f 100644
--- a/src/src/transports/pipe.c
+++ b/src/src/transports/pipe.c
@@ -315,6 +315,7 @@ argv = *argvptr;
 
 /* If allow_commands is set, see if the command is in the permitted list. */
 
+GET_OPTION("allow_commands");
 if (ob->allow_commands)
   {
   int sep = 0;
@@ -368,10 +369,11 @@ for it. */
 if (argv[0][0] != '/')
   {
   int sep = 0;
-  uschar *p;
-  const uschar *listptr = expand_string(ob->path);
+  uschar * p;
 
-  while ((p = string_nextinlist(&listptr, &sep, NULL, 0)))
+  GET_OPTION("path");
+  for (const uschar * listptr = expand_string(ob->path);
+      p = string_nextinlist(&listptr, &sep, NULL, 0); )
     {
     struct stat statbuf;
     sprintf(CS big_buffer, "%.256s/%.256s", p, argv[0]);
@@ -550,6 +552,7 @@ if (testflag(addr, af_pfr) && addr->local_part[0] == '|')
     {
     /* Enables expansion of $address_pipe into separate arguments */
     setflag(addr, af_force_command);
+    GET_OPTION("commsnd");
     cmd = ob->cmd;
     expand_arguments = TRUE;
     expand_fail = PANIC;
@@ -563,6 +566,7 @@ if (testflag(addr, af_pfr) && addr->local_part[0] == '|')
     }
 else
   {
+  GET_OPTION("commsnd");
   cmd = ob->cmd;
   expand_arguments = TRUE;
   expand_fail = PANIC;
@@ -650,6 +654,7 @@ else if (timezone_string && timezone_string[0])
 
 /* Add any requested items */
 
+GET_OPTION("environment");
 if (envlist)
   if (!(envlist = expand_cstring(envlist)))
     {
@@ -796,9 +801,10 @@ transport_count = 0;
 
 /* First write any configured prefix information */
 
+GET_OPTION("message_prefix");
 if (ob->message_prefix)
   {
-  uschar *prefix = expand_string(ob->message_prefix);
+  uschar * prefix = expand_string(ob->message_prefix);
   if (!prefix)
     {
     addr->transport_return = f.search_find_defer? DEFER : PANIC;
@@ -838,9 +844,10 @@ if (!transport_write_message(&tctx, 0))
 
 /* Now any configured suffix */
 
+GET_OPTION("message_suffix");
 if (ob->message_suffix)
   {
-  uschar *suffix = expand_string(ob->message_suffix);
+  uschar * suffix = expand_string(ob->message_suffix);
   if (!suffix)
     {
     addr->transport_return = f.search_find_defer? DEFER : PANIC;
diff --git a/src/src/transports/queuefile.c b/src/src/transports/queuefile.c
index b6511133c..21c98eeef 100644
--- a/src/src/transports/queuefile.c
+++ b/src/src/transports/queuefile.c
@@ -195,6 +195,7 @@ DEBUG(D_transport)
 # define O_NOFOLLOW 0
 #endif
 
+GET_OPTION("directory");
 if (!(dstdir = expand_string(ob->dirname)))
   {
   addr->message = string_sprintf("%s transport: failed to expand dirname option",
diff --git a/src/src/transports/smtp.c b/src/src/transports/smtp.c
index 596a328c3..736592352 100644
--- a/src/src/transports/smtp.c
+++ b/src/src/transports/smtp.c
@@ -1088,6 +1088,7 @@ if (pending_BANNER)
   /*XXX EXPERIMENTAL_ESMTP_LIMITS ? */
 
 # ifndef DISABLE_TLS_RESUME
+  GET_OPTION("host_name_extract");
   s = ((smtp_transport_options_block *)sx->conn_args.ob)->host_name_extract;
   if (!s) s = HNE_DEFAULT;
   ehlo_response_lbserver(sx, s);
@@ -1769,6 +1770,7 @@ uschar * local_authenticated_sender = authenticated_sender;
     authenticated_sender, ob->authenticated_sender, f.smtp_authenticated?"Y":"N");
 #endif
 
+GET_OPTION("authenticated_sender");
 if (ob->authenticated_sender)
   {
   uschar * new = expand_string(ob->authenticated_sender);
@@ -2374,6 +2376,7 @@ PIPE_CONNECT_RETRY:
   For early-pipe, we are ok if binding to a local interface; otherwise (if
   $sending_ip_address is seen in helo_data) we disabled early-pipe above. */
 
+  GET_OPTION("helo_data");
   if (sx->helo_data)
     if (!(sx->helo_data = expand_string(sx->helo_data)))
       if (sx->verify)
@@ -2501,6 +2504,7 @@ goto SEND_QUIT;
     an LB.  Call this anyway, so that a dummy host_name_extract option value can
     force resumption attempts. */
 
+    GET_OPTION("host_name_extract");
     if (!(s = ob->host_name_extract)) s = US"never-LB";
     ehlo_response_lbserver(sx, s);
 # endif
@@ -2629,6 +2633,7 @@ goto SEND_QUIT;
     }
 #endif
 #ifndef DISABLE_TLS_RESUME
+      GET_OPTION("host_name_extract");
       if (!(s = ob->host_name_extract)) s = HNE_DEFAULT;
       ehlo_response_lbserver(sx, s);
 #endif
@@ -2837,13 +2842,17 @@ if (tls_out.active.sock >= 0)
   {
   uschar * greeting_cmd;
 
-  if (!sx->helo_data && !(sx->helo_data = expand_string(ob->helo_data)))
+  if (!sx->helo_data)
     {
-    uschar *message = string_sprintf("failed to expand helo_data: %s",
-      expand_string_message);
-    set_errno_nohost(sx->addrlist, ERRNO_EXPANDFAIL, message, DEFER, FALSE, &sx->delivery_start);
-    yield = DEFER;
-    goto SEND_QUIT;
+    GET_OPTION("helo_data");
+    if (!(sx->helo_data = expand_string(ob->helo_data)))
+      {
+      uschar *message = string_sprintf("failed to expand helo_data: %s",
+    expand_string_message);
+      set_errno_nohost(sx->addrlist, ERRNO_EXPANDFAIL, message, DEFER, FALSE, &sx->delivery_start);
+      yield = DEFER;
+      goto SEND_QUIT;
+      }
     }
 
 #ifndef DISABLE_PIPE_CONNECT
@@ -3094,6 +3103,7 @@ if (sx->addrlist->prop.utf8_msg)
   /* If the transport sets a downconversion mode it overrides any set by ACL
   for the message. */
 
+  GET_OPTION("utf8_downconvert");
   if ((s = ob->utf8_downconvert))
     {
     if (!(s = expand_string(s)))
@@ -5565,8 +5575,9 @@ retry_non_continued:
 
     host_af = Ustrchr(host->address, ':') ? AF_INET6 : AF_INET;
       {
-      uschar * s = ob->interface;
-      if (s && *s)
+      uschar * s;
+      GET_OPTION("interface");
+      if ((s = ob->interface) && *s)
     {
     if (!smtp_get_interface(s, host_af, addrlist, &interface, tid))
       return FALSE;
diff --git a/src/src/transports/smtp_socks.c b/src/src/transports/smtp_socks.c
index 22ee74bd8..ac8d0f2da 100644
--- a/src/src/transports/smtp_socks.c
+++ b/src/src/transports/smtp_socks.c
@@ -229,6 +229,7 @@ blob early_data;
 if (!timeout) timeout = 24*60*60;    /* use 1 day for "indefinite" */
 tmo = time(NULL) + timeout;
 
+GET_OPTION("socks_proxy");
 if (!(proxy_list = expand_string(ob->socks_proxy)))
   {
   log_write(0, LOG_MAIN|LOG_PANIC, "Bad expansion for socks_proxy in %s",
diff --git a/src/src/verify.c b/src/src/verify.c
index bde660063..78923651c 100644
--- a/src/src/verify.c
+++ b/src/src/verify.c
@@ -368,6 +368,7 @@ if (addr->transport == cutthrough.addr.transport)
 
       host_af = Ustrchr(host->address, ':') ? AF_INET6 : AF_INET;
 
+      GET_OPTION("interface");
       if (  !smtp_get_interface(tf->interface, host_af, addr, &interface,
           US"callout")
      || !smtp_get_port(tf->port, addr, &port, US"callout")
@@ -579,10 +580,14 @@ else
   with a random local part, ensure that such a local part is available. If not,
   log the fact, but carry on without randomising. */
 
-  if (options & vopt_callout_random  &&  callout_random_local_part)
-    if (!(random_local_part = expand_string(callout_random_local_part)))
+  if (options & vopt_callout_random)
+    {
+    GET_OPTION("callout_random_local_part");
+    if (  callout_random_local_part
+       && !(random_local_part = expand_string(callout_random_local_part)))
       log_write(0, LOG_MAIN|LOG_PANIC, "failed to expand "
         "callout_random_local_part: %s", expand_string_message);
+    }
 
   /* Compile regex' used by client-side smtp */
 
@@ -660,6 +665,7 @@ coding means skipping this whole loop and doing the append separately.  */
     deliver_domain = addr->domain;
     transport_name = addr->transport->name;
 
+    GET_OPTION("interface");
     if (  !smtp_get_interface(tf->interface, host_af, addr, &interface,
             US"callout")
        || !smtp_get_port(tf->port, addr, &port, US"callout")
diff --git a/test/stderr/0002 b/test/stderr/0002
index 087b58f60..d258b26b4 100644
--- a/test/stderr/0002
+++ b/test/stderr/0002
@@ -4,6 +4,9 @@ environment after trimming:
 configuration file is TESTSUITE/test-config
 admin user
 dropping to exim gid; retaining priv uid
+try option gecos_pattern
+try option gecos_name
+try option unknown_login
  ╭considering: primary_hostname: $primary_hostname
  ├───────text: primary_hostname: 
  ├considering: $primary_hostname
@@ -146,6 +149,9 @@ environment after trimming:
 configuration file is TESTSUITE/test-config
 admin user
 dropping to exim gid; retaining priv uid
+try option gecos_pattern
+try option gecos_name
+try option unknown_login
  /considering: primary_hostname: $primary_hostname
  |-------text: primary_hostname: 
  |considering: $primary_hostname
@@ -280,6 +286,9 @@ environment after trimming:
 configuration file is TESTSUITE/test-config
 admin user
 dropping to exim gid; retaining priv uid
+try option gecos_pattern
+try option gecos_name
+try option unknown_login
  ╭considering: -oMa  sender_host_address = $sender_host_address
  ├───────text: -oMa  sender_host_address = 
  ├considering: $sender_host_address
@@ -356,6 +365,9 @@ environment after trimming:
 configuration file is TESTSUITE/test-config
 admin user
 dropping to exim gid; retaining priv uid
+try option gecos_pattern
+try option gecos_name
+try option unknown_login
  ╭considering: -oMa  sender_host_address = $sender_host_address
  ├───────text: -oMa  sender_host_address = 
  ├considering: $sender_host_address
diff --git a/test/stderr/0092 b/test/stderr/0092
index 51757f42f..9df1800b5 100644
--- a/test/stderr/0092
+++ b/test/stderr/0092
@@ -54,13 +54,18 @@ configuration file is TESTSUITE/test-config
 admin user
 changed uid/gid: privilege not needed
   uid=EXIM_UID gid=EXIM_GID pid=p1234
+try option gecos_pattern
+try option gecos_name
+try option unknown_login
 originator: uid=CALLER_UID gid=CALLER_GID login=CALLER name=CALLER_NAME
 sender address = CALLER@???
+try option smtp_active_hostname
 sender_fullhost = [V4NET.0.0.1]
 sender_rcvhost = [V4NET.0.0.1]
 host in hosts_connection_nolog? no (option unset)
 LOG: smtp_connection MAIN
   SMTP connection from [V4NET.0.0.1]
+try option message_size_limit
 host in host_lookup? no (option unset)
 set_process_info: pppp handling incoming connection from [V4NET.0.0.1]
  ╭considering: ${if eq {V4NET.0.0.1} {$sender_host_address} {2} {30}}s
@@ -98,6 +103,8 @@ host in recipient_unqualified_hosts? no (option unset)
 host in helo_verify_hosts? no (option unset)
 host in helo_try_verify_hosts? no (option unset)
 host in helo_accept_junk_hosts? no (option unset)
+try option acl_smtp_connect
+try option smtp_banner
  ╭considering: $smtp_active_hostname ESMTP Exim $version_number $tod_full
  ├──────value: myhost.test.ex
  ├considering:  ESMTP Exim $version_number $tod_full
@@ -120,12 +127,16 @@ test in helo_lookup_domains? no (end of list)
 sender_fullhost = (test) [V4NET.0.0.1]
 sender_rcvhost = [V4NET.0.0.1] (helo=test)
 set_process_info: pppp handling incoming connection from (test) [V4NET.0.0.1]
+try option spf_smtp_comment_template
+try option acl_smtp_helo

SMTP>> 250 myhost.test.ex Hello test [V4NET.0.0.1]

SMTP<< mail from:userx@???
spool directory space = nnnnnK inodes = nnnnn check_space = 10240K inodes = 100 msg_size = 0
log directory space = nnnnnK inodes = nnnnn check_space = 10240K inodes = 100
+try option acl_smtp_mail
SMTP>> 250 OK

SMTP<< rcpt to:userx@???
+try option acl_smtp_rcpt
using ACL "check_recipient"
processing "accept" (TESTSUITE/test-config 27)
check hosts = :
@@ -156,10 +167,12 @@ accept: condition test succeeded in ACL "check_recipient"
end of ACL "check_recipient": ACCEPT
SMTP>> 250 Accepted

SMTP<< data
+try option acl_smtp_predata
SMTP>> 354 Enter message, ending with "." on a line by itself

search_tidyup called
LOG: lost_incoming_connection MAIN
SMTP data timeout (message abandoned) on connection from (test) [V4NET.0.0.1] F=<userx@???> D=qqs
+try option acl_smtp_notquit
SMTP>> 421 myhost.test.ex SMTP incoming data timeout - closing connection.

search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=1 >>>>>>>>>>>>>>>>

diff --git a/test/stderr/0402 b/test/stderr/0402
index 2aa76c63d..57c4d48ac 100644
--- a/test/stderr/0402
+++ b/test/stderr/0402
@@ -14,11 +14,16 @@ seeking password data for user "CALLER": using cached result
getpwnam() succeeded uid=CALLER_UID gid=CALLER_GID
seeking password data for user "CALLER": using cached result
getpwnam() succeeded uid=CALLER_UID gid=CALLER_GID
+try option gecos_pattern
+try option gecos_name
+try option unknown_login
originator: uid=CALLER_UID gid=CALLER_GID login=CALLER name=CALLER_NAME
sender address = CALLER@???
+try option smtp_active_hostname
set_process_info: pppp accepting a local non-SMTP message from <CALLER@???>
spool directory space = nnnnnK inodes = nnnnn check_space = 10240K inodes = 100 msg_size = 0
log directory space = nnnnnK inodes = nnnnn check_space = 10240K inodes = 100
+try option message_size_limit
Sender: CALLER@???
Recipients:
CALLER@???
@@ -26,9 +31,12 @@ Recipients:
userz
rd+CALLER
rd+usery
+try option acl_not_smtp_start
search_tidyup called
>>Headers received:

 
+try option message_id_header_domain
+try option message_id_header_text
 qualify & rewrite recipients list
 rewrite rules on sender address
 qualify and rewrite headers
@@ -45,6 +53,7 @@ Data file written for message 10HmaX-000000005vi-0000
  ╭considering: ${tod_full}
  ├──expanding: ${tod_full}
  ╰─────result: Tue, 2 Mar 1999 09:44:33 +0000
+try option received_header_text
  ╭considering: Received: ${if def:sender_rcvhost {from $sender_rcvhost
      }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name)
      }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver        { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std
@@ -380,6 +389,8 @@ P Received: from CALLER by mail.test.ex with local (Exim x.yz)
     (envelope-from <CALLER@???>)
     id 10HmaX-000000005vi-0000;
     Tue, 2 Mar 1999 09:44:33 +0000
+try option acl_not_smtp_mime
+try option acl_not_smtp
  ╭considering: ${tod_full}
  ├──expanding: ${tod_full}
  ╰─────result: Tue, 2 Mar 1999 09:44:33 +0000
@@ -513,6 +524,7 @@ checking local_parts
 usery in "usery"?
  list element: usery
  usery in "usery"? yes (matched "usery")
+try option router_home_directory
  ╭considering: /non-exist/$domain
  ├───────text: /non-exist/
  ├considering: $domain
@@ -521,17 +533,23 @@ usery in "usery"?
  ├──expanding: /non-exist/$domain
  ╰─────result: /non-exist/test.ex
             ╰──(tainted)
+try option set
 calling r5 router
+try option qualify_domain
 rda_interpret (string): 'TESTSUITE/test-mail/junk'
 expanded: 'TESTSUITE/test-mail/junk'
 file is not a filter file
 parse_forward_list: TESTSUITE/test-mail/junk
 extract item: TESTSUITE/test-mail/junk
+try option file_transport
+try option transport
 set transport ft1
 r5 router generated TESTSUITE/test-mail/junk
   pipe, file, or autoreply
   errors_to=NULL transport=ft1
   uid=unset gid=unset home=/non-exist/$local_part
+try option unseen
+try option unseen
 routed by r5 router
   envelope to: rd+usery@???
   transport: <none>
@@ -565,6 +583,7 @@ checking local_parts
 CALLER in "CALLER"?
  list element: CALLER
  CALLER in "CALLER"? yes (matched "CALLER")
+try option router_home_directory
  ╭considering: /non-exist/$local_part
  ├───────text: /non-exist/
  ├considering: $local_part
@@ -573,17 +592,23 @@ CALLER in "CALLER"?
  ├──expanding: /non-exist/$local_part
  ╰─────result: /non-exist/CALLER
             ╰──(tainted)
+try option set
 calling r4 router
+try option qualify_domain
 rda_interpret (string): 'TESTSUITE/test-mail/junk'
 expanded: 'TESTSUITE/test-mail/junk'
 file is not a filter file
 parse_forward_list: TESTSUITE/test-mail/junk
 extract item: TESTSUITE/test-mail/junk
+try option file_transport
+try option transport
 set transport ft1
 r4 router generated TESTSUITE/test-mail/junk
   pipe, file, or autoreply
   errors_to=NULL transport=ft1
   uid=unset gid=unset home=/non-exist/CALLER
+try option unseen
+try option unseen
 routed by r4 router
   envelope to: rd+CALLER@???
   transport: <none>
@@ -609,6 +634,7 @@ checking local_parts
 userz in "userz"?
  list element: userz
  userz in "userz"? yes (matched "userz")
+try option router_home_directory
  ╭considering: /non-exist/$domain
  ├───────text: /non-exist/
  ├considering: $domain
@@ -617,14 +643,18 @@ userz in "userz"?
  ├──expanding: /non-exist/$domain
  ╰─────result: /non-exist/test.ex
             ╰──(tainted)
+try option set
 calling r3 router
 r3 router called for userz@???
   domain = test.ex
+try option transport
 set transport t2
 queued for t2 transport: local_part = userz
 domain = test.ex
   errors_to=NULL
   domain_data=NULL local_part_data=userz
+try option unseen
+try option unseen
 routed by r3 router
   envelope to: userz@???
   transport: t2
@@ -643,6 +673,7 @@ checking local_parts
 usery in "usery"?
  list element: usery
  usery in "usery"? yes (matched "usery")
+try option router_home_directory
  ╭considering: /non-exist/$domain
  ├───────text: /non-exist/
  ├considering: $domain
@@ -651,14 +682,18 @@ usery in "usery"?
  ├──expanding: /non-exist/$domain
  ╰─────result: /non-exist/test.ex
             ╰──(tainted)
+try option set
 calling r2 router
 r2 router called for usery@???
   domain = test.ex
+try option transport
 set transport t1
 queued for t1 transport: local_part = usery
 domain = test.ex
   errors_to=NULL
   domain_data=NULL local_part_data=usery
+try option unseen
+try option unseen
 routed by r2 router
   envelope to: usery@???
   transport: t1
@@ -670,6 +705,7 @@ checking local_parts
 CALLER in "CALLER"?
  list element: CALLER
  CALLER in "CALLER"? yes (matched "CALLER")
+try option router_home_directory
  ╭considering: /non-exist/$local_part
  ├───────text: /non-exist/
  ├considering: $local_part
@@ -678,14 +714,18 @@ CALLER in "CALLER"?
  ├──expanding: /non-exist/$local_part
  ╰─────result: /non-exist/CALLER
             ╰──(tainted)
+try option set
 calling r1 router
 r1 router called for CALLER@???
   domain = test.ex
+try option transport
 set transport t1
 queued for t1 transport: local_part = CALLER
 domain = test.ex
   errors_to=NULL
   domain_data=NULL local_part_data=CALLER
+try option unseen
+try option unseen
 routed by r1 router
   envelope to: CALLER@???
   transport: t1
@@ -723,6 +763,9 @@ search_tidyup called
  returned from EXIM_DBOPEN: (nil)
  failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
+try option max_parallel
+try option return_path
+try option home_directory
  ╭considering: /non-exist/$local_part
  ├───────text: /non-exist/
  ├considering: $local_part
@@ -731,7 +774,13 @@ no retry data available
  ├──expanding: /non-exist/$local_part
  ╰─────result: /non-exist/usery
             ╰──(tainted)
+try option current_directory
 search_tidyup called
+try option quota
+try option quota_filecount
+try option quota_warn_threshold
+try option mailbox_size
+try option mailbox_filecount
 changed uid/gid: local delivery to TESTSUITE/test-mail/junk <TESTSUITE/test-mail/junk> transport=ft1
   uid=CALLER_UID gid=CALLER_GID pid=p1236
   home=/non-exist/usery current=/
@@ -752,6 +801,7 @@ hitch name: TESTSUITE/test-mail/junk.lock.test.ex.dddddddd.pppppppp
 lock file created
 mailbox TESTSUITE/test-mail/junk is locked
 writing to file TESTSUITE/test-mail/junk
+try option message_prefix
  ╭considering: From ${if def:return_path{$return_path}{MAILER-DAEMON}} ${tod_bsdinbox}
  
  ├───────text: From 
@@ -795,6 +845,7 @@ writing to file TESTSUITE/test-mail/junk
 writing data block fd=dddd size=sss timeout=0
 cannot use sendfile for body: spoolfile not wireformat
 writing data block fd=dddd size=sss timeout=0
+try option message_suffix
 writing data block fd=dddd size=sss timeout=0
 appendfile yields 0 with errno=dd more_errno=dd
 search_tidyup called
@@ -812,7 +863,16 @@ LOG: MAIN
  returned from EXIM_DBOPEN: (nil)
  failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
+try option max_parallel
+try option return_path
+try option home_directory
+try option current_directory
 search_tidyup called
+try option quota
+try option quota_filecount
+try option quota_warn_threshold
+try option mailbox_size
+try option mailbox_filecount
 changed uid/gid: local delivery to TESTSUITE/test-mail/junk <TESTSUITE/test-mail/junk> transport=ft1
   uid=CALLER_UID gid=CALLER_GID pid=p1237
   home=/non-exist/CALLER current=/
@@ -833,6 +893,7 @@ hitch name: TESTSUITE/test-mail/junk.lock.test.ex.dddddddd.pppppppp
 lock file created
 mailbox TESTSUITE/test-mail/junk is locked
 writing to file TESTSUITE/test-mail/junk
+try option message_prefix
  ╭considering: From ${if def:return_path{$return_path}{MAILER-DAEMON}} ${tod_bsdinbox}
  
  ├───────text: From 
@@ -876,6 +937,7 @@ writing to file TESTSUITE/test-mail/junk
 writing data block fd=dddd size=sss timeout=0
 cannot use sendfile for body: spoolfile not wireformat
 writing data block fd=dddd size=sss timeout=0
+try option message_suffix
 writing data block fd=dddd size=sss timeout=0
 appendfile yields 0 with errno=dd more_errno=dd
 search_tidyup called
@@ -893,7 +955,16 @@ LOG: MAIN
  returned from EXIM_DBOPEN: (nil)
  failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
+try option max_parallel
+try option return_path
+try option home_directory
+try option current_directory
 search_tidyup called
+try option quota
+try option quota_filecount
+try option quota_warn_threshold
+try option mailbox_size
+try option mailbox_filecount
 changed uid/gid: local delivery to CALLER <CALLER@???> transport=t1
   uid=CALLER_UID gid=CALLER_GID pid=p1238
   home=/non-exist/CALLER current=/
@@ -919,6 +990,9 @@ LOG: MAIN
  returned from EXIM_DBOPEN: (nil)
  failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
+try option max_parallel
+try option return_path
+try option home_directory
  ╭considering: /non-exist/$local_part
  ├───────text: /non-exist/
  ├considering: $local_part
@@ -927,7 +1001,13 @@ no retry data available
  ├──expanding: /non-exist/$local_part
  ╰─────result: /non-exist/usery
             ╰──(tainted)
+try option current_directory
 search_tidyup called
+try option quota
+try option quota_filecount
+try option quota_warn_threshold
+try option mailbox_size
+try option mailbox_filecount
 changed uid/gid: local delivery to usery <usery@???> transport=t1
   uid=CALLER_UID gid=CALLER_GID pid=p1239
   home=/non-exist/usery current=/
@@ -953,6 +1033,9 @@ LOG: MAIN
  returned from EXIM_DBOPEN: (nil)
  failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
 no retry data available
+try option max_parallel
+try option return_path
+try option home_directory
  ╭considering: /$local_part
  ├───────text: /
  ├considering: $local_part
@@ -961,7 +1044,13 @@ no retry data available
  ├──expanding: /$local_part
  ╰─────result: /userz
             ╰──(tainted)
+try option current_directory
 search_tidyup called
+try option quota
+try option quota_filecount
+try option quota_warn_threshold
+try option mailbox_size
+try option mailbox_filecount
 changed uid/gid: local delivery to userz <userz@???> transport=t2
   uid=CALLER_UID gid=CALLER_GID pid=p1240
   home=/userz current=/
diff --git a/test/stderr/0544 b/test/stderr/0544
index 17ec179ea..2cbbb848d 100644
--- a/test/stderr/0544
+++ b/test/stderr/0544
@@ -4,9 +4,18 @@ environment after trimming:
 adding SSLKEYLOGFILE=TESTSUITE/spool/sslkeys
 configuration file is TESTSUITE/test-config
 admin user
+try option gecos_pattern
+try option gecos_name
+try option unknown_login
+try option smtp_active_hostname
+try option message_size_limit
+try option acl_not_smtp_start
+try option message_id_header_domain
+try option message_id_header_text
  ╭considering: ${tod_full}
  ├──expanding: ${tod_full}
  ╰─────result: Tue, 2 Mar 1999 09:44:33 +0000
+try option received_header_text
  ╭considering: Received: ${if def:sender_rcvhost {from $sender_rcvhost
      }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name)
      }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver        { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std
@@ -337,6 +346,8 @@ admin user
  ╰─────result: Received: from CALLER by the.local.host.name with local (Exim x.yz)
      (envelope-from <CALLER@???>)
      id 10HmaX-000000005vi-0000
+try option acl_not_smtp_mime
+try option acl_not_smtp
  ╭considering: ${tod_full}
  ├──expanding: ${tod_full}
  ╰─────result: Tue, 2 Mar 1999 09:44:33 +0000
@@ -351,6 +362,20 @@ configuration file is TESTSUITE/test-config
 trusted user
 admin user
 dropping to exim gid; retaining priv uid
+try option router_home_directory
+try option set
+try option transport
+try option unseen
+try option unseen
+try option router_home_directory
+try option set
+try option transport
+try option unseen
+try option unseen
+try option multi_domain
+try option multi_domain
+try option max_parallel
+try option return_path
  ╭considering: $domain
  ├──────value: domain1.ex
             ╰──(tainted)
@@ -361,6 +386,7 @@ LOG: MAIN
   == userx@??? R=smarthost T=smtp defer (-1): first-pass only routing due to -odqs, queue_smtp_domains or control=queue
 LOG: MAIN
   == userx@??? R=smarthost T=smtp defer (-1): first-pass only routing due to -odqs, queue_smtp_domains or control=queue
+try option delay_warning_condition
  ╭considering: ${if or {{ !eq{$h_list-id:$h_list-post:$h_list-subscribe:}{} }{ match{$h_precedence:}{(?i)bulk|list|junk} }{ match{$h_auto-submitted:}{(?i)auto-generated|auto-replied} }} {no}{yes}}
   ╭considering: $h_list-id:$h_list-post:$h_list-subscribe:}{} }{ match{$h_precedence:}{(?i)bulk|list|junk} }{ match{$h_auto-submitted:}{(?i)auto-generated|auto-replied} }} {no}{yes}}
   ├considering: $h_list-post:$h_list-subscribe:}{} }{ match{$h_precedence:}{(?i)bulk|list|junk} }{ match{$h_auto-submitted:}{(?i)auto-generated|auto-replied} }} {no}{yes}}
@@ -418,8 +444,15 @@ environment after trimming:
 adding SSLKEYLOGFILE=TESTSUITE/spool/sslkeys
 configuration file is TESTSUITE/test-config
 admin user
+try option gecos_pattern
+try option gecos_name
+try option unknown_login
+try option smtp_active_hostname
 LOG: smtp_connection MAIN
   SMTP connection from CALLER
+try option message_size_limit
+try option acl_smtp_connect
+try option smtp_banner
  ╭considering: $smtp_active_hostname ESMTP Exim $version_number $tod_full
  ├──────value: the.local.host.name
  ├considering:  ESMTP Exim $version_number $tod_full
@@ -432,6 +465,8 @@ LOG: smtp_connection MAIN
  ├──────value: Tue, 2 Mar 1999 09:44:33 +0000
  ├──expanding: $smtp_active_hostname ESMTP Exim $version_number $tod_full
  ╰─────result: the.local.host.name ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+try option spf_smtp_comment_template
+try option acl_smtp_helo
  ╭considering: ${if match_domain {$sender_helo_name}{+dlist}}
   ╭considering: $sender_helo_name}{+dlist}}
   ├──────value: ehlo.domain
@@ -455,6 +490,10 @@ LOG: smtp_connection MAIN
  ├─────result: true
  ├──expanding: ${if match_domain {$sender_helo_name}{+dlist}}
  ╰─────result: true
+try option acl_smtp_etrn
+try option acl_smtp_vrfy
+try option acl_smtp_expn
+try option acl_smtp_mail
  ╭considering: domain=$domain/sender_domain=$sender_address_domain
  ├───────text: domain=
  ├considering: $domain/sender_domain=$sender_address_domain
@@ -467,6 +506,7 @@ LOG: smtp_connection MAIN
  ├──expanding: domain=$domain/sender_domain=$sender_address_domain
  ╰─────result: domain=/sender_domain=sender.domain
             ╰──(tainted)
+try option acl_smtp_rcpt
  ╭considering: domain=$domain/sender_domain=$sender_address_domain
  ├───────text: domain=
  ├considering: $domain/sender_domain=$sender_address_domain
@@ -493,6 +533,7 @@ LOG: smtp_connection MAIN
  ├──expanding: domain=$domain/sender_domain=$sender_address_domain
  ╰─────result: domain=recipient.domain/sender_domain=sender.domain
             ╰──(tainted)
+try option acl_smtp_quit
 LOG: smtp_connection MAIN
   SMTP connection from CALLER D=qqs closed by QUIT

>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>

diff --git a/test/stderr/0620 b/test/stderr/0620
index b0a0114fd..852014746 100644
--- a/test/stderr/0620
+++ b/test/stderr/0620
@@ -4,8 +4,15 @@ environment after trimming:
 adding SSLKEYLOGFILE=TESTSUITE/spool/sslkeys
 configuration file is TESTSUITE/test-config
 admin user
+try option gecos_pattern
+try option gecos_name
+try option unknown_login
+try option smtp_active_hostname
 LOG: smtp_connection MAIN
   SMTP connection from CALLER
+try option message_size_limit
+try option acl_smtp_connect
+try option smtp_banner
  ╭considering: $smtp_active_hostname ESMTP Exim $version_number $tod_full
  ├──────value: primaryhostname.ex
  ├considering:  ESMTP Exim $version_number $tod_full
@@ -18,6 +25,10 @@ LOG: smtp_connection MAIN
  ├──────value: Tue, 2 Mar 1999 09:44:33 +0000
  ├──expanding: $smtp_active_hostname ESMTP Exim $version_number $tod_full
  ╰─────result: primaryhostname.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+try option spf_smtp_comment_template
+try option acl_smtp_helo
+try option acl_smtp_mail
+try option acl_smtp_rcpt
  ╭considering: domain $domain
  ├───────text: domain 
  ├considering: $domain
@@ -58,6 +69,7 @@ LOG: MAIN
             ╰──(tainted)
 LOG: MAIN
   $0 'trythiskey.ex'  $1 ''
+try option acl_smtp_quit
 LOG: smtp_connection MAIN
   SMTP connection from CALLER D=qqs closed by QUIT

>>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>

@@ -67,8 +79,15 @@ environment after trimming:
 adding SSLKEYLOGFILE=TESTSUITE/spool/sslkeys
 configuration file is TESTSUITE/test-config
 admin user
+try option gecos_pattern
+try option gecos_name
+try option unknown_login
+try option smtp_active_hostname
 LOG: smtp_connection MAIN
   SMTP connection from CALLER
+try option message_size_limit
+try option acl_smtp_connect
+try option smtp_banner
  ╭considering: $smtp_active_hostname ESMTP Exim $version_number $tod_full
  ├──────value: primaryhostname.ex
  ├considering:  ESMTP Exim $version_number $tod_full
@@ -81,6 +100,10 @@ LOG: smtp_connection MAIN
  ├──────value: Tue, 2 Mar 1999 09:44:33 +0000
  ├──expanding: $smtp_active_hostname ESMTP Exim $version_number $tod_full
  ╰─────result: primaryhostname.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
+try option spf_smtp_comment_template
+try option acl_smtp_helo
+try option acl_smtp_mail
+try option acl_smtp_rcpt
  ╭considering: domain $domain
  ├───────text: domain 
  ├considering: $domain
@@ -120,6 +143,7 @@ LOG: MAIN
             ╰──(tainted)
 LOG: MAIN
   $0 'trythiskey.ex'  $1 ''
+try option acl_smtp_quit
 LOG: smtp_connection MAIN
   SMTP connection from CALLER D=qqs closed by QUIT

>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>

diff --git a/test/stderr/0628 b/test/stderr/0628
index f112b1cc7..9c2db0ec3 100644
--- a/test/stderr/0628
+++ b/test/stderr/0628
@@ -20,6 +20,7 @@
 01:01:01 p1237  Process p1237 is ready for new message
 01:01:01 p1237  smtp_setup_msg entered
 01:01:01 p1237  SMTP<< QUIT
+01:01:01 p1237  try option acl_smtp_quit
 01:01:01 p1237  SMTP>> 221 myhost.test.ex closing connection
 01:01:01 p1237  LOG: smtp_connection MAIN
 01:01:01 p1237    SMTP connection from (test.ex) [127.0.0.1] D=qqs closed by QUIT
@@ -67,7 +68,10 @@
 01:01:01 p1239  routing dest@???
 01:01:01 p1239  --------> r1 router <--------
 01:01:01 p1239  local_part=dest domain=test.ex
+01:01:01 p1239  try option router_home_directory
+01:01:01 p1239  try option set
 01:01:01 p1239  calling r1 router
+01:01:01 p1239  try option qualify_domain
 01:01:01 p1239  rda_interpret (string): ':blackhole:'
 01:01:01 p1239  expanded: ':blackhole:'
 01:01:01 p1239  file is not a filter file
@@ -134,6 +138,7 @@
 01:01:01 p1240  Process p1240 is ready for new message
 01:01:01 p1240  smtp_setup_msg entered
 01:01:01 p1240  SMTP<< QUIT
+01:01:01 p1240  try option acl_smtp_quit
 01:01:01 p1240  SMTP>> 221 myhost.test.ex closing connection
 01:01:01 p1240  LOG: smtp_connection MAIN
 01:01:01 p1240    SMTP connection from (test.ex) [127.0.0.1] D=qqs closed by QUIT
@@ -169,7 +174,10 @@
 01:01:01 p1241  routing dest2@???
 01:01:01 p1241  --------> r1 router <--------
 01:01:01 p1241  local_part=dest2 domain=test.ex
+01:01:01 p1241  try option router_home_directory
+01:01:01 p1241  try option set
 01:01:01 p1241  calling r1 router
+01:01:01 p1241  try option qualify_domain
 01:01:01 p1241  rda_interpret (string): ':blackhole:'
 01:01:01 p1241  expanded: ':blackhole:'
 01:01:01 p1241  file is not a filter file
diff --git a/test/stderr/0632 b/test/stderr/0632
index 66928e2e8..85f1979a7 100644
--- a/test/stderr/0632
+++ b/test/stderr/0632
@@ -7,9 +7,13 @@ adding SSLKEYLOGFILE=TESTSUITE/spool/sslkeys
 configuration file is TESTSUITE/test-config
 admin user
 dropping to exim gid; retaining priv uid
+try option gecos_pattern
+try option gecos_name
+try option unknown_login
 daemon_smtp_port overridden by -oX:
   <: 1225
 creating notifier socket
+try option notifier_socket
  ╭considering: $spool_directory/exim_daemon_notify
  ├──────value: TESTSUITE/spool
  ├considering: /exim_daemon_notify
@@ -22,11 +26,17 @@ listening on all interfaces (IPv4) port PORT_D
 pid written to TESTSUITE/spool/exim-daemon.pid
 LOG: MAIN
   exim x.yz daemon started: pid=p1234, no queue runs, listening for SMTP on port PORT_D
+try option spf_smtp_comment_template
 daemon running with uid=EXIM_UID gid=EXIM_GID euid=EXIM_UID egid=EXIM_GID
 Listening...
 Connection request from 127.0.0.1 port sssss
+try option smtp_accept_max_per_host
 search_tidyup called
+p1235 try option smtp_active_hostname
 p1235 Process p1235 is handling incoming connection from [127.0.0.1]
+p1235 try option message_size_limit
+p1235 try option acl_smtp_connect
+p1235 try option smtp_banner
 p1235  ╭considering: $smtp_active_hostname ESMTP Exim $version_number $tod_full
 p1235  ├──────value: myhost.test.ex
 p1235  ├considering:  ESMTP Exim $version_number $tod_full
@@ -40,9 +50,13 @@ p1235  ├──────value: Tue, 2 Mar 1999 09:44:33 +0000
 p1235  ├──expanding: $smtp_active_hostname ESMTP Exim $version_number $tod_full
 p1235  ╰─────result: myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
 p1235 Process p1235 is ready for new message
+p1235 try option acl_smtp_helo
+p1235 try option acl_smtp_mail
+p1235 try option acl_smtp_rcpt
 p1235 compiled caseless RE '^nomatch_list' not found in local cache
 p1235 compiled RE '^nomatch_list' saved in local cache
 p1235 sending RE '^nomatch_list' to daemon
+p1235 try option notifier_socket
 p1235  ╭considering: $spool_directory/exim_daemon_notify
 p1235  ├──────value: TESTSUITE/spool
 p1235  ├considering: /exim_daemon_notify
@@ -64,6 +78,7 @@ p1235  compiled RE 'static_RE' not found in local cache
 p1235  compiling RE 'static_RE'
 p1235  compiled RE 'static_RE' saved in local cache
 p1235  sending RE 'static_RE' to daemon
+p1235 try option notifier_socket
 p1235   ╭considering: $spool_directory/exim_daemon_notify
 p1235   ├──────value: TESTSUITE/spool
 p1235   ├considering: /exim_daemon_notify
@@ -91,6 +106,7 @@ p1235  compiled RE 'tricky_static_RE$' not found in local cache
 p1235  compiling RE 'tricky_static_RE$'
 p1235  compiled RE 'tricky_static_RE$' saved in local cache
 p1235  sending RE 'tricky_static_RE$' to daemon
+p1235 try option notifier_socket
 p1235   ╭considering: $spool_directory/exim_daemon_notify
 p1235   ├──────value: TESTSUITE/spool
 p1235   ├considering: /exim_daemon_notify
@@ -120,11 +136,13 @@ p1235  ├──condition: match {a_random_string} {pid=${pid} uncacheable_RE}
 p1235  ├─────result: false
 p1235  ├──expanding: ${if match {a_random_string} {pid=${pid} uncacheable_RE}}
 p1235  ╰─────result: 
+p1235 try option acl_smtp_predata
 p1235 search_tidyup called
 p1235 search_tidyup called
 p1235  ╭considering: ${tod_full}
 p1235  ├──expanding: ${tod_full}
 p1235  ╰─────result: Tue, 2 Mar 1999 09:44:33 +0000
+p1235 try option received_header_text
 p1235  ╭considering: Received: ${if def:sender_rcvhost {from $sender_rcvhost
 p1235      }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name)
 p1235      }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver        { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std
@@ -472,6 +490,9 @@ p1235      (envelope-from <CALLER@???>)
 p1235      id 10HmaX-000000005vi-0000
 p1235      for dest_1@???
 p1235             ╰──(tainted)
+p1235 try option acl_smtp_dkim
+p1235 try option acl_smtp_mime
+p1235 try option acl_smtp_data
 p1235  ╭considering: ${tod_full}
 p1235  ├──expanding: ${tod_full}
 p1235  ╰─────result: Tue, 2 Mar 1999 09:44:33 +0000
@@ -479,6 +500,7 @@ LOG: MAIN
   <= CALLER@??? H=(test.ex) [127.0.0.1] Ci=p1235 P=smtp S=sss
 search_tidyup called
 Process p1235 is ready for new message
+try option acl_smtp_quit
 LOG: smtp_connection MAIN
   SMTP connection Ci=p1235 from (test.ex) [127.0.0.1] D=qqs closed by QUIT
 p1234 1 SMTP accept process running
@@ -505,8 +527,13 @@ p1234   normal exit, 0
 p1234 0 SMTP accept processes now running
 p1234 Listening...
 p1234 Connection request from 127.0.0.1 port sssss
+p1234 try option smtp_accept_max_per_host
 p1234 search_tidyup called
+p1236 try option smtp_active_hostname
 p1236 Process p1236 is handling incoming connection from [127.0.0.1]
+p1236 try option message_size_limit
+p1236 try option acl_smtp_connect
+p1236 try option smtp_banner
 p1236  ╭considering: $smtp_active_hostname ESMTP Exim $version_number $tod_full
 p1236  ├──────value: myhost.test.ex
 p1236  ├considering:  ESMTP Exim $version_number $tod_full
@@ -520,6 +547,9 @@ p1236  ├──────value: Tue, 2 Mar 1999 09:44:33 +0000
 p1236  ├──expanding: $smtp_active_hostname ESMTP Exim $version_number $tod_full
 p1236  ╰─────result: myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
 p1236 Process p1236 is ready for new message
+p1236 try option acl_smtp_helo
+p1236 try option acl_smtp_mail
+p1236 try option acl_smtp_rcpt
 p1236 compiled caseless RE '^nomatch_list' found in local cache
 p1236  ╭considering: ${if match {a_random_string} {static_RE}}
 p1236   ╭considering: a_random_string} {static_RE}}
@@ -574,11 +604,13 @@ p1236  ├──condition: match {a_random_string} {pid=${pid} uncacheable_RE}
 p1236  ├─────result: false
 p1236  ├──expanding: ${if match {a_random_string} {pid=${pid} uncacheable_RE}}
 p1236  ╰─────result: 
+p1236 try option acl_smtp_predata
 p1236 search_tidyup called
 p1236 search_tidyup called
 p1236  ╭considering: ${tod_full}
 p1236  ├──expanding: ${tod_full}
 p1236  ╰─────result: Tue, 2 Mar 1999 09:44:33 +0000
+p1236 try option received_header_text
 p1236  ╭considering: Received: ${if def:sender_rcvhost {from $sender_rcvhost
 p1236      }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name)
 p1236      }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver        { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std
@@ -926,6 +958,9 @@ p1236      (envelope-from <CALLER@???>)
 p1236      id 10HmaY-000000005vi-0000
 p1236      for dest_2@???
 p1236             ╰──(tainted)
+p1236 try option acl_smtp_dkim
+p1236 try option acl_smtp_mime
+p1236 try option acl_smtp_data
 p1236  ╭considering: ${tod_full}
 p1236  ├──expanding: ${tod_full}
 p1236  ╰─────result: Tue, 2 Mar 1999 09:44:33 +0000
@@ -933,6 +968,7 @@ LOG: MAIN
   <= CALLER@??? H=(test.ex) [127.0.0.1] Ci=p1236 P=smtp S=sss
 search_tidyup called
 Process p1236 is ready for new message
+try option acl_smtp_quit
 LOG: smtp_connection MAIN
   SMTP connection Ci=p1236 from (test.ex) [127.0.0.1] D=qqs closed by QUIT
 p1234 1 SMTP accept process running
diff --git a/test/stderr/3000 b/test/stderr/3000
index 69915e2d1..6f8b2689d 100644
--- a/test/stderr/3000
+++ b/test/stderr/3000
@@ -6,6 +6,9 @@ adding SSLKEYLOGFILE=TESTSUITE/spool/sslkeys
 configuration file is TESTSUITE/test-config
 admin user
 dropping to exim gid; retaining priv uid
+try option gecos_pattern
+try option gecos_name
+try option unknown_login
  ╭considering: ${perl{foo}{arg1}}
   ╭considering: foo}{arg1}}
   ├───────text: foo
diff --git a/test/stderr/5410 b/test/stderr/5410
index 24abaeafa..5d94a6b18 100644
--- a/test/stderr/5410
+++ b/test/stderr/5410
@@ -4,9 +4,16 @@ environment after trimming:
 adding SSLKEYLOGFILE=TESTSUITE/spool/sslkeys
 configuration file is TESTSUITE/test-config
 admin user
+try option gecos_pattern
+try option gecos_name
+try option unknown_login
+try option smtp_active_hostname
  in hosts_connection_nolog? no (option unset)
 LOG: smtp_connection MAIN
   SMTP connection from CALLER
+try option message_size_limit
+try option acl_smtp_connect
+try option smtp_banner
  ╭considering: $smtp_active_hostname ESMTP Exim $version_number $tod_full
  ├──────value: myhost.test.ex
  ├considering:  ESMTP Exim $version_number $tod_full
@@ -21,7 +28,12 @@ LOG: smtp_connection MAIN
  ╰─────result: myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
  list element: *
   in limits_advertise_hosts? yes (matched "*")
+try option spf_smtp_comment_template
+try option acl_smtp_helo
  in dsn_advertise_hosts? no (option unset)
+try option acl_smtp_etrn
+try option acl_smtp_vrfy
+try option acl_smtp_expn
  in pipelining_advertise_hosts?
  list element: *
   in pipelining_advertise_hosts? yes (matched "*")
@@ -29,6 +41,8 @@ LOG: smtp_connection MAIN
  in chunking_advertise_hosts? no (end of list)
  list element: *
   in tls_advertise_hosts? yes (matched "*")
+try option acl_smtp_mail
+try option acl_smtp_rcpt
  ╭considering: ${if eq {SERVER}{server}{queue}{cutthrough}}
   ╭considering: SERVER}{server}{queue}{cutthrough}}
   ├───────text: SERVER
@@ -77,6 +91,7 @@ domain.com in "! +local_domains"? yes (end of list)
 domain.com in "*"?
  list element: *
  domain.com in "*"? yes (matched "*")
+try option unseen
 ----------- end verify ------------
 accept: condition test succeeded in ACL "cutthrough"
 end of ACL "cutthrough": ACCEPT
@@ -99,9 +114,13 @@ domain.com in "! +local_domains"? yes (end of list)
 domain.com in "*"?
  list element: *
  domain.com in "*"? yes (matched "*")
-Connecting to 127.0.0.1 [127.0.0.1]:PORT_D from ip4.ip4.ip4.ip4 ... 127.0.0.1 in hosts_try_fastopen?
+try option unseen
+try option interface
+Connecting to 127.0.0.1 [127.0.0.1]:PORT_D from ip4.ip4.ip4.ip4 ... try option dscp
+127.0.0.1 in hosts_try_fastopen?
  list element: 
  connected
+try option helo_data
  ╭considering: $primary_hostname
  ├──────value: myhost.test.ex
  ├──expanding: $primary_hostname
@@ -117,6 +136,7 @@ cmd buf flush ddd bytes
          250-PIPELINING
          250-STARTTLS
          250 HELP
+try option host_name_extract
  ╭considering: ${if and {{match{$host}{.outlook.com\$}} {match{$item}{\N^250-([\w.]+)\s\N}}} {$1}}
   ╭considering: $host}{.outlook.com\$}} {match{$item}{\N^250-([\w.]+)\s\N}}} {$1}}
   ├──────value: 127.0.0.1
@@ -236,6 +256,7 @@ cmd buf flush ddd bytes
 using PIPELINING
 not using DSN
 127.0.0.1 in hosts_require_auth? no (option unset)
+try option authenticated_sender
   SMTP|> MAIL FROM:<CALLER@???>
   SMTP>> RCPT TO:<userx@???>
 cmd buf flush ddd bytes
@@ -245,14 +266,18 @@ sync_responses expect rcpt for userx@???
   SMTP<< 250 Accepted
 holding verify callout open for cutthrough delivery
 ----------- end cutthrough setup ------------
+try option acl_smtp_predata
 processing "accept" (TESTSUITE/test-config 57)
 accept: condition test succeeded in inline ACL
 end of inline ACL: ACCEPT
   SMTP>> DATA
   SMTP<< 354 Enter message, ending with "." on a line by itself
+try option message_id_header_domain
+try option message_id_header_text
  ╭considering: ${tod_full}
  ├──expanding: ${tod_full}
  ╰─────result: Tue, 2 Mar 1999 09:44:33 +0000
+try option received_header_text
  ╭considering: Received: ${if def:sender_rcvhost {from $sender_rcvhost
      }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name)
      }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver        { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std
@@ -602,6 +627,9 @@ end of inline ACL: ACCEPT
             ╰──(tainted)
 ----------- start cutthrough headers send -----------
 ----------- done cutthrough headers send ------------
+try option acl_smtp_dkim
+try option acl_smtp_mime
+try option acl_smtp_data
  ╭considering: ${tod_full}
  ├──expanding: ${tod_full}
  ╰─────result: Tue, 2 Mar 1999 09:44:33 +0000
@@ -618,6 +646,7 @@ LOG: MAIN
   <= CALLER@??? U=CALLER P=local-esmtp S=sss
 LOG: MAIN
   Completed
+try option acl_smtp_quit
 LOG: smtp_connection MAIN
   SMTP connection from CALLER D=qqs closed by QUIT

>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>

@@ -627,9 +656,16 @@ environment after trimming:
 adding SSLKEYLOGFILE=TESTSUITE/spool/sslkeys
 configuration file is TESTSUITE/test-config
 admin user
+try option gecos_pattern
+try option gecos_name
+try option unknown_login
+try option smtp_active_hostname
  in hosts_connection_nolog? no (option unset)
 LOG: smtp_connection MAIN
   SMTP connection from CALLER
+try option message_size_limit
+try option acl_smtp_connect
+try option smtp_banner
  ╭considering: $smtp_active_hostname ESMTP Exim $version_number $tod_full
  ├──────value: myhost.test.ex
  ├considering:  ESMTP Exim $version_number $tod_full
@@ -644,7 +680,12 @@ LOG: smtp_connection MAIN
  ╰─────result: myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
  list element: *
   in limits_advertise_hosts? yes (matched "*")
+try option spf_smtp_comment_template
+try option acl_smtp_helo
  in dsn_advertise_hosts? no (option unset)
+try option acl_smtp_etrn
+try option acl_smtp_vrfy
+try option acl_smtp_expn
  in pipelining_advertise_hosts?
  list element: *
   in pipelining_advertise_hosts? yes (matched "*")
@@ -652,6 +693,8 @@ LOG: smtp_connection MAIN
  in chunking_advertise_hosts? no (end of list)
  list element: *
   in tls_advertise_hosts? yes (matched "*")
+try option acl_smtp_mail
+try option acl_smtp_rcpt
  ╭considering: ${if eq {SERVER}{server}{queue}{cutthrough}}
   ╭considering: SERVER}{server}{queue}{cutthrough}}
   ├───────text: SERVER
@@ -700,6 +743,7 @@ domain.com in "! +local_domains"? yes (end of list)
 domain.com in "*"?
  list element: *
  domain.com in "*"? yes (matched "*")
+try option unseen
 ----------- end verify ------------
 accept: condition test succeeded in ACL "cutthrough"
 end of ACL "cutthrough": ACCEPT
@@ -722,9 +766,13 @@ domain.com in "! +local_domains"? yes (end of list)
 domain.com in "*"?
  list element: *
  domain.com in "*"? yes (matched "*")
-Connecting to 127.0.0.1 [127.0.0.1]:PORT_D from ip4.ip4.ip4.ip4 ... 127.0.0.1 in hosts_try_fastopen?
+try option unseen
+try option interface
+Connecting to 127.0.0.1 [127.0.0.1]:PORT_D from ip4.ip4.ip4.ip4 ... try option dscp
+127.0.0.1 in hosts_try_fastopen?
  list element: 
  connected
+try option helo_data
  ╭considering: $primary_hostname
  ├──────value: myhost.test.ex
  ├──expanding: $primary_hostname
@@ -740,6 +788,7 @@ cmd buf flush ddd bytes
          250-PIPELINING
          250-STARTTLS
          250 HELP
+try option host_name_extract
  ╭considering: ${if and {{match{$host}{.outlook.com\$}} {match{$item}{\N^250-([\w.]+)\s\N}}} {$1}}
   ╭considering: $host}{.outlook.com\$}} {match{$item}{\N^250-([\w.]+)\s\N}}} {$1}}
   ├──────value: 127.0.0.1
@@ -809,6 +858,7 @@ cmd buf flush ddd bytes
 using PIPELINING
 not using DSN
 127.0.0.1 in hosts_require_auth? no (option unset)
+try option authenticated_sender
   SMTP|> MAIL FROM:<CALLER@???>
   SMTP>> RCPT TO:<usery@???>
 cmd buf flush ddd bytes
@@ -818,14 +868,18 @@ sync_responses expect rcpt for usery@???
   SMTP<< 250 Accepted
 holding verify callout open for cutthrough delivery
 ----------- end cutthrough setup ------------
+try option acl_smtp_predata
 processing "accept" (TESTSUITE/test-config 57)
 accept: condition test succeeded in inline ACL
 end of inline ACL: ACCEPT
   SMTP>> DATA
   SMTP<< 354 Enter message, ending with "." on a line by itself
+try option message_id_header_domain
+try option message_id_header_text
  ╭considering: ${tod_full}
  ├──expanding: ${tod_full}
  ╰─────result: Tue, 2 Mar 1999 09:44:33 +0000
+try option received_header_text
  ╭considering: Received: ${if def:sender_rcvhost {from $sender_rcvhost
      }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name)
      }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver        { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std
@@ -1175,6 +1229,9 @@ end of inline ACL: ACCEPT
             ╰──(tainted)
 ----------- start cutthrough headers send -----------
 ----------- done cutthrough headers send ------------
+try option acl_smtp_dkim
+try option acl_smtp_mime
+try option acl_smtp_data
  ╭considering: ${tod_full}
  ├──expanding: ${tod_full}
  ╰─────result: Tue, 2 Mar 1999 09:44:33 +0000
@@ -1191,6 +1248,7 @@ LOG: MAIN
   <= CALLER@??? U=CALLER P=local-esmtp S=sss
 LOG: MAIN
   Completed
+try option acl_smtp_quit
 LOG: smtp_connection MAIN
   SMTP connection from CALLER D=qqs closed by QUIT

>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>

@@ -1200,9 +1258,16 @@ environment after trimming:
 adding SSLKEYLOGFILE=TESTSUITE/spool/sslkeys
 configuration file is TESTSUITE/test-config
 admin user
+try option gecos_pattern
+try option gecos_name
+try option unknown_login
+try option smtp_active_hostname
  in hosts_connection_nolog? no (option unset)
 LOG: smtp_connection MAIN
   SMTP connection from CALLER
+try option message_size_limit
+try option acl_smtp_connect
+try option smtp_banner
  ╭considering: $smtp_active_hostname ESMTP Exim $version_number $tod_full
  ├──────value: myhost.test.ex
  ├considering:  ESMTP Exim $version_number $tod_full
@@ -1217,7 +1282,12 @@ LOG: smtp_connection MAIN
  ╰─────result: myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
  list element: *
   in limits_advertise_hosts? yes (matched "*")
+try option spf_smtp_comment_template
+try option acl_smtp_helo
  in dsn_advertise_hosts? no (option unset)
+try option acl_smtp_etrn
+try option acl_smtp_vrfy
+try option acl_smtp_expn
  in pipelining_advertise_hosts?
  list element: *
   in pipelining_advertise_hosts? yes (matched "*")
@@ -1225,6 +1295,8 @@ LOG: smtp_connection MAIN
  in chunking_advertise_hosts? no (end of list)
  list element: *
   in tls_advertise_hosts? yes (matched "*")
+try option acl_smtp_mail
+try option acl_smtp_rcpt
  ╭considering: ${if eq {SERVER}{server}{queue}{cutthrough}}
   ╭considering: SERVER}{server}{queue}{cutthrough}}
   ├───────text: SERVER
@@ -1273,6 +1345,7 @@ domain.com in "! +local_domains"? yes (end of list)
 domain.com in "*"?
  list element: *
  domain.com in "*"? yes (matched "*")
+try option unseen
 ----------- end verify ------------
 accept: condition test succeeded in ACL "cutthrough"
 end of ACL "cutthrough": ACCEPT
@@ -1295,9 +1368,13 @@ domain.com in "! +local_domains"? yes (end of list)
 domain.com in "*"?
  list element: *
  domain.com in "*"? yes (matched "*")
-Connecting to 127.0.0.1 [127.0.0.1]:PORT_D from ip4.ip4.ip4.ip4 ... 127.0.0.1 in hosts_try_fastopen?
+try option unseen
+try option interface
+Connecting to 127.0.0.1 [127.0.0.1]:PORT_D from ip4.ip4.ip4.ip4 ... try option dscp
+127.0.0.1 in hosts_try_fastopen?
  list element: 
  connected
+try option helo_data
  ╭considering: $primary_hostname
  ├──────value: myhost.test.ex
  ├──expanding: $primary_hostname
@@ -1313,6 +1390,7 @@ cmd buf flush ddd bytes
          250-PIPELINING
          250-STARTTLS
          250 HELP
+try option host_name_extract
  ╭considering: ${if and {{match{$host}{.outlook.com\$}} {match{$item}{\N^250-([\w.]+)\s\N}}} {$1}}
   ╭considering: $host}{.outlook.com\$}} {match{$item}{\N^250-([\w.]+)\s\N}}} {$1}}
   ├──────value: 127.0.0.1
@@ -1382,6 +1460,7 @@ cmd buf flush ddd bytes
 using PIPELINING
 not using DSN
 127.0.0.1 in hosts_require_auth? no (option unset)
+try option authenticated_sender
   SMTP|> MAIL FROM:<CALLER@???>
   SMTP>> RCPT TO:<usery@???>
 cmd buf flush ddd bytes
@@ -1391,14 +1470,18 @@ sync_responses expect rcpt for usery@???
   SMTP<< 250 Accepted
 holding verify callout open for cutthrough delivery
 ----------- end cutthrough setup ------------
+try option acl_smtp_predata
 processing "accept" (TESTSUITE/test-config 57)
 accept: condition test succeeded in inline ACL
 end of inline ACL: ACCEPT
   SMTP>> DATA
   SMTP<< 354 Enter message, ending with "." on a line by itself
+try option message_id_header_domain
+try option message_id_header_text
  ╭considering: ${tod_full}
  ├──expanding: ${tod_full}
  ╰─────result: Tue, 2 Mar 1999 09:44:33 +0000
+try option received_header_text
  ╭considering: Received: ${if def:sender_rcvhost {from $sender_rcvhost
      }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name)
      }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver        { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std
@@ -1748,6 +1831,9 @@ end of inline ACL: ACCEPT
             ╰──(tainted)
 ----------- start cutthrough headers send -----------
 ----------- done cutthrough headers send ------------
+try option acl_smtp_dkim
+try option acl_smtp_mime
+try option acl_smtp_data
  ╭considering: ${tod_full}
  ├──expanding: ${tod_full}
  ╰─────result: Tue, 2 Mar 1999 09:44:33 +0000
@@ -1764,6 +1850,7 @@ LOG: MAIN
   <= CALLER@??? U=CALLER P=local-esmtp S=sss
 LOG: MAIN
   Completed
+try option acl_smtp_quit
 LOG: smtp_connection MAIN
   SMTP connection from CALLER D=qqs closed by QUIT

>>>>>>>>>>>>>>>> Exim pid=p1237 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>

diff --git a/test/stderr/5420 b/test/stderr/5420
index ac3c16c81..3e535861c 100644
--- a/test/stderr/5420
+++ b/test/stderr/5420
@@ -4,9 +4,16 @@ environment after trimming:
 adding SSLKEYLOGFILE=TESTSUITE/spool/sslkeys
 configuration file is TESTSUITE/test-config
 admin user
+try option gecos_pattern
+try option gecos_name
+try option unknown_login
+try option smtp_active_hostname
  in hosts_connection_nolog? no (option unset)
 LOG: smtp_connection MAIN
   SMTP connection from CALLER
+try option message_size_limit
+try option acl_smtp_connect
+try option smtp_banner
  ╭considering: $smtp_active_hostname ESMTP Exim $version_number $tod_full
  ├──────value: myhost.test.ex
  ├considering:  ESMTP Exim $version_number $tod_full
@@ -21,7 +28,12 @@ LOG: smtp_connection MAIN
  ╰─────result: myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
  list element: *
   in limits_advertise_hosts? yes (matched "*")
+try option spf_smtp_comment_template
+try option acl_smtp_helo
  in dsn_advertise_hosts? no (option unset)
+try option acl_smtp_etrn
+try option acl_smtp_vrfy
+try option acl_smtp_expn
  in pipelining_advertise_hosts?
  list element: *
   in pipelining_advertise_hosts? yes (matched "*")
@@ -29,6 +41,8 @@ LOG: smtp_connection MAIN
  in chunking_advertise_hosts? no (end of list)
  list element: *
   in tls_advertise_hosts? yes (matched "*")
+try option acl_smtp_mail
+try option acl_smtp_rcpt
  ╭considering: ${if eq {SERVER}{server}{queue}{cutthrough}}
   ╭considering: SERVER}{server}{queue}{cutthrough}}
   ├───────text: SERVER
@@ -68,6 +82,9 @@ domain.com in "! +local_domains"?
    domain.com in "test.ex : *.test.ex"? no (end of list)
   end sublist local_domains
 domain.com in "! +local_domains"? yes (end of list)
+try option router_home_directory
+try option set
+processing address_data
  ╭considering: $local_part
  ├──────value: userx
             ╰──(tainted)
@@ -77,6 +94,9 @@ domain.com in "! +local_domains"? yes (end of list)
 domain.com in "*"?
  list element: *
  domain.com in "*"? yes (matched "*")
+try option transport
+try option unseen
+try option unseen
 ----------- end verify ------------
 accept: condition test succeeded in ACL "cutthrough"
 end of ACL "cutthrough": ACCEPT
@@ -90,6 +110,9 @@ domain.com in "! +local_domains"?
    domain.com in "test.ex : *.test.ex"? no (end of list)
   end sublist local_domains
 domain.com in "! +local_domains"? yes (end of list)
+try option router_home_directory
+try option set
+processing address_data
  ╭considering: $local_part
  ├──────value: userx
             ╰──(tainted)
@@ -99,9 +122,15 @@ domain.com in "! +local_domains"? yes (end of list)
 domain.com in "*"?
  list element: *
  domain.com in "*"? yes (matched "*")
-Connecting to 127.0.0.1 [127.0.0.1]:PORT_D from ip4.ip4.ip4.ip4 ... 127.0.0.1 in hosts_try_fastopen?
+try option transport
+try option unseen
+try option unseen
+try option interface
+Connecting to 127.0.0.1 [127.0.0.1]:PORT_D from ip4.ip4.ip4.ip4 ... try option dscp
+127.0.0.1 in hosts_try_fastopen?
  list element: 
  connected
+try option helo_data
  ╭considering: $primary_hostname
  ├──────value: myhost.test.ex
  ├──expanding: $primary_hostname
@@ -117,6 +146,7 @@ cmd buf flush ddd bytes
          250-PIPELINING
          250-STARTTLS
          250 HELP
+try option host_name_extract
  ╭considering: ${if and {{match{$host}{.outlook.com\$}} {match{$item}{\N^250-([\w.]+)\s\N}}} {$1}}
   ╭considering: $host}{.outlook.com\$}} {match{$item}{\N^250-([\w.]+)\s\N}}} {$1}}
   ├──────value: 127.0.0.1
@@ -236,6 +266,7 @@ cmd buf flush ddd bytes
 using PIPELINING
 not using DSN
 127.0.0.1 in hosts_require_auth? no (option unset)
+try option authenticated_sender
   SMTP|> MAIL FROM:<CALLER@???>
   SMTP>> RCPT TO:<userx@???>
 cmd buf flush ddd bytes
@@ -245,14 +276,18 @@ sync_responses expect rcpt for userx@???
   SMTP<< 250 Accepted
 holding verify callout open for cutthrough delivery
 ----------- end cutthrough setup ------------
+try option acl_smtp_predata
 processing "accept" (TESTSUITE/test-config 55)
 accept: condition test succeeded in inline ACL
 end of inline ACL: ACCEPT
   SMTP>> DATA
   SMTP<< 354 Enter message, ending with "." on a line by itself
+try option message_id_header_domain
+try option message_id_header_text
  ╭considering: ${tod_full}
  ├──expanding: ${tod_full}
  ╰─────result: Tue, 2 Mar 1999 09:44:33 +0000
+try option received_header_text
  ╭considering: Received: ${if def:sender_rcvhost {from $sender_rcvhost
      }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name)
      }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver        { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std
@@ -602,6 +637,9 @@ end of inline ACL: ACCEPT
             ╰──(tainted)
 ----------- start cutthrough headers send -----------
 ----------- done cutthrough headers send ------------
+try option acl_smtp_dkim
+try option acl_smtp_mime
+try option acl_smtp_data
  ╭considering: ${tod_full}
  ├──expanding: ${tod_full}
  ╰─────result: Tue, 2 Mar 1999 09:44:33 +0000
@@ -618,6 +656,7 @@ LOG: MAIN
   <= CALLER@??? U=CALLER P=local-esmtp S=sss
 LOG: MAIN
   Completed
+try option acl_smtp_quit
 LOG: smtp_connection MAIN
   SMTP connection from CALLER D=qqs closed by QUIT

>>>>>>>>>>>>>>>> Exim pid=p1235 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>

@@ -627,9 +666,16 @@ environment after trimming:
 adding SSLKEYLOGFILE=TESTSUITE/spool/sslkeys
 configuration file is TESTSUITE/test-config
 admin user
+try option gecos_pattern
+try option gecos_name
+try option unknown_login
+try option smtp_active_hostname
  in hosts_connection_nolog? no (option unset)
 LOG: smtp_connection MAIN
   SMTP connection from CALLER
+try option message_size_limit
+try option acl_smtp_connect
+try option smtp_banner
  ╭considering: $smtp_active_hostname ESMTP Exim $version_number $tod_full
  ├──────value: myhost.test.ex
  ├considering:  ESMTP Exim $version_number $tod_full
@@ -644,7 +690,12 @@ LOG: smtp_connection MAIN
  ╰─────result: myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
  list element: *
   in limits_advertise_hosts? yes (matched "*")
+try option spf_smtp_comment_template
+try option acl_smtp_helo
  in dsn_advertise_hosts? no (option unset)
+try option acl_smtp_etrn
+try option acl_smtp_vrfy
+try option acl_smtp_expn
  in pipelining_advertise_hosts?
  list element: *
   in pipelining_advertise_hosts? yes (matched "*")
@@ -652,6 +703,8 @@ LOG: smtp_connection MAIN
  in chunking_advertise_hosts? no (end of list)
  list element: *
   in tls_advertise_hosts? yes (matched "*")
+try option acl_smtp_mail
+try option acl_smtp_rcpt
  ╭considering: ${if eq {SERVER}{server}{queue}{cutthrough}}
   ╭considering: SERVER}{server}{queue}{cutthrough}}
   ├───────text: SERVER
@@ -691,6 +744,9 @@ domain.com in "! +local_domains"?
    domain.com in "test.ex : *.test.ex"? no (end of list)
   end sublist local_domains
 domain.com in "! +local_domains"? yes (end of list)
+try option router_home_directory
+try option set
+processing address_data
  ╭considering: $local_part
  ├──────value: usery
             ╰──(tainted)
@@ -700,6 +756,9 @@ domain.com in "! +local_domains"? yes (end of list)
 domain.com in "*"?
  list element: *
  domain.com in "*"? yes (matched "*")
+try option transport
+try option unseen
+try option unseen
 ----------- end verify ------------
 accept: condition test succeeded in ACL "cutthrough"
 end of ACL "cutthrough": ACCEPT
@@ -713,6 +772,9 @@ domain.com in "! +local_domains"?
    domain.com in "test.ex : *.test.ex"? no (end of list)
   end sublist local_domains
 domain.com in "! +local_domains"? yes (end of list)
+try option router_home_directory
+try option set
+processing address_data
  ╭considering: $local_part
  ├──────value: usery
             ╰──(tainted)
@@ -722,9 +784,15 @@ domain.com in "! +local_domains"? yes (end of list)
 domain.com in "*"?
  list element: *
  domain.com in "*"? yes (matched "*")
-Connecting to 127.0.0.1 [127.0.0.1]:PORT_D from ip4.ip4.ip4.ip4 ... 127.0.0.1 in hosts_try_fastopen?
+try option transport
+try option unseen
+try option unseen
+try option interface
+Connecting to 127.0.0.1 [127.0.0.1]:PORT_D from ip4.ip4.ip4.ip4 ... try option dscp
+127.0.0.1 in hosts_try_fastopen?
  list element: 
  connected
+try option helo_data
  ╭considering: $primary_hostname
  ├──────value: myhost.test.ex
  ├──expanding: $primary_hostname
@@ -740,6 +808,7 @@ cmd buf flush ddd bytes
          250-PIPELINING
          250-STARTTLS
          250 HELP
+try option host_name_extract
  ╭considering: ${if and {{match{$host}{.outlook.com\$}} {match{$item}{\N^250-([\w.]+)\s\N}}} {$1}}
   ╭considering: $host}{.outlook.com\$}} {match{$item}{\N^250-([\w.]+)\s\N}}} {$1}}
   ├──────value: 127.0.0.1
@@ -809,6 +878,7 @@ cmd buf flush ddd bytes
 using PIPELINING
 not using DSN
 127.0.0.1 in hosts_require_auth? no (option unset)
+try option authenticated_sender
   SMTP|> MAIL FROM:<CALLER@???>
   SMTP>> RCPT TO:<usery@???>
 cmd buf flush ddd bytes
@@ -818,14 +888,18 @@ sync_responses expect rcpt for usery@???
   SMTP<< 250 Accepted
 holding verify callout open for cutthrough delivery
 ----------- end cutthrough setup ------------
+try option acl_smtp_predata
 processing "accept" (TESTSUITE/test-config 55)
 accept: condition test succeeded in inline ACL
 end of inline ACL: ACCEPT
   SMTP>> DATA
   SMTP<< 354 Enter message, ending with "." on a line by itself
+try option message_id_header_domain
+try option message_id_header_text
  ╭considering: ${tod_full}
  ├──expanding: ${tod_full}
  ╰─────result: Tue, 2 Mar 1999 09:44:33 +0000
+try option received_header_text
  ╭considering: Received: ${if def:sender_rcvhost {from $sender_rcvhost
      }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name)
      }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver        { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std
@@ -1175,6 +1249,9 @@ end of inline ACL: ACCEPT
             ╰──(tainted)
 ----------- start cutthrough headers send -----------
 ----------- done cutthrough headers send ------------
+try option acl_smtp_dkim
+try option acl_smtp_mime
+try option acl_smtp_data
  ╭considering: ${tod_full}
  ├──expanding: ${tod_full}
  ╰─────result: Tue, 2 Mar 1999 09:44:33 +0000
@@ -1191,6 +1268,7 @@ LOG: MAIN
   <= CALLER@??? U=CALLER P=local-esmtp S=sss
 LOG: MAIN
   Completed
+try option acl_smtp_quit
 LOG: smtp_connection MAIN
   SMTP connection from CALLER D=qqs closed by QUIT

>>>>>>>>>>>>>>>> Exim pid=p1236 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>

@@ -1200,9 +1278,16 @@ environment after trimming:
 adding SSLKEYLOGFILE=TESTSUITE/spool/sslkeys
 configuration file is TESTSUITE/test-config
 admin user
+try option gecos_pattern
+try option gecos_name
+try option unknown_login
+try option smtp_active_hostname
  in hosts_connection_nolog? no (option unset)
 LOG: smtp_connection MAIN
   SMTP connection from CALLER
+try option message_size_limit
+try option acl_smtp_connect
+try option smtp_banner
  ╭considering: $smtp_active_hostname ESMTP Exim $version_number $tod_full
  ├──────value: myhost.test.ex
  ├considering:  ESMTP Exim $version_number $tod_full
@@ -1217,7 +1302,12 @@ LOG: smtp_connection MAIN
  ╰─────result: myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000
  list element: *
   in limits_advertise_hosts? yes (matched "*")
+try option spf_smtp_comment_template
+try option acl_smtp_helo
  in dsn_advertise_hosts? no (option unset)
+try option acl_smtp_etrn
+try option acl_smtp_vrfy
+try option acl_smtp_expn
  in pipelining_advertise_hosts?
  list element: *
   in pipelining_advertise_hosts? yes (matched "*")
@@ -1225,6 +1315,8 @@ LOG: smtp_connection MAIN
  in chunking_advertise_hosts? no (end of list)
  list element: *
   in tls_advertise_hosts? yes (matched "*")
+try option acl_smtp_mail
+try option acl_smtp_rcpt
  ╭considering: ${if eq {SERVER}{server}{queue}{cutthrough}}
   ╭considering: SERVER}{server}{queue}{cutthrough}}
   ├───────text: SERVER
@@ -1264,6 +1356,9 @@ domain.com in "! +local_domains"?
    domain.com in "test.ex : *.test.ex"? no (end of list)
   end sublist local_domains
 domain.com in "! +local_domains"? yes (end of list)
+try option router_home_directory
+try option set
+processing address_data
  ╭considering: $local_part
  ├──────value: usery
             ╰──(tainted)
@@ -1273,6 +1368,9 @@ domain.com in "! +local_domains"? yes (end of list)
 domain.com in "*"?
  list element: *
  domain.com in "*"? yes (matched "*")
+try option transport
+try option unseen
+try option unseen
 ----------- end verify ------------
 accept: condition test succeeded in ACL "cutthrough"
 end of ACL "cutthrough": ACCEPT
@@ -1286,6 +1384,9 @@ domain.com in "! +local_domains"?
    domain.com in "test.ex : *.test.ex"? no (end of list)
   end sublist local_domains
 domain.com in "! +local_domains"? yes (end of list)
+try option router_home_directory
+try option set
+processing address_data
  ╭considering: $local_part
  ├──────value: usery
             ╰──(tainted)
@@ -1295,9 +1396,15 @@ domain.com in "! +local_domains"? yes (end of list)
 domain.com in "*"?
  list element: *
  domain.com in "*"? yes (matched "*")
-Connecting to 127.0.0.1 [127.0.0.1]:PORT_D from ip4.ip4.ip4.ip4 ... 127.0.0.1 in hosts_try_fastopen?
+try option transport
+try option unseen
+try option unseen
+try option interface
+Connecting to 127.0.0.1 [127.0.0.1]:PORT_D from ip4.ip4.ip4.ip4 ... try option dscp
+127.0.0.1 in hosts_try_fastopen?
  list element: 
  connected
+try option helo_data
  ╭considering: $primary_hostname
  ├──────value: myhost.test.ex
  ├──expanding: $primary_hostname
@@ -1313,6 +1420,7 @@ cmd buf flush ddd bytes
          250-PIPELINING
          250-STARTTLS
          250 HELP
+try option host_name_extract
  ╭considering: ${if and {{match{$host}{.outlook.com\$}} {match{$item}{\N^250-([\w.]+)\s\N}}} {$1}}
   ╭considering: $host}{.outlook.com\$}} {match{$item}{\N^250-([\w.]+)\s\N}}} {$1}}
   ├──────value: 127.0.0.1
@@ -1382,6 +1490,7 @@ cmd buf flush ddd bytes
 using PIPELINING
 not using DSN
 127.0.0.1 in hosts_require_auth? no (option unset)
+try option authenticated_sender
   SMTP|> MAIL FROM:<CALLER@???>
   SMTP>> RCPT TO:<usery@???>
 cmd buf flush ddd bytes
@@ -1391,14 +1500,18 @@ sync_responses expect rcpt for usery@???
   SMTP<< 250 Accepted
 holding verify callout open for cutthrough delivery
 ----------- end cutthrough setup ------------
+try option acl_smtp_predata
 processing "accept" (TESTSUITE/test-config 55)
 accept: condition test succeeded in inline ACL
 end of inline ACL: ACCEPT
   SMTP>> DATA
   SMTP<< 354 Enter message, ending with "." on a line by itself
+try option message_id_header_domain
+try option message_id_header_text
  ╭considering: ${tod_full}
  ├──expanding: ${tod_full}
  ╰─────result: Tue, 2 Mar 1999 09:44:33 +0000
+try option received_header_text
  ╭considering: Received: ${if def:sender_rcvhost {from $sender_rcvhost
      }{${if def:sender_ident {from ${quote_local_part:$sender_ident} }}${if def:sender_helo_name {(helo=$sender_helo_name)
      }}}}by $primary_hostname ${if def:received_protocol {with $received_protocol }}${if def:tls_in_ver        { ($tls_in_ver)}}${if def:tls_in_cipher_std { tls $tls_in_cipher_std
@@ -1748,6 +1861,9 @@ end of inline ACL: ACCEPT
             ╰──(tainted)
 ----------- start cutthrough headers send -----------
 ----------- done cutthrough headers send ------------
+try option acl_smtp_dkim
+try option acl_smtp_mime
+try option acl_smtp_data
  ╭considering: ${tod_full}
  ├──expanding: ${tod_full}
  ╰─────result: Tue, 2 Mar 1999 09:44:33 +0000
@@ -1764,6 +1880,7 @@ LOG: MAIN
   <= CALLER@??? U=CALLER P=local-esmtp S=sss
 LOG: MAIN
   Completed
+try option acl_smtp_quit
 LOG: smtp_connection MAIN
   SMTP connection from CALLER D=qqs closed by QUIT

>>>>>>>>>>>>>>>> Exim pid=p1237 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>


--
## subscription configuration (requires account):
## https://lists.exim.org/mailman3/postorius/lists/exim-cvs.lists.exim.org/
## unsubscribe (doesn't require an account):
## exim-cvs-unsubscribe@???
## Exim details at http://www.exim.org/
## Please use the Wiki with this list - http://wiki.exim.org/