X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/4d8d62b965c7379e85aeb6e43534c89d06099ad2..d68218c76f4dc65a3e308fa75d071526ad0e0f49:/src/src/transports/smtp.c diff --git a/src/src/transports/smtp.c b/src/src/transports/smtp.c index b18720cc0..9918f3116 100644 --- a/src/src/transports/smtp.c +++ b/src/src/transports/smtp.c @@ -156,6 +156,10 @@ optionlist smtp_transport_options[] = { { "tls_verify_certificates", opt_stringptr, (void *)offsetof(smtp_transport_options_block, tls_verify_certificates) } #endif +#ifdef EXPERIMENTAL_TPDA + ,{ "tpda_host_defer_action", opt_stringptr, + (void *)offsetof(smtp_transport_options_block, tpda_host_defer_action) }, +#endif }; /* Size of the options list. An extern variable has to be used so that its @@ -233,6 +237,9 @@ smtp_transport_options_block smtp_transport_option_defaults = { NULL, /* dkim_sign_headers */ NULL /* dkim_strict */ #endif +#ifdef EXPERIMENTAL_TPDA + ,NULL /* tpda_host_defer_action */ +#endif }; @@ -577,6 +584,59 @@ else +#ifdef EXPERIMENTAL_TPDA +/************************************************* +* Post-defer action * +*************************************************/ + +/* This expands an arbitrary per-transport string. + It might, for example, be used to write to the database log. + +Arguments: + ob transport options block + addr the address item containing error information + host the current host + +Returns: nothing +*/ + +static void +tpda_deferred(smtp_transport_options_block *ob, address_item *addr, host_item *host) +{ +uschar *action = ob->tpda_host_defer_action; +if (!action) + return; + +tpda_delivery_ip = string_copy(host->address); +tpda_delivery_port = (host->port == PORT_NONE)? 25 : host->port; +tpda_delivery_fqdn = string_copy(host->name); +tpda_delivery_local_part = string_copy(addr->local_part); +tpda_delivery_domain = string_copy(addr->domain); +tpda_defer_errno = addr->basic_errno; + +tpda_defer_errstr = addr->message + ? addr->basic_errno > 0 + ? string_sprintf("%s: %s", addr->message, strerror(addr->basic_errno)) + : string_copy(addr->message) + : addr->basic_errno > 0 + ? string_copy(strerror(addr->basic_errno)) + : NULL; + +DEBUG(D_transport) + debug_printf(" TPDA(host defer): tpda_host_defer_action=|%s| tpda_delivery_IP=%s\n", + action, tpda_delivery_ip); + +router_name = addr->router->name; +transport_name = addr->transport->name; +if (!expand_string(action) && *expand_string_message) + log_write(0, LOG_MAIN|LOG_PANIC, "failed to expand tpda_defer_action in %s: %s\n", + transport_name, expand_string_message); +router_name = transport_name = NULL; +} +#endif + + + /************************************************* * Synchronize SMTP responses * *************************************************/ @@ -1912,7 +1972,12 @@ if (!ok) ok = TRUE; else /* Set up confirmation if needed - applies only to SMTP */ - if ((log_extra_selector & LX_smtp_confirmation) != 0 && !lmtp) + if ( + #ifndef EXPERIMENTAL_TPDA + (log_extra_selector & LX_smtp_confirmation) != 0 && + #endif + !lmtp + ) { uschar *s = string_printing(buffer); conf = (s == buffer)? (uschar *)string_copy(s) : s; @@ -3051,6 +3116,11 @@ for (cutoff_retry = 0; expired && first_addr->basic_errno != ERRNO_TLSFAILURE) write_logs(first_addr, host); + #ifdef EXPERIMENTAL_TPDA + if (rc == DEFER) + tpda_deferred(ob, first_addr, host); + #endif + /* If STARTTLS was accepted, but there was a failure in setting up the TLS session (usually a certificate screwup), and the host is not in hosts_require_tls, and tls_tempfail_tryclear is true, try again, with @@ -3073,6 +3143,10 @@ for (cutoff_retry = 0; expired && expanded_hosts != NULL, &message_defer, TRUE); if (rc == DEFER && first_addr->basic_errno != ERRNO_AUTHFAIL) write_logs(first_addr, host); + #ifdef EXPERIMENTAL_TPDA + if (rc == DEFER) + tpda_deferred(ob, first_addr, host); + #endif } #endif }