Skip to content

Commit

Permalink
Do not defer if MX server was not found
Browse files Browse the repository at this point in the history
  • Loading branch information
andris9 committed Jan 19, 2024
1 parent 3769fc3 commit cd5e1a2
Show file tree
Hide file tree
Showing 5 changed files with 640 additions and 602 deletions.
4 changes: 1 addition & 3 deletions bin/check-bounce.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,7 @@ process.stdin.on('data', chunk => {
});

process.stdin.on('end', () => {
let str = Buffer.concat(chunks)
.toString()
.trim();
let str = Buffer.concat(chunks).toString().trim();
let bounceInfo = bounces.check(str);
console.log('data : %s', str.replace(/\n/g, '\n' + ' '.repeat(11)));
Object.keys(bounceInfo || {}).forEach(key => {
Expand Down
2 changes: 2 additions & 0 deletions lib/ip-tools.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ class RedisCache {
return callback();
}

log.silly(logKey, 'DNSCACHE SET key=%s value=%s', key, JSON.stringify(value));

db.redis
.multi()
.set('dns:' + key, JSON.stringify(value))
Expand Down
48 changes: 34 additions & 14 deletions lib/sender.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ const DEFAULT_DEFER_TIMES = [
240 /* 28h */, 240 /* 32h */, 240 /* 36h */, 240 /* 40h */, 240 /* 44h */, 240 /* 48h */
].map(v => v * 60 * 1000);

const POLICY_RESPONSE = '550 Failed to establish a TLS connection to the MX server as requested by policy';
const POLICY_RESPONSE = 'Failed to establish a TLS connection to the MX server as requested by policy';

class Sender extends EventEmitter {
constructor(clientId, connectionId, zone, sendCommand, queue, connectionPool) {
Expand Down Expand Up @@ -304,9 +304,12 @@ class Sender extends EventEmitter {
// connection reached unexpected close event
let host =
(connection && connection.options && (connection.options.servername || connection.options.host)) || delivery.domain;
let err = new Error('Connection to ' + host + ' closed unexpectedly');
err.response = '450 Connection to ' + host + ' closed unexpectedly';
err.category = 'network';

let error = new Error(`Connection to ${host} closed unexpectedly`);
error.response = `Network error: ${err.message}`;
error.category = 'network';
error.temporary = true;

return handleError(delivery, connection, err);
}, 1000).unref();
});
Expand Down Expand Up @@ -694,16 +697,23 @@ class Sender extends EventEmitter {
action: err.httpResponse >= 400 && err.httpResponse < 500 ? 'reject' : 'defer',
category: 'http',
message: err.response || err.message,
code: err.httpResponse || 488,
code: err.httpResponse,
status: false
};
} else if (['dns', 'network', 'policy'].includes(err.category)) {
// preset categories from mx-connect etc
bounce = {
action: err.temporary || err.action === 'defer' ? 'defer' : 'reject',
category: err.category,
message: err.response || err.message,
status: false
};
} else if (!err.responseCode && !/^\d{3}\b/.test(err.response || err.message)) {
// timeouts, node network errors etc.
bounce = {
action: 'defer',
category: 'connection',
category: 'network',
message: err.response || err.message,
code: 488,
status: false
};
} else {
Expand Down Expand Up @@ -878,8 +888,12 @@ class Sender extends EventEmitter {

if (domainData && domainData.error) {
let err = new Error(domainData.error);
err.response = domainData.response;
err.category = domainData.category;
for (let key of ['response', 'category', 'temporary', 'code']) {
if (domainData[key]) {
err[key] = domainData[key];
}
}

return callback(err);
}

Expand All @@ -894,13 +908,15 @@ class Sender extends EventEmitter {
domainData.error = err.message;
domainData.response = err.response;
domainData.category = err.category;
domainData.temporary = err.temporary;
domainData.code = err.code;

if (err.lastErr && [err.lastErr.errno, err.lastErr.code].includes('ETIMEDOUT')) {
// most probably a firewall issue or a server that does not have MX running
ttl = 15 * 60 * 1000;
} else {
// auto defer all messages to this server for the next 10 minutes
ttl = 10 * 60 * 1000;
// auto defer all messages to this server for the next 2 minutes
ttl = 2 * 60 * 1000;
}
cmd = {
cmd: 'SETCACHE',
Expand Down Expand Up @@ -1170,17 +1186,21 @@ class Sender extends EventEmitter {
if (/disconnected\s+before\s+secure\s+TLS\s+connection\s+was\s+established/i.test(err.message) || err.cert) {
if (enforceTLS) {
// policy violation
err.response = POLICY_RESPONSE + (err.reason ? '. ' + err.reason : '');
err.response = `Policy error: ${POLICY_RESPONSE}${err.reason ? `. ${err.reason}` : ''}`;
err.category = 'policy';
err.temporary = false;
} else {
// try to reconnect without TLS
err.code = 'ETLS';
}
}

err.response = err.response || '450 Error connecting to ' + mx.host + '. ' + err.message;
err.response = err.response || `Nework error: Error connecting to ${mx.host}. ${err.message}`;
err.category = err.category || 'network';
err.logtrail = logtrail;
if (typeof err.temporary !== 'boolean') {
err.temporary = true;
}

if (
(err.code === 'ETLS' ||
Expand Down Expand Up @@ -1302,7 +1322,7 @@ class Sender extends EventEmitter {
returned = true;
connection.close();
let err = new Error('TLS is required');
err.response = POLICY_RESPONSE;
err.response = `Policy error: ${POLICY_RESPONSE}`;
err.category = 'policy';
return callback(err);
}
Expand Down
Loading

0 comments on commit cd5e1a2

Please sign in to comment.