helpers.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. var mongoose = require('mongoose');
  2. var nodemailer = require("nodemailer");
  3. var chalk = require("chalk");
  4. const cheerio = require('cheerio');
  5. var db = require("kairoscope-db-models");
  6. var SentMail = db.SentMail;
  7. var send_mail = function(msg_data, id) {
  8. var content = add_link_tracking(msg_data.message, id)
  9. content = add_tracking_pixel(content, id);
  10. var mail_msg = {
  11. id: id,
  12. to: msg_data.to,
  13. from: msg_data.from,
  14. subject: msg_data.subject,
  15. html: content,
  16. }
  17. // create Nodemailer SES transporter
  18. var transporter = nodemailer.createTransport({
  19. host: process.env.AWS_SES_URL,
  20. port: 587,
  21. secure: false, // upgrade later with STARTTLS
  22. auth: {
  23. user: process.env.AWS_SES_SMTP_USERNAME,
  24. pass: process.env.AWS_SES_SMTP_PASSWORD
  25. }
  26. });
  27. transporter.sendMail(mail_msg, function (err, info) {
  28. if (err) {
  29. console.log("Error sending email");
  30. console.log(err);
  31. save_sent_email(mail_msg, undefined, false, false);
  32. } else {
  33. console.log(`Sent email ${chalk.italic(`\'${mail_msg.id}\'`)} successfully`);
  34. //console.log(info);
  35. save_sent_email(mail_msg, info, true, true);
  36. }
  37. });
  38. }
  39. var save_sent_email = function(email_msg, response_data, sent, delivered) {
  40. var new_sent_mail = new SentMail();
  41. if(response_data != undefined) new_sent_mail.sent_id = response_data.messageId;
  42. new_sent_mail.message_id = email_msg.id;
  43. new_sent_mail.to = email_msg.to;
  44. new_sent_mail.from = email_msg.from;
  45. new_sent_mail.subject = email_msg.subject;
  46. new_sent_mail.message = email_msg.html;
  47. new_sent_mail.sent = sent;
  48. new_sent_mail.delivered = delivered;
  49. new_sent_mail.save().then((sent_mail) => {
  50. console.log(`Saved email ${chalk.italic(`\'${sent_mail.message_id}\'`)} to database`);
  51. }).catch((error) => { reject(error); });
  52. }
  53. // Some checking to see if environment variables are set on statup and show errors if not
  54. var check_env_variables = function() {
  55. var env = process.env;
  56. var e = `${chalk.red(`ERROR:`)}`;
  57. if(env.AWS_SES_URL != "" && env.AWS_SES_URL != undefined){
  58. console.log(`Delivery server URL: ${chalk.green(`\'${env.AWS_SES_URL}\'`)}`);
  59. } else {
  60. var v = `${chalk.yellow(`\'AWS_SES_URL\'`)}`;
  61. console.log(`${e} AWS SES URL is missing. To fix this, add ${v} to the environment variables.`);
  62. }
  63. var has_username = env.AWS_SES_SMTP_USERNAME != "" && env.AWS_SES_SMTP_USERNAME != undefined;
  64. var has_password = env.AWS_SES_SMTP_PASSWORD != "" && env.AWS_SES_SMTP_PASSWORD != undefined;
  65. if(has_username && has_password){
  66. console.log(`AWS SES authentication is set with username: ${chalk.italic(env.AWS_SES_SMTP_USERNAME)}`);
  67. } else {
  68. if(!has_username){
  69. var v = `${chalk.yellow(`\'AWS_SES_SMTP_USERNAME\'`)}`;
  70. console.log(`${e} AWS SES needs a username. Add ${v} to the environment variables.`);
  71. }
  72. if(!has_password){
  73. var v = `${chalk.yellow(`\'AWS_SES_SMTP_PASSWORD\'`)}`;
  74. console.log(`${e} AWS SES needs a password. Add ${v} to the environment variables.`);
  75. }
  76. }
  77. var has_tracking_url = env.TRACKING_URL != "" && env.TRACKING_URL != undefined;
  78. if(has_tracking_url) {
  79. console.log(`Tracking URL: ${chalk.green(`\'${env.TRACKING_URL}\'`)}`);
  80. } else {
  81. var v = `${chalk.yellow(`\'TRACKING_URL\'`)}`;
  82. console.log(`${e} The mail delivery service needs a tracking server URL. Add ${v} to the environment variables.`);
  83. }
  84. }
  85. var add_tracking_pixel = function(content, id) {
  86. var has_tracking_url = process.env.TRACKING_URL != "" && process.env.TRACKING_URL != undefined;
  87. if(has_tracking_url == false) return content;
  88. var s = `\n<img src="${process.env.TRACKING_URL}${id}/image.png">`;
  89. return content + s;
  90. }
  91. var add_link_tracking = function(content, id) {
  92. const html = cheerio.load(content);
  93. html('a').each( (index, link) => {
  94. var url = html(link).attr('href');
  95. var link_id = html(link).text();
  96. //link_id = link_id.replaceAll(" ", "-").replaceAll("/", "").replaceAll("\"", "").replaceAll(":", "").replaceAll("'", "");
  97. var new_url = `${process.env.TRACKING_URL}${id}/redirect?url=${url}&link=${link_id}`;
  98. html(link).attr("href", new_url);
  99. });
  100. return html.html();
  101. }
  102. module.exports.send_mail = send_mail;
  103. module.exports.save_sent_email = save_sent_email;
  104. module.exports.check_env_variables = check_env_variables;