API временной почты · MCP

API временной почты и MCP-сервер для тестов и ИИ-агентов

Создайте одноразовый ящик, дождитесь следующего письма и получите из него коды, ссылки и вложения через REST или MCP.

TempGeneratorВсё готовится…

Попробуйте сейчас

Аккаунт не нужен. Вы получите один приватный ящик на срок до 10 минут и сможете удалить его в любой момент. Новый пробный ящик можно создавать раз в 10 минут из одной сети.

Пробный режим
Без регистрации · 1 ящик · 10 минут · только эта вкладка
Токен разработчика
Подтверждённый аккаунт · 5 ящиков одновременно · до 60 минут · REST и MCP
Управление API-ключами

Подтвердите почту, чтобы создавать отзываемые API-ключи с ограниченными правами.

  1. Создать ящик
  2. Ждать письмо
  3. Прочитать письмо

Приватный пробный ящик

Пробный ключ хранится в памяти этой вкладки. После перезагрузки доступ будет потерян, но ящик всё равно истечёт сам.

    Письма показываются обычным текстом. Коды и ссылки распознаются автоматически, но никогда не открываются. Вложения скачиваются через приватный API.

    Быстрый старт с curl

    Создайте ящик, дождитесь следующего письма, прочитайте его и удалите ящик. Храните API-ключ в TEMPGENERATOR_TOKEN и никогда не передавайте его в URL.

    Нужны curl и jq. Скрипт до трёх раз ждёт письмо по 20 секунд, выводит тему, коды, ссылки и текст каждого письма, а затем удаляет ящик.

    bash
    export TEMPGENERATOR_URL='https://www.tempgenerator.com'
    API="$TEMPGENERATOR_URL/developer-api/v1"
    AUTH="Authorization: Bearer $TEMPGENERATOR_TOKEN"
    INBOX=$(curl --fail-with-body -sS -X POST "$API/inboxes" -H "$AUTH" -H 'Accept: application/json')
    ID=$(printf '%s' "$INBOX" | jq -r .id)
    echo "Send a test email to $(printf '%s' "$INBOX" | jq -r .address)"
    for ATTEMPT in 1 2 3; do
      RESULT=$(curl --fail-with-body -sS "$API/inboxes/$ID/wait?after=0&timeout=20" -H "$AUTH" -H 'Accept: application/json')
      [ "$(printf '%s' "$RESULT" | jq -r .status)" = message ] && break
    done
    for MESSAGE in $(printf '%s' "$RESULT" | jq -r '.messages[].id'); do
      curl --fail-with-body -sS "$API/inboxes/$ID/messages/$MESSAGE" -H "$AUTH" -H 'Accept: application/json' \
        | jq '{subject, codes, links, text}'
    done
    curl --fail-with-body -sS -X DELETE "$API/inboxes/$ID" -H "$AUTH"

    Обзор API

    Базовый URL: https://www.tempgenerator.com/developer-api/v1. Передавайте Authorization: Bearer <key> в каждом запросе. Ответы приходят в формате JSON; ошибки имеют вид {"error": {"code", "message", "retry_after"}}, а при ошибках квоты дополнительно отправляется заголовок Retry-After.

    • POST /inboxes Создать ящик и получить его адрес и срок действия
    • GET /inboxes/{id}/wait?after=0&timeout=20 Ждать следующее письмо после курсора до 20 секунд
    • GET /inboxes/{id}/messages?after=0 Получить до 50 писем после курсора, сначала самые старые
    • GET /inboxes/{id}/messages/{message_id} Прочитать письмо: текст, коды, ссылки и список вложений
    • GET /inboxes/{id}/messages/{message_id}/attachments/{index} Скачать вложение по его индексу
    • DELETE /inboxes/{id} Сразу удалить ящик и его письма

    Список и ожидание принимают необязательные фильтры from и subject_contains: поиск по вхождению в отправителе и теме без учёта регистра.

    Пример ответа при чтении письма

    json
    {
        "id": 42,
        "from": "no-reply@app.example",
        "subject": "Your verification code",
        "received_at": "2026-10-03T09:41:07+00:00",
        "text": "Your verification code is 482913.\nOr confirm: https://app.example/verify?token=8f3c",
        "text_truncated": false,
        "codes": [
            "482913"
        ],
        "links": [
            "https://app.example/verify?token=8f3c"
        ],
        "expires_at": "2026-10-03T10:40:12+00:00",
        "attachments": [
            {
                "index": 0,
                "filename": "receipt.pdf",
                "size": 48213
            }
        ],
        "untrusted_content": true
    }

    Токены разработчика

    После подтверждения почты создавайте API-ключи в разделе «Доступ разработчика». Ключ с правами на чтение и запись может создавать, читать и удалять ящики; ключ только для чтения — получать список, ждать, читать и скачивать. Ключи действуют 90 дней, у аккаунта может быть до 10 активных ключей, а отзыв ключа вступает в силу сразу.

    Каждый ключ показывается один раз и хранится только в виде хеша SHA-256. Отзыв ключа не удаляет его ящики: другие действующие ключи аккаунта сохраняют к ним доступ, пока ящики не истекут или не будут удалены.

    Управление API-ключами

    Ожидание следующего письма без sleep()

    GET …/wait держит запрос открытым и отвечает, как только приходит письмо, или по истечении тайм-аута (не более 20 секунд) — тогда в ответе будет status timeout. Передайте next_cursor из предыдущего ответа как after, чтобы не прочитать одно и то же письмо дважды.

    Тайм-аут — не ошибка доставки: просто снова ждите с тем же курсором. Для одного ящика выполняется одно ожидание, и новое ожидание того же ящика заменяет предыдущее; ожидания разных ящиков выполняются параллельно, не более 2 одновременно на аккаунт.

    Тестирование email в Playwright, Cypress, pytest и CI

    Дайте каждому тесту собственный ящик, запустите в своём приложении отправку письма о регистрации или сбросе пароля, дождитесь его и проверьте код или ссылку. В teardown удаляйте ящик.

    Храните ключ в секретах CI, например как TEMPGENERATOR_TOKEN в GitHub Actions. Cypress может делать те же HTTP-запросы через cy.request, а рецепт на Python ниже работает в pytest и любом другом раннере.

    Playwright (TypeScript)

    TypeScript
    import { test, expect } from '@playwright/test';
    
    const api = `${process.env.TEMPGENERATOR_URL}/developer-api/v1`;
    const headers = { Authorization: `Bearer ${process.env.TEMPGENERATOR_TOKEN}`, Accept: 'application/json' };
    
    async function call(path: string, method = 'GET') {
      const response = await fetch(api + path, { method, headers });
      if (!response.ok) throw new Error(`${response.status} ${await response.text()}`);
      return response.status === 204 ? null : response.json();
    }
    
    async function waitForCode(inboxId: string, after = 0): Promise<string> {
      for (let attempt = 0; attempt < 3; attempt++) {
        const result = await call(`/inboxes/${inboxId}/wait?after=${after}&timeout=20`);
        for (const summary of result.messages) {
          const message = await call(`/inboxes/${inboxId}/messages/${summary.id}`);
          if (message.codes.length) return message.codes[0];
        }
        after = result.next_cursor;
      }
      throw new Error('No verification code arrived');
    }
    
    test('signup sends a verification code', async ({ page }) => {
      const inbox = await call('/inboxes', 'POST');
      try {
        await page.goto('/signup');
        await page.getByLabel('Email').fill(inbox.address);
        await page.getByRole('button', { name: 'Create account' }).click();
        await page.getByLabel('Verification code').fill(await waitForCode(inbox.id));
        await expect(page.getByText('Welcome')).toBeVisible();
      } finally {
        await call(`/inboxes/${inbox.id}`, 'DELETE');
      }
    });

    GitHub Actions

    YAML
    - name: End-to-end tests
      run: npx playwright test
      env:
        TEMPGENERATOR_URL: https://www.tempgenerator.com
        TEMPGENERATOR_TOKEN: ${{ secrets.TEMPGENERATOR_TOKEN }}

    Проверка регистрации на Python

    Запустите скрипт с заданными переменными окружения. Он выведет новый ящик: отправьте на этот адрес письмо о регистрации из своего тестового приложения и нажмите Enter. Скрипт ждёт до 15 секунд, выводит каждое письмо с его кодами и ссылками и удаляет ящик, даже если чтение завершилось ошибкой.

    Python
    import json, os
    from urllib.request import Request, urlopen
    
    base = os.environ["TEMPGENERATOR_URL"].rstrip("/") + "/developer-api/v1"
    headers = {"Authorization": "Bearer " + os.environ["TEMPGENERATOR_TOKEN"],
               "Accept": "application/json"}
    
    def request(path, method="GET"):
        with urlopen(Request(base + path, headers=headers, method=method), timeout=30) as response:
            return json.load(response) if response.status != 204 else None
    
    inbox = request("/inboxes", "POST")
    print(json.dumps(inbox), flush=True)
    try:
        input()
        result = request("/inboxes/" + inbox["id"] + "/wait?after=0&timeout=15")
        print(json.dumps(result))
        for message in result["messages"]:
            detail = request("/inboxes/" + inbox["id"] + "/messages/" + str(message["id"]))
            print(json.dumps(detail))
    finally:
        request("/inboxes/" + inbox["id"], "DELETE")

    MCP-сервер для ИИ-агентов

    Эндпоинт https://www.tempgenerator.com/mcp, аутентификация через Authorization: Bearer <key>. Streamable HTTP с протоколом 2026-07-28; старые клиенты обслуживаются через рукопожатие 2025-11-25 или 2025-06-18.

    Подключение клиента

    Claude Code

    bash
    claude mcp add --transport http tempgenerator-mail https://www.tempgenerator.com/mcp \
      --header "Authorization: Bearer $TEMPGENERATOR_TOKEN"

    Cursor: .cursor/mcp.json

    JSON
    {
      "mcpServers": {
        "tempgenerator-mail": {
          "url": "https://www.tempgenerator.com/mcp",
          "headers": { "Authorization": "Bearer ${env:TEMPGENERATOR_TOKEN}" }
        }
      }
    }

    VS Code: .vscode/mcp.json

    JSON
    {
      "inputs": [
        { "type": "promptString", "id": "tempgenerator-token", "description": "TempGenerator API key", "password": true }
      ],
      "servers": {
        "tempgenerator-mail": {
          "type": "http",
          "url": "https://www.tempgenerator.com/mcp",
          "headers": { "Authorization": "Bearer ${input:tempgenerator-token}" }
        }
      }
    }

    Claude в веб-версии и десктопном приложении: добавьте пользовательский коннектор с URL эндпоинта, выберите вариант без входа и добавьте заголовок запроса Authorization: Bearer <key>. Claude подключается из облака Anthropic, поэтому URL должен быть доступен из интернета.

    Инструменты

    create_inbox
    Создаёт приватный ящик и возвращает его ID и адрес.
    list_messages
    Возвращает сводки писем после курсора с необязательными фильтрами по отправителю и теме.
    wait_for_message
    Ждёт следующее письмо до 20 секунд.
    read_message
    Читает текст, коды, ссылки и список вложений одного письма.
    delete_inbox
    Удаляет ящик и его письма.

    Пример промпта

    Создайте временный ящик и сообщите мне его адрес. Затем дождитесь письма с подтверждением от моего staging-приложения и назовите код.

    Разрешайте агентам завершать регистрацию только в аккаунтах, которые принадлежат вам или которые вам разрешено использовать. Входящим письмам доверять нельзя: сервер никогда не открывает ссылки, а агенты не должны выполнять инструкции из писем.

    MCP SDK для Python

    Проверено с Python 3 и официальным пакетом mcp 2.3.0: pip install "mcp>=2.3,<3". Сначала задайте TEMPGENERATOR_URL и TEMPGENERATOR_TOKEN.

    Python
    import asyncio, os
    
    import httpx2
    from mcp import Client
    from mcp.client.streamable_http import streamable_http_client
    
    async def main():
        url = os.environ["TEMPGENERATOR_URL"].rstrip("/") + "/mcp"
        headers = {"Authorization": "Bearer " + os.environ["TEMPGENERATOR_TOKEN"]}
        async with httpx2.AsyncClient(headers=headers, timeout=httpx2.Timeout(30, read=60)) as http:
            async with Client(streamable_http_client(url, http_client=http)) as client:
                print([tool.name for tool in (await client.list_tools()).tools])
                created = await client.call_tool("create_inbox", {})
                if created.is_error:
                    raise RuntimeError(created.content)
                inbox = created.structured_content
                try:
                    print("Send a test email to", inbox["address"])
                    waited = await client.call_tool("wait_for_message", {"inbox_id": inbox["id"], "timeout": 20})
                    for summary in waited.structured_content["messages"]:
                        message = await client.call_tool("read_message", {"inbox_id": inbox["id"], "message_id": summary["id"]})
                        print(message.structured_content["subject"], message.structured_content["codes"])
                finally:
                    deleted = await client.call_tool("delete_inbox", {"inbox_id": inbox["id"]})
                    if deleted.is_error:
                        raise RuntimeError(deleted.content)
    
    asyncio.run(main())

    Вложения

    При чтении письма возвращаются индекс, имя файла и размер каждого вложения. Скачать вложение можно через GET …/attachments/{index}: файлы до 10 МБ отдаются как application/octet-stream с очищенными именами файлов. MCP-клиенты видят тот же список и скачивают вложения через этот REST-эндпоинт.

    Когда выбрать этот API вместо других инструментов

    Mailpit, MailHog и Ethereal перехватывают письма, которые ваше приложение отправляет на локальный или фиктивный SMTP-сервер, — это идеально, когда вы управляете настройками SMTP. Эти ящики — настоящие адреса на публичном домене, поэтому до них может достучаться любой отправитель: сторонний сервис, staging-сервер с вашим реальным почтовым провайдером или сценарий, близкий к продакшену.

    Обычные API временной почты, например mail.tm или Guerrilla Mail, рассчитаны на личные одноразовые адреса. Этот API создан для автоматизации: ключи с ограниченными правами и сроком действия, один ящик на тест, ограниченное по времени ожидание через long polling, распознавание кодов и ссылок и MCP-сервер.

    Не входит: отправка писем, SMS, предпросмотр HTML или проверка на спам, собственные домены и вход через OAuth для MCP-клиентов.

    Хранение, ограничения и безопасность

    ОграничениеПробный режимТокен разработчика
    Срок жизни ящика10 минутДо 60 минут
    Активные ящики15 на аккаунт
    Новые ящикиОдин раз в 10 минут на сеть20 в час
    Запросы к API120 в минуту120 в минуту
    Ожидание (long polling)До 20 секунд, одно на ящикДо 20 секунд, одно на ящик, не более 2 одновременно
    Писем на ящикДо 10До 10
    Возвращаемый текст письмаПервые 128 КБПервые 128 КБ
    Скачивание вложенийДо 10 МБ каждоеДо 10 МБ каждое
    ДоступТолько эта вкладка браузераREST API и MCP с вашими ключами

    Домен приёма может задать более короткий срок жизни или меньший лимит писем.

    Только приём. Считайте письма и вложения недоверенными; ничего не открывается автоматически. При удалении ящика его письма удаляются сразу, а истёкшие ящики удаляет плановая очистка.

    Частые вопросы

    Что такое API временной почты?

    HTTP API, который по запросу создаёт одноразовые почтовые ящики и позволяет вашему коду читать входящие письма. Здесь каждый ящик доступен только по вашему ключу, истекает сам и читается через REST или MCP.

    Нужен ли аккаунт?

    Чтобы попробовать — нет: пробный режим создаёт один приватный ящик на 10 минут прямо в браузере. Для API-ключей, MCP и ящиков с более долгим сроком жизни создайте аккаунт и подтвердите почту.

    Сколько живут ящики?

    Пробные ящики живут 10 минут. Ящики, созданные с токеном разработчика, живут до 60 минут или меньше, если домен приёма задаёт более короткий срок. Удалить ящик можно в любой момент.

    Как дождаться письма в тесте?

    Вызовите эндпоинт wait или инструмент wait_for_message с последним курсором. Ответ придёт, как только появится письмо, или не позднее чем через 20 секунд — тогда в ответе будет status timeout; затем снова ждите с тем же курсором. Избегайте фиксированных пауз.

    Как получить OTP или ссылку подтверждения?

    Прочитайте письмо. Ответ содержит его обычный текст, а также поля codes (вероятные одноразовые коды рядом со словами вроде «код», OTP или «подтверждение») и links (ссылки http и https из текста и HTML). Это подсказки, поэтому сверяйте их с текстом.

    Можно ли скачивать вложения?

    Да. При чтении письма возвращаются индекс, имя и размер каждого вложения; скачайте нужное через эндпоинт вложений. Поддерживаются файлы до 10 МБ.

    К чему даёт доступ токен и когда он истекает?

    Ключ принадлежит одному подтверждённому аккаунту и даёт доступ только к ящикам этого аккаунта. Ключи на чтение и запись могут создавать и удалять ящики; ключи только для чтения — получать список, ждать, читать и скачивать. Ключи действуют 90 дней, и их можно мгновенно отозвать.

    Как подключить Claude Code или Cursor?

    Используйте эндпоинт https://www.tempgenerator.com/mcp с заголовком Authorization: Bearer. В Claude Code выполните claude mcp add --transport http с параметром --header; в Cursor добавьте запись с url и headers в .cursor/mcp.json. Оба примера приведены выше.

    Могут ли агенты завершать регистрацию?

    Только в аккаунтах, которые принадлежат вам или которые вам разрешено использовать, например в staging-окружении вашего собственного приложения. Сервер никогда не открывает ссылки. Агент должен использовать код или ссылку только для завершения сценария, о котором вы попросили, и никогда не выполнять инструкции из письма.

    Можно ли запускать тесты параллельно или в CI?

    Да. Дайте каждому тесту свой ящик: ожидания на разных ящиках выполняются параллельно. У аккаунта может быть 5 активных ящиков и 20 новых в час, поэтому удаляйте ящики в teardown и храните ключ в секретах CI.

    Можно ли удалить ящик досрочно?

    Да. Отправьте DELETE для ящика или вызовите delete_inbox, чтобы сразу удалить его вместе с письмами. Удаление пробного ящика не сокращает интервал в 10 минут, после которого из вашей сети можно создать следующий.

    Чем это отличается от Mailpit или MailHog?

    Mailpit и MailHog запускают локальный SMTP-сервер, который перехватывает письма вашего собственного приложения. Здесь же — настоящие ящики на публичном домене, до которых может достучаться любой отправитель, с API, ожиданием через long polling и MCP.

    Какие есть ограничения?

    Пробные ящики живут 10 минут. У аккаунта разработчика может быть 5 активных ящиков; он может создавать 20 ящиков в час, делать 120 запросов к API в минуту и ждать до 20 секунд на запрос. Каждый ящик принимает до 10 писем.

    Можно ли отправлять письма или использовать свой домен?

    Нет. Ящики работают только на приём и используют домены приёма этого сайта. Отправка, SMS и собственные домены не поддерживаются.