var mongoose = require('mongoose'); var nodemailer = require("nodemailer"); var chalk = require("chalk"); const cheerio = require('cheerio'); var db = require("kairoscope-db-models"); var SentMail = db.SentMail; var send_mail = function(msg_data, id) { var content = add_link_tracking(msg_data.message, id) content = add_tracking_pixel(content, id); var mail_msg = { id: id, to: msg_data.to, from: msg_data.from, subject: msg_data.subject, html: content, } // create Nodemailer SES transporter var transporter = nodemailer.createTransport({ host: process.env.AWS_SES_URL, port: 587, secure: false, // upgrade later with STARTTLS auth: { user: process.env.AWS_SES_SMTP_USERNAME, pass: process.env.AWS_SES_SMTP_PASSWORD } }); transporter.sendMail(mail_msg, function (err, info) { if (err) { console.log("Error sending email"); console.log(err); save_sent_email(mail_msg, undefined, false, false); } else { console.log(`Sent email ${chalk.italic(`\'${mail_msg.id}\'`)} successfully`); //console.log(info); save_sent_email(mail_msg, info, true, true); } }); } var save_sent_email = function(email_msg, response_data, sent, delivered) { var new_sent_mail = new SentMail(); if(response_data != undefined) new_sent_mail.sent_id = response_data.messageId; new_sent_mail.message_id = email_msg.id; new_sent_mail.to = email_msg.to; new_sent_mail.from = email_msg.from; new_sent_mail.subject = email_msg.subject; new_sent_mail.message = email_msg.html; new_sent_mail.sent = sent; new_sent_mail.delivered = delivered; new_sent_mail.save().then((sent_mail) => { console.log(`Saved email ${chalk.italic(`\'${sent_mail.message_id}\'`)} to database`); }).catch((error) => { reject(error); }); } // Some checking to see if environment variables are set on statup and show errors if not var check_env_variables = function() { var env = process.env; var e = `${chalk.red(`ERROR:`)}`; if(env.AWS_SES_URL != "" && env.AWS_SES_URL != undefined){ console.log(`Delivery server URL: ${chalk.green(`\'${env.AWS_SES_URL}\'`)}`); } else { var v = `${chalk.yellow(`\'AWS_SES_URL\'`)}`; console.log(`${e} AWS SES URL is missing. To fix this, add ${v} to the environment variables.`); } var has_username = env.AWS_SES_SMTP_USERNAME != "" && env.AWS_SES_SMTP_USERNAME != undefined; var has_password = env.AWS_SES_SMTP_PASSWORD != "" && env.AWS_SES_SMTP_PASSWORD != undefined; if(has_username && has_password){ console.log(`AWS SES authentication is set with username: ${chalk.italic(env.AWS_SES_SMTP_USERNAME)}`); } else { if(!has_username){ var v = `${chalk.yellow(`\'AWS_SES_SMTP_USERNAME\'`)}`; console.log(`${e} AWS SES needs a username. Add ${v} to the environment variables.`); } if(!has_password){ var v = `${chalk.yellow(`\'AWS_SES_SMTP_PASSWORD\'`)}`; console.log(`${e} AWS SES needs a password. Add ${v} to the environment variables.`); } } var has_tracking_url = env.TRACKING_URL != "" && env.TRACKING_URL != undefined; if(has_tracking_url) { console.log(`Tracking URL: ${chalk.green(`\'${env.TRACKING_URL}\'`)}`); } else { var v = `${chalk.yellow(`\'TRACKING_URL\'`)}`; console.log(`${e} The mail delivery service needs a tracking server URL. Add ${v} to the environment variables.`); } } var add_tracking_pixel = function(content, id) { var has_tracking_url = process.env.TRACKING_URL != "" && process.env.TRACKING_URL != undefined; if(has_tracking_url == false) return content; var s = `\n`; return content + s; } var add_link_tracking = function(content, id) { const html = cheerio.load(content); html('a').each( (index, link) => { var url = html(link).attr('href'); var link_id = html(link).text(); //link_id = link_id.replaceAll(" ", "-").replaceAll("/", "").replaceAll("\"", "").replaceAll(":", "").replaceAll("'", ""); var new_url = `${process.env.TRACKING_URL}${id}/redirect?url=${url}&link=${link_id}`; html(link).attr("href", new_url); }); return html.html(); } module.exports.send_mail = send_mail; module.exports.save_sent_email = save_sent_email; module.exports.check_env_variables = check_env_variables;