我正在尝试在 node.js 中为 gmail 编写一个简单的 POP3 客户端。我最初写了一个,我在其中输入 POP3 命令并将它们发送到服务器,然后服务器响应。这很好用,因为我可以在输入下一个命令之前等待服务器的响应。
但我想进行自动对话,程序本身发送命令并等待自己的响应。简单地做:
stream.write('USER ***&@gmail.com');
stream.write('PASS *****');
stream.write('LIST');
不起作用,因为节点中流的异步性质。在发送下一条消息之前,我必须等待流的“数据”事件,否则,什么都不会发生。所以尝试了这样的:
var tls =require ('tls');
var stream = tls.connect(995,'pop.gmail.com', function() {
    console.log ('Conexion establecida');
});
stream.on('data', function(data)
{
    var str = data.toString();
    console.log(str.substr(0,14));
    if(str.substr(0,14)=="+OK Gpop ready")
    {
        console.log('Sending username...');
        process.nextTick(function() {
            stream.write ('USER ***********@gmail.com');
        });
    }
    if(str.substr(0,14)=="+OK send PASS")
    {
        console.log('Recieving list of email...');
        process.nextTick(function(){
            stream.write('PASS *********');
        });
    }
});
这个想法是“数据”事件侦听器根据收到的最后一个回复来处理下一个命令的发送。同样,单独执行 stream.write 似乎不起作用,因此我将 write() 调用包装在 process.nextTick() 调用中。似乎发送了 USER 命令,但从未发送过 PASS 命令。有人能告诉我为什么吗?或者是否有更有效的方法来做到这一点?感谢您提供任何信息。