Javascript POP3与gmail和node.js的对话
我正试图在node.js中为gmail编写一个简单的POP3客户端。我最初编写了一个程序,在其中输入POP3命令,它们被发送到服务器,服务器响应。这很好,因为我可以在输入下一个命令之前等待服务器的响应 但是我想进行一次自动对话,程序本身发送命令并等待自己的响应。简单地做:Javascript POP3与gmail和node.js的对话,javascript,node.js,pop3,gmail-pop,Javascript,Node.js,Pop3,Gmail Pop,我正试图在node.js中为gmail编写一个简单的POP3客户端。我最初编写了一个程序,在其中输入POP3命令,它们被发送到服务器,服务器响应。这很好,因为我可以在输入下一个命令之前等待服务器的响应 但是我想进行一次自动对话,程序本身发送命令并等待自己的响应。简单地做: stream.write('USER ***&@gmail.com'); stream.write('PASS *****'); stream.write('LIST'); 不工作,因为节点中的流具有异步性质。在发送
stream.write('USER ***&@gmail.com');
stream.write('PASS *****');
stream.write('LIST');
不工作,因为节点中的流具有异步性质。在发送下一条消息之前,我必须等待流的“data”事件,否则,什么也不会发生。所以试着这样做:
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命令。有人能告诉我为什么吗?或者有没有更有效的方法?谢谢您提供的任何信息。没有看到所有代码,回答起来有点困难 但是我注意到在你的第一个例子中,你写 stream.write('USER*&@gmail.com') 用符号“&”
但是,在第二个示例中没有符号-这可能是问题的根源吗?您的命令正在发送,但是无法识别,因为它们缺少换行符,这表示命令结束。在命令末尾添加换行符应该可以使其正常工作 此外,您可以通过实现如下队列来简化命令:
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());
}
});
仅供参考:
substr
第二个参数是长度。您只有13个
字符,但正在比较14个
。谢谢您,但即使修复了它,仍然没有发送任何内容。我尝试了它,并在发送用户
后返回-ERR bad command
。在我的情况下,我从服务器得到的唯一回复是原始的“+OK Gpop已准备好接收请求消息”。发送用户后,不会发生任何其他情况,甚至不会出现错误消息。注意,我在两台不同的机器上,在不同的地方,用相同的结果尝试了这段代码。这绝对不是防火墙问题。此外,我还创建了一个客户端,您可以在控制台中输入命令,然后它发送命令。这在两个位置都适用。符号是一个打字错误。我没有在我的真实例子中使用它。这似乎不起作用。我在数据事件的开头添加了console.log(data.toString())
,以查看发生了什么。只收到第一条消息(+OK Gpop ready…),谢谢!就像你说的,我错过了新行字符。现在它开始工作了。