diff --git a/src/lib-sieve/cmd-redirect.c b/src/lib-sieve/cmd-redirect.c
index 25d2c162728d4960f3edad0bce6446c8749608de..6a3b0a46ed8beb5dc5952cea3d82cff247ac406f 100644
--- a/src/lib-sieve/cmd-redirect.c
+++ b/src/lib-sieve/cmd-redirect.c
@@ -570,8 +570,13 @@ act_redirect_execute(const struct sieve_action_exec_env *aenv,
 	trans->msg_id = msgdata->id;
 	if (trans->msg_id == NULL) {
 		pool_t pool = sieve_result_pool(aenv->result);
-		trans->msg_id = trans->new_msg_id =
-			p_strdup(pool, sieve_message_get_new_id(svinst));
+		const char *msg_id;
+		if (mail_get_message_id_no_validation(msgdata->mail, &msg_id) > 0)
+			trans->msg_id = p_strdup(pool, msg_id);
+		else {
+			msg_id = sieve_message_get_new_id(svinst);
+			trans->msg_id = trans->new_msg_id = p_strdup(pool, msg_id);
+		}
 	}
 
 	/* Create ID for duplicate database lookup */