UNPKG

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