Электронный маркетинг — мощный инструмент для бизнеса любого размера. Однако по мере роста числа получателей отправка электронных писем может быстро стать узким местом для вашего приложения. В этой статье мы рассмотрим, как масштабировать отправку электронной почты с помощью 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 мы можем легко управлять процессом отправки электронных писем в фоновом режиме, гарантируя, что наша программа не зависнет или не истечет время ожидания при отправке большого количества писем одновременно. Этот подход можно использовать в различных приложениях, таких как рассылка информационных бюллетеней, уведомлений или электронных писем с подтверждением для пользователей.