-
Notifications
You must be signed in to change notification settings - Fork 32
/
mail.listener.js
117 lines (103 loc) · 3.59 KB
/
mail.listener.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// Generated by CoffeeScript 1.6.3
(function() {
var EventEmitter, Imap, MailListener, MailParser,
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
EventEmitter = require("events").EventEmitter;
MailParser = require("mailparser").MailParser;
Imap = require("imap");
MailListener = (function(_super) {
var imap;
__extends(MailListener, _super);
function MailListener(options) {
this._parseUnreadEmails = __bind(this._parseUnreadEmails, this);
this.stop = __bind(this.stop, this);
this.start = __bind(this.start, this);
this.fetchUnreadOnStart = options.fetchUnreadOnStart;
this.markSeen = options.markSeen;
this.imap = new Imap({
user: options.username,
password: options.password,
host: options.host,
port: options.port,
tls: options.secure
});
this.mailbox = options.mailbox || "INBOX";
}
MailListener.prototype.start = function() {
var _this = this;
this.imap.once('ready', function(err) {
if (err) {
return _this.emit("error", err);
} else {
_this.emit("server:connected");
return _this.imap.openBox(_this.mailbox, false, function(err) {
if (err) {
return _this.emit("error", err);
} else {
if (_this.fetchUnreadOnStart) {
_this._parseUnreadEmails();
}
return _this.imap.on("mail", function(id) {
_this.emit("mail:arrived", id);
return _this._parseUnreadEmails();
});
}
});
}
});
return this.imap.connect();
};
MailListener.prototype.stop = function() {
var _this = this;
return this.imap.logout(function() {
return _this.emit("server:disconnected");
});
};
MailListener.prototype._parseUnreadEmails = function() {
var _this = this;
return this.imap.search(["UNSEEN"], function(err, searchResults) {
var fetch, markSeen;
if (err) {
return _this.emit("error", err);
} else {
if (Array.isArray(searchResults) && searchResults.length === 0) {
return;
}
if (_this.markSeen) {
markSeen = true;
}
fetch = _this.imap.fetch(searchResults, {
bodies: '',
markSeen: markSeen
});
return fetch.on("message", function(msg, id) {
var parser;
parser = new MailParser;
parser.on("end", function(mail) {
mail.uid = id;
return _this.emit("mail:parsed", mail);
});
msg.on("body", function(stream, info) {
var buffer;
buffer = '';
stream.on("data", function(chunk) {
return buffer += chunk;
});
return stream.once("end", function() {
return parser.write(buffer);
});
});
return msg.on("end", function() {
return parser.end();
});
});
}
});
};
imap = MailListener.imap;
return MailListener;
})(EventEmitter);
module.exports = MailListener;
}).call(this);