需求:
REDIS-> READ DATA -> NODEJS -> SENDNG MAIL VIA SOAP/SMTP ->CALLBACK (WRITE FLAG INTO REDIS )
废话一两句:
最初我的个人方案是使用PYTHON, 并且单个PYTHON DEMO 进程发送1000封大概再20秒左右,但公司原因~只好改用NODEJS,NODEJS 发送反而要慢很多,1000封在1分钟左右,打开10个任务后,速度基本持平,但是CPU会上升很多
经过多次改进,目前已用于生产,并且子线程不挂,父线程退出后,子线程自动推出,成功率 100%~~
SMTP 代码:
PS : 部分错误处理,以及敏感信息已经去掉..
但任可以正常使用以下
var config = require("../config/singleMailing").config; var net = require("net"); var redisClient = require('redis').createClient(config.redis.port,config.redis.host); function Mail (){ this.param = { Helo : { cmd: 'Helo roban\r\n', next: 'Auth' }, Auth:{ cmd:'Auth login\r\n', next:'AuthName' }, AuthName:{ cmd: new Buffer(config.smtp.UID).toString("base64") + '\r\n', next:'AuthPWD' }, AuthPWD:{ cmd: new Buffer(config.smtp.PWD).toString("base64")+"\r\n", next:'MailFrom' }, MailFrom: { cmd: "mail from :"+config.smtp.SENDER+"\r\n", next : 'RcptTo' }, RcptTo:{ cmd : -110, next:'DataBegin' }, DataBegin:{ cmd: "Data\r\n", next: 'DataTransfer' }, DataTransfer:{ cmd:-122, next:'End' }, End:{ cmd : "done", next:undefined } } }; Mail.prototype.openSocket = function(responseData){ if(arguments[1] != undefined ) { this.fnDone = arguments[1]; } this.socket = net.createConnection(config.smtp.PORT,config.smtp.HOST); this.socket.setNoDelay(true); var self = this; this.socket.once('data',function(stream){ return self.callBack(stream,'Helo', responseData); }); }; Mail.prototype.callBack = function (stream,next,data){ var self = this; var cmd = this.param[next].cmd; var next = this.param[next].next; if(cmd == -110) { cmd = "Rcpt to: <"+data.email+">\r\n"; } if(cmd == - 122) { cmd ="From: no-reply@support.51fanli.com\r\n"+ "Subject: "+data.title+"\r\n"+ "To: "+data.email+"\r\n"+ "Content-type: text/html\r\n"+ "Content-transfer-encoding: 8BIT\r\n\r\n"+data.content; cmd += "\r\n.\r\n"; } if(cmd != 'done') { this.socket.write( cmd ); } if(next != undefined ) { this.socket.once('data',function(stream){ return self.callBack(stream,next, data); }); }else{ var code = (stream.toString().match(/^\d+/g)||[""])[0]; var key = config.keys.RESULT_KEY; var prefix = 'succ'; if (code != 250 ) { prefix = 'fail'; } var id = data.id; var result = id + '_' + prefix; redisClient.rpush(key,result,function(err,data){ console.log('['+prefix+']: key ' +key + ' has been pushed with smtp via ['+id+'] '); self.socket.end(); self.fnDone(); }); } }; exports = module.exports = Mail;
SOAP发送量: 177万 SMTP: 53万...
监控数据: