rcpt->index = index;
rcpt->rcpt_cmd = NULL;
}
+
+struct lmtp_recipient *
+lmtp_recipient_find_duplicate(struct lmtp_recipient *rcpt,
+ struct smtp_server_transaction *trans)
+{
+ struct smtp_server_recipient *drcpt;
+ struct lmtp_recipient *dup_rcpt;
+
+ i_assert(rcpt->rcpt != NULL);
+ drcpt = smtp_server_transaction_find_rcpt_duplicate(trans, rcpt->rcpt);
+ if (drcpt == NULL)
+ return NULL;
+
+ dup_rcpt = drcpt->context;
+ i_assert(dup_rcpt->rcpt == drcpt);
+ i_assert(dup_rcpt->type == rcpt->type);
+
+ return dup_rcpt;
+}
+
struct mail_storage_service_user *service_user;
struct anvil_query *anvil_query;
+ struct lmtp_local_recipient *duplicate;
+
bool anvil_connect_sent:1;
};
static void lmtp_local_rcpt_finished(
struct smtp_server_cmd_ctx *cmd,
- struct smtp_server_transaction *trans ATTR_UNUSED,
+ struct smtp_server_transaction *trans,
struct smtp_server_recipient *trcpt,
unsigned int index)
{
lmtp_recipient_finish(&rcpt->rcpt, trcpt, index);
+ /* resolve duplicate recipient */
+ rcpt->duplicate = (struct lmtp_local_recipient *)
+ lmtp_recipient_find_duplicate(&rcpt->rcpt, trans);
+ i_assert(rcpt->duplicate == NULL || rcpt->duplicate->duplicate == NULL);
+
/* add to local recipients */
array_append(&client->local->rcpt_to, &rcpt, 1);
}
for (i = 0; i < count; i++) {
struct lmtp_local_recipient *rcpt = rcpts[i];
+ if (rcpt->duplicate != NULL) {
+ /* don't deliver more than once to the same recipient */
+ smtp_server_reply_submit_duplicate(cmd,
+ rcpt->rcpt.index, rcpt->duplicate->rcpt.index);
+ continue;
+ }
+
ret = lmtp_local_deliver(local, cmd,
trans, rcpt, src_mail, session);
i_set_failure_prefix("lmtp(%s): ", my_pid);