【问题标题】:basic smtp server in node.jsnode.js 中的基本 smtp 服务器
【发布时间】:2012-04-28 09:48:00
【问题描述】:

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

我有一组基本的响应,它与telnet 配合得很好。

但是,当我的 php/Codeigniter 应用程序使用它时,它运行得非常缓慢以至于毫无用处,并且我偶尔会收到 fwirite() broken socket 错误。

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

我是否遗漏了关键或明显的步骤?是否存在我处理不当的套接字或系统指针资源?

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

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);

【问题讨论】:

    标签: php sockets node.js tcp


    【解决方案1】:

    您缺少我所期望的大部分换行逻辑:不确定这是否会导致您观察到的行为问题,但您可能希望使用功能更全的东西 (like this one, perhaps),以防万一一些边缘情况,您的实现并没有真正处理正确。除了 telnet 之外,它还能与任何其他邮件客户端一起使用吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 2017-01-30
      • 1970-01-01
      • 2016-08-04
      • 2014-02-23
      • 2017-02-19
      • 1970-01-01
      相关资源
      最近更新 更多