diff --git a/src/lib-sieve/sieve-error.c b/src/lib-sieve/sieve-error.c
index 528954fd43475736ff90a914333a9444b4982851..578205c69157d69b413873e7f5aae550a9d50e80 100644
--- a/src/lib-sieve/sieve-error.c
+++ b/src/lib-sieve/sieve-error.c
@@ -188,6 +188,69 @@ struct sieve_error_handler *sieve_stderr_ehandler_create( void )
 	return ehandler;	
 }
 
+/* Output errors to a string buffer */
+
+struct sieve_strbuf_ehandler {
+    struct sieve_error_handler handler;
+
+	string_t *errors;
+};
+
+static void sieve_strbuf_verror
+(struct sieve_error_handler *ehandler, const char *location,
+    const char *fmt, va_list args)
+{
+    struct sieve_strbuf_ehandler *handler =
+        (struct sieve_strbuf_ehandler *) ehandler;
+
+	str_printfa(handler->errors, "%s: error: ", location);
+	str_vprintfa(handler->errors, fmt, args);
+	str_append(handler->errors, ".\n");
+}
+
+static void sieve_strbuf_vwarning
+(struct sieve_error_handler *ehandler, const char *location,
+    const char *fmt, va_list args)
+{
+    struct sieve_strbuf_ehandler *handler =
+        (struct sieve_strbuf_ehandler *) ehandler;
+
+	str_printfa(handler->errors, "%s: warning: ", location);
+    str_vprintfa(handler->errors, fmt, args);
+    str_append(handler->errors, ".\n");
+}
+
+static void sieve_strbuf_vinfo
+(struct sieve_error_handler *ehandler, const char *location,
+    const char *fmt, va_list args)
+{
+    struct sieve_strbuf_ehandler *handler =
+        (struct sieve_strbuf_ehandler *) ehandler;
+	
+	str_printfa(handler->errors, "%s: info: ", location);
+    str_vprintfa(handler->errors, fmt, args);
+    str_append(handler->errors, ".\n");
+}
+
+struct sieve_error_handler *sieve_strbuf_ehandler_create
+(string_t *strbuf)
+{
+    pool_t pool;
+    struct sieve_strbuf_ehandler *ehandler;
+
+    pool = pool_alloconly_create("strbuf_error_handler", 256);
+    ehandler = p_new(pool, struct sieve_strbuf_ehandler, 1);
+	ehandler->errors = strbuf;
+    ehandler->handler.pool = pool;
+    ehandler->handler.errors = 0;
+    ehandler->handler.warnings = 0;
+    ehandler->handler.verror = sieve_strbuf_verror;
+    ehandler->handler.vwarning = sieve_strbuf_vwarning;
+    ehandler->handler.vinfo = sieve_strbuf_vinfo;
+
+    return &(ehandler->handler);
+}
+
 /* Output errors to a log file */
 
 struct sieve_logfile_ehandler {
diff --git a/src/lib-sieve/sieve-error.h b/src/lib-sieve/sieve-error.h
index 00d395f84b10fbf5872f7ff4cbb8fae3ee6dfdc8..3b389cb8a5c4543c9e0aa16f22bc12a84979ccf1 100644
--- a/src/lib-sieve/sieve-error.h
+++ b/src/lib-sieve/sieve-error.h
@@ -102,6 +102,7 @@ void sieve_error_handler_free(struct sieve_error_handler **ehandler);
 /* Error handlers */
 
 struct sieve_error_handler *sieve_stderr_ehandler_create(void);
+struct sieve_error_handler *sieve_strbuf_ehandler_create(string_t *strbuf);
 struct sieve_error_handler *sieve_logfile_ehandler_create(const char *logfile);  
 
 #endif /* __SIEVE_ERROR_H */