3 var _ = require('lodash');
4 var nodemailer = require('nodemailer');
5 var smtpTransport = require('nodemailer-smtp-transport');
7 var Contact = require('../../models').Contact;
8 var MailRoom = require('../../models').MailRoom;
9 var MailMessage = require('../../models').MailMessage;
10 var ContactEmail = require('../../models').ContactEmail;
11 var MailServerOut = require('../../models').MailServerOut;
14 create: function (doc) {
19 function onSave(doc) {
20 console.log("MAIL - Account " + doc.username + " SMTP CREATE");
22 _smtp = nodemailer.createTransport(smtpTransport({
34 function onUpdate(doc) {
35 if (_smtp.transporter.options.auth.user === doc.username) {
36 console.log("MAIL - Account " + doc.username + " SMTP UPDATE");
38 _smtp = nodemailer.createTransport(smtpTransport({
51 function onRemove(doc) {
52 if (_smtp.transporter.options.auth.user === doc.username) {
53 console.log("[MAIL - Account " + doc.username + " SMTP DESTROY");
58 function onSend(mailMessage, options) {
59 if (mailMessage.changed('status') && mailMessage.status === 'SENDING' && _smtp.transporter.options.auth.user === mailMessage.from) {
60 console.log('onSend', mailMessage.from);
62 var _mMessage = mailMessage;
63 var _mFrom, _mTo, _mCc, _mBcc;
65 if (_mMessage.inReplyTo) {
69 messageId: _mMessage.inReplyTo
72 .then(function (mailMessageParent) {
73 return mailMessageParent
76 .then(function (mailRoom) {
79 .addMailMessage(_mMessage, {
80 transaction: options ? options.transaction : null
92 transaction: options ? options.transaction : null
95 .spread(function (mFrom, created) {
97 var tos = _mMessage.to ? _mMessage.to.split(';') : [];
100 tos.forEach(function (email) {
101 promises.push(ContactEmail
109 transaction: options ? options.transaction : null
116 .then(function (mTo) {
118 var ccs = _mMessage.cc ? _mMessage.cc.split(';') : [];
119 _mTo = _.map(mTo, function (elm) {
123 ccs.forEach(function (email) {
124 promises.push(ContactEmail
132 transaction: options ? options.transaction : null
139 .then(function (mCc) {
141 var bccs = _mMessage.bcc ? _mMessage.bcc.split(';') : [];
142 _mCc = _.map(mCc, function (elm) {
146 bccs.forEach(function (email) {
147 promises.push(ContactEmail
155 transaction: options ? options.transaction : null
162 .then(function (mBcc) {
163 _mBcc = _.map(mBcc, function (elm) {
172 transaction: options ? options.transaction : null
178 transaction: options ? options.transaction : null
184 transaction: options ? options.transaction : null
190 transaction: options ? options.transaction : null
195 status: _mMessage.status,
196 from: _mMessage.from,
199 subject: _mMessage.subject,
200 html: _mMessage.html,
201 text: _mMessage.text,
203 'X-Laziness-level': 1000
207 if (_mMessage.MailAttachments) {
208 mail.attachments = _.map(_mMessage.MailAttachments, function (elm) {
215 return new Promise(function (resolve, reject) {
216 _smtp.sendMail(mail, function (err, info) {
225 .then(function (info) {
228 messageId: info.messageId,
231 transaction: options ? options.transaction : null
238 id: _mMessage.MailRoomId
241 subject: _mMessage.subject,
242 from: _mMessage.from,
244 MailAccountId: _doc.MailAccountId
246 transaction: options ? options.transaction : null
248 .spread(function (mailRoom) {
251 .addMailMessage(_mMessage, {
252 transaction: options ? options.transaction : null
259 email: _mMessage.from
262 email: _mMessage.from,
264 transaction: options ? options.transaction : null
267 .spread(function (mFrom) {
269 var tos = _mMessage.to ? _mMessage.to.split(';') : [];
272 tos.forEach(function (email) {
273 promises.push(ContactEmail
281 transaction: options ? options.transaction : null
288 .then(function (mTo) {
290 var ccs = _mMessage.cc ? _mMessage.cc.split(';') : [];
291 _mTo = _.map(mTo, function (elm) {
295 ccs.forEach(function (email) {
296 promises.push(ContactEmail
304 transaction: options ? options.transaction : null
311 .then(function (mCc) {
313 var bccs = _mMessage.bcc ? _mMessage.bcc.split(';') : [];
314 _mCc = _.map(mCc, function (elm) {
318 bccs.forEach(function (email) {
319 promises.push(ContactEmail
327 transaction: options ? options.transaction : null
334 .then(function (mBcc) {
335 _mBcc = _.map(mBcc, function (elm) {
344 transaction: options ? options.transaction : null
350 transaction: options ? options.transaction : null
356 transaction: options ? options.transaction : null
362 transaction: options ? options.transaction : null
367 status: _mMessage.status,
368 from: _mMessage.from,
371 subject: _mMessage.subject,
372 html: _mMessage.html,
373 text: _mMessage.text,
375 'X-Laziness-level': 1000
379 if (_mMessage.MailAttachments) {
380 mail.attachments = _.map(_mMessage.MailAttachments, function (elm) {
387 return new Promise(function (resolve, reject) {
388 _smtp.sendMail(mail, function (err, info) {
397 .then(function (info) {
400 messageId: info.messageId,
403 transaction: options ? options.transaction : null
412 // HANDLE ACCOUNT UPDATE/DELETE
413 MailServerOut.afterUpdate(function (doc) {
416 MailServerOut.afterDestroy(function (doc) {
420 MailMessage.afterCreate(function (doc, options) {
421 return onSend(doc, options);
424 // MailMessage.afterUpdate(function (doc) {