Временная почта
на C#.
Создавайте одноразовые ящики и получайте OTP-коды прямо из C#.
using System.Net.Http;
using System.Net.Http.Json;
using System.Text.Json;
var http = new HttpClient { BaseAddress = new Uri("https://evilmail.pro") };
http.DefaultRequestHeaders.Add(
"X-API-Key", Environment.GetEnvironmentVariable("EVILMAIL_KEY"));
// Create an inbox that self-destructs after 30 minutes.
var res = await http.PostAsJsonAsync("/api/temp-email", new { ttlMinutes = 30 });
res.EnsureSuccessStatusCode();
using var doc = await res.Content.ReadFromJsonAsync<JsonDocument>();
var data = doc!.RootElement.GetProperty("data");
Console.WriteLine(data.GetProperty("email").GetString());Чтобы подключить временную почту в C#, достаточно нескольких строк HttpClient и System.Text.Json — без SMTP-сервера, без настройки почтового ящика, без фальшивых SDK. EvilMail даёт вам настоящий API одноразовой почты, который можно вызвать из любого .NET-приложения: создать временный ящик, опрашивать его, пока не придёт сообщение, а затем с помощью regex вытащить код подтверждения из тела письма. Он создан для тех частей тестирования, которые доставляют боль — сквозных сценариев регистрации, проверок OTP и подтверждения email, а также CI-пайплайнов, которым нужен свежий ящик на каждом запуске без единого открытия почтового клиента человеком.
Зачем использовать временную почту на C#
Автотесты регистрации и E2E
Выделяйте свежий одноразовый ящик на каждый прогон теста, чтобы сценарии регистрации никогда не пересекались на переиспользованном адресе. Идеально для наборов xUnit, NUnit или Playwright, которые проверяют приветственное или подтверждающее письмо.
Проверки OTP и подтверждения email
Опросите ящик, прочитайте сообщение и вытащите 6-значный код одним regex. Ваш тест может полностью пройти шаг «подтвердите свой email» из конца в конец, ровно как это сделал бы настоящий пользователь.
CI/CD-пайплайны
Читайте API-ключ из переменной окружения и генерируйте временные адреса по требованию внутри GitHub Actions, Azure Pipelines или любого раннера — без общего тестового ящика, который нужно очищать или ограничивать по лимитам.
Скрапинг и одноразовые регистрации
Когда .NET-инструменту нужен разовый адрес, чтобы открыть доступ к ресурсу, создайте ящик временной почты, который самоуничтожается по истечении заданного TTL и никогда не затрагивает ваш реальный домен.
Процесс — временная почта C# за 3 вызова
Создайте одноразовый ящик
using System.Net.Http;
using System.Net.Http.Json;
using System.Text.Json;
var http = new HttpClient { BaseAddress = new Uri("https://evilmail.pro") };
http.DefaultRequestHeaders.Add(
"X-API-Key", Environment.GetEnvironmentVariable("EVILMAIL_KEY"));
// Ask for an inbox with a 30-minute time-to-live.
var res = await http.PostAsJsonAsync(
"/api/temp-email", new { ttlMinutes = 30 });
res.EnsureSuccessStatusCode();
using var doc = await res.Content.ReadFromJsonAsync<JsonDocument>();
var data = doc!.RootElement.GetProperty("data");
string email = data.GetProperty("email").GetString()!;
string token = data.GetProperty("sessionToken").GetString()!;
Console.WriteLine($"Inbox: {email}");
Console.WriteLine($"Token: {token}");Опрашивайте, пока не придёт письмо
// Reuse `http` and `token` from step 1.
// Check the inbox up to 20 times, 3s apart.
int uid = -1;
for (int i = 0; i < 20; i++)
{
var res = await http.GetAsync($"/api/temp-email/{token}");
res.EnsureSuccessStatusCode();
using var doc = await res.Content.ReadFromJsonAsync<JsonDocument>();
var messages = doc!.RootElement
.GetProperty("data").GetProperty("messages");
if (messages.GetArrayLength() > 0)
{
uid = messages[0].GetProperty("uid").GetInt32();
Console.WriteLine($"Got message uid={uid}");
break;
}
Console.WriteLine("No mail yet, retrying...");
await Task.Delay(TimeSpan.FromSeconds(3));
}
if (uid < 0)
throw new TimeoutException("No email arrived in time.");Прочитайте сообщение и извлеките код
using System.Text.RegularExpressions;
// Fetch the full message body by its uid (reuse `http`, `uid`, `token`).
var res = await http.GetAsync(
$"/api/message/{uid}?token={token}");
res.EnsureSuccessStatusCode();
using var doc = await res.Content.ReadFromJsonAsync<JsonDocument>();
var data = doc!.RootElement.GetProperty("data");
string text = data.GetProperty("text").GetString() ?? "";
// Pull the first 6-digit code out of the body.
var match = Regex.Match(text, @"\b(\d{6})\b");
if (match.Success)
Console.WriteLine($"OTP: {match.Groups[1].Value}");
else
Console.WriteLine("No 6-digit code found.");Временная почта C# — FAQ
Q1Как получить адрес временной почты в C#?−
Отправьте POST-запрос на https://evilmail.pro/api/temp-email с заголовком X-API-Key и JSON-телом вида {"ttlMinutes": 30}. Поле data.email в ответе — это ваш одноразовый адрес, а data.sessionToken — дескриптор, с помощью которого вы читаете его входящие. С HttpClient и System.Text.Json это около десяти строк — смотрите фрагмент выше.
Q2Можно ли использовать это для автотестов?+
Да — это основной сценарий использования. Создайте свежий ящик в начале каждого теста, инициируйте отправку письма вашим приложением, затем опрашивайте GET /api/temp-email/{sessionToken}, пока не появится сообщение. Это аккуратно встраивается в наборы xUnit, NUnit или Playwright/.NET E2E, а поскольку ключ берётся из переменной окружения, всё работает без участия человека в CI.
Q3Как извлечь OTP из письма?+
Получите сообщение через GET /api/message/{uid}?token={sessionToken}, возьмите data.text (или data.html) и запустите regex. Для стандартного 6-значного одноразового кода Regex.Match(text, @"\b(\d{6})\b") вернёт код в группе 1. Подстройте шаблон, если ваш провайдер использует другую длину или токен в ссылке.
Q4Нужен ли API-ключ и есть ли лимиты запросов?+
Да, каждый запрос должен содержать заголовок X-API-Key — читайте его из переменной окружения, например EVILMAIL_KEY, и никогда не хардкодьте в исходниках. Запросы ограничены по лимитам для каждого ключа, поэтому держите опрос в разумных интервалах (около 3 секунд, ~20 попыток, как показано), а не в плотных циклах. Точную квоту вашего тарифа смотрите в панели EvilMail.
Q5Сколько живёт ящик?+
Вы управляете этим через поле ttlMinutes при создании ящика — задайте 30 для получаса или меньше для быстрых разовых проверок. Как только TTL истекает, адрес и его сообщения уничтожаются, поэтому получите и прочитайте письмо до того, как окно закроется.
Временная почта на других языках
Один API-ключ. Одноразовые ящики в масштабе.
Создавайте неограниченное число одноразовых адресов, опрашивайте их по HTTP и получайте коды подтверждения прямо в тесты и CI. Бесплатно на старте; собственные домены и повышенные лимиты на платных тарифах.

