import os from "node:os"; import path from "node:path"; import { fileURLToPath } from "node:url"; import { promisify } from "node:util"; import type { Transporter } from "nodemailer"; import nodemailer from "nodemailer"; import type Mail from "nodemailer/lib/mailer/index.js"; import type { Address } from "nodemailer/lib/mailer/index.js"; import type SMTPTransport from "nodemailer/lib/smtp-transport/index.js"; import hbs from "nodemailer-express-handlebars"; import { returnFunc } from "./returnHelper.utils.js"; import { tryCatch } from "./trycatch.utils.js"; interface HandlebarsMailOptions extends Mail.Options { template: string; context: Record; } interface EmailData { email: string; subject: string; template: string; context: Record; } export const sendEmail = async (data: EmailData) => { let transporter: Transporter; let fromEmail: string | Address; if (os.hostname().includes("OLP")) { transporter = nodemailer.createTransport({ service: "gmail", auth: { user: process.env.EMAIL_USER, pass: process.env.EMAIL_PASSWORD, // The 16-character App Password }, //debug: true, }); // update the from email fromEmail = process.env.EMAIL_USER as string; // update the from email fromEmail = `donotreply@alpla.com`; } else { //create the servers smtp config let host = `${os.hostname().replace("VMS006", "")}-smtp.alpla.net`; if (os.hostname().includes("VMS036")) { host = "USMCD1-smtp.alpla.net"; } transporter = nodemailer.createTransport({ host: host, port: 25, rejectUnauthorized: false, //secure: false, // auth: { // user: "alplaprod", // pass: "obelix", // }, debug: true, } as SMTPTransport.Options); // update the from email fromEmail = `donotreply@alpla.com`; } // create the handlebars view const viewPath = path.resolve( path.dirname(fileURLToPath(import.meta.url)), "./mailViews", ); const handlebarOptions = { viewEngine: { extname: ".hbs", defaultLayout: "", partialsDir: viewPath, }, viewPath: viewPath, extName: ".hbs", }; transporter.use("compile", hbs(handlebarOptions)); const mailOptions: HandlebarsMailOptions = { from: fromEmail, to: data.email, subject: data.subject, //text: "You will have a reset token here and only have 30min to click the link before it expires.", //html: emailTemplate("Blake's Test", "This is an example with css"), template: data.template, // Name of the Handlebars template (e.g., 'welcome.hbs') context: data.context, }; // now verify and send the email const sendMailPromise = promisify(transporter.sendMail).bind(transporter); const { data: mail, error } = await tryCatch(sendMailPromise(mailOptions)); if (mail) { return returnFunc({ success: true, level: "info", module: "utils", subModule: "sendmail", message: `Email was sent to: ${data.email}`, data: [], notify: false, }); } if (error) { return returnFunc({ success: false, level: "error", module: "utils", subModule: "sendmail", message: `Error sending Email to : ${data.email}`, data: [{ error: error }], notify: false, }); } };