node-spamd
Version:
SpamAssassin message evaluator for node.js
130 lines (93 loc) • 2.94 kB
JavaScript
var net = require('net');
var Spamd = (function(){
var _headers = '';
var _sender = 'root';
var _receiver = 'root';
var _host = 'localhost';
var _port = 783;
var _instance = null;
var _evaluate = {};
var _fn = null;
var Constructor = function(sender, receiver, host, port) {
if(typeof sender !== 'undefined' &&
typeof receiver !== 'undefined'){
_sender = sender;
_receiver = receiver;
if(typeof host !== 'undefined'){
_host = host;
}
if(typeof port !== 'undefined'){
_port = port;
}
_headers += 'Message-ID: <4F452339.1040102@'+ _host +'>\r\n';
_headers += 'Date: ' + new Date().toUTCString() + '\r\n';
_headers += 'From: ' + sender + '\r\n';
_headers += 'MIME-Version: 1.0\r\n';
_headers += 'To: ' + receiver + '\r\n';
}else{
throw this.INVALID_RECEIVER;
}
};
var end = function() {
_fn(_evaluate);
};
var error = function(error) {
_fn(_evaluate, error);
_instance.end();
};
var timeout = function() {
_fn(_evaluate, {code: 'ECONNTIMEOUT'});
_instance.end();
};
var data = function (line) {
line = line.toString().split('\r\n');
for ( var l in line ){
var matches;
if (matches = line[l].match(/Spam: (True|False) ; (-?\d+\.\d) \/ (-?\d+\.\d)/)) {
_evaluate.spam = matches[1] == 'True' ? true : false;
_evaluate.evaluation = matches[2];
_evaluate.allowed = matches[3];
}else if(line[l].indexOf(',') >= 0){
_evaluate.rules = line[l].split(',');
}
}
};
var connected = function(){
_instance.write("SYMBOLS SPAMC/1.3\r\n", function () {
_instance.write("User: " + _receiver + "\r\n\r\n", function () {
_instance.write("X-Envelope-From: " + _sender + "\r\n", function ()
{
_instance.write(_headers);
_instance.end('\r\n');
});
});
});
};
Constructor.prototype = {
constructor: Spamd,
INVALID_RECEIVER: 'Invalid sender and receiver',
NO_CALLBACK: 'Evaluate method requires a callback',
evaluate: function(subject, body, fn){
_headers += 'Subject: ' + subject + '\r\n';
_headers += 'Content-Type: text/plain; charset=UTF-8; format=flowed\r\n';
_headers += 'Content-Transfer-Encoding: quoted-printable\r\n';
_headers += '\r\n' + body;
if(typeof fn !== 'undefined'){
_fn = fn;
_instance = net.connect(_port, _host, connected);
_instance.on('end', end);
_instance.on('error', error);
_instance.on('timeout', timeout);
_instance.on('data', data);
}else{
throw this.NO_CALLBACK;
}
},
reset: function(){
_evaluate = {};
_fn = null;
}
};
return Constructor;
}());
module.exports = Spamd;