Перейти к содержанию

Sidekiq

Инструкция для фоновой отправки почты через Sidekiq на Ruby on Rails (Ruby 3.2+). Письма отправляются на SMTP Mailexam® из воркера через Action Mailer — удобно для уведомлений и CI без блокировки HTTP-запроса.

Веб-слой ставит задачу в очередь, Sidekiq отправляет письмо асинхронно (как Celery в Python).

Что понадобится

  • Аккаунт Mailexam® и проект с SMTP-учетными данными.
  • Брокер сообщений — Redis (обязателен для Sidekiq).
  • Ruby 3.2+, Bundler и Rails-приложение.

Скопируйте из приветственного письма (или личного кабинета) для вашего проекта:

  • ВАШ_ЛОГИН — SMTP-логин (например, xxxxx);
  • ВАШ_ПАРОЛЬ — SMTP-пароль (уникальная пара к логину);
  • хост — ВАШ_ЛОГИН.mailexam.ru (совпадает с логином).

1. Зависимости

В Gemfile:

gem "rails", "~> 8.1"
gem "sidekiq", "~> 7.3"
gem "redis", "~> 5.0"
gem "dotenv-rails", groups: %i[development test]
bundle install

Запустите Redis локально (Docker):

docker run -d --name redis -p 6379:6379 redis:7-alpine

2. Переменные окружения

Файл .env в корне проекта:

REDIS_URL=redis://localhost:6379/0

MAILEXAM_LOGIN=ВАШ_ЛОГИН
MAILEXAM_PASSWORD=ВАШ_ПАРОЛЬ
MAILEXAM_PORT=587
MAIL_FROM=noreply@example.test

SMTP-хост: ВАШ_ЛОГИН.mailexam.ru.

3. Конфигурация Action Mailer

Тот же подход, что в Ruby on Railsconfig/initializers/mailexam_mailer.rb или SMTP-настройки в соответствующих окружениях.

4. Конфигурация Sidekiq

config/initializers/sidekiq.rb:

Sidekiq.configure_server do |config|
  config.redis = { url: ENV.fetch("REDIS_URL", "redis://localhost:6379/0") }
end

Sidekiq.configure_client do |config|
  config.redis = { url: ENV.fetch("REDIS_URL", "redis://localhost:6379/0") }
end

config/sidekiq.yml:

:concurrency: 5
:queues:
  - default

Добавьте пути автозагрузки воркеров в config/application.rb:

config.autoload_paths << Rails.root.join("app/workers")
config.eager_load_paths << Rails.root.join("app/workers")

5. Mailer, worker и маршрут

Mailer (как в примере Rails):

# app/mailers/test_mailer.rb
class TestMailer < ApplicationMailer
  def test_email
    @body = params[:body]

    mail(
      to: params[:to],
      subject: params[:subject]
    )
  end
end

Worker:

# app/workers/mail_test_worker.rb
class MailTestWorker
  include Sidekiq::Worker

  def perform(to, subject, body)
    TestMailer.with(
      to: to,
      subject: subject,
      body: body
    ).test_email.deliver_now
  end
end

Контроллер — постановка задачи в очередь вместо deliver_now:

# app/controllers/mail_controller.rb
class MailController < ApplicationController
  def test
    payload = JSON.parse(request.body.read.presence || "{}")

    MailTestWorker.perform_async(
      payload["to"].presence || "user@example.test",
      payload["subject"].presence || "Sidekiq + Mailexam",
      payload["body"].presence || payload["text"].presence || "Тест Mailexam из Sidekiq"
    )

    render json: { status: "ok", queued: true }
  end
end

Запустите Redis, Sidekiq и Rails:

bundle exec sidekiq -C config/sidekiq.yml
bin/rails server
curl -X POST http://127.0.0.1:3000/mail/test \
  -H 'Content-Type: application/json' \
  -d '{"to":"user@example.test","subject":"Проверка","body":"Привет"}'

Письмо появится в личном кабинете Mailexam® → ваш проект → входящие после обработки задачи воркером.

6. Локальная разработка и CI

Среда Рекомендация
local Redis + процесс Sidekiq + сервер Rails
CI Redis service, REDIS_URL и секреты Mailexam в переменных pipeline

Пример для .gitlab-ci.yml:

variables:
  REDIS_URL: redis://redis:6379/0
  MAILEXAM_LOGIN: $MAILEXAM_LOGIN
  MAILEXAM_PASSWORD: $MAILEXAM_PASSWORD
  MAILEXAM_PORT: "587"
  MAIL_FROM: "noreply@example.test"

После интеграционного теста проверьте доставку через API Mailexam®.

7. Типичные проблемы

Задача поставлена в очередь, но письмо не отправлено

  • Убедитесь, что Sidekiq запущен.
  • Проверьте REDIS_URL и доступность Redis.
  • Посмотрите логи Sidekiq на ошибки SMTP.

Ошибка TLS или authentication failed

  • SMTP-хост должен быть {логин}.mailexam.ru, с тем же логином из приветственного письма.

Письмо не в личном кабинете

  • Смотрите входящие того же проекта Mailexam®.
  • Дождитесь обработки задачи воркером.

См. также