基本的smtp服务器在node.js

我试图在node.js中编写一个愚蠢的(braindead)smtp服务器,作为testing其他应用程序的存根服务器。

我有一套基本的回应,而且它在telnet很好用。

然而,当我的PHP / Codeigniter应用程序使用它,它运行得如此缓慢,以至于无用,我偶尔会fwirite() broken socket错误。

  • 该应用程序运行良好使用真正的SMTP服务器
  • 使用telnet时,node.js应用程序运行良好

我是否缺less一个关键或明显的步骤? 有什么关于套接字或系统指针资源,我不正确的处理?

这是非常快速和肮脏的,但这是重点:

 var net = require('net'); net.createServer(function (socket) { var mode = 'nodata'; socket.on('data', function(data) { var data_string = data.toString(); console.log(data_string); if (mode == 'nodata') { if (data_string.substring(0, 4) == 'EHLO') { socket.write('hello ' + data_string.substring(5, data_string.length - 1) + '\r\n'); } else if (data_string.substring(0, 10) == 'AUTH LOGIN') { socket.write('250 ok\r\n'); } else if (data_string.substring(0, 10) == 'MAIL FROM:') { socket.write('250 ok\r\n'); } else if (data_string.substring(0, 8) == 'RCPT TO:') { to = data_string.substring(8, data_string.length - 1); socket.write('250 ok its for ' + to + '\r\n'); } else if (data_string.substring(0, 4) == 'DATA') { socket.write('354 ok send it\r\n'); mode = 'data'; } else if (data_string.substring(0, 4) == 'QUIT') { socket.write('221 Goodbye\r\n'); socket.end(); return; } } else if (mode == 'data') { if (data_string.substring(0, 1) == '.') { socket.write('250 message queued\r\n'); mode = 'nodata'; } } }); }).listen(3434); 

你错过了我所期待的大部分linebreak逻辑:不知道这是否会导致你正在观察的行为问题,但是你可能想要使用一些更全面的function( 比如这个,也许这样 ),以防你有一些最后一种情况是你的实现没有真正处理好。 除了telnet之外,它还可以与任何其他邮件客户端一起工作吗