diff --git a/index.js b/index.js index 183c911..00d16ad 100644 --- a/index.js +++ b/index.js @@ -9,7 +9,9 @@ var async = require('async'); module.exports = MailListener; function MailListener(options) { - this.markSeen = !! options.markSeen; + this.haveNewEmails = false; + this.parsingUnread = false; + this.markSeen = !!options.markSeen; this.mailbox = options.mailbox || "INBOX"; if ('string' === typeof options.searchFilter) { this.searchFilter = [options.searchFilter]; @@ -37,8 +39,8 @@ function MailListener(options) { debug: options.debug || null }); - this.imap.once('ready', imapReady.bind(this)); - this.imap.once('close', imapClose.bind(this)); + this.imap.on('ready', imapReady.bind(this)); + this.imap.on('close', imapClose.bind(this)); this.imap.on('error', imapError.bind(this)); } @@ -52,6 +54,15 @@ MailListener.prototype.stop = function() { this.imap.end(); }; +MailListener.prototype.restart = function() { + console.log('detaching existing listener'); + this.imap.removeAllListeners('mail'); + this.imap.removeAllListeners('update'); + + console.log('calling imap connect'); + this.imap.connect(); +}; + function imapReady() { var self = this; this.imap.openBox(this.mailbox, false, function(err, mailbox) { @@ -78,7 +89,12 @@ function imapError(err) { } function imapMail() { - parseUnread.call(this); + if (!this.haveNewEmails && !this.parsingUnread) { + parseUnread.call(this); + this.parsingUnread = true; + } else if (this.parsingUnread) { + this.haveNewEmails = true; + } } function parseUnread() { @@ -87,7 +103,15 @@ function parseUnread() { if (err) { self.emit('error', err); } else if (results.length > 0) { - async.each(results, function( result, callback) { + + self.imap.setFlags(results, ['\\Seen'], function (err) { + if (err) { + console.log(JSON.stringify(err, null, 2)); + } + }); + + + async.each(results, function (result, callback) { var f = self.imap.fetch(result, { bodies: '', markSeen: self.markSeen @@ -117,10 +141,11 @@ function parseUnread() { }); } else { self.emit('mail',mail,seqno,attributes); + callback(); } }); - parser.on("attachment", function (attachment) { - self.emit('attachment', attachment); + parser.on("attachment", function (attachment, email) { + self.emit('attachment', attachment, email); }); msg.on('body', function(stream, info) { stream.on('data', function(chunk) { @@ -138,11 +163,23 @@ function parseUnread() { f.once('error', function(err) { self.emit('error', err); }); - }, function(err){ - if( err ) { + }, function (err) { + console.log('all process'); + if (err) { self.emit('error', err); } + + + if (self.haveNewEmails) { + self.haveNewEmails = false; + parseUnread.call(self); + } else { + self.parsingUnread = false; + } + }); + } else { + self.parsingUnread = false; } }); } diff --git a/package.json b/package.json index 253e5a4..40b0e1e 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,9 @@ "description": "Mail listener library for node.js. Get notification when new email arrived.", "dependencies": { "imap": "~0.8.14", - "mailparser": "~0.4.6", - "async": "^0.9.0" + "mailparser": "^0.4.8", + "async": "^0.9.0", + "mime": "^1.0.0" }, "repository": { "type": "git", diff --git a/test.js b/test.js index c22f3b5..f932ede 100644 --- a/test.js +++ b/test.js @@ -1,7 +1,7 @@ var MailListener = require("./"); var mailListener = new MailListener({ - username: "xxxx", + username: "xxx", password: "xxx", host: "imap.gmail.com", port: 993, @@ -22,6 +22,10 @@ mailListener.on("server:connected", function(){ mailListener.on("server:disconnected", function(){ console.log("imapDisconnected"); + setTimeout(function() { + console.log("Trying to establish imap connection again"); + mailListener.restart(); + }, 5* 1000); }); mailListener.on("error", function(err){