From: Stephan Bosch Date: Sat, 16 Sep 2017 11:28:32 +0000 (+0200) Subject: lib-smtp: smtp-submit: Made submission_timeout a setting rather than a function param... X-Git-Tag: 2.3.0.rc1~917 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=47fa7b222e197f73042e8b36ad688bf5fcbfc6f0;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: smtp-submit: Made submission_timeout a setting rather than a function parameter. This makes it configurable. --- diff --git a/src/lda/main.c b/src/lda/main.c index 2274b2accb..4d25d5c0ad 100644 --- a/src/lda/main.c +++ b/src/lda/main.c @@ -319,7 +319,6 @@ int main(int argc, char *argv[]) ctx.session = mail_deliver_session_init(); ctx.pool = ctx.session->pool; ctx.dest_mailbox_name = "INBOX"; - ctx.timeout_secs = LDA_SUBMISSION_TIMEOUT_SECS; path = NULL; user = getenv("USER"); diff --git a/src/lib-lda/mail-deliver.h b/src/lib-lda/mail-deliver.h index da40eaf55d..15ff62a21f 100644 --- a/src/lib-lda/mail-deliver.h +++ b/src/lib-lda/mail-deliver.h @@ -7,10 +7,6 @@ #include -/* How many seconds to wait for replies from SMTP before failing. Used for - sending rejects, forward, etc. */ -#define LDA_SUBMISSION_TIMEOUT_SECS 30 - struct mail_storage; struct mail_save_context; struct mailbox; @@ -27,7 +23,6 @@ struct mail_deliver_context { const struct lda_settings *set; const struct smtp_submit_settings *smtp_set; struct mail_deliver_session *session; - unsigned int timeout_secs; unsigned int session_time_msecs; struct timeval delivery_time_started; diff --git a/src/lib-lda/mail-send.c b/src/lib-lda/mail-send.c index a64d8c5890..86c58cedb6 100644 --- a/src/lib-lda/mail-send.c +++ b/src/lib-lda/mail-send.c @@ -184,8 +184,7 @@ int mail_send_rejection(struct mail_deliver_context *ctx, const char *recipient, str_truncate(str, 0); str_printfa(str, "\r\n\r\n--%s--\r\n", boundary); o_stream_nsend(output, str_data(str), str_len(str)); - if ((ret = smtp_submit_run_timeout - (smtp_submit, ctx->timeout_secs, &error)) < 0) { + if ((ret = smtp_submit_run(smtp_submit, &error)) < 0) { i_error("msgid=%s: Temporarily failed to send rejection: %s", orig_msgid == NULL ? "" : str_sanitize(orig_msgid, 80), str_sanitize(error, 512)); diff --git a/src/lib-smtp/smtp-submit-settings.c b/src/lib-smtp/smtp-submit-settings.c index 138491a3ee..e486531187 100644 --- a/src/lib-smtp/smtp-submit-settings.c +++ b/src/lib-smtp/smtp-submit-settings.c @@ -18,16 +18,20 @@ static bool smtp_submit_settings_check(void *_set, pool_t pool, const char **err static const struct setting_define smtp_submit_setting_defines[] = { DEF(SET_STR, hostname), + DEF(SET_STR_VARS, submission_host), DEF(SET_STR_VARS, sendmail_path), + DEF(SET_TIME, submission_timeout), SETTING_DEFINE_LIST_END }; static const struct smtp_submit_settings smtp_submit_default_settings = { .hostname = "", + .submission_host = "", .sendmail_path = "/usr/sbin/sendmail", + .submission_timeout = 30, }; const struct setting_parser_info smtp_submit_setting_parser_info = { diff --git a/src/lib-smtp/smtp-submit-settings.h b/src/lib-smtp/smtp-submit-settings.h index 8792d4e4f8..3b7eb1e0ff 100644 --- a/src/lib-smtp/smtp-submit-settings.h +++ b/src/lib-smtp/smtp-submit-settings.h @@ -3,8 +3,10 @@ struct smtp_submit_settings { const char *hostname; + const char *submission_host; const char *sendmail_path; + unsigned int submission_timeout; }; extern const struct setting_parser_info smtp_submit_setting_parser_info; diff --git a/src/lib-smtp/smtp-submit.c b/src/lib-smtp/smtp-submit.c index 4da0086e3f..ef3cccfbea 100644 --- a/src/lib-smtp/smtp-submit.c +++ b/src/lib-smtp/smtp-submit.c @@ -58,6 +58,7 @@ smtp_submit_session_init(const struct smtp_submit_settings *set) session = p_new(pool, struct smtp_submit_session, 1); session->pool = pool; + session->set = *set; session->set.hostname = p_strdup_empty(pool, set->hostname); session->set.submission_host = p_strdup_empty(pool, set->submission_host); session->set.sendmail_path = p_strdup_empty(pool, set->sendmail_path); @@ -243,8 +244,7 @@ data_callback(enum lmtp_client_result result, const char *reply, void *context) } static void -smtp_submit_send_host(struct smtp_submit *subm, - unsigned int timeout_secs) +smtp_submit_send_host(struct smtp_submit *subm) { const struct smtp_submit_settings *set = &subm->session->set; struct lmtp_client_settings client_set; @@ -263,7 +263,7 @@ smtp_submit_send_host(struct smtp_submit *subm, client_set.mail_from = subm->return_path == NULL ? "<>" : t_strconcat("<", subm->return_path, ">", NULL); client_set.my_hostname = set->hostname; - client_set.timeout_secs = timeout_secs; + client_set.timeout_secs = set->submission_timeout; lmtp_client = lmtp_client_init(&client_set, smtp_submit_send_host_finished, subm); @@ -305,8 +305,7 @@ smtp_submit_sendmail_callback(int status, struct smtp_submit *subm) } static void -smtp_submit_send_sendmail(struct smtp_submit *subm, - unsigned int timeout_secs) +smtp_submit_send_sendmail(struct smtp_submit *subm) { const struct smtp_submit_settings *set = &subm->session->set; const char *const *sendmail_args, *sendmail_bin, *str; @@ -334,8 +333,8 @@ smtp_submit_send_sendmail(struct smtp_submit *subm, array_append_zero(&args); i_zero(&pc_set); - pc_set.client_connect_timeout_msecs = timeout_secs * 1000; - pc_set.input_idle_timeout_msecs = timeout_secs * 1000; + pc_set.client_connect_timeout_msecs = set->submission_timeout * 1000; + pc_set.input_idle_timeout_msecs = set->submission_timeout * 1000; restrict_access_init(&pc_set.restrict_set); pc = program_client_local_create @@ -363,8 +362,8 @@ smtp_submit_run_callback(const struct smtp_submit_result *result, io_loop_stop(current_ioloop); } -int smtp_submit_run_timeout(struct smtp_submit *subm, - unsigned int timeout_secs, const char **error_r) +int smtp_submit_run(struct smtp_submit *subm, + const char **error_r) { struct smtp_submit_run_context rctx; struct ioloop *ioloop; @@ -373,7 +372,7 @@ int smtp_submit_run_timeout(struct smtp_submit *subm, io_loop_set_running(ioloop); i_zero(&rctx); - smtp_submit_run_async(subm, timeout_secs, + smtp_submit_run_async(subm, smtp_submit_run_callback, &rctx); if (io_loop_is_running(ioloop)) @@ -391,14 +390,8 @@ int smtp_submit_run_timeout(struct smtp_submit *subm, return rctx.status; } -int smtp_submit_run(struct smtp_submit *submit, const char **error_r) -{ - return smtp_submit_run_timeout(submit, 0, error_r); -} - #undef smtp_submit_run_async void smtp_submit_run_async(struct smtp_submit *subm, - unsigned int timeout_secs, smtp_submit_callback_t *callback, void *context) { const struct smtp_submit_settings *set = &subm->session->set; @@ -411,8 +404,8 @@ void smtp_submit_run_async(struct smtp_submit *subm, (&subm->output, IO_BLOCK_SIZE); if (set->submission_host != NULL) { - smtp_submit_send_host(subm, timeout_secs); + smtp_submit_send_host(subm); } else { - smtp_submit_send_sendmail(subm, timeout_secs); + smtp_submit_send_sendmail(subm); } } diff --git a/src/lib-smtp/smtp-submit.h b/src/lib-smtp/smtp-submit.h index 40c17bdfa3..01300be09e 100644 --- a/src/lib-smtp/smtp-submit.h +++ b/src/lib-smtp/smtp-submit.h @@ -43,10 +43,9 @@ struct ostream *smtp_submit_send(struct smtp_submit *subm); /* Submit the message. Callback is called once the message submission finishes. */ void smtp_submit_run_async(struct smtp_submit *subm, - unsigned int timeout_secs, smtp_submit_callback_t *callback, void *context); -#define smtp_submit_run_async(subm, timeout_secs, callback, context) \ - smtp_submit_run_async(subm, timeout_secs, \ +#define smtp_submit_run_async(subm, callback, context) \ + smtp_submit_run_async(subm, \ (smtp_submit_callback_t*)callback, \ (char*)context + CALLBACK_TYPECHECK(callback, \ void (*)(const struct smtp_submit_result *result, typeof(context)))) @@ -54,7 +53,5 @@ void smtp_submit_run_async(struct smtp_submit *subm, /* Returns 1 on success, 0 on permanent failure (e.g. invalid destination), -1 on temporary failure. */ int smtp_submit_run(struct smtp_submit *subm, const char **error_r); -/* Same as smtp_submit_run(), but timeout after given number of seconds. */ -int smtp_submit_run_timeout(struct smtp_submit *subm, - unsigned int timeout_secs, const char **error_r); + #endif diff --git a/src/lib-smtp/test-smtp-submit.c b/src/lib-smtp/test-smtp-submit.c index 34706ca3db..c94782aaa7 100644 --- a/src/lib-smtp/test-smtp-submit.c +++ b/src/lib-smtp/test-smtp-submit.c @@ -100,11 +100,11 @@ static void test_client_deinit(void); static int test_client_smtp_send_simple(const struct smtp_submit_settings *smtp_set, const char *message, const char *host, - unsigned int timeout_secs, const char **error_r); + const char **error_r); static int test_client_smtp_send_simple_port(const struct smtp_submit_settings *smtp_set, const char *message, unsigned int port, - unsigned int timeout_secs, const char **error_r); + const char **error_r); /* test*/ static const char *test_tmp_dir_get(void); @@ -132,7 +132,7 @@ test_client_host_lookup_failed(const struct smtp_submit_settings *submit_set) int ret; ret = test_client_smtp_send_simple(submit_set, - test_message1, "host.invalid", 5, &error); + test_message1, "host.invalid", &error); test_out_reason("run (ret < 0)", ret < 0, error); return FALSE; @@ -145,6 +145,7 @@ static void test_host_lookup_failed(void) struct smtp_submit_settings smtp_submit_set; test_client_defaults(&smtp_submit_set); + smtp_submit_set.submission_timeout = 5; test_begin("host lookup failed"); test_expect_errors(1); @@ -175,7 +176,7 @@ test_client_connection_refused(const struct smtp_submit_settings *submit_set) int ret; ret = test_client_smtp_send_simple_port(submit_set, - test_message1, bind_ports[0], 5, &error); + test_message1, bind_ports[0], &error); test_out_reason("run (ret < 0)", ret < 0, error); return FALSE; @@ -188,6 +189,7 @@ static void test_connection_refused(void) struct smtp_submit_settings smtp_submit_set; test_client_defaults(&smtp_submit_set); + smtp_submit_set.submission_timeout = 5; test_begin("connection refused"); test_expect_errors(1); @@ -227,7 +229,7 @@ test_client_connection_timed_out(const struct smtp_submit_settings *submit_set) io_loop_time_refresh(); time = ioloop_time; ret = test_client_smtp_send_simple_port(submit_set, - test_message1, bind_ports[0], 1, &error); + test_message1, bind_ports[0], &error); test_out_reason("run (ret < 0)", ret < 0, error); io_loop_time_refresh(); @@ -243,6 +245,7 @@ static void test_connection_timed_out(void) struct smtp_submit_settings smtp_submit_set; test_client_defaults(&smtp_submit_set); + smtp_submit_set.submission_timeout = 1; test_begin("connection timed out"); test_expect_errors(0); @@ -287,7 +290,7 @@ test_client_bad_greeting(const struct smtp_submit_settings *submit_set) int ret; ret = test_client_smtp_send_simple_port(submit_set, - test_message1, bind_ports[0], 5, &error); + test_message1, bind_ports[0], &error); // FIXME: lmtp client handles this wrong, the greeting is not "bad" //test_out_reason("run", ret == 0, error); test_out_reason("run (ret < 0)", ret < 0, error); @@ -302,6 +305,7 @@ static void test_bad_greeting(void) struct smtp_submit_settings smtp_submit_set; test_client_defaults(&smtp_submit_set); + smtp_submit_set.submission_timeout = 5; test_begin("bad greeting"); test_expect_errors(0); @@ -357,7 +361,7 @@ test_client_denied_helo(const struct smtp_submit_settings *submit_set) int ret; ret = test_client_smtp_send_simple_port(submit_set, - test_message1, bind_ports[0], 5, &error); + test_message1, bind_ports[0], &error); // FIXME: lmtp client handles this wrong, the greeting is not "bad" //test_out_reason("run", ret == 0, error); test_out_reason("run (ret < 0)", ret < 0, error); @@ -372,6 +376,7 @@ static void test_denied_helo(void) struct smtp_submit_settings smtp_submit_set; test_client_defaults(&smtp_submit_set); + smtp_submit_set.submission_timeout = 5; test_begin("denied helo"); test_expect_errors(0); @@ -425,7 +430,7 @@ test_client_disconnect_helo(const struct smtp_submit_settings *submit_set) int ret; ret = test_client_smtp_send_simple_port(submit_set, - test_message1, bind_ports[0], 5, &error); + test_message1, bind_ports[0], &error); // FIXME: lmtp client handles this wrong, the greeting is not "bad" //test_out_reason("run", ret == 0, error); test_out_reason("run (ret < 0)", ret < 0, error); @@ -440,6 +445,7 @@ static void test_disconnect_helo(void) struct smtp_submit_settings smtp_submit_set; test_client_defaults(&smtp_submit_set); + smtp_submit_set.submission_timeout = 5; test_begin("disconnect helo"); test_expect_errors(0); @@ -529,7 +535,7 @@ test_client_denied_mail(const struct smtp_submit_settings *submit_set) int ret; ret = test_client_smtp_send_simple_port(submit_set, - test_message1, bind_ports[0], 5, &error); + test_message1, bind_ports[0], &error); // FIXME: lmtp client handles this wrong, the greeting is not "bad" //test_out_reason("run", ret == 0, error); test_out_reason("run (ret < 0)", ret < 0, error); @@ -544,6 +550,7 @@ static void test_denied_mail(void) struct smtp_submit_settings smtp_submit_set; test_client_defaults(&smtp_submit_set); + smtp_submit_set.submission_timeout = 5; test_begin("denied mail"); test_expect_errors(0); @@ -639,7 +646,7 @@ test_client_denied_rcpt(const struct smtp_submit_settings *submit_set) int ret; ret = test_client_smtp_send_simple_port(submit_set, - test_message1, bind_ports[0], 5, &error); + test_message1, bind_ports[0], &error); test_out_reason("run (ret == 0)", ret == 0, error); return FALSE; @@ -652,6 +659,7 @@ static void test_denied_rcpt(void) struct smtp_submit_settings smtp_submit_set; test_client_defaults(&smtp_submit_set); + smtp_submit_set.submission_timeout = 5; test_begin("denied rcpt"); test_expect_errors(0); @@ -758,6 +766,7 @@ test_client_denied_second_rcpt(const struct smtp_submit_settings *submit_set) smtp_submit_set = *submit_set; smtp_submit_set.submission_host = t_strdup_printf("127.0.0.1:%u", bind_ports[0]); + smtp_submit_set.submission_timeout = 1000; smtp_submit = smtp_submit_init_simple(&smtp_submit_set, "sender@example.com"); @@ -766,7 +775,7 @@ test_client_denied_second_rcpt(const struct smtp_submit_settings *submit_set) output = smtp_submit_send(smtp_submit); o_stream_send_str(output, test_message1); - ret = smtp_submit_run_timeout(smtp_submit, 1000, &error); + ret = smtp_submit_run(smtp_submit, &error); test_out_reason("run (ret == 0)", ret == 0, error); smtp_submit_deinit(&smtp_submit); @@ -882,7 +891,7 @@ test_client_denied_data(const struct smtp_submit_settings *submit_set) int ret; ret = test_client_smtp_send_simple_port(submit_set, - test_message1, bind_ports[0], 5, &error); + test_message1, bind_ports[0], &error); test_out_reason("run (ret == 0)", ret == 0, error); return FALSE; @@ -895,6 +904,7 @@ static void test_denied_data(void) struct smtp_submit_settings smtp_submit_set; test_client_defaults(&smtp_submit_set); + smtp_submit_set.submission_timeout = 5; test_begin("denied data"); test_expect_errors(0); @@ -1005,7 +1015,7 @@ test_client_data_failure(const struct smtp_submit_settings *submit_set) int ret; ret = test_client_smtp_send_simple_port(submit_set, - test_message1, bind_ports[0], 5, &error); + test_message1, bind_ports[0], &error); test_out_reason("run (ret == 0)", ret == 0, error); return FALSE; @@ -1018,6 +1028,7 @@ static void test_data_failure(void) struct smtp_submit_settings smtp_submit_set; test_client_defaults(&smtp_submit_set); + smtp_submit_set.submission_timeout = 5; test_begin("data failure"); test_expect_errors(0); @@ -1123,7 +1134,7 @@ test_client_data_disconnect(const struct smtp_submit_settings *submit_set) int ret; ret = test_client_smtp_send_simple_port(submit_set, - test_message1, bind_ports[0], 5, &error); + test_message1, bind_ports[0], &error); test_out_reason("run (ret < 0)", ret < 0, error); return FALSE; @@ -1136,6 +1147,7 @@ static void test_data_disconnect(void) struct smtp_submit_settings smtp_submit_set; test_client_defaults(&smtp_submit_set); + smtp_submit_set.submission_timeout = 5; test_begin("data disconnect"); test_expect_errors(0); @@ -1245,7 +1257,7 @@ test_client_data_timout(const struct smtp_submit_settings *submit_set) io_loop_time_refresh(); time = ioloop_time; ret = test_client_smtp_send_simple_port(submit_set, - test_message1, bind_ports[0], 2, &error); + test_message1, bind_ports[0], &error); test_out_reason("run (ret < 0)", ret < 0, error); io_loop_time_refresh(); @@ -1261,6 +1273,7 @@ static void test_data_timeout(void) struct smtp_submit_settings smtp_submit_set; test_client_defaults(&smtp_submit_set); + smtp_submit_set.submission_timeout = 2; test_begin("data timeout"); test_expect_errors(0); @@ -1423,7 +1436,7 @@ test_client_successful_delivery(const struct smtp_submit_settings *submit_set) /* send the message */ ret = test_client_smtp_send_simple_port(submit_set, - test_message1, bind_ports[0], 5, &error); + test_message1, bind_ports[0], &error); test_out_reason("run (ret > 0)", ret > 0, error); /* verify delivery */ @@ -1464,6 +1477,7 @@ test_client_parallel_delivery(const struct smtp_submit_settings *submit_set) ctx->count = 2; smtp_submit_set = *submit_set; + smtp_submit_set.submission_timeout = 5; /* submit 1 */ smtp_submit_set.submission_host = @@ -1474,7 +1488,7 @@ test_client_parallel_delivery(const struct smtp_submit_settings *submit_set) output = smtp_submit_send(smtp_submit1); o_stream_send_str(output, test_message1); - smtp_submit_run_async(smtp_submit1, 5, + smtp_submit_run_async(smtp_submit1, test_client_parallel_delivery_callback, ctx); /* submit 2 */ @@ -1486,7 +1500,7 @@ test_client_parallel_delivery(const struct smtp_submit_settings *submit_set) output = smtp_submit_send(smtp_submit2); o_stream_send_str(output, test_message2); - smtp_submit_run_async(smtp_submit2, 5, + smtp_submit_run_async(smtp_submit2, test_client_parallel_delivery_callback, ctx); io_loop_run(ioloop); @@ -1550,6 +1564,7 @@ test_client_failed_sendmail(const struct smtp_submit_settings *submit_set) smtp_submit_set = *submit_set; smtp_submit_set.sendmail_path = sendmail_path; + smtp_submit_set.submission_timeout = 5; smtp_submit = smtp_submit_init_simple(&smtp_submit_set, "sender@example.com"); @@ -1557,7 +1572,7 @@ test_client_failed_sendmail(const struct smtp_submit_settings *submit_set) output = smtp_submit_send(smtp_submit); o_stream_send_str(output, test_message1); - ret = smtp_submit_run_timeout(smtp_submit, 5, &error); + ret = smtp_submit_run(smtp_submit, &error); test_out_reason("run (ret < 0)", ret < 0, error); smtp_submit_deinit(&smtp_submit); @@ -1602,6 +1617,7 @@ test_client_successful_sendmail(const struct smtp_submit_settings *submit_set) smtp_submit_set = *submit_set; smtp_submit_set.sendmail_path = sendmail_path; + smtp_submit_set.submission_timeout = 5; smtp_submit = smtp_submit_init_simple(&smtp_submit_set, "sender@example.com"); @@ -1609,7 +1625,7 @@ test_client_successful_sendmail(const struct smtp_submit_settings *submit_set) output = smtp_submit_send(smtp_submit); o_stream_send_str(output, test_message1); - ret = smtp_submit_run_timeout(smtp_submit, 5, &error); + ret = smtp_submit_run(smtp_submit, &error); test_out_reason("run (ret > 0)", ret > 0, error); smtp_submit_deinit(&smtp_submit); @@ -1681,6 +1697,7 @@ test_client_parallel_sendmail(const struct smtp_submit_settings *submit_set) TEST_BIN_DIR"/sendmail-success.sh %s", msg_path2); smtp_submit_set = *submit_set; + smtp_submit_set.submission_timeout = 5; /* submit 1 */ smtp_submit_set.sendmail_path = sendmail_path1; @@ -1690,7 +1707,7 @@ test_client_parallel_sendmail(const struct smtp_submit_settings *submit_set) output = smtp_submit_send(smtp_submit1); o_stream_send_str(output, test_message1); - smtp_submit_run_async(smtp_submit1, 5, + smtp_submit_run_async(smtp_submit1, test_client_parallel_sendmail_callback, ctx); /* submit 2 */ @@ -1701,7 +1718,7 @@ test_client_parallel_sendmail(const struct smtp_submit_settings *submit_set) output = smtp_submit_send(smtp_submit2); o_stream_send_str(output, test_message2); - smtp_submit_run_async(smtp_submit2, 5, + smtp_submit_run_async(smtp_submit2, test_client_parallel_sendmail_callback, ctx); io_loop_run(ioloop); @@ -1779,7 +1796,7 @@ static void test_client_deinit(void) static int test_client_smtp_send_simple(const struct smtp_submit_settings *smtp_set, const char *message, const char *host, - unsigned int timeout_secs, const char **error_r) + const char **error_r) { struct smtp_submit_settings smtp_submit_set; struct smtp_submit *smtp_submit; @@ -1796,7 +1813,7 @@ test_client_smtp_send_simple(const struct smtp_submit_settings *smtp_set, output = smtp_submit_send(smtp_submit); o_stream_send_str(output, message); - ret = smtp_submit_run_timeout(smtp_submit, timeout_secs, error_r); + ret = smtp_submit_run(smtp_submit, error_r); smtp_submit_deinit(&smtp_submit); @@ -1804,14 +1821,15 @@ test_client_smtp_send_simple(const struct smtp_submit_settings *smtp_set, } static int -test_client_smtp_send_simple_port(const struct smtp_submit_settings *smtp_set, +test_client_smtp_send_simple_port( + const struct smtp_submit_settings *smtp_set, const char *message, unsigned int port, - unsigned int timeout_secs, const char **error_r) + const char **error_r) { const char *host = t_strdup_printf("127.0.0.1:%u", port); return test_client_smtp_send_simple(smtp_set, - message, host, timeout_secs, error_r); + message, host, error_r); } /* diff --git a/src/lmtp/commands.c b/src/lmtp/commands.c index 1eba17a216..b3838e4109 100644 --- a/src/lmtp/commands.c +++ b/src/lmtp/commands.c @@ -895,7 +895,6 @@ client_deliver(struct client *client, const struct mail_recipient *rcpt, dctx.session = session; dctx.pool = session->pool; dctx.set = lda_set; - dctx.timeout_secs = LDA_SUBMISSION_TIMEOUT_SECS; dctx.session_id = rcpt->session_id; dctx.src_mail = src_mail; dctx.src_envelope_sender = client->state.mail_from;