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