我使用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)
因此,理论上,您可以使用IMAP IDLE命令来执行此操作。
不过,有几点值得注意:
IDLE
只会告诉您新消息已到达,不会告诉您这些消息是什么另一种(也许更好)方法是在前端使用一些 Javascript 来每分钟左右刷新页面,或者每分钟左右发出 AJAX 请求并刷新页面的消息列表部分。(我所说的“更好”是指更简单。我以前做过 IMAP IDLE 实现,但通常最终会删除该代码,因为这IDLE
对我来说很糟糕。)
如果您确实要进行客户端或服务器端轮询,您可能需要研究setInterval。(因为这通常是 Javascript 的事情,而不是特定于客户端或节点的,所以它在任何地方都可以工作)。