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

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:

gem "dotenv-rails", groups: %i[development test]
bundle install

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

Файл .env в корне проекта (добавьте в .gitignore):

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

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

Адрес отправителя

MAIL_FROM может быть любым тестовым адресом — письмо попадёт в Mailexam, а не реальному получателю.

Альтернативные порты

MAILEXAM_PORT=587

enable_starttls_auto: true

MAILEXAM_PORT=2525

STARTTLS, как для 587.

MAILEXAM_PORT=25

enable_starttls_auto: false

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 и шаблон

bin/rails generate mailer TestMailer test_email

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:

<%= @body %>

5. Отправка тестового письма

Через консоль

bin/rails console
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:

Rails.application.routes.draw do
  post "mail/test", to: "mail#test"
end

Запуск и проверка:

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 .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 и нет :test delivery в production по ошибке.

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

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

См. также