diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c
index ddbaf266e50914a15c3d8d58614490426629044f..bded5d827881f649305734b76ee02d86765effea 100644
--- a/src/lib-sieve/sieve.c
+++ b/src/lib-sieve/sieve.c
@@ -543,6 +543,14 @@ int sieve_test
  * Script execution
  */
 
+int sieve_script_env_init(struct sieve_script_env *senv,
+	struct mail_user *user, const char **error_r ATTR_UNUSED)
+{
+	i_zero(senv);
+	senv->user = user;
+	return 0;
+}
+
 int sieve_execute
 (struct sieve_binary *sbin, const struct sieve_message_data *msgdata,
 	const struct sieve_script_env *senv,
diff --git a/src/lib-sieve/sieve.h b/src/lib-sieve/sieve.h
index 54b1ac24477a70c688db02f4186fd150c8bc975b..8f68d2e5de92c301a39ff8b54eee556ffa1e463e 100644
--- a/src/lib-sieve/sieve.h
+++ b/src/lib-sieve/sieve.h
@@ -164,6 +164,13 @@ int sieve_test
  * Script execution
  */
 
+/* sieve_script_env_init:
+ *
+ *   Initializes the scirpt environment from the given mail_user.
+ */
+int sieve_script_env_init(struct sieve_script_env *senv,
+	struct mail_user *user, const char **error_r);
+
 /* sieve_execute:
  *
  *   Executes the binary, including the result.
diff --git a/src/plugins/imapsieve/imap-sieve.c b/src/plugins/imapsieve/imap-sieve.c
index 61cdd15ef55cb6b370843d6a3852bc7e4f8709a5..712d08ec1f842ce7dc82314ed2e7412c702d98cf 100644
--- a/src/plugins/imapsieve/imap-sieve.c
+++ b/src/plugins/imapsieve/imap-sieve.c
@@ -713,6 +713,7 @@ int imap_sieve_run_mail
 	struct imap_sieve_context context;
 	struct sieve_trace_config trace_config;
 	struct sieve_trace_log *trace_log;
+	const char *error;
 	int ret;
 
 	i_zero(&context);
@@ -744,26 +745,32 @@ int imap_sieve_run_mail
 
 		/* Compose script execution environment */
 
-		i_zero(&scriptenv);
-		i_zero(&estatus);
-		scriptenv.default_mailbox = mailbox_get_vname(mail->box);
-		scriptenv.user = user;
-		scriptenv.smtp_start = imap_sieve_smtp_start;
-		scriptenv.smtp_add_rcpt = imap_sieve_smtp_add_rcpt;
-		scriptenv.smtp_send = imap_sieve_smtp_send;
-		scriptenv.smtp_abort = imap_sieve_smtp_abort;
-		scriptenv.smtp_finish = imap_sieve_smtp_finish;
-		scriptenv.duplicate_mark = imap_sieve_duplicate_mark;
-		scriptenv.duplicate_check = imap_sieve_duplicate_check;
-		scriptenv.duplicate_flush = imap_sieve_duplicate_flush;
-		scriptenv.exec_status = &estatus;
-		scriptenv.trace_log = trace_log;
-		scriptenv.trace_config = trace_config;
-		scriptenv.script_context = (void *)&context;
-
-		/* Execute script(s) */
-
-		ret = imap_sieve_run_scripts(isrun, &msgdata, &scriptenv);
+		if (sieve_script_env_init(&scriptenv, user, &error) < 0) {
+			sieve_sys_error(svinst,
+				"Failed to initialize script execution: %s",
+				error);
+			ret = -1;
+		} else {
+			scriptenv.default_mailbox = mailbox_get_vname(mail->box);
+			scriptenv.smtp_start = imap_sieve_smtp_start;
+			scriptenv.smtp_add_rcpt = imap_sieve_smtp_add_rcpt;
+			scriptenv.smtp_send = imap_sieve_smtp_send;
+			scriptenv.smtp_abort = imap_sieve_smtp_abort;
+			scriptenv.smtp_finish = imap_sieve_smtp_finish;
+			scriptenv.duplicate_mark = imap_sieve_duplicate_mark;
+			scriptenv.duplicate_check = imap_sieve_duplicate_check;
+			scriptenv.duplicate_flush = imap_sieve_duplicate_flush;
+			scriptenv.trace_log = trace_log;
+			scriptenv.trace_config = trace_config;
+			scriptenv.script_context = (void *)&context;
+
+			i_zero(&estatus);
+			scriptenv.exec_status = &estatus;
+
+			/* Execute script(s) */
+
+			ret = imap_sieve_run_scripts(isrun, &msgdata, &scriptenv);
+		}
 	} T_END;
 
 	if ( trace_log != NULL )
diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c
index 2d5a32570f24538bd56d3664b3759e9982baebe0..836010658bf89711bba87758367bfa7fc645d53f 100644
--- a/src/plugins/lda-sieve/lda-sieve-plugin.c
+++ b/src/plugins/lda-sieve/lda-sieve-plugin.c
@@ -800,6 +800,7 @@ static int lda_sieve_execute
 	struct sieve_trace_config trace_config;
 	struct sieve_trace_log *trace_log;
 	bool debug = mdctx->rcpt_user->mail_debug;
+	const char *error;
 	int ret;
 
 	/* Check whether there are any scripts to execute at all */
@@ -855,13 +856,17 @@ static int lda_sieve_execute
 
 	/* Compose script execution environment */
 
-	i_zero(&scriptenv);
-	i_zero(&estatus);
+	if (sieve_script_env_init(&scriptenv, mdctx->rcpt_user, &error) < 0) {
+		sieve_sys_error(svinst,
+			"Failed to initialize script execution: %s", error);
+		if ( trace_log != NULL )
+			sieve_trace_log_free(&trace_log);
+		return -1;
+	}
 
 	scriptenv.default_mailbox = mdctx->rcpt_default_mailbox;
 	scriptenv.mailbox_autocreate = mdctx->set->lda_mailbox_autocreate;
 	scriptenv.mailbox_autosubscribe = mdctx->set->lda_mailbox_autosubscribe;
-	scriptenv.user = mdctx->rcpt_user;
 	scriptenv.smtp_start = lda_sieve_smtp_start;
 	scriptenv.smtp_add_rcpt = lda_sieve_smtp_add_rcpt;
 	scriptenv.smtp_send = lda_sieve_smtp_send;
@@ -874,6 +879,8 @@ static int lda_sieve_execute
 	scriptenv.script_context = (void *) mdctx;
 	scriptenv.trace_log = trace_log;
 	scriptenv.trace_config = trace_config;
+
+	i_zero(&estatus);
 	scriptenv.exec_status = &estatus;
 
 	srctx->scriptenv = &scriptenv;
diff --git a/src/sieve-tools/sieve-filter.c b/src/sieve-tools/sieve-filter.c
index a3a9015087a8db930b7a3bf996229eab89f67a07..30e86523c063d3e148e4dce127df8a7d67396509 100644
--- a/src/sieve-tools/sieve-filter.c
+++ b/src/sieve-tools/sieve-filter.c
@@ -366,6 +366,7 @@ int main(int argc, char **argv)
 	struct mailbox *src_box = NULL, *move_box = NULL;
 	enum mailbox_flags open_flags = MAILBOX_FLAG_IGNORE_ACLS;
 	enum mail_error error;
+	const char *errstr;
 	int c;
 
 	sieve_tool = sieve_tool_init("sieve-filter", &argc, &argv,
@@ -541,10 +542,10 @@ int main(int argc, char **argv)
 	}
 
 	/* Compose script environment */
-	i_zero(&scriptenv);
+	if (sieve_script_env_init(&scriptenv, mail_user, &errstr) < 0)
+		i_fatal("Failed to initialize script execution: %s", errstr);
 	scriptenv.mailbox_autocreate = FALSE;
 	scriptenv.default_mailbox = dst_mailbox;
-	scriptenv.user = mail_user;
 
 	/* Compose filter context */
 	i_zero(&sfdata);
diff --git a/src/sieve-tools/sieve-test.c b/src/sieve-tools/sieve-test.c
index de0496b86418b70f68c507dfa3e1c6381029a23a..81b31afa0927de5cc9483b06bb1d0ccc120c68e0 100644
--- a/src/sieve-tools/sieve-test.c
+++ b/src/sieve-tools/sieve-test.c
@@ -316,9 +316,11 @@ int main(int argc, char **argv)
 		}
 
 		/* Compose script environment */
-		i_zero(&scriptenv);
+		if (sieve_script_env_init(&scriptenv,
+			sieve_tool_get_mail_user(sieve_tool), &errstr) < 0)
+			i_fatal("Failed to initialize script execution: %s", errstr);
+
 		scriptenv.default_mailbox = mailbox;
-		scriptenv.user = sieve_tool_get_mail_user(sieve_tool);
 		scriptenv.smtp_start = sieve_smtp_start;
 		scriptenv.smtp_add_rcpt = sieve_smtp_add_rcpt;
 		scriptenv.smtp_send = sieve_smtp_send;
@@ -328,6 +330,8 @@ int main(int argc, char **argv)
 		scriptenv.duplicate_check = duplicate_check;
 		scriptenv.trace_log = trace_log;
 		scriptenv.trace_config = trace_config;
