2

他のアプリケーションをテストするためのスタブ サーバーとして機能するように、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);
4

1 に答える 1

0

私が期待する改行ロジックの多くが欠けています:それがあなたが観察している動作の問題を引き起こすかどうかはわかりませんが、いくつかある場合に備えて、もう少し完全な機能を備えたもの(おそらくこのようなもの)を使用することをお勧めます実装が実際には正しく処理されていないというエッジケース。telnet 以外のメールクライアントで動作しますか?

于 2012-04-17T05:54:56.200 に答える