diff --git a/src/lib-sieve/util/mail-raw.c b/src/lib-sieve/util/mail-raw.c
index e42f5b3aa42d188ea1bc6ade27734bd193f111a7..4a53553f05cefc1c9b6556127660026b44773c07 100644
--- a/src/lib-sieve/util/mail-raw.c
+++ b/src/lib-sieve/util/mail-raw.c
@@ -190,6 +190,18 @@ static struct mail_raw *mail_raw_create
 	return mailr;
 }
 
+struct mail_raw *mail_raw_open_stream
+(struct mail_user *ruser, struct istream *input)
+{
+	struct mail_raw *mailr;
+
+	i_assert(input->seekable);
+	i_stream_set_name(input, "data");
+	mailr = mail_raw_create(ruser, input, NULL, NULL, (time_t)-1);
+
+	return mailr;
+}
+
 struct mail_raw *mail_raw_open_data
 (struct mail_user *ruser, string_t *mail_data)
 {
@@ -197,12 +209,10 @@ struct mail_raw *mail_raw_open_data
 	struct istream *input;
 
 	input = i_stream_create_from_data(str_data(mail_data), str_len(mail_data));
-	i_stream_set_name(input, "data");
 
-	mailr = mail_raw_create(ruser, input, NULL, NULL, (time_t)-1);
+	mailr = mail_raw_open_stream(ruser, input);
 
 	i_stream_unref(&input);
-
 	return mailr;
 }
 
diff --git a/src/lib-sieve/util/mail-raw.h b/src/lib-sieve/util/mail-raw.h
index 71e3fe0e2ab7d26183f46b82e2aedffdb6e81d5d..a942d06d1b56927773d21e8aff2a6c7e672a8e68 100644
--- a/src/lib-sieve/util/mail-raw.h
+++ b/src/lib-sieve/util/mail-raw.h
@@ -15,6 +15,8 @@ struct mail_raw {
 struct mail_user *mail_raw_user_create
 	(struct master_service *service, struct mail_user *mail_user);
 
+struct mail_raw *mail_raw_open_stream
+	(struct mail_user *ruser, struct istream *input);
 struct mail_raw *mail_raw_open_file
 	(struct mail_user *ruser, const char *path);
 struct mail_raw *mail_raw_open_data