diff --git a/src/sbbs3/mailsrvr.c b/src/sbbs3/mailsrvr.c
index 19690c2f1beb5a6fe94f9f22bfbe76890d174d69..00d61f4a1709047f31948850e7cedded826c3dc6 100644
--- a/src/sbbs3/mailsrvr.c
+++ b/src/sbbs3/mailsrvr.c
@@ -110,6 +110,7 @@ struct mailproc {
 	BOOL		native;
 	BOOL		ignore_on_error;	/* Ignore mail message if cmdline fails */
 	BOOL		disabled;
+	uint8_t*	ar;
 } *mailproc_list;
 
 typedef struct {
@@ -1592,7 +1593,8 @@ js_mailproc(SOCKET sock, client_t* client, user_t* user
 			,char* cmdline
 			,char* msgtxt_fname, char* newtxt_fname, char* logtxt_fname
 			,char* rcptlst_fname, char* proc_err_fname
-			,char* sender, char* sender_addr, char* reverse_path)
+			,char* sender, char* sender_addr, char* reverse_path
+			,int* result)
 {
 	char*		p;
 	char		fname[MAX_PATH+1];
@@ -1623,6 +1625,7 @@ js_mailproc(SOCKET sock, client_t* client, user_t* user
 			sprintf(path,"%s%s",scfg.exec_dir,fname);
 	}
 
+	*result = 0;
 	do {
 
 		lprintf(LOG_DEBUG,"%04d JavaScript: Creating runtime: %lu bytes\n"
@@ -1739,11 +1742,19 @@ js_mailproc(SOCKET sock, client_t* client, user_t* user
 
 		success=JS_ExecuteScript(js_cx, js_glob, js_script, &rval);
 
+		JS_ReportPendingException(js_cx);
+
 		js_EvalOnExit(js_cx, js_glob, &js_branch);
 
+		JS_GetProperty(js_cx, js_glob, "exit_code", &rval);
+
 	} while(0);
 
 	if(js_cx!=NULL) {
+
+		if(rval!=JSVAL_VOID && JSVAL_IS_NUMBER(rval))
+			JS_ValueToInt32(js_cx,rval,result);
+
 		JS_ENDREQUEST(js_cx);
 		JS_DestroyContext(js_cx);
 	}
@@ -2350,11 +2361,7 @@ static void smtp_thread(void* arg)
 
 					for(i=0;i<mailproc_count;i++) {
 
-						if(mailproc_list[i].disabled)
-							continue;
-
-						/* This processor is for specific recipients only and did not match */
-						if(strListCount(mailproc_list[i].to) && !mailproc_match[i])
+						if(!mailproc_match[i])
 							continue;
 
 						if(!mailproc_list[i].passthru)
@@ -2382,9 +2389,9 @@ static void smtp_thread(void* arg)
 							if(!js_mailproc(socket, &client, &relay_user, str /* cmdline */
 								,msgtxt_fname, newtxt_fname, logtxt_fname
 								,rcptlst_fname, proc_err_fname
-								,sender, sender_addr, reverse_path)) {
-								lprintf(LOG_NOTICE,"%04d !SMTP JavaScript (%s) failed"
-									,socket, str);
+								,sender, sender_addr, reverse_path, &j) || j!=0) {
+								lprintf(LOG_NOTICE,"%04d !SMTP JavaScript mailproc command (%s) failed (returned: %d)"
+									,socket, str, j);
 								if(mailproc_list[i].ignore_on_error) {
 									lprintf(LOG_WARNING,"%04d !SMTP IGNORED MAIL due to mail processor (%s) failure"
 										,socket, str);
@@ -3307,6 +3314,8 @@ static void smtp_thread(void* arg)
 			for(i=0;i<mailproc_count;i++) {
 				if(mailproc_list[i].disabled)
 					continue;
+				if(!chk_ar(&scfg,mailproc_list[i].ar,&relay_user))
+					continue;
 				if(mailproc_list[i].to!=NULL) {
 					for(j=0;mailproc_list[i].to[j]!=NULL;j++) {
 						if(stricmp(p,mailproc_list[i].to[j])==0) {
@@ -3317,7 +3326,8 @@ static void smtp_thread(void* arg)
 					}
 					if(mailproc_list[i].to[j]!=NULL)
 						break;
-				}
+				} else
+					mailproc_match[i]=TRUE;
 			}
 			/* destined for an external mail processor */
 			if(i<mailproc_count) {
@@ -4221,8 +4231,11 @@ static void cleanup(int code)
 	semfile_list_free(&shutdown_semfiles);
 
 	if(mailproc_list!=NULL) {
-		for(i=0;i<mailproc_count;i++)
+		for(i=0;i<mailproc_count;i++) {
+			if(mailproc_list[i].ar!=NULL && mailproc_list[i].ar!=nular)
+				free(mailproc_list[i].ar);
 			strListFree(&mailproc_list[i].to);
+		}
 		FREE_AND_NULL(mailproc_list);
 	}
 
@@ -4422,6 +4435,7 @@ void DLLCALL mail_server(void* arg)
 			sec_list = iniReadSectionList(fp,/* prefix */NULL);
 			if((mailproc_count=strListCount(sec_list))!=0
 				&& (mailproc_list=malloc(mailproc_count*sizeof(struct mailproc)))!=NULL) {
+				char buf[INI_MAX_VALUE_LEN+1];
 				for(i=0;i<mailproc_count;i++) {
 					memset(&mailproc_list[i],0,sizeof(struct mailproc));
 					SAFECOPY(mailproc_list[i].cmdline,sec_list[i]);
@@ -4435,6 +4449,8 @@ void DLLCALL mail_server(void* arg)
 						iniReadBool(fp,sec_list[i],"disabled",FALSE);
 					mailproc_list[i].ignore_on_error = 
 						iniReadBool(fp,sec_list[i],"IgnoreOnError",FALSE);
+					mailproc_list[i].ar = 
+						arstr(NULL,iniReadString(fp,sec_list[i],"AccessRequirements","",buf),&scfg);
 				}
 			}
 			iniFreeStringList(sec_list);
diff --git a/src/sbbs3/mailsrvr.dsp b/src/sbbs3/mailsrvr.dsp
index 175e46efcdb6b9d603ccd7d64bf1e79a6f988241..8caba88a073707694fa2aad05984bcfa1fa45a21 100644
--- a/src/sbbs3/mailsrvr.dsp
+++ b/src/sbbs3/mailsrvr.dsp
@@ -90,6 +90,10 @@ LINK32=link.exe
 # Name "mailsrvr - Win32 Debug"
 # Begin Source File
 
+SOURCE=.\ars.c
+# End Source File
+# Begin Source File
+
 SOURCE=.\base64.c
 # End Source File
 # Begin Source File
diff --git a/src/sbbs3/objects.mk b/src/sbbs3/objects.mk
index 7fba0c22efa1056ae08590cb44ac7513e39d5ace..afdfd0eeef7fb7a2b5b0f7393c3825ca4bd43585 100644
--- a/src/sbbs3/objects.mk
+++ b/src/sbbs3/objects.mk
@@ -121,6 +121,7 @@ FTP_OBJS	= $(MTOBJODIR)$(DIRSEP)ftpsrvr$(OFILE) \
 MAIL_OBJS	= $(MTOBJODIR)$(DIRSEP)mailsrvr$(OFILE) \
 			$(MTOBJODIR)$(DIRSEP)mxlookup$(OFILE) \
  		  	$(MTOBJODIR)$(DIRSEP)mime$(OFILE) \
+ 		  	$(MTOBJODIR)$(DIRSEP)ars$(OFILE) \
 			$(MTOBJODIR)$(DIRSEP)base64$(OFILE)
 
 # Must add new additions to MONO_OBJS too!