client->disconnected = TRUE;
}
+void client_rcpt_anvil_disconnect(const struct mail_recipient *rcpt)
+{
+ const struct mail_storage_service_input *input;
+
+ if (!rcpt->anvil_connect_sent)
+ return;
+
+ input = mail_storage_service_user_get_input(rcpt->service_user);
+ master_service_anvil_send(master_service, t_strconcat(
+ "DISCONNECT\t", my_pid, "\t", master_service_get_name(master_service),
+ "/", input->username, "\n", NULL));
+}
+
void client_state_reset(struct client *client, const char *state_name)
{
struct mail_recipient *const *rcptp;
array_foreach_modifiable(&client->state.rcpt_to, rcptp) {
if ((*rcptp)->anvil_query != NULL)
anvil_client_query_abort(anvil, &(*rcptp)->anvil_query);
+ client_rcpt_anvil_disconnect(*rcptp);
mail_storage_service_user_free(&(*rcptp)->service_user);
}
}
struct lmtp_recipient_params params;
struct anvil_query *anvil_query;
+ bool anvil_connect_sent;
struct mail_storage_service_user *service_user;
};
void client_disconnect(struct client *client, const char *prefix,
const char *reason);
void client_io_reset(struct client *client);
+void client_rcpt_anvil_disconnect(const struct mail_recipient *rcpt);
void client_state_reset(struct client *client, const char *state_name);
void client_state_set(struct client *client, const char *name, const char *args);
const char *client_remote_id(struct client *client);
{
struct mail_recipient *rcpt = context;
struct client *client = rcpt->client;
+ const struct mail_storage_service_input *input;
unsigned int parallel_count;
i_assert(rcpt->anvil_query != NULL);
if (parallel_count < client->lmtp_set->lmtp_user_concurrency_limit) {
client_send_line(client, "250 2.1.5 OK");
+
+ rcpt->anvil_connect_sent = TRUE;
+ input = mail_storage_service_user_get_input(rcpt->service_user);
+ master_service_anvil_send(master_service, t_strconcat(
+ "CONNECT\t", my_pid, "\t", master_service_get_name(master_service),
+ "/", input->username, "\n", NULL));
array_append(&client->state.rcpt_to, &rcpt, 1);
} else {
client_send_line(client, ERRSTR_TEMP_USERDB_FAIL_PREFIX
dctx.save_dest_mail = array_count(&client->state.rcpt_to) > 1 &&
client->state.first_saved_mail == NULL;
- if (client->lmtp_set->lmtp_user_concurrency_limit > 0) {
- master_service_anvil_send(master_service, t_strconcat(
- "CONNECT\t", my_pid, "\t", master_service_get_name(master_service),
- "/", username, "\n", NULL));
- }
if (mail_deliver(&dctx, &storage) == 0) {
if (dctx.dest_mail != NULL) {
i_assert(client->state.first_saved_mail == NULL);
rcpt->address);
ret = -1;
}
- if (client->lmtp_set->lmtp_user_concurrency_limit > 0) {
- master_service_anvil_send(master_service, t_strconcat(
- "DISCONNECT\t", my_pid, "\t", master_service_get_name(master_service),
- "/", username, "\n", NULL));
- }
+ client_rcpt_anvil_disconnect(rcpt);
return ret;
}