const sgMail = require('@sendgrid/mail');
const kue = require('kue');

// set API key
sgMail.setApiKey(process.env.SENDGRID_API_KEY);

// create a queue
const queue = kue.createQueue();

// process emails in the queue
queue.process('email', (job, done) => {
  const { to, from, subject, text, html } = job.data;

  // send email using SendGrid
  sgMail.send({ to, from, subject, text, html });

  // call done when the job is complete
  done();
});

// add 10000 emails to the queue
for (let i = 0; i < 10000; i++) {
  queue.create('email', {
    to: `@example.com">email${i}@example.com`,
    from: '[email protected]',
    subject: 'Hello',
    text: 'Hello, welcome to my website!',
    html: '<p>Hello, welcome to my website!</p>',
  }).save();
}
  • Сначала мы импортируем пакеты @sendgrid/mail и kue. Пакет @sendgrid/mail позволяет нам взаимодействовать с API SendGrid, а пакет kue — это мощная очередь заданий для Node.js.
  • Далее мы устанавливаем ключ API с помощью sgMail.setApiKey(). Вы можете получить ключ API из своей учетной записи SendGrid.
  • Затем мы создаем новую очередь, используя kue.createQueue().
  • Мы определяем функцию process, которая будет вызываться для каждого задания в очереди, эта функция будет отправлять электронную почту с помощью SendGrid.
  • Внутри цикла for мы добавляем в очередь 10000 заданий, каждое задание содержит данные электронной почты, такие как «кому», «от», «тема», «текст», «html».
  • Наконец, мы вызываем метод .save(), чтобы сохранить задание в очереди.

Этот код использует очередь для обработки большого количества электронных писем. Преимущество использования очереди заключается в том, что она позволяет отправлять электронные письма в фоновом режиме, не блокируя ваше приложение. С очередью ваше приложение может продолжать обрабатывать другие задачи, пока электронные письма отправляются. Кроме того, если при отправке сообщения электронной почты возникают какие-либо ошибки, очередь автоматически повторяет задание, что может помочь гарантировать успешную отправку всех сообщений электронной почты.

Вы также можете установить параметры attempts и backoff при создании задания, чтобы указать, сколько раз задание должно быть повторено в случае сбоя и как долго ждать перед повторной попыткой.

queue.create('email', {
    to: `@example.com">email${i}@example.com`,
    from: '[email protected]',
    subject: 'Hello',
    text: 'Hello, welcome to my website!',
    html: '<p>Hello, welcome to my website!</p>',
  })
  .attempts(5)
  .backoff({ delay: 60 * 1000, type: 'fixed' })
  .save();

Это задание будет повторено 5 раз и будет ждать 60 секунд перед повторной попыткой.