@tmlmobilidade/emails
Version:
80 lines (79 loc) • 3.57 kB
JavaScript
/* * */
import { asyncSingletonProxy } from '@tmlmobilidade/utils';
import nodemailer from 'nodemailer';
/* * */
export class EmailProvider {
//
static _instance;
_smtpTransporter;
/**
* Return the instance of the EmailProvider.
*/
static async getInstance() {
if (!EmailProvider._instance) {
const instance = new EmailProvider();
await instance.connect();
EmailProvider._instance = instance;
}
return EmailProvider._instance;
}
/**
* Connect to the SMTP server and return the transporter instance.
*/
async connect() {
try {
// Check for required environment variables
if (!process.env.TML_PROVIDER_EMAIL_SERVER_HOST)
throw new Error('Missing required environment variable: TML_PROVIDER_EMAIL_SERVER_HOST');
if (!process.env.TML_PROVIDER_EMAIL_SERVER_PORT)
throw new Error('Missing required environment variable: TML_PROVIDER_EMAIL_SERVER_PORT');
if (!process.env.TML_PROVIDER_EMAIL_AUTH_CLIENT_ID)
throw new Error('Missing required environment variable: TML_PROVIDER_EMAIL_AUTH_CLIENT_ID');
if (!process.env.TML_PROVIDER_EMAIL_AUTH_CLIENT_SECRET)
throw new Error('Missing required environment variable: TML_PROVIDER_EMAIL_AUTH_CLIENT_SECRET');
if (!process.env.TML_PROVIDER_EMAIL_AUTH_ACCESS_URL)
throw new Error('Missing required environment variable: TML_PROVIDER_EMAIL_AUTH_ACCESS_URL');
if (!process.env.TML_PROVIDER_EMAIL_AUTH_REFRESH_TOKEN)
throw new Error('Missing required environment variable: TML_PROVIDER_EMAIL_AUTH_REFRESH_TOKEN');
if (!process.env.TML_PROVIDER_EMAIL_AUTH_USER)
throw new Error('Missing required environment variable: TML_PROVIDER_EMAIL_AUTH_USER');
if (!process.env.TML_PROVIDER_EMAIL_FROM)
throw new Error('Missing required environment variable: TML_PROVIDER_EMAIL_FROM');
// Connect to the SMTP server
this._smtpTransporter = nodemailer.createTransport({
auth: {
accessUrl: process.env.TML_PROVIDER_EMAIL_AUTH_ACCESS_URL,
clientId: process.env.TML_PROVIDER_EMAIL_AUTH_CLIENT_ID,
clientSecret: process.env.TML_PROVIDER_EMAIL_AUTH_CLIENT_SECRET,
refreshToken: process.env.TML_PROVIDER_EMAIL_AUTH_REFRESH_TOKEN,
type: 'OAuth2',
user: process.env.TML_PROVIDER_EMAIL_AUTH_USER,
},
from: process.env.TML_PROVIDER_EMAIL_FROM,
host: process.env.TML_PROVIDER_EMAIL_SERVER_HOST,
port: Number(process.env.TML_PROVIDER_EMAIL_SERVER_PORT),
});
return this._smtpTransporter;
}
catch (error) {
throw new Error('Error connecting to SMTP server', { cause: error });
}
}
/**
* Send an email.
* @param emailOptions - The email options.
* @returns A promise that resolves when the email is sent.
*/
async send(sendMailOptions) {
try {
await this._smtpTransporter.sendMail({
...this._smtpTransporter.options,
...sendMailOptions,
});
}
catch (error) {
throw new Error('Error sending email', { cause: error });
}
}
}
export const emailProvider = asyncSingletonProxy(EmailProvider);