polymail/newsletters/default/index.js

69 lines
2.6 KiB
JavaScript

/* ==== MODULE ============================================================== */
var polymail = require.main.exports;
var newsletter = new polymail.Newsletter(require('./config.json'));
/* ==== REQUIRES ============================================================ */
var fs = require('fs');
var nodemailer = require('nodemailer');
var smtpPool = require('nodemailer-smtp-pool');
var doT = require('dot');
var md = require('markdown-it')({
typographer: true
});
md.use(require('markdown-it-header-sections'));
md.use(require('markdown-it-deflist'));
var defaultRender = md.renderer.rules.image;
md.renderer.rules.image = function(tokens, idx, options, env, self) {
var token = tokens[idx],
aIndex = token.attrIndex('src');
newsletter.temp.attachments.push({
filename: token.attrs[aIndex][1],
path: '',
cid: token.attrs[aIndex][1]
});
token.attrs[aIndex][1] = 'cid:'+token.attrs[aIndex][1];
return defaultRender(tokens, idx, options, env, self);
};
/* ==== NEWSLETTER ========================================================== */
// our custom build step
newsletter.build = function(file, options, cb) {
// clear potential old newsletter
newsletter.temp = {
attachments: []
};
// merge passed options with newsletter defaults
var opts = polymail.mergeObjects(newsletter.options, options);
// read our provided content file
var content = fs.readFileSync(file);
opts.content = content;
// read our markdown template and build it
var md_source = fs.readFileSync(__dirname+'/templates/md.dot');
var md_template = doT.template(md_source);
var md_result = md_template(opts);
// convert our content md into html
opts.content = md.render(opts.content.toString());
// at this point attachments should be populated with all pertinent attachments - let's modify it to make all paths relative to this file's directory
var path = file;
file = file.replace(/\.[^/.]+$/, "");
for (var i = 0; i < newsletter.temp.attachments.length; i++) {
newsletter.temp.attachments[i].path = file+'/'+newsletter.temp.attachments[i].filename;
}
// read our html template and build it
var html_source = fs.readFileSync(__dirname+'/templates/html.dot');
var html_template = doT.template(html_source);
var html_result = html_template(opts);
// set our temporary mail objects
newsletter.temp.subject = opts.heading + (opts.title ? ' '+opts.title : '');
newsletter.temp.text = md_result;
newsletter.temp.html = html_result;
};
// create our transport
newsletter.transport = nodemailer.createTransport(smtpPool(newsletter.transport_options));
module.exports = newsletter;