15

我使用 node-imap 从 gmail 帐户检索了新电子邮件。如何让节点工作人员等待任何新电子邮件并立即采取行动而不是 cron 作业?

我不想每隔几分钟就一直点击页面,这有点违背了节点 js 的目的。

到目前为止,这是我的代码

var Imap = require('imap'),
inspect = require('util').inspect;

var imap = new Imap({
    user: 'yyyy@gmail.com',
    password: 'xxxx',
    host: 'imap.gmail.com',
    port: 993,
    tls: true,
    tlsOptions: { rejectUnauthorized: false }
});

var fs = require('fs'), fileStream;

function openInbox(cb) {
    imap.openBox('INBOX', false, cb);
}

imap.once('ready', function() {
    openInbox(function(err, box) {
        if (err) throw err;
        imap.search([ 'UNSEEN', ['SINCE', 'October 2, 2013'] ], function(err, results) {
            if (err) {
                console.log('you are already up to date');
            }
            var f = imap.fetch(results, { bodies: '' });
            f.on('message', function(msg, seqno) {
                console.log('Message #%d', seqno);
                var prefix = '(#' + seqno + ') ';
                msg.on('body', function(stream, info) {
                    console.log(prefix + 'Body');
                    stream.pipe(fs.createWriteStream('msg-' + seqno + '-body.txt'));
                });
                msg.once('attributes', function(attrs) {
                    console.log(prefix + 'Attributes: %s', inspect(attrs, false, 8));
                });
                msg.once('end', function() {
                    console.log(prefix + 'Finished');
                });
            });
            f.once('error', function(err) {
                console.log('Fetch error: ' + err);
            });
            f.once('end', function() {
                console.log('Done fetching all messages!');
            });
        });
    });
});



imap.connect();
4

1 回答 1

3

因此,理论上您可以使用IMAP IDLE命令来执行此操作。

但是,有几点值得注意:

  1. IDLE只会告诉你新消息已经到达,它不会告诉你这些消息是什么
  2. 我不认为您可以在 IMAP 空闲时发送命令(如搜索命令),因此您可能需要创建另一个进程来以某种方式收集消息。

另一种(可能更好)的方法是在前端使用一些 Javascript 来每隔一分钟左右刷新一次页面,或者每隔一分钟左右发出一个 AJAX 请求并刷新页面的消息列表部分。(“更好”是指更简单。我之前已经完成了 IMAP IDLE 实现,并且通常最终删除了该代码,因为这IDLE对我来说很糟糕。)

如果您确实进行此轮询,客户端或服务器端,您可能想要查看setInterval。(因为这通常是一个 Javascript 的东西,而不是客户端或节点特定的,它会在任何地方工作)。

于 2013-10-04T04:56:50.133 回答