UNPKG

2.64 kBJavaScriptView Raw
1
2const cons = require('consolidate');
3const dust = require('dustjs-linkedin');
4const i18next = require('i18next');
5const nodemailer = require('nodemailer');
6
7const config = require('./config');
8const logger = require('./logger');
9
10let transport = null;
11const options = {};
12
13//
14const DEFAULT_SUBJECT = (email, data) => {
15 return `emails.${email}.subject`;
16};
17
18//
19const DEFAULT_TEMPLATE = (email, data) => {
20 return `./views/emails/${email}.dust`;
21};
22
23//
24module.exports.init = function() {
25 if (config.mailer) {
26 transport = nodemailer.createTransport(config.mailer.transport);
27 options.subject = config.mailer.subject || DEFAULT_SUBJECT;
28 options.template = config.mailer.template || DEFAULT_TEMPLATE;
29 }
30};
31
32//
33module.exports.send = function(email, data) {
34
35 if (!data || !data.to) {
36 logger.warn('mailer.send: no email for recipient');
37 return;
38 }
39 if (!transport) {
40 logger.warn('mailer.send: missing transport configuration');
41 return;
42 }
43
44 data.from = data.from || config.mailer.defaultfrom;
45 data.lang = data.lang || 'en';
46 data.lng = data.lang;
47 data.subject = data.subject || i18next.t(options.subject(email, data), data);
48 data.views = './views';
49
50 //
51 data.t = function(chunk, context, bodies, params) {
52 const key = dust.helpers.tap(params.key, chunk, context);
53 params.lng = data.lang;
54 const translation = i18next.t(key, params);
55 return chunk.write(translation);
56 };
57
58 const template = data.template || options.template(email, data);
59
60 const renderBody = function(callback) {
61 if (data.body) {
62 return callback(null, data.body);
63 }
64 cons.dust(template, data, callback);
65 };
66
67 renderBody(function(err, html) {
68 if (err || !html) {
69 logger.error('mailer.send: error - could not render template ' + template);
70 logger.error(err);
71 return;
72 }
73
74 logger.info('mailer.send: Sending mail ' + email + ' to ' + data.to + ' in ' + data.lang);
75 const headers = {};
76 if (config.mailer.subaccount) {
77 headers['X-MC-Subaccount'] = config.mailer.subaccount;
78 }
79 var mailOptions = {
80 from: data.from,
81 to: data.to,
82 replyTo: data.replyTo,
83 cc: data.cc,
84 bcc: data.bcc,
85 attachments: data.attachments,
86 subject: data.subject,
87 html,
88 headers
89 };
90 transport.sendMail(mailOptions, function(err, res) {
91 if (err) {
92 logger.error(err);
93 } else {
94 logger.info('mailer.send: Message ' + email + ' sent: ' + res.response);
95 }
96 });
97 });
98};