使用NODEJS通过SMTP以及SOAP发送邮件.

需求:

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万...


使用NODEJS通过SMTP以及SOAP发送邮件._第1张图片


监控数据:


使用NODEJS通过SMTP以及SOAP发送邮件._第2张图片

你可能感兴趣的:(python,nodejs,SOAP,mail,smtp)