«Отправлять электронные письма в Node.js с помощью Typescript с использованием нескольких поставщиков услуг электронной почты»

Отправка электронных писем является неотъемлемой частью многих приложений, и настройка почтовых провайдеров может оказаться непростой задачей для разработчиков. В этой статье мы рассмотрим, как упростить настройку службы электронной почты с помощью Nodemailer, популярного модуля Node.js для отправки электронных писем.

Nodemailer предоставляет простой и гибкий API для отправки электронных писем с поддержкой нескольких поставщиков электронной почты. В этом примере мы будем использовать двух почтовых провайдеров, Gmail и Mailtrap. Мы создадим класс EmailService, который будет обрабатывать отправку электронных писем, и функцию sendEmail, которая будет использовать класс EmailService для отправки электронных писем.

Начнем с просмотра кода:

import nodemailer, { SendMailOptions } from 'nodemailer';

interface EmailOptions {
    service?: string;
    host?: string;
    port?: number;
    auth: {
        user: string;
        pass: string;
    };
}

class EmailService {
    private transporter: any;

    constructor(private options: EmailOptions) {
        this.transporter = nodemailer.createTransport(options);
    }

    public async sendMail(mailOptions: SendMailOptions): Promise<void> {
        await this.transporter.sendMail(mailOptions);
    }
}

const getEmailService = (): EmailService => {
    const emailProviders: { [key: string]: () => EmailService } = {
        gmail: () =>
            new EmailService({
                service: 'gmail',
                auth: {
                    user: process.env.GMAIL_USERNAME,
                    pass: process.env.GMAIL_PASSWORD,
                },
            }),
        mailtrap: () =>
            new EmailService({
                host: process.env.MAILTRAP_HOST,
                port: 2525,
                auth: {
                    user: process.env.MAILTRAP_USERNAME,
                    pass: process.env.MAILTRAP_PASSWORD,
                },
            }),
    };

    const defaultEmailProvider =
        process.env.DEFAULT_EMAIL_PROVIDER?.toLowerCase() || 'mailtrap';

    if (!emailProviders[defaultEmailProvider]) {
        throw new Error(
            `Invalid email provider '${defaultEmailProvider}'. Supported providers are ${Object.keys(
                emailProviders
            ).join(', ')}`
        );
    }

    return emailProviders[defaultEmailProvider]();
};

const sendEmail = async (to: string | string[], subject: string, html: string): Promise<void> => {
    const emailService = getEmailService();

    const mailOptions = {
        from: process.env.EMAIL_SENDER,
        to: Array.isArray(to) ? to.join(',') : to,
        subject: subject,
        html: html,
    };

    await emailService.sendMail(mailOptions);
};

export default sendEmail;

Приведенный выше код экспортирует функцию с именем sendEmail, которая принимает адреса электронной почты получателя, тему электронной почты и HTML-содержимое электронного письма. Затем он вызывает функцию getEmailService для получения экземпляра службы электронной почты на основе поставщика электронной почты по умолчанию, указанного в переменных среды. Затем создается объект mailOptions с данными электронной почты, и для отправки электронной почты вызывается функция sendMail экземпляра службы электронной почты.

Функция getEmailService возвращает экземпляр класса EmailService на основе поставщика услуг электронной почты по умолчанию, установленного в переменных среды. Класс EmailService принимает объект EmailOptions с данными поставщика электронной почты, такими как имя службы, хост, порт и данные аутентификации.

В функции getEmailService определен объект с именем emailProviders для сопоставления имен провайдеров электронной почты с функциями, которые возвращают экземпляр класса EmailService с соответствующими параметрами. В этом примере поставщики электронной почты Gmail и Mailtrap определены с соответствующими параметрами.

Таким образом, функция sendEmail отправляет электронное письмо с использованием поставщика электронной почты по умолчанию, класс EmailService используется для отправки электронных писем с библиотекой nodemailer, а функция getEmailService возвращает экземпляр EmailService на основе поставщика электронной почты по умолчанию, установленного в переменных среды.

Использование

После установки переменных среды вы можете использовать функцию sendEmail для отправки электронных писем. Вот пример:

import sendEmail from './sendEmail';

async function main() {
  const to = '[email protected]';
  const subject = 'Test email';
  const html = '<p>This is a test email.</p>';

  await sendEmail(to, subject, html);

  console.log('Email sent!');
}

main();