diff --git a/server/lib/campaign-sender.js b/server/lib/campaign-sender.js index 0fecb466..43ab4ad5 100644 --- a/server/lib/campaign-sender.js +++ b/server/lib/campaign-sender.js @@ -391,6 +391,7 @@ class CampaignSender { let status; let response; + let responseId; try { const info = await mailer.sendMassMail(mail); status = SubscriptionStatus.SUBSCRIBED; @@ -407,6 +408,7 @@ class CampaignSender { console.log(`response: ${info.response} messageId: ${info.messageId}`); response = info.response || info.messageId; + responseId = info.messageId.replace(/(^<|>$)/g, "") || response.split(/\s+/).pop(); await knex('campaigns').where('id', campaign.id).increment('delivered'); } catch (err) { @@ -415,8 +417,6 @@ class CampaignSender { await knex('campaigns').where('id', campaign.id).increment('delivered').increment('bounced'); } - const responseId = response.split(/\s+/).pop(); - const now = new Date(); if (campaign.type === CampaignType.REGULAR || campaign.type === CampaignType.RSS_ENTRY) { @@ -443,4 +443,4 @@ class CampaignSender { } } -module.exports = CampaignSender; \ No newline at end of file +module.exports = CampaignSender; diff --git a/server/routes/webhooks.js b/server/routes/webhooks.js index 15e71548..98d35854 100644 --- a/server/routes/webhooks.js +++ b/server/routes/webhooks.js @@ -254,4 +254,39 @@ router.postAsync('/zone-mta/sender-config/:sendConfigurationCid', async (req, re }); }); + +router.postAsync('/postal', async (req, res) => { + + if (typeof req.body === 'string') { + req.body = JSON.parse(req.body); + } + + switch (req.body.event) { + + case 'MessageDeliveryFailed': + if (req.body.payload.message && req.body.payload.message.message_id) { + const message = await campaigns.getMessageByResponseId(req.body.payload.message.message_id); + if (message) { + await campaigns.changeStatusByMessage(contextHelpers.getAdminContext(), message, SubscriptionStatus.BOUNCED, req.body.payload.status === 'HardFail'); + log.verbose('Postal', 'Marked message %s as bounced', req.body.payload.message.message_id); + } + } + break; + + case 'MessageBounced': + if (req.body.payload.original_message && req.body.payload.original_message.message_id) { + const message = await campaigns.getMessageByResponseId(req.body.payload.original_message.message_id); + if (message) { + await campaigns.changeStatusByMessage(contextHelpers.getAdminContext(), message, SubscriptionStatus.BOUNCED, true); + log.verbose('Postal', 'Marked message %s as bounced', req.body.payload.original_message.message_id); + } + } + break; + } + + res.json({ + success: true + }); +}); + module.exports = router;