Source: services/zMailService.ts

import { Observable } from 'rxjs';
import { zIMail, zIMailConfig } from './../interfaces';
import { zConfigMail } from '../configs';
import { zTranslateService } from './zTranslateService';
const nodemailer = require('nodemailer');

/**
 * Module mailing service.
 * @author Gabriel Alves <gbrextreme@hotmail.com>
 * @copyright Ivan Antunes 2021
 */
export class zMailService {
    /**
     * Stores zMailService Instance.
     * @author Gabriel Alves <gbrextreme@hotmail.com>
     * @copyright Ivan Antunes 2021
     */
    private static instance: zMailService | null;

    /**
     * Stores instance zTranslateService.
     * @author Ivan Antunes <ivanantnes75@gmail.com>
     * @copyright Ivan Antunes 2021
     */
    private tService = zTranslateService.getInstance();

    /**
     * @author Gabriel Alves <gbrextreme@hotmail.com>
     * @copyright Ivan Antunes 2021
     */
    private constructor() { }

    /**
     * Function used to get instance of zMailService
     * @author Gabriel Alves <gbrextreme@hotmail.com>
     * @copyright Ivan Antunes 2021
     */
    public static getInstance(): zMailService {
        if (!zMailService.instance) {
            zMailService.instance = new zMailService();
        }
        return zMailService.instance;
    }

    /**
     * Function used to destroy instance of zMailService
     * @author Gabriel Alves <gbrextreme@hotmail.com>
     * @copyright Ivan Antunes 2021
     */
    public static destroyInstance(): void {
        zMailService.instance = null;
    }

    /**
     * Function to send custom mail
     * @author Ivam Antunes <ivanantnes75@gmail.com>
     * @copyright Ivan Antunes 2021
     */
    public sendCustomMail(mail: zIMail, config: zIMailConfig): Observable<void> {
        return new Observable<void>((obs) => {
            const transport = nodemailer.createTransport(config);

            if (mail.html && mail.text !== '') {
                mail.html = `${mail.text} <br><br><br> ${mail.html}`;
            }

            transport.sendMail(mail, (err: any, res: any) => {
                if (err) {
                    console.log(`${this.tService.t('gnc_error_send_mail')} ${err.message}`);
                    obs.error(err.message);
                    obs.complete();
                } else {
                    obs.next();
                    obs.complete();
                }
            });
        });
    }

    /**
     * Function to send mail
     * @author Gabriel Alves <gbrextreme@hotmail.com>
     * @copyright Ivan Antunes 2021
     */
    public sendMail(mail: zIMail): Observable<void> {
        return new Observable<void>((obs) => {
            const transport = nodemailer.createTransport(zConfigMail);

            if (mail.html && mail.text !== '') {
                mail.html = `${mail.text} <br><br><br> ${mail.html}`;
            }

            transport.sendMail(mail, (err: any, res: any) => {
                if (err) {
                    console.log(`${this.tService.t('gnc_error_send_mail')} ${err.message}`);
                    obs.error(err.message);
                    obs.complete();
                } else {
                    obs.next();
                    obs.complete();
                }
            });
        });
    }
}