diff --git a/lib/models/campaigns.js b/lib/models/campaigns.js index 0fb4323d..bfef231f 100644 --- a/lib/models/campaigns.js +++ b/lib/models/campaigns.js @@ -1086,6 +1086,24 @@ module.exports.updateMessage = (message, status, updateSubscription, callback) = }); }; +module.exports.updateMessageResponse = (message, response, response_id, callback) => { + db.getConnection((err, connection) => { + if (err) { + return callback(err); + } + + let query = 'UPDATE `campaign__' + message.campaign + '` SET `response`=?, `response_id`=? WHERE id=? LIMIT 1'; + connection.query(query, [response, response_id, message.id], err => { + connection.release(); + if (err) { + return callback(err); + } + return callback(null, true); + }); + + }); +}; + function createCampaignTables(id, callback) { let query = 'CREATE TABLE `campaign__' + id + '` LIKE campaign'; db.getConnection((err, connection) => { diff --git a/services/postfix-bounce-server.js b/services/postfix-bounce-server.js index 60aba027..3bc578b9 100644 --- a/services/postfix-bounce-server.js +++ b/services/postfix-bounce-server.js @@ -28,26 +28,58 @@ let server = net.createServer(socket => { return readNextChunk(); } let line = lines[pos++]; - let match = /\bstatus=bounced\b/.test(line) && line.match(/\bpostfix\/\w+\[\d+\]:\s*([^:]+)/); + let match = /\bstatus=(bounced|sent)\b/.test(line) && line.match(/\bpostfix\/\w+\[\d+\]:\s*([^:]+).*?status=(\w+)/); if (match) { let queueId = match[1]; + let queued = ''; + let queued_as = ''; if (seenIds.has(queueId)) { return checkNextLine(); } seenIds.add(queueId); + // Losacno: Check for local requeue + let status = match[2]; + log.verbose('POSTFIXBOUNCE', 'Checking message %s for local requeue (status: %s)', queueId, status); + if ( status === 'sent' ) { + // Save new queueId to update message's previous queueId (thanks @mfechner ) + queued = / relay=/.test(line) && line.match(/status=sent \((.*)\)/); + if ( queued ) { + queued = queued[1]; + queued_as = queued.match(/ queued as (\w+)/); + queued_as = queued_as[1]; + } + } + campaigns.findMailByResponse(queueId, (err, message) => { if (err || !message) { return checkNextLine(); } - campaigns.updateMessage(message, 'bounced', true, (err, updated) => { - if (err) { - log.error('POSTFIXBOUNCE', 'Failed updating message: %s', err && err.stack); - } else if (updated) { - log.verbose('POSTFIXBOUNCE', 'Marked message %s as bounced', queueId); - } - }); + if ( queued_as ) { + log.verbose('POSTFIXBOUNCE', 'Message %s locally requeued as %s', queueId, queued_as); + // Update message's previous queueId (thanks @mfechner ) + campaigns.updateMessageResponse(message, queued, queued_as, (err, updated) => { + if (err) { + log.error('POSTFIXBOUNCE', 'Failed updating message: %s', err && err.stack); + } else if (updated) { + log.verbose('POSTFIXBOUNCE', 'Successfully changed message queueId to %s', queued_as); + } + }); + + } else { + campaigns.updateMessage(message, 'bounced', true, (err, updated) => { + if (err) { + log.error('POSTFIXBOUNCE', 'Failed updating message: %s', err && err.stack); + } else if (updated) { + log.verbose('POSTFIXBOUNCE', 'Marked message %s as bounced', queueId); + } + }); + } + + // No need to keep in memory... free it ( thanks @witzig ) + seenIds.delete(queueId); + return checkNextLine(); }); return;