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)
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);
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
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)
for (qrunner * q = qrunners; q; q = q->next)
q->run_max = local_queue_run_max;
}
+ }
process_purpose = US"daemon";
}
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;
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)))
{
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);
else
return_path = sender_address;
+GET_OPTION("return_path");
if (tp->return_path)
{
uschar * new_return_path = expand_string(tp->return_path);
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 */
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)
{
/* 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;
+ }
}
}
{
unsigned max_parallel;
+GET_OPTION("max_parallel");
if (!tp->max_parallel) return FALSE;
max_parallel = (unsigned) expand_string_integer(tp->max_parallel, TRUE);
/* 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);
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)
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)
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));
/* 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");
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");
/* 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;
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
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;
|| 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 */
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; }
/* 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; }
/* 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. */
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; }
/* 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; }
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; }
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);
/* 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;
if (!originator_login || f.running_in_test_harness)
{
+ GET_OPTION("unknown_login");
if (unknown_login)
{
originator_login = expand_string(unknown_login);
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
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)
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 */
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);
*/
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)))
#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 */
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);
/* 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))
{
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 */
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;
{
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);
/* 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);
/* 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);
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 =
#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
#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;
/* 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);
{
#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)
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)
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)))
/* 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. */
/* 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)
{
/* 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 */
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);
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)
tree_node ** root = (tree_node **) &addr->prop.variables;
int sep = ';';
+GET_OPTION("set");
if (!varlist) return OK;
/* Walk the varlist, creating variables */
/* 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;
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)
/* 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;
{
/* 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;
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;
}
#ifdef SUPPORT_TRANSLATE_IP_ADDRESS
+GET_OPTION("translate_ip_address");
if (r->translate_ip_address)
{
int rc;
/* 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;
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)
/* 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)
{
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
/* 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,
/* 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);
/* 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);
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);
/* 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 */
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);
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;
}
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;
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;
}
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;
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);
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)
{
/* 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 */
uschar *ss;
BOOL expandable;
+GET_OPTION("transport");
if (!tpname)
{
if (!require_name) return TRUE;
/* 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)
{
/* Run the connect ACL if it exists */
user_msg = NULL;
+GET_OPTION("acl_smtp_connect");
if (acl_smtp_connect)
{
int rc;
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 */
/* 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;
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)
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
/* 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
/* 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)
/* 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);
US"invalid data for AUTH");
goto COMMAND_LOOP;
}
+ GET_OPTION("acl_smtp_mailauth");
if (!acl_smtp_mailauth)
{
ignore_msg = US"client not authenticated";
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);
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 */
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
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);
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);
/* 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
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))
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)
{
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;
/* 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)
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");
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;
which = US"quota";
ob->quota_value = (off_t)d;
ob->quota_no_check = no_check;
+ GET_OPTION("quota_filecount");
q = ob->quota_filecount;
break;
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;
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;
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;
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);
}
{
if (!(fdname = ob->filename))
{
+ GET_OPTION("directory");
fdname = ob->dirname;
isdirectory = TRUE;
}
/* Use an explicitly configured directory if set */
+ GET_OPTION("quota_directory");
if (ob->quota_directory)
{
if (!(check_path = expand_string(ob->quota_directory)))
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
/* 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)
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)
/* 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
/* 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. */
}
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;
/* 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;
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]);
{
/* 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;
}
else
{
+ GET_OPTION("commsnd");
cmd = ob->cmd;
expand_arguments = TRUE;
expand_fail = PANIC;
/* Add any requested items */
+GET_OPTION("environment");
if (envlist)
if (!(envlist = expand_cstring(envlist)))
{
/* 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;
/* 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;
# 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",
/*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);
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);
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)
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
}
#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
{
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
/* 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)))
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;
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",
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")
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 */
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")
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
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
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
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
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@myhost.test.ex
+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
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
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@test.ex
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@test.ex
+try option acl_smtp_rcpt
using ACL "check_recipient"
processing "accept" (TESTSUITE/test-config 27)
check hosts = :
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@test.ex> 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 >>>>>>>>>>>>>>>>
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@test.ex
+try option smtp_active_hostname
set_process_info: pppp accepting a local non-SMTP message from <CALLER@test.ex>
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@test.ex
Recipients:
CALLER@test.ex
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
╭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
(envelope-from <CALLER@test.ex>)
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
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
├──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@test.ex
transport: <none>
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
├──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@test.ex
transport: <none>
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
├──expanding: /non-exist/$domain
╰─────result: /non-exist/test.ex
╰──(tainted)
+try option set
calling r3 router
r3 router called for userz@test.ex
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@test.ex
transport: t2
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
├──expanding: /non-exist/$domain
╰─────result: /non-exist/test.ex
╰──(tainted)
+try option set
calling r2 router
r2 router called for usery@test.ex
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@test.ex
transport: t1
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
├──expanding: /non-exist/$local_part
╰─────result: /non-exist/CALLER
╰──(tainted)
+try option set
calling r1 router
r1 router called for CALLER@test.ex
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@test.ex
transport: t1
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
├──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=/
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
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
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=/
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
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
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@test.ex> transport=t1
uid=CALLER_UID gid=CALLER_GID pid=p1238
home=/non-exist/CALLER current=/
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
├──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@test.ex> transport=t1
uid=CALLER_UID gid=CALLER_GID pid=p1239
home=/non-exist/usery current=/
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
├──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@test.ex> transport=t2
uid=CALLER_UID gid=CALLER_GID pid=p1240
home=/userz current=/
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
╰─────result: Received: from CALLER by the.local.host.name with local (Exim x.yz)
(envelope-from <CALLER@test.ex>)
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
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)
== userx@domain1.ex R=smarthost T=smtp defer (-1): first-pass only routing due to -odqs, queue_smtp_domains or control=queue
LOG: MAIN
== userx@domain2.ex 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}}
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
├──────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
├─────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
├──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
├──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 >>>>>>>>>>>>>>>>
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
├──────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
╰──(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 >>>>>>>>>>>>>>>>
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
├──────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
╰──(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 >>>>>>>>>>>>>>>>
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
01:01:01 p1239 routing dest@test.ex
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
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
01:01:01 p1241 routing dest2@test.ex
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
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
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
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
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
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
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
p1235 id 10HmaX-000000005vi-0000
p1235 for dest_1@test.ex
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
<= CALLER@test.ex 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
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
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}}
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
p1236 id 10HmaY-000000005vi-0000
p1236 for dest_2@test.ex
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
<= CALLER@test.ex 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
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
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
╰─────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 "*")
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
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
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
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
using PIPELINING
not using DSN
127.0.0.1 in hosts_require_auth? no (option unset)
+try option authenticated_sender
SMTP|> MAIL FROM:<CALLER@myhost.test.ex>
SMTP>> RCPT TO:<userx@domain.com>
cmd buf flush ddd bytes
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
╰──(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
<= CALLER@myhost.test.ex 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 >>>>>>>>>>>>>>>>
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
╰─────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 "*")
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
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
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
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
using PIPELINING
not using DSN
127.0.0.1 in hosts_require_auth? no (option unset)
+try option authenticated_sender
SMTP|> MAIL FROM:<CALLER@myhost.test.ex>
SMTP>> RCPT TO:<usery@domain.com>
cmd buf flush ddd bytes
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
╰──(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
<= CALLER@myhost.test.ex 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 >>>>>>>>>>>>>>>>
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
╰─────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 "*")
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
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
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
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
using PIPELINING
not using DSN
127.0.0.1 in hosts_require_auth? no (option unset)
+try option authenticated_sender
SMTP|> MAIL FROM:<CALLER@myhost.test.ex>
SMTP>> RCPT TO:<usery@domain.com>
cmd buf flush ddd bytes
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
╰──(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
<= CALLER@myhost.test.ex 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 >>>>>>>>>>>>>>>>
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
╰─────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 "*")
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
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)
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
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)
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
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
using PIPELINING
not using DSN
127.0.0.1 in hosts_require_auth? no (option unset)
+try option authenticated_sender
SMTP|> MAIL FROM:<CALLER@myhost.test.ex>
SMTP>> RCPT TO:<userx@domain.com>
cmd buf flush ddd bytes
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
╰──(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
<= CALLER@myhost.test.ex 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 >>>>>>>>>>>>>>>>
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
╰─────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 "*")
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
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)
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
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)
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
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
using PIPELINING
not using DSN
127.0.0.1 in hosts_require_auth? no (option unset)
+try option authenticated_sender
SMTP|> MAIL FROM:<CALLER@myhost.test.ex>
SMTP>> RCPT TO:<usery@domain.com>
cmd buf flush ddd bytes
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
╰──(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
<= CALLER@myhost.test.ex 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 >>>>>>>>>>>>>>>>
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
╰─────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 "*")
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
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)
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
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)
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
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
using PIPELINING
not using DSN
127.0.0.1 in hosts_require_auth? no (option unset)
+try option authenticated_sender
SMTP|> MAIL FROM:<CALLER@myhost.test.ex>
SMTP>> RCPT TO:<usery@domain.com>
cmd buf flush ddd bytes
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
╰──(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
<= CALLER@myhost.test.ex 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 >>>>>>>>>>>>>>>>