diff --git a/src/lib-sieve/sieve-address-parts.c b/src/lib-sieve/sieve-address-parts.c
index 6c4af73de9d5e54072c58c67e241e402d322dea6..297b23bd2f05c3e3dfd949f02f380b9b28b9eff1 100644
--- a/src/lib-sieve/sieve-address-parts.c
+++ b/src/lib-sieve/sieve-address-parts.c
@@ -371,6 +371,14 @@ static const char *addrp_all_extract_from
 	const char *local_part = address->local_part;
 	const char *domain = address->domain;
 
+	if ( domain == NULL ) {
+		return local_part;
+	}
+
+	if ( local_part == NULL ) {
+		return NULL;
+	}
+
 	return t_strconcat(local_part, "@", domain, NULL);
 }
 
diff --git a/src/lib-sieve/sieve-address.c b/src/lib-sieve/sieve-address.c
index fd02b3a095772466a2c3a4afdb665c8ba7235a13..4121ac3b713cb76ed11bf197b362ffb47bada4cf 100644
--- a/src/lib-sieve/sieve-address.c
+++ b/src/lib-sieve/sieve-address.c
@@ -692,14 +692,14 @@ static int path_parse_mailbox(struct sieve_envelope_address_parser *parser)
 
 	/* Mailbox = Local-part "@" Domain */
 	
-	if ( (ret=path_parse_local_part(parser)) <= 0 )
+	if ( (ret=path_parse_local_part(parser)) < 0
+		|| (ret=path_skip_white_space(parser)) < 0 )
 		return -1;
 
-	if ( (ret=path_skip_white_space(parser)) <= 0 )
-		return -1;
+	if ( ret == 0 || *parser->data != '@' ) {
+		return ret;
+	}
 
-	if ( *parser->data != '@' )
-		return -1;
 	parser->data++;
 
 	if ( (ret=path_skip_white_space(parser)) <= 0 )
diff --git a/tests/extensions/envelope.svtest b/tests/extensions/envelope.svtest
index 30c4e60bf2b46bee6ce656fa53a2facf3b992633..356ac8e7709bd6719b78bf204e7cee81bef886ac 100644
--- a/tests/extensions/envelope.svtest
+++ b/tests/extensions/envelope.svtest
@@ -67,10 +67,10 @@ test "Envelope - from empty" {
 test "Envelope - invalid paths" {
     /* Return_path: "hutsefluts" */
 
-	test_set "envelope.from" "hutsefluts";
-	test_set "envelope.to" "knurft";
+	test_set "envelope.from" "hutsefluts@";
+	test_set "envelope.to" "knurft@";
 
-	if not envelope :all :is "from" "hutsefluts" {
+	if not envelope :all :is "from" "hutsefluts@" {
 		test_fail ":all address part mangled syntactically incorrect reverse path";
 	}
 
@@ -82,7 +82,7 @@ test "Envelope - invalid paths" {
         test_fail ":domain address part matched syntactically incorrect reverse path";
     }
 
-	if not envelope :all :is "to" "knurft" {
+	if not envelope :all :is "to" "knurft@" {
 		test_fail ":all address part mangled syntactically incorrect forward path";
 	}
 
@@ -216,3 +216,30 @@ test "Envelope - source route errors" {
 		test_fail ":all address part mangled syntactically incorrect path";
 	}
 }
+
+test "Envelope - local part only" {
+	test_set "envelope.to" "<MAILER-DAEMON>";
+	if not envelope :is "to" "MAILER-DAEMON" {
+		test_fail "failed to parse local_part only path";
+	}
+
+	test_set "envelope.to" "MAILER-DAEMON@";
+	if envelope :is "to" "MAILER-DAEMON" {
+		test_fail "parsing syntactically incorrect path with missing domain";
+	}
+
+	test_set "envelope.to" "<MAILER-DAEMON>";
+	if not envelope :is "to" "MAILER-DAEMON" {
+        test_fail "failed to parse local_part only path with angle brackets";
+    }
+
+	test_set "envelope.to" "<MAILER-DAEMON  >";
+	if not envelope :is "to" "MAILER-DAEMON" {
+        test_fail "failed to parse local_part only path with angle brackets and whitespace";
+    }
+
+	test_set "envelope.to" "   MAILER-DAEMON   ";
+	if not envelope :is "to" "MAILER-DAEMON" {
+        test_fail "failed to parse local_part only path with whitespace";
+    }
+}