diff --git a/src/lib-sieve/sieve-script.c b/src/lib-sieve/sieve-script.c
index caa23f2db3ad7fd848cc396398487e1e70af310d..e280d8ea8f99ada7d172ec7312a213a24425f026 100644
--- a/src/lib-sieve/sieve-script.c
+++ b/src/lib-sieve/sieve-script.c
@@ -161,14 +161,22 @@ struct sieve_script *sieve_script_init
 		/* First obtain stat data from the system */
 		
 		if ( (ret=lstat(path, &st)) < 0 ) {
-			if ( errno == ENOENT ) {
+			switch ( errno ) {
+			case ENOENT:
 				if ( exists_r == NULL ) 
 					sieve_error(ehandler, basename, "sieve script does not exist");
 				else
 					*exists_r = FALSE;
-			} else
+				break;
+			case EACCES:
+				sieve_critical(ehandler, basename, 
+					"failed to stat sieve script: %s",
+					eacces_error_get("lstat", path));
+				break;
+            default:
 				sieve_critical(ehandler, basename, 
 					"failed to stat sieve script: lstat(%s) failed: %m", path);
+			}
 
 			script = NULL;
 			ret = 1;
@@ -180,14 +188,23 @@ struct sieve_script *sieve_script_init
 			/* Only create/init the object if it stat()s without problems */
 			if (S_ISLNK(st.st_mode)) {
 				if ( (ret=stat(path, &st)) < 0 ) { 
-					if ( errno == ENOENT ) {
+					switch ( errno ) {
+					case ENOENT:
 						if ( exists_r == NULL )
 							sieve_error(ehandler, basename, "sieve script does not exist");
 						else
 							*exists_r = FALSE;
-					} else
+						break;
+					case EACCES:
+						sieve_critical(ehandler, basename, 
+							"failed to stat sieve script: %s",
+							eacces_error_get("stat", path));
+						break;
+            		default:
 						sieve_critical(ehandler, basename, 
 							"failed to stat sieve script: stat(%s) failed: %m", path);
+						break;
+					}
 
 					script = NULL;	
 					ret = 1;
@@ -338,20 +355,24 @@ struct istream *sieve_script_open
 		*deleted_r = FALSE;
 
 	if ( (fd=open(script->path, O_RDONLY)) < 0 ) {
-		if ( errno == ENOENT ) {
+		switch( errno ) {
+		case ENOENT:
 			if ( deleted_r == NULL ) 
 				/* Not supposed to occur, create() does stat already */
 				sieve_error(script->ehandler, script->basename, 
 					"sieve script does not exist");
 			else 
 				*deleted_r = TRUE;
-		} else if ( errno == EACCES ) {
+			break;
+		case EACCES:
 			sieve_critical(script->ehandler, script->path,
 				"failed to open sieve script: %s",
 				eacces_error_get("open", script->path));
-		} else {
+			break;
+		default:
 			sieve_critical(script->ehandler, script->path, 
 				"failed to open sieve script: open(%s) failed: %m", script->path);
+			break;
 		}
 		return NULL;
 	}	
diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c
index 9b3ca195c8ca0080abc68d4253370cdc8638821c..cc5c52456509a8a291dc1a067cd7662e79db96a9 100644
--- a/src/lib-sieve/sieve.c
+++ b/src/lib-sieve/sieve.c
@@ -5,6 +5,7 @@
 #include "str.h"
 #include "istream.h"
 #include "buffer.h"
+#include "eacces-error.h"
 
 #include "sieve-limits.h"
 #include "sieve-settings.h"
@@ -605,14 +606,28 @@ struct sieve_directory *sieve_directory_open(const char *path)
 	struct stat st;
 
 	/* Specified path can either be a regular file or a directory */
-	if ( stat(path, &st) != 0 )
+	if ( stat(path, &st) != 0 ) {
+		switch ( errno ) {
+		case ENOENT:
+			break;
+		case EACCES:
+			sieve_sys_error("failed to open sieve dir: %s",
+				eacces_error_get("stat", path));
+			break;
+		default:
+			sieve_sys_error("failed to open sieve dir: "
+				"stat(%s) failed: %m", path);
+			break;
+		}
 		return NULL;
+	}
 
 	if ( S_ISDIR(st.st_mode) ) {
 	 	
 		/* Open the directory */
 		if ( (dirp = opendir(path)) == NULL ) {
-			sieve_sys_error("opendir(%s) failed: %m", path);
+			sieve_sys_error("failed to open sieve dir: "
+				"opendir(%s) failed: %m", path);
 			return NULL;		
 		}
 	
@@ -642,7 +657,8 @@ const char *sieve_directory_get_scriptfile(struct sieve_directory *sdir)
 			errno = 0;
 			if ( (dp = readdir(sdir->dirp)) == NULL ) {
 				if ( errno != 0 ) { 
-					sieve_sys_error("readdir(%s) failed: %m", sdir->path);
+					sieve_sys_error("failed to read sieve dir: "
+						"readdir(%s) failed: %m", sdir->path);
 					continue;
 				} else 
 					return NULL;
@@ -673,7 +689,8 @@ void sieve_directory_close(struct sieve_directory **sdir)
 {
 	/* Close the directory */
 	if ( (*sdir)->dirp != NULL && closedir((*sdir)->dirp) < 0 ) 
-		sieve_sys_error("closedir(%s) failed: %m", (*sdir)->path);
+		sieve_sys_error("failed to close sieve dir: "
+			"closedir(%s) failed: %m", (*sdir)->path);
 		
 	*sdir = NULL;
 }
diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c
index e056a1527ab60c45af64e0163be9d0d8cdcbfb72..0ddb0dd603dadbf84a40a14951a1cb7283a80085 100644
--- a/src/plugins/lda-sieve/lda-sieve-plugin.c
+++ b/src/plugins/lda-sieve/lda-sieve-plugin.c
@@ -4,6 +4,7 @@
 #include "lib.h"
 #include "array.h"
 #include "home-expand.h"
+#include "eacces-error.h"
 #include "mail-storage.h"
 #include "mail-deliver.h"
 #include "mail-user.h"
@@ -659,17 +660,27 @@ static int lda_sieve_deliver_mail
 
 		if ( user_script != NULL && stat(user_script, &st) < 0 ) {
 
-			if (errno != ENOENT)
-				sieve_sys_error("stat(%s) failed: %m "
-					"(using global script path in stead)", user_script);
-			else if ( debug )
-				sieve_sys_debug("local script path %s doesn't exist "
-					"(using global script path in stead)", user_script);
+			switch ( errno ) {
+			case ENOENT:
+				if (getenv("DEBUG") != NULL)
+					sieve_sys_info("user's script path %s doesn't exist "
+						"(using global script path in stead)", user_script);
+				break;
+			case EACCES:
+				sieve_sys_error("failed to stat user's sieve script: %s "
+					"(using global script path in stead)",
+					eacces_error_get("stat", user_script));
+				break;
+			default:
+				sieve_sys_error("failed to stat user's sieve script: "
+					"stat(%s) failed: %m (using global script path in stead)",
+					user_script);
+				break;
+			}
 
 			user_script = NULL;
 		}
 
-
 		if ( debug ) {
 			const char *script = user_script == NULL ? default_script : user_script;