qcobjects-lib-sendemail
Version:
QCObjects Lib to send emails using NodeMailer and Gmail.
185 lines (170 loc) • 6.13 kB
JavaScript
/**
* QCObjects SendEmail
* ________________
*
* Author: Jean Machuca <correojean@gmail.com>
*
* Cross Browser Javascript Framework for MVC Patterns
* QuickCorp/QCObjects is licensed under the
* GNU Lesser General Public License v3.0
* [LICENSE] (https://github.com/QuickCorp/QCObjects/blob/master/LICENSE.txt)
*
* Permissions of this copyleft license are conditioned on making available
* complete source code of licensed works and modifications under the same
* license or the GNU GPLv3. Copyright and license notices must be preserved.
* Contributors provide an express grant of patent rights. However, a larger
* work using the licensed work through interfaces provided by the licensed
* work may be distributed under different terms and without source code for
* the larger work.
*
* Copyright (C) 2015 Jean Machuca,<correojean@gmail.com>
*
* Everyone is permitted to copy and distribute verbatim copies of this
* license document, but changing it is not allowed.
*/
/*eslint no-unused-vars: "off"*/
/*eslint no-redeclare: "off"*/
/*eslint no-empty: "off"*/
/*eslint strict: "off"*/
/*eslint no-mixed-operators: "off"*/
/*eslint no-undef: "off"*/
/*eslint no-useless-escape: "off"*/
;
const fs = require("fs");
const path = require("path");
const absolutePath = path.resolve(__dirname, "./");
const templatesPath = path.resolve(absolutePath, "../../templates/");
var nodemailer = require("nodemailer");
const assignData = function (source, data) {
// source = source.replace(new RegExp("\\*\\|(.*)\\|\\*", "g"),"{{$1}}");
source = source.replace(new RegExp("\\*\\|(.*)\:(.*)\\|\\*", "g"), "{{$1_$2}}");
return new Promise((resolve, reject) => {
(New(Component, {
name: "static_source",
template: source,
cached: false,
tplsource: "inline",
data: JSON.parse(data),
done({
request,
component
}) {
resolve(component.parsedAssignmentText);
return Promise.resolve({
request,
component
});
}
}));
}).catch(e => {
logger.debug(e.toString());
});
};
Package("com.qcobjects.backend.sendemail", [
Class("EmailNotification", {
microservice: null,
parseData(formData, name) {
return JSON.parse(formData.toString())[name];
},
sendEmailUser(formData) {
let microservice = this.microservice;
let emailNotification = this;
return emailNotification.sendEmail(formData,
CONFIG.get("gmail_from"),
emailNotification.parseData(formData, "email"),
CONFIG.get("sendemail_subject_user"),
CONFIG.get("sendemail_user_template_file")
);
},
sendEmailBackoffice(formData) {
let microservice = this.microservice;
let emailNotification = this;
return emailNotification.sendEmail(formData,
CONFIG.get("gmail_from"),
CONFIG.get("gmail_to"),
CONFIG.get("sendemail_subject_backoffice"),
CONFIG.get("sendemail_backoffice_template_file")
);
},
sendEmail(formData, from, to, subject, email_template_name) {
var microservice = this.microservice;
let emailNotification = this;
return new Promise((resolve, reject) => {
logger.debug("PREPARING DATA TO SEND EMAIL...");
var emailBody = fs.readFileSync(path.resolve(`${CONFIG.get("basePath")}`, `${email_template_name}`));
assignData(emailBody.toString(), formData.toString()).then(function (response) {
logger.debug("SENDING EMAIL...");
emailBody = response;
var transport = {
"gmail_user_pass": {
attachDataUrls: true,
service: "gmail",
auth: {
user: CONFIG.get("gmail_user"),
pass: CONFIG.get("gmail_password")
}
},
"gmail_2lo": {
host: "smtp.gmail.com",
port: 465,
secure: true,
auth: {
type: "OAuth2",
user: CONFIG.get("gmail_user"),
serviceClient: CONFIG.get("gmail_service_client"),
privateKey: CONFIG.get("gmail_service_account_private_key"),
accessToken: CONFIG.get("gmail_access_token"),
expires: CONFIG.get("gmail_access_token_expires")
}
},
"gmail_3lo": {
host: "smtp.gmail.com",
port: 465,
secure: true,
auth: {
type: "OAuth2",
user: CONFIG.get("gmail_user"),
clientId: CONFIG.get("gmail_client_id"),
clientSecret: CONFIG.get("gmail_client_secret"),
refreshToken: CONFIG.get("gmail_refresh_token"),
accessToken: CONFIG.get("gmail_access_token"),
expires: CONFIG.get("gmail_access_token_expires")
}
}
};
var sendemail_transport = CONFIG.get("sendemail_transport", "gmail_user_pass");
if (!Object.hasOwnProperty.call(transport, sendemail_transport)) {
throw new Error(`Transport ${sendemail_transport} not found`);
}
var transporter = nodemailer.createTransport(transport[sendemail_transport]);
const mailOptions = {
from: from, // sender address
to: to, // list of receivers
subject: subject, // Subject line
html: emailBody // plain text body
};
microservice.body = {
result: "OK"
};
try {
transporter.sendMail(mailOptions, function (err, info) {
if (err) {
logger.warn(err.toString());
reject(err);
} else {
logger.info(_DataStringify(info));
resolve();
}
});
} catch (e) {
logger.debug(e.toString());
reject(e);
}
}).catch(function (e) {
logger.debug(e.toString());
reject(e);
});
});
}
})
]);