diff --git a/src/platform.js b/src/platform.js index 7175c43c5..3eb0a105e 100644 --- a/src/platform.js +++ b/src/platform.js @@ -260,7 +260,7 @@ function createMailConfig(callback) { settings.getMailRelay(function (error, relay) { if (error) return callback(error); - const enabled = relay.enabled || false, + const enabled = relay.provider === 'cloudron-smtp' ? true : false, host = relay.host || '', port = relay.port || 25, tls = !!relay.tls, diff --git a/src/routes/settings.js b/src/routes/settings.js index 0ad502ee1..2b50bad56 100644 --- a/src/routes/settings.js +++ b/src/routes/settings.js @@ -142,7 +142,7 @@ function getMailRelay(req, res, next) { function setMailRelay(req, res, next) { assert.strictEqual(typeof req.body, 'object'); - if (typeof req.body.enabled !== 'boolean') return next(new HttpError(400, 'enabled is required')); + if (typeof req.body.provider !== 'string') return next(new HttpError(400, 'provider is required')); if ('host' in req.body && typeof req.body.host !== 'string') return next(new HttpError(400, 'host must be a string')); if ('port' in req.body && typeof req.body.port !== 'number') return next(new HttpError(400, 'port must be a string')); if ('tls' in req.body && typeof req.body.tls !== 'boolean') return next(new HttpError(400, 'tls must be a boolean')); diff --git a/src/routes/test/settings-test.js b/src/routes/test/settings-test.js index 63d7566a6..7fb7b5e2d 100644 --- a/src/routes/test/settings-test.js +++ b/src/routes/test/settings-test.js @@ -15,9 +15,10 @@ var appdb = require('../../appdb.js'), expect = require('expect.js'), path = require('path'), paths = require('../../paths.js'), - superagent = require('superagent'), server = require('../../server.js'), settings = require('../../settings.js'), + settingsdb = require('../../settingsdb.js'), + superagent = require('superagent'), fs = require('fs'), nock = require('nock'); @@ -321,12 +322,12 @@ describe('Settings API', function () { .query({ access_token: token }) .end(function (err, res) { expect(res.statusCode).to.equal(200); - expect(res.body).to.eql({ enabled: false }); + expect(res.body).to.eql({ provider: 'cloudron-smtp' }); done(); }); }); - it('cannot set without enabled field', function (done) { + it('cannot set without provider field', function (done) { superagent.post(SERVER_URL + '/api/v1/settings/mail_relay') .query({ access_token: token }) .send({ }) @@ -339,30 +340,36 @@ describe('Settings API', function () { it('cannot set with bad host', function (done) { superagent.post(SERVER_URL + '/api/v1/settings/mail_relay') .query({ access_token: token }) - .send({ enabled: true, host: true }) + .send({ provider: 'external-smtp', host: true }) .end(function (err, res) { expect(res.statusCode).to.equal(400); done(); }); }); - it('set succeeds', function (done) { + it('set fails because mail server is unreachable', function (done) { superagent.post(SERVER_URL + '/api/v1/settings/mail_relay') .query({ access_token: token }) - .send({ enabled: true, host: 'host', port: 25, username: 'u', password: 'p', tls: true }) + .send({ provider: 'external-smtp', host: 'host', port: 25, username: 'u', password: 'p', tls: true }) .end(function (err, res) { - expect(res.statusCode).to.equal(202); + expect(res.statusCode).to.equal(400); done(); }); }); it('get succeeds', function (done) { - superagent.get(SERVER_URL + '/api/v1/settings/mail_relay') - .query({ access_token: token }) - .end(function (err, res) { - expect(res.statusCode).to.equal(200); - expect(res.body).to.eql({ enabled: true, host: 'host', port: 25, username: 'u', password: 'p', tls: true }); - done(); + var relay = { provider: 'external-smtp', host: 'host', port: 25, username: 'u', password: 'p', tls: true }; + + settingsdb.set(settings.MAIL_RELAY_KEY, JSON.stringify(relay), function (error) { // skip the mail server verify() + expect(error).to.not.be.ok(); + + superagent.get(SERVER_URL + '/api/v1/settings/mail_relay') + .query({ access_token: token }) + .end(function (err, res) { + expect(res.statusCode).to.equal(200); + expect(res.body).to.eql(relay); + done(); + }); }); }); }); diff --git a/src/settings.js b/src/settings.js index 840e97ec4..308c48b48 100644 --- a/src/settings.js +++ b/src/settings.js @@ -115,7 +115,7 @@ var gDefaults = (function () { result[exports.UPDATE_CONFIG_KEY] = { prerelease: false }; result[exports.APPSTORE_CONFIG_KEY] = {}; result[exports.MAIL_CONFIG_KEY] = { enabled: false }; - result[exports.MAIL_RELAY_KEY] = { enabled: false }; + result[exports.MAIL_RELAY_KEY] = { provider: 'cloudron-smtp' }; result[exports.CATCH_ALL_ADDRESS] = [ ]; return result; @@ -682,6 +682,20 @@ function setMailRelay(relay, callback) { assert.strictEqual(typeof relay, 'object'); assert.strictEqual(typeof callback, 'function'); + function save() { + settingsdb.set(exports.MAIL_RELAY_KEY, JSON.stringify(relay), function (error) { + if (error) return callback(new SettingsError(SettingsError.INTERNAL_ERROR, error)); + + exports.events.emit(exports.MAIL_RELAY_KEY, relay); + + platform.createMailConfig(NOOP_CALLBACK); + + callback(null); + }); + } + + if (relay.provider === 'cloudron-smtp') return save(); + var transporter = nodemailer.createTransport(smtpTransport({ host: relay.host, port: relay.port, @@ -694,15 +708,7 @@ function setMailRelay(relay, callback) { transporter.verify(function(error) { if (error) return callback(new SettingsError(SettingsError.BAD_FIELD, error.message)); - settingsdb.set(exports.MAIL_RELAY_KEY, JSON.stringify(relay), function (error) { - if (error) return callback(new SettingsError(SettingsError.INTERNAL_ERROR, error)); - - exports.events.emit(exports.MAIL_RELAY_KEY, relay); - - platform.createMailConfig(NOOP_CALLBACK); - - callback(null); - }); + save(); }); } diff --git a/src/test/settings-test.js b/src/test/settings-test.js index 2206bab93..b9c5d0acc 100644 --- a/src/test/settings-test.js +++ b/src/test/settings-test.js @@ -9,7 +9,8 @@ var async = require('async'), config = require('../config.js'), database = require('../database.js'), expect = require('expect.js'), - settings = require('../settings.js'); + settings = require('../settings.js'), + settingsdb = require('../settingsdb.js'); function setup(done) { config.set('provider', 'caas'); @@ -184,18 +185,19 @@ describe('Settings', function () { it('can get mail relay', function (done) { settings.getMailRelay(function (error, address) { expect(error).to.be(null); - expect(address).to.eql({ enabled: false }); + expect(address).to.eql({ provider: 'cloudron-smtp' }); done(); }); }); it('can set mail relay', function (done) { - settings.setMailRelay({ enabled: true, host: 'mx.foo.com', port: 25 }, function (error) { + var relay = { provider: 'external-smtp', host: 'mx.foo.com', port: 25 }; ++ settingsdb.set(settings.MAIL_RELAY_KEY, JSON.stringify(relay), function (error) { // skip the mail server verify() expect(error).to.be(null); settings.getMailRelay(function (error, address) { expect(error).to.be(null); - expect(address).to.eql({ enabled: true, host: 'mx.foo.com', port: 25 }); + expect(address).to.eql(relay); done(); }); }); diff --git a/webadmin/src/views/email.html b/webadmin/src/views/email.html index a5354797f..433d5a716 100644 --- a/webadmin/src/views/email.html +++ b/webadmin/src/views/email.html @@ -75,11 +75,11 @@
- +
-
+
diff --git a/webadmin/src/views/email.js b/webadmin/src/views/email.js index 1a6fadbe2..82aa730df 100644 --- a/webadmin/src/views/email.js +++ b/webadmin/src/views/email.js @@ -85,13 +85,13 @@ angular.module('Application').controller('EmailController', ['$scope', '$locatio }; $scope.mailRelayPresets = [ - { id: 'builtin', name: 'Built-in SMTP server', enabled: false }, - { id: 'ses', name: 'Amazon SES', enabled: true, host: 'email-smtp.us-east-1.amazonaws.com', port: 25, tls: true }, - { id: 'custom', name: 'Custom SMTP server', enabled: true, host: '', port: 587, tls: true }, - { id: 'google', name: 'Google', enabled: true, host: 'smtp.gmail.com', port: 587, tls: true }, - { id: 'mailgun', name: 'Mailgun', enabled: true, host: 'smtp.mailgun.org', port: 587, tls: true }, - { id: 'postmark', name: 'Postmark', enabled: true, host: 'smtp.postmarkapp.com', port: 587, tls: true }, - { id: 'sendgrid', name: 'SendGrid', enabled: true, host: 'smtp.sendgrid.net', port: 587, tls: true }, + { provider: 'cloudron-smtp', name: 'Built-in SMTP server' }, + { provider: 'external-smtp', name: 'External SMTP server', host: '', port: 587, tls: true }, + { provider: 'ses-smtp', name: 'Amazon SES', host: 'email-smtp.us-east-1.amazonaws.com', port: 25, tls: true }, + { provider: 'google-smtp', name: 'Google', host: 'smtp.gmail.com', port: 587, tls: true }, + { provider: 'mailgun-smtp', name: 'Mailgun', host: 'smtp.mailgun.org', port: 587, tls: true }, + { provider: 'postmark-smtp', name: 'Postmark', host: 'smtp.postmarkapp.com', port: 587, tls: true }, + { provider: 'sendgrid-smtp', name: 'SendGrid', host: 'smtp.sendgrid.net', port: 587, tls: true }, ]; $scope.mailRelay = { @@ -102,8 +102,7 @@ angular.module('Application').controller('EmailController', ['$scope', '$locatio presetChanged: function () { $scope.mailRelay.error = null; - $scope.mailRelay.relay.enabled = $scope.mailRelay.preset.enabled; - $scope.mailRelay.relay.presetId = $scope.mailRelay.preset.id; + $scope.mailRelay.relay.provider = $scope.mailRelay.preset.provider; $scope.mailRelay.relay.host = $scope.mailRelay.preset.host; $scope.mailRelay.relay.port = $scope.mailRelay.preset.port; $scope.mailRelay.relay.tls = $scope.mailRelay.preset.tls; @@ -111,8 +110,7 @@ angular.module('Application').controller('EmailController', ['$scope', '$locatio // form data to be set on load relay: { - enabled: false, - presetId: 'builtin', // stash this so we can set the preset label correctly in the UI + provider: 'cloudron-smtp', host: '', port: 25, username: '', @@ -149,7 +147,7 @@ angular.module('Application').controller('EmailController', ['$scope', '$locatio $scope.mailRelay.relay = relay; for (var i = 0; i < $scope.mailRelayPresets.length; i++) { - if ($scope.mailRelayPresets[i].id === relay.presetId) { + if ($scope.mailRelayPresets[i].provider === relay.provider) { $scope.mailRelay.preset = $scope.mailRelayPresets[i]; break; }