From d52436c566e316354615113c9391e349b0f1dc52 Mon Sep 17 00:00:00 2001 From: Gernot Pansy Date: Thu, 14 Feb 2019 22:38:35 +0100 Subject: [PATCH] added webhook support for postal mail server --- server/lib/campaign-sender.js | 6 +++--- server/routes/webhooks.js | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/server/lib/campaign-sender.js b/server/lib/campaign-sender.js index cacb4a1b..864d4139 100644 --- a/server/lib/campaign-sender.js +++ b/server/lib/campaign-sender.js @@ -391,10 +391,12 @@ class CampaignSender { let status; let response; + let responseId; try { const info = await mailer.sendMassMail(mail); status = SubscriptionStatus.SUBSCRIBED; 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) { @@ -403,8 +405,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) { @@ -431,4 +431,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;