diff --git a/Makefile.am b/Makefile.am
index 294e2326a29dbfccb69eb61994b9992e294177c5..4da531e0658618a4aa2d853c9f8981d215e9ac45 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -84,6 +84,7 @@ test_cases = \
 	tests/extensions/enotify/execute.svtest \
 	tests/extensions/enotify/mailto.svtest \
 	tests/extensions/environment/basic.svtest \
+	tests/extensions/environment/rfc.svtest \
 	tests/multiscript/basic.svtest
 
 if HAVE_DOVECOT_LIBS
diff --git a/src/lib-sieve/plugins/environment/ext-environment-common.c b/src/lib-sieve/plugins/environment/ext-environment-common.c
index eed230f30bb7fe031264c846ef6e1bc8da3026ad..9797169053b6f05badb5266fc734f2927deeef8b 100644
--- a/src/lib-sieve/plugins/environment/ext-environment-common.c
+++ b/src/lib-sieve/plugins/environment/ext-environment-common.c
@@ -100,7 +100,7 @@ const struct sieve_environment_item domain_env_item = {
 
 const char *envit_host_get_value(const struct sieve_script_env *senv)
 {
-	return senv->hostname;
+	return senv->hostname != NULL ? senv->hostname : "";
 }
 
 const struct sieve_environment_item host_env_item = {
diff --git a/src/lib-sieve/plugins/environment/tst-environment.c b/src/lib-sieve/plugins/environment/tst-environment.c
index 2050262511d47a8bb0637c2c659de05b9d51d60d..0ae60630ca5fad112b457a6101ecd88228bd537c 100644
--- a/src/lib-sieve/plugins/environment/tst-environment.c
+++ b/src/lib-sieve/plugins/environment/tst-environment.c
@@ -200,18 +200,21 @@ static int tst_environment_operation_execute
 
 	env_item = ext_environment_item_get_value(str_c(name), renv->scriptenv);
 
-	mctx = sieve_match_begin(renv->interp, mtch, cmp, NULL, key_list); 	
-
-	if ( (mret=sieve_match_value(mctx, env_item, strlen(env_item))) < 0 ) {
-		result = FALSE;
-	} else {
-		matched = ( mret > 0 );				
+	if ( env_item != NULL ) {
+		mctx = sieve_match_begin(renv->interp, mtch, cmp, NULL, key_list); 	
+
+		if ( (mret=sieve_match_value(mctx, strlen(env_item) == 0 ? NULL : env_item, 
+			strlen(env_item))) < 0 ) {
+			result = FALSE;
+		} else {
+			matched = ( mret > 0 );				
+		}
+
+		if ( (mret=sieve_match_end(mctx)) < 0 )
+			result = FALSE;
+		else
+			matched = ( mret > 0 || matched );
 	}
-
-	if ( (mret=sieve_match_end(mctx)) < 0 )
-		result = FALSE;
-	else
-		matched = ( mret > 0 || matched ); 	
 	
 	if ( result ) {
 		sieve_interpreter_set_test_result(renv->interp, matched);