Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript POP3与gmail和node.js的对话_Javascript_Node.js_Pop3_Gmail Pop - Fatal编程技术网

Javascript POP3与gmail和node.js的对话

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'); 不工作,因为节点中的流具有异步性质。在发送

我正试图在node.js中为gmail编写一个简单的POP3客户端。我最初编写了一个程序,在其中输入POP3命令,它们被发送到服务器,服务器响应。这很好,因为我可以在输入下一个命令之前等待服务器的响应

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

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…),谢谢!就像你说的,我错过了新行字符。现在它开始工作了。