我正在尝试在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命令。有人可以告诉我为什么吗?还是有更有效的方法来做到这一点?感谢您提供任何信息。
最佳答案
您的命令正在发送,但是由于缺少换行符(表示命令的末尾)而无法被识别。在命令末尾添加换行符应该可以使其正常工作。
此外,您可以通过实现如下队列来简化命令:
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());
}
});
关于javascript - gmail和node.js的POP3对话,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19477271/