与gmail和node.js的POP3对话

时间:2013-10-20 12:24:38

标签: javascript node.js pop3 gmail-pop

我正在尝试在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 *********');
        });
    }
});

这个想法是'data'事件监听器根据收到的最后一个回复处理下一个命令的发送。再一次,单独执行stream.write似乎不起作用,所以我在process.nextTick()调用中包装了write()调用。似乎发送了USER命令,但从未发送过PASS命令。有人可以告诉我为什么吗?或者,如果有更有效的方法来做到这一点?感谢您提供任何信息。

2 个答案:

答案 0 :(得分:1)

您的命令正在被发送,但它们未被识别,因为它们缺少换行符,表示命令的结束。在命令末尾添加换行符应该可以正常工作。

此外,您可以通过实现如下队列来简化命令:

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());
    }
});

答案 1 :(得分:0)

没有看到所有代码,回答有点困难。

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

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

带&符“&”

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