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

我使用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(); 

所以,理论上你可以使用IMAP IDLE命令来做到这一点。

但值得注意的是:

  1. IDLE只会告诉你新消息已经到达,它不会告诉你这些消息是什么
  2. 我不认为你可以发送IMAP空闲时的命令(如search命令),所以你可能需要创build另一个进程来收集消息。

另一种(也许更好)的方法是在前端使用一些Javascript来每分钟刷新一次页面, 或者每隔一分钟发一个AJAX请求并刷新页面的消息列表部分。 (“更好”我的意思是更简单,我之前完成了IMAP IDLE的实现,通常会删除该代码,因为IDLE吸引了我)。

如果你去这个轮询,客户端或服务器端,你可能想看看setInterval 。 (因为这是一个一般的Javascript的东西,而不是客户端或特定的节点,它将工作无论如何)。