使用node-imap nodejs获取新电子邮件

Jac*_*Dre 12 node.js

我使用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();
Run Code Online (Sandbox Code Playgroud)

Rya*_*cox 3

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

不过,有几点值得注意:

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

另一种(也许更好)方法是在前端使用一些 Javascript 来每分钟左右刷新页面,或者每分钟左右发出 AJAX 请求并刷新页面的消息列表部分。(我所说的“更好”是指更简单。我以前做过 IMAP IDLE 实现,但通常最终会删除该代码,因为这IDLE对我来说很糟糕。)

如果您确实要进行客户端或服务器端轮询,您可能需要研究setInterval。(因为这通常是 Javascript 的事情,而不是特定于客户端或节点的,所以它在任何地方都可以工作)。

  • 谢谢你!我找到了一个更好的解决方案邮件监听器库 https://npmjs.org/package/mail-listener2 (2认同)