Converted bulk email service to use mailgun

no-issue
This commit is contained in:
Fabien O'Carroll 2019-11-08 11:13:43 +07:00
parent 00da426a02
commit 11d0eff863

View File

@ -1,7 +1,33 @@
// @ts-check
const mailService = require('../mail');
const ghostMailer = new mailService.GhostMailer();
const {URL} = require('url');
const mailgun = require('mailgun-js');
const configService = require('../../config');
const common = require('../../lib/common');
let mailgunInstance;
function createMailgun(config) {
const baseUrl = new URL(config.baseUrl);
return mailgun({
apiKey: config.apiKey,
domain: config.domain,
protocol: baseUrl.protocol,
host: baseUrl.host,
port: baseUrl.port,
endpoint: baseUrl.pathname
});
}
const config = configService.get('bulk-email');
if (!config || !config.mailgun) {
common.logging.warn(`Bulk email service is not configured`);
} else {
try {
mailgunInstance = createMailgun(config.mailgun);
} catch (err) {
common.logging.warn(`Bulk email service is not configured`);
}
}
/**
* An email address
@ -23,22 +49,23 @@ module.exports = {
* @returns {Promise<boolean>} A promise representing the success of the email sending
*/
async send(message, recipients, recipientData) {
for (const recipient of recipients) {
const messageToSend = Object.assign({}, message, {
to: recipient
});
let unsubscribeUrl = '';
if (recipientData && recipientData[recipient]) {
unsubscribeUrl = recipientData[recipient].unsubscribe_url;
}
messageToSend.html = messageToSend.html.replace('%recipient.unsubscribe_url%', unsubscribeUrl);
try {
await ghostMailer.send(messageToSend);
} catch (err) {
// @TODO log this somewhere with state?
common.logging.warn(`Oh no! an email failed to send :( ${recipient}`);
}
if (!mailgunInstance) {
return;
}
let fromAddress = message.from;
if (/@localhost$/.test(message.from)) {
fromAddress = 'localhost@example.com';
common.logging.warn(`Rewriting bulk email from address ${message.from} to ${fromAddress}`);
}
try {
const messageData = Object.assign({}, message, {
to: recipients.join(', '),
from: fromAddress,
'recipient-variables': recipientData
});
await mailgunInstance.messages().send(messageData);
} catch (err) {
common.logging.error({err});
}
return true;
}
};