127.0.0.1:8000 watch-together / master server / utils / mailgun.js
master

Tree @master (Download .tar.gz)

mailgun.js @masterraw · history · blame

const path = require('path');
const fs = require('fs');
const log = require('./log').create_logger("Mailgun");
const formData = require('form-data');
const Mailgun = require('mailgun.js');
const mailgun = new Mailgun(formData);
const mg = process.env.MG_API_KEY ? mailgun.client({
    username: 'api',
    key: process.env.MG_API_KEY
}) : {
    messages: {
        create: (domain, options) => new Promise(function(resolve) {
            log.v(`Email to ${options.to} not sent - no API key`, domain, options);
            resolve();
        })
    }
};

// mg.domains.list().then(console.log).catch(console.error);

const module_exports = Object.entries({
    confirmation: {
        subject: 'Confirm Your Watch Together Email',
        params: {
            domain: process.env.DOMAIN
        }
    },
    password_reset: {
        subject: 'Reset Your Watch Together Password',
        params: {
            domain: process.env.DOMAIN
        }
    },
    password_changed: {
        subject: 'Watch Together Password Changed',
        params: {
            domain: process.env.DOMAIN
        }
    },
    virus_detected: {
        subject: 'Watch Together Virus Detected'
    },
    account_delete_code: {
        subject: 'Watch Together Account Deletion Requested'
    },
    account_deleted: {
        subject: 'Watch Together Account Deleted'
    }
}).reduce(function(acc, [template_name, data]) {
    console.log("Loading email template: ", template_name);

    // Load Raw HTML string as value
    const template = fs.readFileSync(
        path.resolve(__dirname, 'email_templates', template_name + ".html")
    ).toString();

    return Object.assign(acc, {
        [`send_${template_name}_email`]: function(recipient, params) {
            let html = template;
            params = Object.assign(data.params || {}, params);
            for (let [key, value] of Object.entries(params)) {
                key = `[${key.toUpperCase()}]`;
                html = html.split(key).join(value);
            }
            log.general.info(`Send ${template_name} email to ${recipient}`);
            return mg.messages.create(process.env.DOMAIN, {
                from: `Watch Together <noreply@${process.env.DOMAIN}>`,
                to: recipient,
                subject: data.subject,
                html: html
            }).then(log.general.info);
        }
    });
}, {});

module.exports = module_exports;