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]
Запустите Redis локально (Docker):
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 Rails — config/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:
Добавьте пути автозагрузки воркеров в 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:
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®.
- Дождитесь обработки задачи воркером.
См. также¶
- Каталог примеров
- Пример реализации (Sidekiq) на Mos.Hub
- Ruby on Rails — синхронная отправка Action Mailer на том же SMTP-стеке
- Celery — фоновая отправка почты в Python
- BullMQ — фоновая отправка почты в Node.js
- Документация REST API Mailexam®
- Sidekiq wiki