import { EnvEmitter } from "./Events.js"; import { EmailHost, EmailPort } from "../config/Env.js"; import nodemailer, { Transporter } from "nodemailer"; import Mail from "nodemailer/lib/mailer/index.js"; import Logger from "./Logger.js"; import { EmailPass, EmailUser } from "../config/CheckableEnv.js"; import SMTPTransport from "nodemailer/lib/smtp-transport/index.js"; import { exitProcess } from "./Process.js"; import { ExitCodes } from "../config/Errors.js"; const mailLogger = new Logger("mail"); class EmailQueue { queue: Promise; transporter: Transporter | null = null; constructor() { let $this = this; this.queue = new Promise((resolve, reject) => { EnvEmitter.addListener("loaded", () => { const transporter = nodemailer.createTransport({ // @ts-ignore host: EmailHost, port: EmailPort, // Change to the appropriate port for your SMTP server // secure: false, // Set to true if your SMTP server requires a secure connection (SSL/TLS) auth: { user: EmailUser, pass: EmailPass, }, }); transporter.verify(function (error, success) { if (error) { reject(error); } else { console.log("Server is ready to send emails"); $this.transporter = transporter; resolve(transporter); } }); }); }).catch((err) => { // exitProcess(ExitCodes.EMAIL_ERROR_GENERIC, { error: err?.message || String(err) }); }); } addEmail(options: Mail.Options) { return (this.queue = this.transporter ?.sendMail({ ...options, from: EmailUser }) .then((info) => { mailLogger.info("Email sent successfully!", info); }) ?? Promise.resolve()); } } const emailQueue = new EmailQueue(); export async function SendEmail(options: Mail.Options) { return emailQueue.addEmail(options); }