import { Transporter, createTransport } from 'nodemailer'; type MailSettings = { smtpHostString: string; smtpPort: number; password: string; sender: string; }; export class MailUtil { private transporter: Transporter; private settings: MailSettings; private static instance: MailUtil; static getInstance() { if (!MailUtil.instance) { MailUtil.instance = new MailUtil({ smtpHostString: `${process.env.MAIL_SMTP_HOST}`, smtpPort: parseInt(`${process.env.MAIL_SMTP_PORT}`, 0), password: `${process.env.MAIL_AUTH_PASS}`, sender: `${process.env.MAIL_AUTH_USER}` }); } return MailUtil.instance; } constructor(settings: MailSettings) { this.settings = settings; this.transporter = createTransport({ host: this.settings.smtpHostString, port: this.settings.smtpPort, secure: true, auth: { user: this.settings.sender, pass: this.settings.password } }); } async sendMail(options: { to: string; subject: string; text: string; }): Promise { return new Promise((resolve, reject: (error: Error) => void) => { this.transporter.sendMail( { from: this.settings.sender, to: options.to, subject: options.subject, text: options.text }, error => { if (error) { reject(error); } else { resolve(); } } ); }); } }