(void *)offsetof(transport_instance, connection_max_messages) },
{ "data_timeout", opt_time,
(void *)offsetof(smtp_transport_options_block, data_timeout) },
-#ifdef EXPERIMENTAL_DBL
- { "dbl_host_defer_query", opt_stringptr,
- (void *)offsetof(smtp_transport_options_block, dbl_host_defer_query) },
-#endif
{ "delay_after_cutoff", opt_bool,
(void *)offsetof(smtp_transport_options_block, delay_after_cutoff) },
#ifndef DISABLE_DKIM
{ "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
NULL, /* dkim_sign_headers */
NULL /* dkim_strict */
#endif
-#ifdef EXPERIMENTAL_DBL
- ,NULL /* dbl_host_defer_query */
+#ifdef EXPERIMENTAL_TPDA
+ ,NULL /* tpda_host_defer_action */
#endif
};
-#ifdef EXPERIMENTAL_DBL
+#ifdef EXPERIMENTAL_TPDA
/*************************************************
-* Write error message to database log *
+* Post-defer action *
*************************************************/
/* This expands an arbitrary per-transport string.
It might, for example, be used to write to the database log.
Arguments:
- dbl_host_defer_query dbl_host_defer_query from the transport options block
+ ob transport options block
addr the address item containing error information
host the current host
*/
static void
-dbl_write_defer_log(uschar *dbl_host_defer_query, address_item *addr, host_item *host)
+tpda_deferred(smtp_transport_options_block *ob, address_item *addr, host_item *host)
{
-if (dbl_host_defer_query == NULL)
+uschar *action = ob->tpda_host_defer_action;
+if (!action)
return;
-dbl_delivery_ip = string_copy(host->address);
-dbl_delivery_port = (host->port == PORT_NONE)? 25 : host->port;
-dbl_delivery_fqdn = string_copy(host->name);
-dbl_delivery_local_part = string_copy(addr->local_part);
-dbl_delivery_domain = string_copy(addr->domain);
-dbl_defer_errno = addr->basic_errno;
-
-dbl_defer_errstr = (addr->message != NULL)
- ? (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(" DBL(host defer): dbl_host_defer_query=|%s| dbl_delivery_IP=%s\n", dbl_host_defer_query, dbl_delivery_ip);
-}
+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;
-expand_string(dbl_host_defer_query);
+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
/* Set up confirmation if needed - applies only to SMTP */
if (
- #ifndef EXPERIMENTAL_DBL
+ #ifndef EXPERIMENTAL_TPDA
(log_extra_selector & LX_smtp_confirmation) != 0 &&
#endif
!lmtp
first_addr->basic_errno != ERRNO_TLSFAILURE)
write_logs(first_addr, host);
- #ifdef EXPERIMENTAL_DBL
+ #ifdef EXPERIMENTAL_TPDA
if (rc == DEFER)
- dbl_write_defer_log(ob->dbl_host_defer_query, first_addr, host);
+ tpda_deferred(ob, first_addr, host);
#endif
/* If STARTTLS was accepted, but there was a failure in setting up the
expanded_hosts != NULL, &message_defer, TRUE);
if (rc == DEFER && first_addr->basic_errno != ERRNO_AUTHFAIL)
write_logs(first_addr, host);
- #ifdef EXPERIMENTAL_DBL
+ #ifdef EXPERIMENTAL_TPDA
if (rc == DEFER)
- dbl_write_defer_log(ob->dbl_host_defer_query, first_addr, host);
+ tpda_deferred(ob, first_addr, host);
#endif
}
#endif