与Gmail和node.js的POP3对话

我正在尝试在node.js中为gmail编写一个简单的POP3客户端。 我最初写了一个inputPOP3命令的地方,他们被发送到服务器,服务器响应。 这工作正常,因为我可以在input下一个命令之前等待服务器的响应。

但是我想做一个自动对话,程序本身发送命令并等待自己的回应。 简单地做:

stream.write('USER ***&@gmail.com'); stream.write('PASS *****'); stream.write('LIST'); 

不起作用,因为节点中的stream的asynchronous性质。 在发送下一条消息之前,我必须等待stream的“数据”事件,否则根本没有任何事情发生。 所以试过这样的:

 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似乎没有工作,所以我在process.nextTick()调用中包装了write()调用。 看起来,USER命令被发送,但从来没有PASS命令。 有人能告诉我为什么吗? 或者如果有更有效的方法来做到这一点? 感谢您的任何信息。

你的命令正在发送,但是他们没有被识别,因为他们缺less换行符,这表示命令的结束。 添加一个换行符到你的命令结束应该让它工作。

另外,你可以通过像这样实现一个队列来简化你的命令:

 var tls = require('tls'); var commands = []; commands.push('USER ***********@gmail.com\n'); commands.push('PASS *********\n'); var stream = tls.connect(995, 'pop.gmail.com', function () { console.log('Conexion establecida'); }); stream.on('data', function (data) { if (data.toString().indexOf('OK') > -1 && commands.length) { stream.write(commands.shift()); } }); 

没有看到所有的代码,这是有点难以回答。

但是我注意到,在你的第一个例子中,你写了

stream.write('USER * &@gmail.com');

与&符号“&”

然而,在第二个例子中没有&符号 – 这可能是问题的根源吗?

Interesting Posts