Электронный маркетинг — мощный инструмент для бизнеса любого размера. Однако по мере роста числа получателей отправка электронных писем может быстро стать узким местом для вашего приложения. В этой статье мы рассмотрим, как масштабировать отправку электронной почты с помощью Node.js и AWS SES (Simple Email Service) для отправки 50 000 электронных писем одновременно.
Прежде чем мы углубимся в технические детали, давайте сначала разберемся с основами отправки электронной почты и ограничениями традиционных методов. Как правило, при отправке электронных писем сервер устанавливает соединение с почтовым сервером получателя, отправляет электронное письмо и ждет ответа. Этот процесс повторяется для каждого электронного письма, что может занять значительное время при отправке большому количеству получателей.
Чтобы преодолеть эти ограничения, мы можем использовать систему очередей, такую как BullMQ, для обработки процесса отправки электронной почты. Вместо того, чтобы отправлять электронные письма напрямую, мы можем добавить электронные письма в очередь и позволить BullMQ обрабатывать процесс отправки в фоновом режиме. Это позволяет нам отправлять несколько электронных писем одновременно и значительно ускоряет процесс.
Давайте посмотрим, как это реализовать с помощью Node.js и AWS SES. Во-первых, нам нужно настроить учетную запись SES и подтвердить адреса электронной почты, с которых мы хотим отправлять электронные письма. Как только это будет сделано, мы можем установить необходимые пакеты: bullmq
, aws-sdk
и nodemailer
.
Далее нам нужно будет создать новую очередь для нашего процесса отправки электронной почты. Мы можем сделать это, используя класс BullMQ
и передав имя очереди в качестве параметра.
const BullMQ = require('bullmq'); const queue = new BullMQ('email-sending');
Затем мы можем использовать метод add
для добавления писем в очередь. В этом примере мы будем добавлять объект, который содержит адрес электронной почты получателя, тему и сообщение.
queue.add('email', { to: '[email protected]', subject: 'Hello', message: 'Hello, World!' });
Далее нам нужно обработать электронные письма в очереди. Для этого мы воспользуемся методом process
и передадим функцию обратного вызова, которая будет вызываться для каждого письма в очереди.
queue.process(async (job) => { // Send email using AWS SES });
Внутри функции обратного вызова мы можем использовать пакет nodemailer
для отправки электронной почты с помощью AWS SES. Нам нужно будет настроить nodemailer
с нашими учетными данными SES, а затем использовать метод sendMail
для отправки электронной почты.
const nodemailer = require('nodemailer'); const AWS = require('aws-sdk'); const ses = new AWS.SES({ accessKeyId: 'ACCESS_KEY', secretAccessKey: 'SECRET_KEY', region: 'REGION' }); const transporter = nodemailer.createTransport({ SES: ses }); transporter.sendMail({ from: '[email protected]', to: job.data.to, subject: job.data.subject, text: job.data.message }, (err, info) => { if (err) { console.log(err); return; } console.log(info); }); // Add emails to the queue for (let i = 0; i < 50000; i++) { queue.add({ to: '[email protected]', subject: 'Test Email', message: 'This is a test email' }); } console.log("50,000 emails added to the queue. Emails will be sent in the background."); // Wait for the queue to be empty before exiting the program queue.on('empty', () => { console.log("All emails have been sent."); process.exit(); });
Теперь мы создадим рабочий процесс, который будет обрабатывать отправку электронных писем. Рабочий процесс — это функция, которая будет вызываться для каждого задания, добавляемого в очередь. Он будет использовать библиотеку nodemailer для отправки электронной почты с помощью AWS SES. Нам также нужно настроить nodemailer с нашими учетными данными SES.
queue.process((job, done) => { const nodemailer = require('nodemailer'); const AWS = require('aws-sdk'); const ses = new AWS.SES({ accessKeyId: 'ACCESS_KEY', secretAccessKey: 'SECRET_KEY', region: 'REGION' }); const transporter = nodemailer.createTransport({ SES: ses }); transporter.sendMail({ from: '[email protected]', to: job.data.to, subject: job.data.subject, text: job.data.message }, (err, info) => { if (err) { console.log(err); return; } console.log(info); return done() }); }); // Add emails to the queue for (let i = 0; i < 50000; i++) { queue.add({ to: '[email protected]', subject: 'Test Email', message: 'This is a test email' }); } console.log("50,000 emails added to the queue. Emails will be sent in the background."); // Wait for the queue to be empty before exiting the program queue.on('empty', () => { console.log("All emails have been sent."); process.exit(); });
Теперь давайте рассмотрим пример создания отправителя электронной почты с использованием Node.js и AWS SES. В этом примере мы будем использовать библиотеку Bull для создания очереди электронных писем, которые необходимо отправить, и мы будем использовать пакет nodemailer для отправки электронных писем с помощью AWS SES. В примере также показано, как с помощью этой архитектуры отправить 50 000 электронных писем одновременно.
Первый шаг — установить необходимые пакеты Bull и nodemailer и импортировать их в наш код. Затем мы создаем новый экземпляр класса Queue, передавая имя нашей очереди, «электронные письма» и детали подключения на наш сервер Redis.
Затем мы определяем функцию, которая будет вызываться каждый раз, когда в очередь добавляется новое задание. Внутри функции мы используем пакет nodemailer для отправки электронной почты с помощью AWS SES. Нам нужно настроить nodemailer с нашими учетными данными SES, а затем использовать метод sendMail для отправки электронной почты.
Наконец, мы добавляем 50 000 писем в очередь и ждем, пока очередь опустеет, прежде чем выйти из программы. При таком подходе мы можем легко масштабировать наш процесс отправки электронной почты для обработки большого количества электронных писем, не перегружая систему и не рискуя тайм-аутами.
Важно отметить, что не рекомендуется отправлять так много писем, так как они могут быть помечены как спам и могут быть занесены в черный список, также лучше сегментировать электронные письма на более мелкие фрагменты и распределять их в течение определенного периода времени.
В заключение, используя Node.js и AWS SES, мы можем создать надежную и масштабируемую архитектуру отправки электронной почты, которая может обрабатывать большое количество электронных писем. С помощью библиотеки Bull мы можем легко управлять процессом отправки электронных писем в фоновом режиме, гарантируя, что наша программа не зависнет или не истечет время ожидания при отправке большого количества писем одновременно. Этот подход можно использовать в различных приложениях, таких как рассылка информационных бюллетеней, уведомлений или электронных писем с подтверждением для пользователей.