Sidekiq + Mailexam
Минимальный пример Sidekiq на Ruby on Rails, который отправляет тестовое письмо через SMTP Mailexam с помощью Action Mailer в фоновом worker.
Основан на руководстве Mailexam для Sidekiq.
Что понадобится
Из приветственного письма или личного кабинета Mailexam:
| Переменная | Описание |
|---|---|
MAILEXAM_LOGIN |
SMTP-логин (например, xxxxx) |
MAILEXAM_PASSWORD |
SMTP-пароль (пара к логину) |
| Хост |
{MAILEXAM_LOGIN}.mailexam.ru (задаётся в config/initializers/mailexam_mailer.rb) |
Быстрый старт (на хосте)
- Запустите Redis (если ещё не запущен локально):
docker run -d --name redis -p 6379:6379 redis:7-alpine
- Установите зависимости:
bundle install
- Скопируйте пример файла окружения и заполните учётные данные:
cp .env.example .env
- Отредактируйте
.env:
MAILEXAM_LOGIN=ВАШ_ЛОГИН
MAILEXAM_PASSWORD=ВАШ_ПАРОЛЬ
MAILEXAM_PORT=587
MAIL_FROM=noreply@example.test
REDIS_URL=redis://localhost:6379/0
- Запустите Sidekiq и Rails-сервер (два терминала):
bundle exec sidekiq -C config/sidekiq.yml
bin/rails server
Сервер слушает http://127.0.0.1:3000 по умолчанию.
- Поставьте тестовое письмо в очередь:
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 обработает задачу.
См. также
- Руководство Mailexam для Sidekiq (wiki)
- Пример на Ruby on Rails — синхронный Action Mailer на том же SMTP-стеке
- Пример на Celery — фоновая почта в Python
- Пример на BullMQ — фоновая почта в Node.js
- Sidekiq wiki
- Документация API Mailexam
Лицензия
Apache 2.0