113 lines
3.6 KiB
JavaScript
113 lines
3.6 KiB
JavaScript
var nodemailer = require('nodemailer');
|
|
var config = require('./config.js');
|
|
var template = require('./template.js');
|
|
var database = require('./database.js');
|
|
|
|
/**
|
|
* Mail module
|
|
*/
|
|
module.exports = {
|
|
transporter: null,
|
|
/**
|
|
* Load mail config.
|
|
*/
|
|
init: function() {
|
|
this.transporter = nodemailer.createTransport(config.smtp);
|
|
|
|
this.transporter.verify(function(error, success) {
|
|
if (error) {
|
|
console.error(error);
|
|
} else if (config.app.debug) {
|
|
console.log('SMTP connection stablished');
|
|
}
|
|
});
|
|
|
|
},
|
|
|
|
/**
|
|
* Send email.
|
|
* @param {Object} recipient - Mail destinatary
|
|
* @param {String} subject - Subject
|
|
* @param {String} body - Mail body
|
|
* @param {Object} attachments - Mail attachments
|
|
* @param {Object} params - Params
|
|
* @param {Object} cb - Callback
|
|
*/
|
|
send: function(recipient, subject, body, attachments, params, cb) {
|
|
let mailOptions = {
|
|
from: '"' + config.app.senderName + '" <' + config.app.senderMail + '>',
|
|
to: recipient,
|
|
subject: subject,
|
|
html: body,
|
|
attachments
|
|
};
|
|
|
|
if (config.env != 'production')
|
|
mailOptions.to = config.app.senderMail;
|
|
|
|
this.transporter.sendMail(mailOptions, (error, info) => {
|
|
try {
|
|
let status = (error ? error.message : 'OK');
|
|
this.log(params.sender, params.recipient, recipient, subject, body, params.message, status);
|
|
|
|
if (error)
|
|
return cb(new Error('Email not sent: ' + error));
|
|
|
|
if (config.app.debug)
|
|
console.log('Mail sent ' + info.messageId + ' [' + info.response + ']');
|
|
|
|
cb();
|
|
} catch (e) {
|
|
throw e;
|
|
}
|
|
});
|
|
},
|
|
|
|
/**
|
|
* Send email with template.
|
|
* @param {String} tplName - Template name
|
|
* @param {Object} params - Params object
|
|
* @param {Object} cb - Callback
|
|
*/
|
|
sendWithTemplate: function(tplName, params, cb) {
|
|
template.get(tplName, params, (error, result) => {
|
|
if (error)
|
|
return cb(error);
|
|
|
|
// Custom attachments
|
|
if (params.attachments)
|
|
params.attachments.forEach(function(attachment) {
|
|
result.attachments.push(attachment);
|
|
});
|
|
|
|
this.send(result.recipient, result.subject, result.body, result.attachments, params, error => {
|
|
if (error)
|
|
return cb(error);
|
|
|
|
cb();
|
|
});
|
|
});
|
|
},
|
|
|
|
/**
|
|
* Add mail log
|
|
* @param {Integer} senderId - Sender id
|
|
* @param {Integer} recipientId - Recipient id
|
|
* @param {String} sender - Sender email
|
|
* @param {String} subject - Mail subject
|
|
* @param {String} body - Mail body
|
|
* @param {String} plainTextBody - Mail plain text body
|
|
* @param {String} status - Mail status
|
|
*/
|
|
log: function(senderId, recipientId, sender, subject, body, plainTextBody, status) {
|
|
let qry = `INSERT INTO mail(senderFk, recipientFk, sender, replyTo, subject, body, plainTextBody, sent, status)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`;
|
|
let qryParams = [senderId, recipientId, sender, config.app.senderMail, subject, body, plainTextBody, 1, status];
|
|
|
|
database.pool.query(qry, qryParams, function(error, result) {
|
|
if (config.app.debug && error)
|
|
console.log('Mail log: ' + error);
|
|
});
|
|
}
|
|
};
|