diff --git a/src/boxerror.js b/src/boxerror.js index 7d70ab2be..f6ede8906 100644 --- a/src/boxerror.js +++ b/src/boxerror.js @@ -50,6 +50,7 @@ BoxError.INTERNAL_ERROR = 'Internal Error'; BoxError.INVALID_CREDENTIALS = 'Invalid Credentials'; BoxError.LICENSE_ERROR = 'License Error'; BoxError.LOGROTATE_ERROR = 'Logrotate Error'; +BoxError.MAIL_ERROR = 'Mail Error'; BoxError.NETWORK_ERROR = 'Network Error'; BoxError.NGINX_ERROR = 'Nginx Error'; BoxError.NOT_FOUND = 'Not found'; diff --git a/src/mail.js b/src/mail.js index c35772e56..500656c7e 100644 --- a/src/mail.js +++ b/src/mail.js @@ -26,6 +26,7 @@ exports = module.exports = { startMail: restartMail, restartMail: restartMail, handleCertChanged: handleCertChanged, + getMailAuth: getMailAuth, sendTestMail: sendTestMail, @@ -55,6 +56,7 @@ var assert = require('assert'), constants = require('./constants.js'), debug = require('debug')('box:mail'), dns = require('./native-dns.js'), + docker = require('./docker.js'), domains = require('./domains.js'), eventlog = require('./eventlog.js'), hat = require('./hat.js'), @@ -661,6 +663,31 @@ function configureMail(mailFqdn, mailDomain, callback) { }); } +function getMailAuth(callback) { + assert.strictEqual(typeof callback, 'function'); + + docker.inspect('mail', function (error, data) { + if (error) return callback(error); + + const ip = safe.query(data, 'NetworkSettings.Networks.cloudron.IPAddress'); + if (!ip) return callback(new BoxError(BoxError.MAIL_ERROR, 'Error querying mail server IP')); + + // extract the relay token for auth + const env = safe.query(data, 'Config.Env', null); + if (!env) return callback(new BoxError(BoxError.MAIL_ERROR, 'Error getting mail env')); + const tmp = env.find(function (e) { return e.indexOf('CLOUDRON_RELAY_TOKEN') === 0; }); + if (!tmp) return callback(new BoxError(BoxError.MAIL_ERROR, 'Error getting CLOUDRON_RELAY_TOKEN env var')); + const relayToken = tmp.slice('CLOUDRON_RELAY_TOKEN'.length + 1); // +1 for the = sign + if (!relayToken) return callback(new BoxError(BoxError.MAIL_ERROR, 'Error parsing CLOUDRON_RELAY_TOKEN')); + + callback(null, { + ip, + port: constants.INTERNAL_SMTP_PORT, + relayToken + }); + }); +} + function restartMail(callback) { assert.strictEqual(typeof callback, 'function'); diff --git a/src/mailer.js b/src/mailer.js index cebc3bfc4..b1dd0e184 100644 --- a/src/mailer.js +++ b/src/mailer.js @@ -26,11 +26,10 @@ exports = module.exports = { var assert = require('assert'), BoxError = require('./boxerror.js'), - constants = require('./constants.js'), custom = require('./custom.js'), debug = require('debug')('box:mailer'), - docker = require('./docker.js').connection, ejs = require('ejs'), + mail = require('./mail.js'), nodemailer = require('nodemailer'), path = require('path'), safe = require('safetydance'), @@ -70,26 +69,15 @@ function sendMail(mailOptions, callback) { return callback(); } - docker.getContainer('mail').inspect(function (error, data) { + mail.getMailAuth(function (error, data) { if (error) return callback(error); - var mailServerIp = safe.query(data, 'NetworkSettings.Networks.cloudron.IPAddress'); - if (!mailServerIp) return callback('Error querying mail server IP'); - - // extract the relay token for auth - const env = safe.query(data, 'Config.Env', null); - if (!env) return callback(new Error('Error getting mail env')); - const tmp = env.find(function (e) { return e.indexOf('CLOUDRON_RELAY_TOKEN') === 0; }); - if (!tmp) return callback(new Error('Error getting CLOUDRON_RELAY_TOKEN env var')); - const relayToken = tmp.slice('CLOUDRON_RELAY_TOKEN'.length + 1); // +1 for the = sign - if (!relayToken) return callback(new Error('Error parsing CLOUDRON_RELAY_TOKEN')); - var transport = nodemailer.createTransport(smtpTransport({ - host: mailServerIp, - port: constants.INTERNAL_SMTP_PORT, + host: data.ip, + port: data.port, auth: { user: mailOptions.authUser || `no-reply@${settings.adminDomain()}`, - pass: relayToken + pass: data.relayToken } }));