1 |
|
2 | const cons = require('consolidate');
|
3 | const dust = require('dustjs-linkedin');
|
4 | const i18next = require('i18next');
|
5 | const nodemailer = require('nodemailer');
|
6 |
|
7 | const config = require('./config');
|
8 | const logger = require('./logger');
|
9 |
|
10 | let transport = null;
|
11 | const options = {};
|
12 |
|
13 |
|
14 | const DEFAULT_SUBJECT = (email, data) => {
|
15 | return `emails.${email}.subject`;
|
16 | };
|
17 |
|
18 |
|
19 | const DEFAULT_TEMPLATE = (email, data) => {
|
20 | return `./views/emails/${email}.dust`;
|
21 | };
|
22 |
|
23 |
|
24 | module.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 |
|
33 | module.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 | };
|