diff --git a/exec/spamc.js b/exec/spamc.js
index a0812cfef21bd597839939a9947ee4eb0da3c13c..729ccc142519dcc28a429ca5a4a97de555109437 100644
--- a/exec/spamc.js
+++ b/exec/spamc.js
@@ -1,32 +1,69 @@
 // spamc.js
 
 // SpamAssasin client for Synchronet
-// For use as mailproc.ini script to check messages with spamd
+// For use as mailproc.ini script to check messages against a running/listening spamd
+
+// Example mailproc.ini entries:
+
+// [spamc.js -c]
 
 // $Id$
 
 load('sockdefs.js');
 load('salib.js');
 
-var spamd_address = '127.0.0.1';
-var spamd_tcp_port = 783;
-
 function main()
 {
+	var address = '127.0.0.1';
+	var tcp_port = 783;
+	var user;
+	var cmd = 'PROCESS';	// Default: process
+	var threshold;
+
 	// Process arguments:
 	for(i in argv) {
-		if(argv[i]=='-d' || argv[i]=='--dest')
-			spamd_address = argv[++i];
+		if(argv[i]=='-d' || argv[i]=='--dest')	
+			address = argv[++i]; // Note: only one address supported (unlike spamc)
 		else if(argv[i]=='-p' || argv[i]=='--port')
-			spamd_tcp_port = Number(argv[++i]);
+			tcp_port = Number(argv[++i]);
+		else if(argv[i]=='-u' || argv[i]=='--username')
+			user = argv[++i];
+		else if(argv[i]=='-T' || argv[i]=='--threshold')
+			threshold = parseFloat(argv[++i]);
+		else if(argv[i]=='-c' || argv[i]=='--check')
+			cmd = 'CHECK';
+		else if(argv[i]=='-y' || argv[i]=='--tests')
+			cmd = 'SYMBOLS';
+		else if(argv[i]=='-R' || argv[i]=='--full')
+			cmd = 'REPORT';
+		else if(argv[i]=='-r' || argv[i]=='--fullspam')
+			cmd = 'REPORT_IFSPAM';
 	}
 
-	var msg=new SPAMC_Message(message_text_filename, spamd_address, spamd_tcp_port);
+	var msg=new SPAMC_Message(message_text_filename, address, tcp_port, user);
 	if(msg === false)
 		return;
-	var ret=msg.check();
+	msg.debug=true;
+	log(LOG_INFO, "spamc: Executing command: " + cmd);
+	var ret=msg.DoCommand(cmd);
 	if(ret === false)
 		return;
+	if(ret.score!=undefined) {
+		log(LOG_INFO, "spamc: Score: " + ret.score + ' / ' + ret.threshold);
+		if(threshold && ret.score < threshold)
+			var ret=msg.DoCommand(cmd='PROCESS');
+	}
+	if(cmd == 'PROCESS') {
+		var msg_file = new File(message_text_filename);
+		if(!msg_file.open("w")) {
+			log(LOG_ERR,format("spamc: !ERROR %d opening message text file: %s"
+				,msg_file.error, message_text_filename));
+			return;
+		}
+		msg_file.write(ret.message);
+		msg_file.close();
+		return;
+	}
 	if(!ret.isSpam)
 		return;
 	var error_file = new File(processing_error_filename);
@@ -35,7 +72,8 @@ function main()
 			,error_file.error, processing_error_filename));
 		return;
 	}
-	error_file.writeln("SpamAssassin rejected your mail: " + ret.score + ' / ' + ret.threshold);
+	error_file.writeln("SpamAssassin rejected your mail: " + ret.score + ' / ' + ret.threshold
+		+ ' ' + ret.symbols);
 	error_file.close();
 }