«Отправлять электронные письма в 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();