Интеграция временной почты в тесты и CI

REST API Mail.td создан для end-to-end тестирования — проверки регистраций, сбросов пароля и email-триггерных процессов. Этот гид сосредоточен на шаблонах интеграции для популярных инструментов тестирования.

Сырая ссылка эндпоинтов (форматы запросов/ответов) — на странице API или docs.mail.td.

Selenium / Playwright / Cypress

Шаблон: создать новый ящик перед каждым тестом, зарегистрировать ваше приложение с этим адресом, потом опросить API на письмо подтверждения.

// Псевдокод — адаптируется к любому фреймворку
async function signUpFlow(page) {
  // 1. Создать временный ящик
  const mailbox = await fetch("https://api.mail.td/api/accounts", {
    method: "POST",
    headers: {
      Authorization: "Bearer td_xxx",
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      address: `test-${Date.now()}@mail.td`,
      password: "secret"
    })
  }).then(r => r.json());

  // 2. Зарегистрировать приложение с mailbox.address
  await page.goto("/signup");
  await page.fill("[name=email]", mailbox.address);
  await page.click("button[type=submit]");

  // 3. Опрос на письмо подтверждения (до 30с)
  for (let i = 0; i < 30; i++) {
    const list = await fetch(
      `https://api.mail.td/api/accounts/${mailbox.id}/messages`,
      { headers: { Authorization: "Bearer td_xxx" } }
    ).then(r => r.json());
    if (list.messages.length > 0) {
      // Список не возвращает тело — возьмите детали сообщения для text_body
      const msg = await fetch(
        `https://api.mail.td/api/accounts/${mailbox.id}/messages/${list.messages[0].id}`,
        { headers: { Authorization: "Bearer td_xxx" } }
      ).then(r => r.json());
      const link = extractLink(msg.text_body);
      await page.goto(link);
      break;
    }
    await new Promise(r => setTimeout(r, 1000));
  }
}

CI/CD пайплайны

Для GitHub Actions, GitLab CI, CircleCI или любого пайплайна:

  • Храните один API-токен как CI-секрет (ротируйте из панели при утечке)
  • Каждый job создаёт свой ящик — нет гонок между параллельными
  • Уникальный адрес на тест (например, test-${RUN_ID}-${TEST_ID}@mail.td) — легче отлаживать
  • Не нужно убирать — ящики авто-истекают, скрипта очистки не надо

Webhook-и для быстрых пайплайнов (Pro)

Опрос добавляет латенцию каждому тесту. Для долгих сьютов зарегистрируйте URL webhook-а, на который придёт POST при новом письме. Тест ждёт доставку webhook-а вместо 30 опросов. Сокращает типичные 5–15 секунд до меньше 1.

Webhook-и подписаны HMAC-SHA256 — проверяйте header подписи перед обработкой.

Установка SDK

npm install mailtd       # Node.js / TypeScript
pip install mailtd       # Python
go get github.com/mailtd/mailtd-go    # Go

Полный справочник эндпоинтов — на mail.td/api.

Часто задаваемые вопросы

Где взять API-токен?

Панель Pro → API Tokens → Create. Токены имеют префикс `td_` и показываются один раз при создании — копируйте и храните в CI-секретах или менеджере паролей.

Какой rate limit?

Free — 1 запрос/секунду; Pro — 10 запросов/секунду. При превышении API возвращает 429 с заголовком `Retry-After`.

Как работают подписи webhook-ов?

Каждый POST webhook-а содержит заголовок подписи, выведенный из вашего секрета webhook-а. Проверьте подпись перед обработкой payload, чтобы убедиться, что запрос пришёл от Mail.td и не был подменён.

Можно ли запускать end-to-end тесты параллельно?

Да — каждому параллельному job дайте свой ящик во избежание гонок. Квоты Pro в 100 000 операций/мес хватает большинству CI-сценариев.

API работает на Free аккаунтах?

Free включает 500 операций API в месяц — подходит для лёгких скриптов. Для CI/CD или большего пропускного — переходите на Pro: 100 000 операций/мес и больший rate limit.