+
+		i_zero(&estatus);
 		scriptenv.exec_status = &estatus;
 
 		/* Run the test */
diff --git a/src/testsuite/testsuite-script.c b/src/testsuite/testsuite-script.c
index 6d3a1cc67f770f7ff99c13151615cb51e0318869..b7d5347070e7cb430fcef6f65850d532d8055059 100644
--- a/src/testsuite/testsuite-script.c
+++ b/src/testsuite/testsuite-script.c
@@ -88,11 +88,13 @@ bool testsuite_script_is_subtest(const struct sieve_runtime_env *renv)
 
 bool testsuite_script_run(const struct sieve_runtime_env *renv)
 {
+	const struct sieve_script_env *senv = renv->scriptenv;
 	struct testsuite_interpreter_context *ictx =
 		testsuite_interpreter_context_get(renv->interp, testsuite_ext);
 	struct sieve_script_env scriptenv;
 	struct sieve_result *result;
 	struct sieve_interpreter *interp;
+	const char *error;
 	int ret;
 
 	i_assert(ictx != NULL);
@@ -106,7 +108,12 @@ bool testsuite_script_run(const struct sieve_runtime_env *renv)
 	testsuite_log_clear_messages();
 
 	/* Compose script execution environment */
-	i_zero(&scriptenv);
+	if (sieve_script_env_init(&scriptenv, senv->user, &error) < 0) {
+		sieve_runtime_error(renv, NULL,
+			"testsuite: failed to initialize script execution: %s",
+			error);
+		return FALSE;
+	}
 	scriptenv.default_mailbox = "INBOX";
 	scriptenv.smtp_start = NULL;
 	scriptenv.smtp_add_rcpt = NULL;
@@ -114,7 +121,6 @@ bool testsuite_script_run(const struct sieve_runtime_env *renv)
 	scriptenv.smtp_finish = NULL;
 	scriptenv.duplicate_mark = NULL;
 	scriptenv.duplicate_check = NULL;
-	scriptenv.user = renv->scriptenv->user;
 	scriptenv.trace_log = renv->scriptenv->trace_log;
 	scriptenv.trace_config = renv->scriptenv->trace_config;
 
@@ -168,9 +174,11 @@ bool testsuite_script_multiscript
 (const struct sieve_runtime_env *renv, ARRAY_TYPE (const_string) *scriptfiles)
 {
 	struct sieve_instance *svinst = testsuite_sieve_instance;
+	const struct sieve_script_env *senv = renv->scriptenv;
 	struct sieve_script_env scriptenv;
 	struct sieve_multiscript *mscript;
 	const char *const *scripts;
+	const char *error;
 	unsigned int count, i;
 	bool more = TRUE;
 	bool result = TRUE;
@@ -178,7 +186,12 @@ bool testsuite_script_multiscript
 	testsuite_log_clear_messages();
 
 	/* Compose script execution environment */
-	i_zero(&scriptenv);
+	if (sieve_script_env_init(&scriptenv, senv->user, &error) < 0) {
+		sieve_runtime_error(renv, NULL,
+			"testsuite: failed to initialize script execution: %s",
+			error);
+		return FALSE;
+	}
 	scriptenv.default_mailbox = "INBOX";
 	scriptenv.smtp_start = NULL;
 	scriptenv.smtp_add_rcpt = NULL;
@@ -186,7 +199,6 @@ bool testsuite_script_multiscript
 	scriptenv.smtp_finish = NULL;
 	scriptenv.duplicate_mark = NULL;
 	scriptenv.duplicate_check = NULL;
-	scriptenv.user = renv->scriptenv->user;
 	scriptenv.trace_log = renv->scriptenv->trace_log;
 	scriptenv.trace_config = renv->scriptenv->trace_config;
 
diff --git a/src/testsuite/testsuite.c b/src/testsuite/testsuite.c
index 212d2b390287a90d063c2964af85879234eba509..5cfc31e6162732f88df60e22a27f6fd974cd68e5 100644
--- a/src/testsuite/testsuite.c
+++ b/src/testsuite/testsuite.c
@@ -182,8 +182,10 @@ int main(int argc, char **argv)
 		testsuite_mailstore_init();
 		testsuite_message_init();
 
-		i_zero(&scriptenv);
-		scriptenv.user = testsuite_mailstore_get_user();
+		if (sieve_script_env_init(&scriptenv,
+			testsuite_mailstore_get_user(), &error) < 0)
+			i_fatal("Failed to initialize script execution: %s", error);
+
 		scriptenv.default_mailbox = "INBOX";
 		scriptenv.smtp_start = testsuite_smtp_start;
 		scriptenv.smtp_add_rcpt = testsuite_smtp_add_rcpt;