diff --git a/src/mail.js b/src/mail.js index 94bffdbf4..2bd6e22e7 100644 --- a/src/mail.js +++ b/src/mail.js @@ -75,6 +75,7 @@ const assert = require('assert'), nodemailer = require('nodemailer'), notifications = require('./notifications.js'), path = require('path'), + platform = require('./platforms.js'), safe = require('safetydance'), services = require('./services.js'), shell = require('./shell.js')('mail'), @@ -856,9 +857,10 @@ async function setMailEnabled(domain, enabled, auditSource) { assert.strictEqual(typeof enabled, 'boolean'); assert.strictEqual(typeof auditSource, 'object'); - await updateDomain(domain, { enabled: enabled }); + await updateDomain(domain, { enabled }); - safe(mailServer.restart(), { debug }); + await mailServer.restart(); + await platform.onMailServerIncomingDomainsChanged(); await eventlog.add(enabled ? eventlog.ACTION_MAIL_ENABLED : eventlog.ACTION_MAIL_DISABLED, auditSource, { domain }); } diff --git a/src/platform.js b/src/platform.js index 690319c5c..213c830be 100644 --- a/src/platform.js +++ b/src/platform.js @@ -8,6 +8,7 @@ exports = module.exports = { onDashboardLocationSet, onDashboardLocationChanged, onMailServerLocationChanged, + onMailServerIncomingDomainsChanged, getStatus }; @@ -251,3 +252,12 @@ async function onMailServerLocationChanged(auditSource) { const appsUsingEmail = installedApps.filter((a) => !!a.manifest.addons?.email || a.manifest.addons?.sendmail?.requiresValidCertificate); await safe(apps.configureApps(appsUsingEmail, { scheduleNow: true }, auditSource), { debug }); } + +async function onMailServerIncomingDomainsChanged(auditSource) { + assert.strictEqual(typeof auditSource, 'object'); + + // mark apps using email addon to be reconfigured + const [, installedApps] = await safe(apps.list()); + const appsUsingEmail = installedApps.filter((a) => !!a.manifest.addons?.email); + await safe(apps.configureApps(appsUsingEmail, { scheduleNow: true }, auditSource), { debug }); +} diff --git a/src/routes/mail.js b/src/routes/mail.js index 8f77c3af9..b24b2d475 100644 --- a/src/routes/mail.js +++ b/src/routes/mail.js @@ -114,6 +114,9 @@ async function setMailEnabled(req, res, next) { if (typeof req.body.enabled !== 'boolean') return next(new HttpError(400, 'enabled is required')); + // can take a while to restart the mail container + req.clearTimeout(); + const [error] = await safe(mail.setMailEnabled(req.params.domain, !!req.body.enabled, AuditSource.fromRequest(req))); if (error) return next(BoxError.toHttpError(error)); @@ -237,7 +240,7 @@ async function setAliases(req, res, next) { if (!Array.isArray(req.body.aliases)) return next(new HttpError(400, 'aliases must be an array')); - for (let alias of req.body.aliases) { + for (const alias of req.body.aliases) { if (!alias || typeof alias !== 'object') return next(new HttpError(400, 'each alias must have a name and domain')); if (typeof alias.name !== 'string') return next(new HttpError(400, 'name must be a string')); if (typeof alias.domain !== 'string') return next(new HttpError(400, 'domain must be a string'));