Временная почта
на Ruby.
Одноразовая почта для Ruby на чистом net/http.
require "net/http"
require "json"
uri = URI("https://evilmail.pro/api/temp-email")
req = Net::HTTP::Post.new(uri)
req["X-API-Key"] = ENV.fetch("EVILMAIL_KEY")
req["Content-Type"] = "application/json"
req.body = { ttlMinutes: 30 }.to_json
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
http.request(req)
end
data = JSON.parse(res.body).fetch("data")
puts "Inbox: #{data['email']}"
puts "Token: #{data['sessionToken']}"Настройка временного почтового ящика в Ruby позволяет автоматизировать проверку email без реального почтового ящика, браузера и ручного копирования OTP-кодов. EvilMail предоставляет небольшой HTTP API, который можно использовать со стандартной библиотекой Ruby net/http: создайте одноразовый ящик, опрашивайте его, пока не придёт письмо, а затем извлеките код подтверждения прямо из тела письма с помощью regex. Это создано для разработчиков, которым нужна временная почта в Ruby внутри тестовых наборов, CI-конвейеров и сценариев регистрации или OTP — без сторонних gem-ов, без фейковых SDK, только простые запросы и JSON.
Зачем использовать временную почту на Ruby
Сквозные тесты регистрации
Зарегистрируйте фейкового пользователя на живой временный адрес и убедитесь, что приветственное или подтверждающее письмо действительно приходит. Никакого общего командного ящика, который нужно засорять и чистить.
Тестирование проверки OTP и 2FA
Запустите вход или сброс пароля, опросите ящик и вытащите 6-значный код одним regex. Ваше тестирование проверки email в Ruby работает полностью без участия человека.
CI/CD-конвейеры
Поскольку это просто net/http и API-ключ, одноразовая почта в Ruby работает одинаково на вашем ноутбуке и в GitHub Actions или GitLab CI — не нужно поддерживать SMTP-сервер или автоматизацию браузера.
Извлечение ссылок активации
Получите полный текст или HTML письма и извлеките магические ссылки, токены приглашений или URL-адреса активации, чтобы программно проходить многошаговые сценарии онбординга.
Процесс — временная почта Ruby за 3 вызова
Создайте одноразовый ящик
require "net/http"
require "json"
# Create a temp inbox that self-destructs after 30 minutes.
def create_inbox
uri = URI("https://evilmail.pro/api/temp-email")
req = Net::HTTP::Post.new(uri)
req["X-API-Key"] = ENV.fetch("EVILMAIL_KEY")
req["Content-Type"] = "application/json"
req.body = { ttlMinutes: 30 }.to_json
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
http.request(req)
end
data = JSON.parse(res.body).fetch("data")
[data["email"], data["sessionToken"]]
end
email, token = create_inbox
puts "Waiting for mail at #{email}"Опрашивайте, пока не придёт письмо
require "net/http"
require "json"
# Poll the inbox until a message lands (or we give up).
def wait_for_message(token, tries: 20, delay: 3)
uri = URI("https://evilmail.pro/api/temp-email/#{token}")
tries.times do
req = Net::HTTP::Get.new(uri)
req["X-API-Key"] = ENV.fetch("EVILMAIL_KEY")
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
http.request(req)
end
msgs = JSON.parse(res.body).dig("data", "messages") || []
return msgs.first unless msgs.empty?
sleep delay # wait before the next attempt
end
raise "No message arrived in time"
end
message = wait_for_message(token)
puts "Got: #{message['subject']} (uid #{message['uid']})"Прочитайте письмо и извлеките код
require "net/http"
require "json"
# Fetch the full body and pull out a 6-digit OTP.
def extract_code(uid, token)
uri = URI("https://evilmail.pro/api/message/#{uid}?token=#{token}")
req = Net::HTTP::Get.new(uri)
req["X-API-Key"] = ENV.fetch("EVILMAIL_KEY")
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
http.request(req)
end
body = JSON.parse(res.body).fetch("data")
# First standalone 6-digit number, from text then html.
body["text"].to_s[/\b(\d{6})\b/, 1] ||
body["html"].to_s[/\b(\d{6})\b/, 1]
end
otp = extract_code(message["uid"], token)
puts "Verification code: #{otp}"Временная почта Ruby — FAQ
Q1Как получить адрес временной почты в Ruby?−
Отправьте POST-запрос на https://evilmail.pro/api/temp-email с заголовком X-API-Key и JSON-телом вида {"ttlMinutes": 30}. В ответе data.email — это ваш одноразовый адрес, а data.sessionToken — дескриптор, который вы используете для опроса и чтения входящей почты. Сниппет в шапке делает именно это примерно в дюжину строк на net/http.
Q2Можно ли использовать это для автоматического тестирования?+
Да — это основной сценарий использования. Поскольку это чистый HTTP без зависимости от браузера или SMTP, он аккуратно встраивается в RSpec, Minitest или любую CI-задачу. Создайте ящик, запустите тестируемое письмо, опрашивайте, пока оно не придёт, и проверяйте тему, тело или извлечённый код. Работает одинаково на ноутбуке и в GitHub Actions или GitLab CI.
Q3Как извлечь OTP?+
Прочитайте письмо через GET /api/message/{uid}?token={sessionToken}, затем прогоните regex по data.text (или data.html). Стандартный 6-значный одноразовый код соответствует /\b(\d{6})\b/ — используйте body["text"].to_s[/\b(\d{6})\b/, 1], чтобы захватить первое совпадение. Для магических ссылок или токенов подставьте шаблон, соответствующий формату вашего URL или токена.
Q4Нужен ли API-ключ и есть ли лимиты запросов?+
Да, каждый запрос требует заголовок X-API-Key — считывайте его из переменной окружения, например ENV.fetch("EVILMAIL_KEY"), и никогда не прописывайте его жёстко в исходном коде. Запросы ограничены по частоте для каждого ключа; в примере опроса используется интервал в 3 секунды, который комфортно укладывается в лимиты для тестирования и OTP-сценариев.
Q5Как долго живёт ящик?+
Вы управляете временем жизни через ttlMinutes при создании ящика — в примере используется 30 минут. Как только TTL истекает, адрес и его письма автоматически удаляются, так что чистить ничего не нужно. Для более длительных наборов тестов запросите больший TTL или просто создавайте свежий ящик на каждый тест.
Временная почта на других языках
Один API-ключ. Одноразовые ящики в масштабе.
Создавайте неограниченное число одноразовых адресов, опрашивайте их по HTTP и получайте коды подтверждения прямо в тесты и CI. Бесплатно на старте; собственные домены и повышенные лимиты на платных тарифах.

