diff --git a/src/lib-sieve/plugins/duplicate/tst-duplicate.c b/src/lib-sieve/plugins/duplicate/tst-duplicate.c
index db3756b3646baa51bc3e20f8dfbd3afe79037f82..2a000de2bd960eff01a6b5aa9282730ba223a4a4 100644
--- a/src/lib-sieve/plugins/duplicate/tst-duplicate.c
+++ b/src/lib-sieve/plugins/duplicate/tst-duplicate.c
@@ -403,8 +403,7 @@ tst_duplicate_operation_execute(const struct sieve_runtime_env *renv,
 		val_len = str_len(uniqueid);
 	} else {
 		if (header == NULL) {
-			ret = mail_get_first_header_utf8(mail, "Message-ID",
-							 &val);
+			ret = mail_get_message_id(mail, &val);
 			if (ret < 0) {
 				return sieve_runtime_mail_error(
 					renv, mail, "duplicate test: "
diff --git a/src/plugins/imap-filter-sieve/imap-filter-sieve.c b/src/plugins/imap-filter-sieve/imap-filter-sieve.c
index 5f6b29adc3c19f83db7fc63db3c4e6a785f07b28..97e8faa07ae1e30b7592195f639217e117dda5cd 100644
--- a/src/plugins/imap-filter-sieve/imap-filter-sieve.c
+++ b/src/plugins/imap-filter-sieve/imap-filter-sieve.c
@@ -954,7 +954,7 @@ imap_sieve_filter_get_msgdata(struct imap_filter_sieve_context *sctx,
 	msgdata_r->envelope.mail_from = mail_from;
 	msgdata_r->envelope.rcpt_to = rcpt_to;
 	msgdata_r->auth_user = user->username;
-	(void)mail_get_first_header(mail, "Message-ID", &msgdata_r->id);
+	(void)mail_get_message_id(mail, &msgdata_r->id);
 }
 
 int imap_sieve_filter_run_mail(struct imap_filter_sieve_context *sctx,
diff --git a/src/plugins/imapsieve/imap-sieve.c b/src/plugins/imapsieve/imap-sieve.c
index e701c63c3dd1ebca6d2379174c1b8ae4c8ab24e6..a3ab53fd404f3e8d20e9fa002fb5478a6b3f7f55 100644
--- a/src/plugins/imapsieve/imap-sieve.c
+++ b/src/plugins/imapsieve/imap-sieve.c
@@ -819,8 +819,7 @@ int imap_sieve_run_mail(struct imap_sieve_run *isrun, struct mail *mail,
 		i_zero(&msgdata);
 		msgdata.mail = mail;
 		msgdata.auth_user = user->username;
-		(void)mail_get_first_header(msgdata.mail, "Message-ID",
-					    &msgdata.id);
+		(void)mail_get_message_id(msgdata.mail, &msgdata.id);
 
 		/* Compose script execution environment */
 
diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c
index 979976f0b6b28f1b43dbb87f384ff6d57ba8b657..2f51cfc1d7348f9f8aed9c759bd1426e575eec49 100644
--- a/src/plugins/lda-sieve/lda-sieve-plugin.c
+++ b/src/plugins/lda-sieve/lda-sieve-plugin.c
@@ -944,7 +944,7 @@ lda_sieve_execute(struct lda_sieve_run_context *srctx,
 	msgdata.envelope.mail_params = &mdctx->mail_params;
 	msgdata.envelope.rcpt_to = mdctx->rcpt_to;
 	msgdata.envelope.rcpt_params = &mdctx->rcpt_params;
-	(void)mail_get_first_header(msgdata.mail, "Message-ID", &msgdata.id);
+	(void)mail_get_message_id(msgdata.mail, &msgdata.id);
 
 	srctx->msgdata = &msgdata;
 
diff --git a/src/sieve-tools/sieve-filter.c b/src/sieve-tools/sieve-filter.c
index 6ef92100f5c57677aaf95437ade3e800c8f56f29..d71f4bcad9ef80feac3dce05668bbd1b534eed8f 100644
--- a/src/sieve-tools/sieve-filter.c
+++ b/src/sieve-tools/sieve-filter.c
@@ -108,7 +108,7 @@ static int filter_message(struct sieve_filter_context *sfctx, struct mail *mail)
 	i_zero(&msgdata);
 	msgdata.mail = mail;
 	msgdata.auth_user = senv->user->username;
-	(void)mail_get_first_header(mail, "Message-ID", &msgdata.id);
+	(void)mail_get_message_id(mail, &msgdata.id);
 	senv->script_context = &msgdata;
 
 	sieve_tool_get_envelope_data(&msgdata, mail, NULL, NULL, NULL);
diff --git a/src/sieve-tools/sieve-test.c b/src/sieve-tools/sieve-test.c
index 92793920be95da74e5773769be6c756a8fa819cf..b623b67145a5547d04e114c4279a5bc2e00f32fa 100644
--- a/src/sieve-tools/sieve-test.c
+++ b/src/sieve-tools/sieve-test.c
@@ -310,7 +310,7 @@ int main(int argc, char **argv)
 		i_zero(&msgdata);
 		msgdata.mail = mail;
 		msgdata.auth_user = sieve_tool_get_username(sieve_tool);
-		(void)mail_get_first_header(mail, "Message-ID", &msgdata.id);
+		(void)mail_get_message_id(mail, &msgdata.id);
 
 		sieve_tool_get_envelope_data(&msgdata, mail,
 					     mail_from, rcpt_to, final_rcpt_to);
diff --git a/src/testsuite/testsuite-message.c b/src/testsuite/testsuite-message.c
index 4f5752b3e52c2d9b0cee12e56b954646b837825c..c04ab34455a00fe85fed021882ebeae0bc6a8aa4 100644
--- a/src/testsuite/testsuite-message.c
+++ b/src/testsuite/testsuite-message.c
@@ -42,6 +42,7 @@ static struct smtp_address *testsuite_env_orig_rcpt_to = NULL;
 static char *testsuite_env_auth = NULL;
 
 static pool_t testsuite_msg_pool;
+static char *testsuite_msg_id = NULL;
 
 static const struct smtp_address *
 testsuite_message_get_address(struct mail *mail, const char *header)
@@ -62,6 +63,7 @@ testsuite_message_get_address(struct mail *mail, const char *header)
 static void testsuite_message_set_data(struct mail *mail)
 {
 	const struct smtp_address *recipient = NULL, *sender = NULL;
+	const char *msg_id;
 
 	static const struct smtp_address default_recipient = {
 		.localpart = "recipient",
@@ -76,6 +78,7 @@ static void testsuite_message_set_data(struct mail *mail)
 	i_free(testsuite_env_rcpt_to);
 	i_free(testsuite_env_orig_rcpt_to);
 	i_free(testsuite_env_auth);
+	i_free(testsuite_msg_id);
 
 	/*
 	 * Collect necessary message data
@@ -101,18 +104,20 @@ static void testsuite_message_set_data(struct mail *mail)
 	testsuite_env_rcpt_to = smtp_address_clone(default_pool, recipient);
 	testsuite_env_orig_rcpt_to = smtp_address_clone(default_pool, recipient);
 
+	(void)mail_get_message_id(mail, &msg_id);
+	testsuite_msg_id = i_strdup(msg_id);
+
 	i_zero(&testsuite_msgdata);
 	testsuite_msgdata.mail = mail;
 	testsuite_msgdata.auth_user = sieve_tool_get_username(sieve_tool);
 	testsuite_msgdata.envelope.mail_from = testsuite_env_mail_from;
 	testsuite_msgdata.envelope.rcpt_to = testsuite_env_rcpt_to;
+	testsuite_msgdata.id = testsuite_msg_id;
 
 	i_zero(&testsuite_rcpt_params);
 	testsuite_rcpt_params.orcpt.addr = testsuite_env_orig_rcpt_to;
 
 	testsuite_msgdata.envelope.rcpt_params = &testsuite_rcpt_params;
-
-	(void)mail_get_first_header(mail, "Message-ID", &testsuite_msgdata.id);
 }
 
 void testsuite_message_init(void)
@@ -160,6 +165,7 @@ void testsuite_message_deinit(void)
 	i_free(testsuite_env_orig_rcpt_to);
 	i_free(testsuite_env_auth);
 	pool_unref(&testsuite_msg_pool);
+	i_free(testsuite_msg_id);
 }
 
 void testsuite_envelope_set_sender_address(const struct sieve_runtime_env *renv,