get rid of mail queue

this prevents us from returning mail errors synchronously
This commit is contained in:
Girish Ramakrishnan
2019-04-15 16:36:37 -07:00
parent e23fd5e3c5
commit fa5415b1eb
6 changed files with 61 additions and 92 deletions

View File

@@ -20,12 +20,10 @@ exports = module.exports = {
sendTestMail: sendTestMail,
_getMailQueue: _getMailQueue,
_clearMailQueue: _clearMailQueue
_mailQueue: [] // accumulate mails in test mode
};
var assert = require('assert'),
async = require('async'),
config = require('./config.js'),
debug = require('debug')('box:mailer'),
docker = require('./docker.js').connection,
@@ -42,8 +40,6 @@ var NOOP_CALLBACK = function (error) { if (error) debug(error); };
var MAIL_TEMPLATES_DIR = path.join(__dirname, 'mail_templates');
var gMailQueue = [ ];
// This will collect the most common details required for notification emails
function getMailConfig(callback) {
assert.strictEqual(typeof callback, 'function');
@@ -62,18 +58,15 @@ function getMailConfig(callback) {
});
}
function processQueue() {
sendMails(gMailQueue);
gMailQueue = [ ];
}
// note : this function should NOT access the database. it is called by the crashnotifier
// which does not initialize mailer or the databse
function sendMails(queue, callback) {
assert(util.isArray(queue));
function sendMail(mailOptions, callback) {
assert.strictEqual(typeof mailOptions, 'object');
callback = callback || NOOP_CALLBACK;
if (process.env.BOX_ENV === 'test') {
exports._mailQueue.push(mailOptions);
return callback();
}
docker.getContainer('mail').inspect(function (error, data) {
if (error) return callback(error);
@@ -97,34 +90,16 @@ function sendMails(queue, callback) {
}
}));
debug('Processing mail queue of size %d (through %s:2525)', queue.length, mailServerIp);
transport.sendMail(mailOptions, function (error) {
if (error) return callback(error);
async.mapSeries(queue, function iterator(mailOptions, callback) {
transport.sendMail(mailOptions, function (error) {
if (error) return debug(error); // TODO: requeue?
debug('Email sent to ' + mailOptions.to);
});
callback(null);
}, function done() {
debug('Done processing mail queue');
debug(`Email "${mailOptions.subject}" sent to ${mailOptions.to}`);
callback(null);
});
});
}
function enqueue(mailOptions) {
assert.strictEqual(typeof mailOptions, 'object');
if (!mailOptions.from) debug('sender address is missing');
if (!mailOptions.to) debug('recipient address is missing');
debug('Queued mail for ' + mailOptions.from + ' to ' + mailOptions.to);
gMailQueue.push(mailOptions);
if (process.env.BOX_ENV !== 'test') processQueue();
}
function render(templateFile, params) {
assert.strictEqual(typeof templateFile, 'string');
assert.strictEqual(typeof params, 'object');
@@ -155,7 +130,7 @@ function mailUserEvent(mailTo, user, event) {
text: render('user_event.ejs', { user: user, event: event, format: 'text' }),
};
enqueue(mailOptions);
sendMail(mailOptions);
});
}
@@ -191,7 +166,7 @@ function sendInvite(user, invitor) {
html: render('welcome_user.ejs', templateDataHTML)
};
enqueue(mailOptions);
sendMail(mailOptions);
});
}
@@ -224,7 +199,7 @@ function userAdded(mailTo, user) {
html: render('user_added.ejs', templateDataHTML)
};
enqueue(mailOptions);
sendMail(mailOptions);
});
}
@@ -276,7 +251,7 @@ function passwordReset(user) {
html: render('password_reset.ejs', templateDataHTML)
};
enqueue(mailOptions);
sendMail(mailOptions);
});
}
@@ -296,7 +271,7 @@ function appUp(mailTo, app) {
text: render('app_up.ejs', { title: app.manifest.title, appFqdn: app.fqdn, format: 'text' })
};
enqueue(mailOptions);
sendMail(mailOptions);
});
}
@@ -316,7 +291,7 @@ function appDied(mailTo, app) {
text: render('app_down.ejs', { title: app.manifest.title, appFqdn: app.fqdn, format: 'text' })
};
enqueue(mailOptions);
sendMail(mailOptions);
});
}
@@ -356,9 +331,7 @@ function appUpdateAvailable(mailTo, app, hasSubscription, info, callback) {
html: render('app_update_available.ejs', templateDataHTML)
};
enqueue(mailOptions);
callback();
sendMail(mailOptions, callback);
});
}
@@ -391,9 +364,7 @@ function sendDigest(mailTo, info, callback) {
html: render('digest.ejs', templateDataHTML)
};
enqueue(mailOptions);
callback();
sendMail(mailOptions, callback);
});
}
@@ -410,7 +381,7 @@ function backupFailed(mailTo, errorMessage, logUrl) {
text: render('backup_failed.ejs', { cloudronName: mailConfig.cloudronName, message: errorMessage, logUrl: logUrl, format: 'text' })
};
enqueue(mailOptions);
sendMail(mailOptions);
});
}
@@ -429,7 +400,7 @@ function certificateRenewalError(mailTo, domain, message) {
text: render('certificate_renewal_error.ejs', { domain: domain, message: message, format: 'text' })
};
sendMails([ mailOptions ]);
sendMail(mailOptions);
});
}
@@ -448,7 +419,7 @@ function oomEvent(mailTo, program, event) {
text: render('oom_event.ejs', { cloudronName: mailConfig.cloudronName, program: program, event: JSON.stringify(event), format: 'text' })
};
sendMails([ mailOptions ]);
sendMail(mailOptions);
});
}
@@ -466,16 +437,6 @@ function sendTestMail(domain, email) {
text: render('test.ejs', { cloudronName: mailConfig.cloudronName, format: 'text'})
};
enqueue(mailOptions);
sendMail(mailOptions);
});
}
function _getMailQueue() {
return gMailQueue;
}
function _clearMailQueue(callback) {
gMailQueue = [];
if (callback) callback();
}