diff --git a/services/postfix-bounce-server.js b/services/postfix-bounce-server.js index c4c96e65..bc8bcede 100644 --- a/services/postfix-bounce-server.js +++ b/services/postfix-bounce-server.js @@ -70,17 +70,37 @@ let server = net.createServer(socket => { }); }); -server.on('error', err => { - log.error('POSTFIXBOUNCE', err && err.stack); -}); - module.exports = callback => { - if (config.postfixbounce.enabled) { - server.listen(config.postfixbounce.port, config.postfixbounce.host, () => { - log.info('POSTFIXBOUNCE', 'Server listening on port %s', config.postfixbounce.port); - setImmediate(callback); - }); - } else { - setImmediate(callback); + if (!config.postfixbounce.enabled) { + return setImmediate(callback); } + + let started = false; + + server.on('error', err => { + const port = config.postfixbounce.port; + const bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port; + + switch (err.code) { + case 'EACCES': + log.error('POSTFIXBOUNCE', '%s requires elevated privileges.', bind); + break; + case 'EADDRINUSE': + log.error('POSTFIXBOUNCE', '%s is already in use', bind); + break; + default: + log.error('POSTFIXBOUNCE', err); + } + + if (!started) { + started = true; + return callback(err); + } + }); + + server.listen(config.postfixbounce.port, config.postfixbounce.host, () => { + started = true; + log.info('POSTFIXBOUNCE', 'Server listening on port %s', config.postfixbounce.port); + setImmediate(callback); + }); }; diff --git a/services/test-server.js b/services/test-server.js index 1f4777b8..ed549c67 100644 --- a/services/test-server.js +++ b/services/test-server.js @@ -164,6 +164,10 @@ let mailBoxServer = http.createServer((req, res) => { }); }); +mailBoxServer.on('error', err => { + log.error('Test SMTP Mailbox Server', err); +}); + module.exports = callback => { if (config.testserver.enabled) { server.listen(config.testserver.port, config.testserver.host, () => { diff --git a/services/verp-server.js b/services/verp-server.js index 95964daf..37bd17d1 100644 --- a/services/verp-server.js +++ b/services/verp-server.js @@ -99,15 +99,36 @@ let server = new SMTPServer({ } }); -server.on('error', err => { - log.error('VERP', err); - server.close(); -}); - module.exports = callback => { if (!config.verp.enabled) { return setImmediate(callback); } + + let started = false; + + server.on('error', err => { + const port = config.verp.port; + const bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port; + + switch (err.code) { + case 'EACCES': + log.error('VERP', '%s requires elevated privileges', bind); + break; + case 'EADDRINUSE': + log.error('VERP', '%s is already in use', bind); + break; + case 'ECONNRESET': // Usually happens when a client does not disconnect cleanly + case 'EPIPE': // Remote connection was closed before the server attempted to send data + default: + log.error('VERP', err); + } + + if (!started) { + started = true; + return callback(err); + } + }); + let hosts; if (typeof config.verp.host === 'string' && config.verp.host) { hosts = config.verp.host.trim().split(',').map(host => host.trim()).filter(host => host.trim()); @@ -121,6 +142,7 @@ module.exports = callback => { let pos = 0; let startNextHost = () => { if (pos >= hosts.length) { + started = true; return setImmediate(callback); } let host = hosts[pos++];