S

Sidekiq

Sidekiq + Mailexam

Минимальный пример Sidekiq на Ruby on Rails, который отправляет тестовое письмо через SMTP Mailexam с помощью Action Mailer в фоновом worker.

Основан на руководстве Mailexam для Sidekiq.

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

  • Аккаунт Mailexam и проект с SMTP-учётными данными.
  • Ruby 3.2+, Bundler и Redis (брокер Sidekiq).

Из приветственного письма или личного кабинета Mailexam:

Переменная Описание
MAILEXAM_LOGIN SMTP-логин (например, xxxxx)
MAILEXAM_PASSWORD SMTP-пароль (пара к логину)
Хост {MAILEXAM_LOGIN}.mailexam.ru (задаётся в config/initializers/mailexam_mailer.rb)

Быстрый старт (на хосте)

  1. Запустите Redis (если ещё не запущен локально):
docker run -d --name redis -p 6379:6379 redis:7-alpine
  1. Установите зависимости:
bundle install
  1. Скопируйте пример файла окружения и заполните учётные данные:
cp .env.example .env
  1. Отредактируйте .env:
MAILEXAM_LOGIN=ВАШ_ЛОГИН
MAILEXAM_PASSWORD=ВАШ_ПАРОЛЬ
MAILEXAM_PORT=587
MAIL_FROM=noreply@example.test
REDIS_URL=redis://localhost:6379/0
  1. Запустите Sidekiq и Rails-сервер (два терминала):
bundle exec sidekiq -C config/sidekiq.yml
bin/rails server

Сервер слушает http://127.0.0.1:3000 по умолчанию.

  1. Поставьте тестовое письмо в очередь:
curl -X POST http://127.0.0.1:3000/mail/test \
  -H 'Content-Type: application/json' \
  -d '{"to":"user@example.test","subject":"Тест","body":"Привет"}'

Ответ: {"status":"ok","queued":true}. После выполнения worker письмо появится в личном кабинете Mailexam → ваш проект → входящие.

Альтернатива через Rails console

bin/rails console
MailTestWorker.perform_async(
  "user@example.test",
  "Sidekiq + Mailexam",
  "Mailexam test from Sidekiq"
)

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

Переменная Обязательна По умолчанию Описание
MAILEXAM_LOGIN да SMTP-логин; также используется для имени хоста
MAILEXAM_PASSWORD да SMTP-пароль
MAILEXAM_PORT нет 587 SMTP-порт (587, 2525 или 25)
MAIL_FROM нет noreply@example.test Адрес отправителя (любой тестовый адрес)
REDIS_URL нет redis://localhost:6379/0 URL Redis для Sidekiq
PORT нет 3000 Порт HTTP

Для портов 587 и 2525 STARTTLS включён (enable_starttls_auto: true). Для порта 25 — отключён.

Структура проекта

.
├── Gemfile
├── config/initializers/mailexam_mailer.rb
├── config/initializers/sidekiq.rb
├── config/sidekiq.yml
├── app/workers/mail_test_worker.rb
├── app/mailers/test_mailer.rb
├── app/controllers/mail_controller.rb
├── config/routes.rb
├── .env.example
├── Dockerfile         # только для локальной отладки
└── docker-compose.yml # app + sidekiq + redis

Docker (отладка)

Docker предназначен для локальной отладки. Для повседневной разработки запускайте Redis, Sidekiq и Rails на хосте (см. выше).

cp .env.example .env
# отредактируйте .env с учётными данными Mailexam

docker compose up --build

Затем вызовите тот же endpoint на проброшенном порту:

curl -X POST http://127.0.0.1:3000/mail/test \
  -H 'Content-Type: application/json' \
  -d '{"to":"user@example.test","subject":"Тест","body":"Привет"}'

Compose-файл запускает сервисы app, sidekiq и redis.

CI

Задайте эти секреты в окружении CI:

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

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

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

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

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

Ошибка TLS или аутентификации

  • Хост должен быть {логин}.mailexam.ru, где {логин} совпадает с MAILEXAM_LOGIN.
  • Логин и пароль должны быть из одного проекта Mailexam.

Переменные окружения не подхватываются

  • Перезапустите bin/rails server и Sidekiq после изменения .env.

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

  • Откройте входящие того же проекта Mailexam.
  • Подождите, пока worker обработает задачу.

См. также

Лицензия

Apache 2.0