Тимчасова пошта
на Rust.
Одноразові поштові скриньки та витягування OTP для Rust — звичайний HTTP, без SDK.
use serde_json::{json, Value};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let key = std::env::var("EVILMAIL_KEY")?;
let res: Value = reqwest::blocking::Client::new()
.post("https://evilmail.pro/api/temp-email")
.header("X-API-Key", key)
.json(&json!({ "ttlMinutes": 30 }))
.send()?
.json()?;
let email = res["data"]["email"].as_str().unwrap_or("");
println!("Inbox: {email}");
Ok(())
}Створення тимчасової поштової скриньки на Rust дає змогу тестувати процеси реєстрації, підтвердження email та доставку OTP без справжньої скриньки чи ненадійного спільного акаунта. EvilMail надає звичайний HTTP API: створіть одноразову скриньку, опитуйте її на предмет вхідної пошти та витягуйте код підтвердження прямо у ваші інтеграційні тести чи CI-конвеєр. Немає SMTP-сервера, який треба запускати, і немає SDK, який треба вбудовувати, — лише reqwest, serde_json та ключ API зі змінної середовища.
Навіщо використовувати тимчасову пошту на Rust
Наскрізні тести реєстрації
Зареєструйте справжній акаунт у вашому staging-середовищі, використовуючи свіжу одноразову адресу, а потім переконайтеся, що вітальний лист або лист підтвердження справді надходить. Немає спільної скриньки, яку треба чистити між запусками.
Автоматизація OTP та 2FA
Дочекайтеся листа входу чи підтвердження, витягніть шестизначний код з тіла листа за допомогою regex і поверніть його у ваш процес. Ідеально для тестування входу без пароля та двофакторної автентифікації в Rust.
Перевірка пошти в CI-конвеєрі
Зчитайте ключ API зі змінної середовища та виконайте весь цикл створення-опитування-читання всередині GitHub Actions або GitLab CI. Кожна збірка отримує чисту, ізольовану поштову скриньку.
Збирання посилань підтвердження
Витягніть URL активації або magic-посилання з тексту чи HTML повідомлення, перейдіть за ними через reqwest і переконайтеся, що весь шлях онбордингу працює без участі людини.
Процес — тимчасова пошта Rust за 3 виклики
Створіть одноразову скриньку
use serde_json::{json, Value};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let key = std::env::var("EVILMAIL_KEY")?;
let client = reqwest::blocking::Client::new();
// Ask EvilMail for a fresh inbox that lives 30 minutes.
let res: Value = client
.post("https://evilmail.pro/api/temp-email")
.header("X-API-Key", &key)
.json(&json!({ "ttlMinutes": 30 }))
.send()?
.json()?;
let email = res["data"]["email"].as_str().unwrap_or("");
let token = res["data"]["sessionToken"].as_str().unwrap_or("");
println!("Inbox {email} ready (token {token})");
Ok(())
}Опитуйте, доки не надійде лист
use serde_json::Value;
use std::{thread::sleep, time::Duration};
// Poll the session ~20 times, 3s apart, until mail lands.
fn wait_for_message(
client: &reqwest::blocking::Client,
key: &str,
token: &str,
) -> Result<u64, Box<dyn std::error::Error>> {
let url =
format!("https://evilmail.pro/api/temp-email/{token}");
for _ in 0..20 {
let res: Value = client
.get(&url)
.header("X-API-Key", key)
.send()?
.json()?;
// messages is empty until something is delivered.
if let Some(msg) = res["data"]["messages"].get(0) {
let uid = msg["uid"].as_u64().unwrap_or(0);
let subject = msg["subject"].as_str().unwrap_or("");
println!("Got mail: {subject} (uid {uid})");
return Ok(uid);
}
sleep(Duration::from_secs(3));
}
Err("timed out waiting for email".into())
}Прочитайте повідомлення та витягніть код
use regex::Regex;
use serde_json::Value;
// Fetch the message body and pull out a 6-digit OTP.
fn extract_code(
client: &reqwest::blocking::Client,
key: &str,
token: &str,
uid: u64,
) -> Result<Option<String>, Box<dyn std::error::Error>> {
let url = format!(
"https://evilmail.pro/api/message/{uid}?token={token}"
);
let res: Value = client
.get(&url)
.header("X-API-Key", key)
.send()?
.json()?;
let body = res["data"]["text"].as_str().unwrap_or("");
// A one-time code is six consecutive digits.
let re = Regex::new(r"\b(\d{6})\b")?;
let code = re.captures(body).map(|c| c[1].to_string());
match &code {
Some(c) => println!("OTP = {c}"),
None => println!("No 6-digit code found"),
}
Ok(code)
}Тимчасова пошта Rust — FAQ
Q1Як отримати тимчасову поштову адресу в Rust?−
Надішліть POST на https://evilmail.pro/api/temp-email із заголовком X-API-Key та JSON-тілом на кшталт {"ttlMinutes": 30}. Відповідь містить data.email (одноразову адресу) та data.sessionToken, який ви використовуєте для опитування й читання повідомлень. Дивіться сніпет у hero-блоці — це близько десяти рядків з reqwest і serde_json.
Q2Чи можна використовувати це для автоматизованого тестування?+
Так — це основний сценарій використання. Зчитайте ключ API зі змінної середовища, генеруйте свіжу скриньку для кожного тесту та виконуйте цикл створення-опитування-читання всередині вашого набору інтеграційних тестів або CI. Оскільки кожна скринька ізольована й короткочасна, тести не заважають один одному, і нічого не треба чистити.
Q3Як витягнути OTP?+
Викличте GET /api/message/{uid}?token={sessionToken}, щоб отримати повідомлення, а потім застосуйте regex до data.text (або data.html). Для стандартного шестизначного одноразового коду підходить шаблон \b(\d{6})\b; група захоплення 1 — це код. Сніпет кроку 3 показує це за допомогою крейта regex.
Q4Чи потрібен ключ API / чи є обмеження частоти запитів?+
Так, кожен запит потребує заголовка X-API-Key — зберігайте ключ у змінній середовища, наприклад EVILMAIL_KEY, а не прописуйте його жорстко в коді. Запити обмежені за частотою на кожен ключ, тож під час опитування дотримуйтеся розумного інтервалу (у прикладах — 3 секунди між ~20 спробами опитування) замість щільного циклу.
Q5Скільки живе скринька?+
Ви керуєте цим через поле ttlMinutes при створенні скриньки — у прикладах використано 30 хвилин. Щойно TTL спливає, адреса та її повідомлення видаляються, тож опитайте й прочитайте повідомлення в межах цього вікна. Для більшості процесів підтвердження та OTP короткого TTL від 10 до 30 хвилин цілком достатньо.
Тимчасова пошта іншими мовами
Один ключ API. Одноразові скриньки в масштабі.
Створюйте необмежену кількість тимчасових адрес, опитуйте їх через HTTP і витягуйте коди підтвердження прямо у ваші тести й CI. Безкоштовний старт; власні домени та вищі ліміти на платних тарифах.

