diff --git a/src/lib-sieve/ext-reject.c b/src/lib-sieve/ext-reject.c
index 22dd0c410dfb141fd49a2ec6c0c646182fdb60bc..9519f4118dae397ff4d442695e0adeed02dcfdae 100644
--- a/src/lib-sieve/ext-reject.c
+++ b/src/lib-sieve/ext-reject.c
@@ -488,6 +488,12 @@ static int act_reject_commit
 	sender = sieve_message_get_sender(aenv->msgctx);
 	recipient = sieve_message_get_orig_recipient(aenv->msgctx);
 
+	if ((aenv->flags & SIEVE_EXECUTE_FLAG_SKIP_RESPONSES) != 0) {
+		sieve_result_global_log(aenv,
+			"not sending reject message (skipped)");
+		return SIEVE_EXEC_OK;
+	}
+
 	if ( smtp_address_isnull(recipient) ) {
 		sieve_result_global_warning(aenv,
 			"reject action aborted: envelope recipient is <>");
diff --git a/src/lib-sieve/plugins/vacation/cmd-vacation.c b/src/lib-sieve/plugins/vacation/cmd-vacation.c
index 501296ce8ea615fa1be6d6d74c03c1ea00783d05..048bc61b3df8f0b8c3289c77abe00fa5881a0cd0 100644
--- a/src/lib-sieve/plugins/vacation/cmd-vacation.c
+++ b/src/lib-sieve/plugins/vacation/cmd-vacation.c
@@ -1127,6 +1127,12 @@ static int act_vacation_commit
 	const char *const *hdsp, *const *headers;
 	int ret;
 
+	if ((aenv->flags & SIEVE_EXECUTE_FLAG_SKIP_RESPONSES) != 0) {
+		sieve_result_global_log(aenv,
+			"not sending vacation reply (skipped)");
+		return SIEVE_EXEC_OK;
+	}
+
 	sender = sieve_message_get_sender(aenv->msgctx);
 	recipient = sieve_message_get_final_recipient(aenv->msgctx);
 
diff --git a/src/lib-sieve/sieve-types.h b/src/lib-sieve/sieve-types.h
index b5cbbf4d1041fee991706e277b4d117b549d7c2f..05514b9472d2aa853d7815502426e38ee8adbd6c 100644
--- a/src/lib-sieve/sieve-types.h
+++ b/src/lib-sieve/sieve-types.h
@@ -155,7 +155,9 @@ enum sieve_execute_flags {
 	/* Do not execute (implicit keep) at the end */
 	SIEVE_EXECUTE_FLAG_DEFER_KEEP = (1<<1),
 	/* There is no envelope */
-	SIEVE_EXECUTE_FLAG_NO_ENVELOPE = (1<<2)
+	SIEVE_EXECUTE_FLAG_NO_ENVELOPE = (1<<2),
+	/* Skip sending responses */
+	SIEVE_EXECUTE_FLAG_SKIP_RESPONSES = (1<<3),
 };
 
 /*