Ruby on Rails¶
Инструкция для приложений на Ruby on Rails 7.x / 8.x. Mailexam подключается через Action Mailer и SMTP-настройки в config.
Что понадобится¶
- Аккаунт Mailexam и проект с SMTP-учётными данными.
- Ruby 3.2+ и Rails-приложение (
rails new).
Скопируйте из приветственного письма (или кабинета) для вашего проекта:
ВАШ_ЛОГИН— SMTP-логин (например,xxxxx);ВАШ_ПАРОЛЬ— SMTP-пароль (уникальная пара к логину);- хост —
ВАШ_ЛОГИН.mailexam.ru(совпадает с логином).
1. Зависимости¶
В Gemfile для загрузки .env в development:
2. Переменные окружения¶
Файл .env в корне проекта (добавьте в .gitignore):
MAILEXAM_LOGIN=ВАШ_ЛОГИН
MAILEXAM_PASSWORD=ВАШ_ПАРОЛЬ
MAILEXAM_PORT=587
MAIL_FROM=noreply@example.test
Хост SMTP: ВАШ_ЛОГИН.mailexam.ru.
Адрес отправителя
MAIL_FROM может быть любым тестовым адресом — письмо попадёт в Mailexam, а не реальному получателю.
Альтернативные порты¶
3. Настройка Action Mailer¶
config/environments/development.rb (аналогично для production через переменные окружения на сервере):
login = ENV.fetch("MAILEXAM_LOGIN")
port = ENV.fetch("MAILEXAM_PORT", "587").to_i
config.action_mailer.delivery_method = :smtp
config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_deliveries = true
config.action_mailer.smtp_settings = {
address: "#{login}.mailexam.ru",
port: port,
user_name: login,
password: ENV.fetch("MAILEXAM_PASSWORD"),
authentication: :plain,
enable_starttls_auto: [587, 2525].include?(port),
}
config.action_mailer.default_options = {
from: ENV.fetch("MAIL_FROM", "noreply@example.test"),
}
4. Mailer и шаблон¶
app/mailers/test_mailer.rb:
class TestMailer < ApplicationMailer
def test_email
@body = params[:body]
mail(
to: params[:to],
subject: params[:subject]
)
end
end
app/views/test_mailer/test_email.text.erb:
5. Отправка тестового письма¶
Через консоль¶
TestMailer.with(
to: "user@example.test",
subject: "Ruby on Rails + Mailexam",
body: "Тест Mailexam из Rails"
).test_email.deliver_now
Через контроллер¶
app/controllers/mail_controller.rb:
class MailController < ActionController::API
def test
payload = JSON.parse(request.body.read.presence || "{}")
TestMailer.with(
to: payload["to"].presence || "user@example.test",
subject: payload["subject"].presence || "Ruby on Rails + Mailexam",
body: payload["body"].presence || "Тест Mailexam из Ruby on Rails"
).test_email.deliver_now
render json: { status: "ok" }
end
end
config/routes.rb:
Запуск и проверка:
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 |
.env + dotenv-rails |
| CI | секреты MAILEXAM_LOGIN, MAILEXAM_PASSWORD в GitLab CI/CD Variables |
Пример для .gitlab-ci.yml:
variables:
MAILEXAM_LOGIN: $MAILEXAM_LOGIN
MAILEXAM_PASSWORD: $MAILEXAM_PASSWORD
MAILEXAM_PORT: "587"
MAIL_FROM: "noreply@example.test"
После интеграционного теста проверьте доставку через API Mailexam.
В тестах можно использовать delivery_method = :test и ActionMailer::Base.deliveries.
7. Типичные проблемы¶
Ошибка TLS или authentication failed
address—{логин}.mailexam.ru,user_name— тот же логин из письма.- Логин и пароль — пара из письма одного проекта.
Порт 587
enable_starttls_autoдолжен бытьtrue.
Письмо не в кабинете
- Смотрите входящие того же проекта Mailexam.
- Убедитесь, что
perform_deliveries = trueи нет:testdelivery в production по ошибке.
Переменные не подхватываются
- Перезапустите
bin/rails serverпосле изменения.env.
См. также¶
- Каталог примеров
- Пример реализации (Ruby on Rails)
- Django — похожая схема через встроенный mailer
- Документация REST API Mailexam
- Action Mailer Basics