임시 메일 API · MCP

이메일 테스트와 AI 에이전트를 위한 임시 메일 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개까지 가능합니다.

    Playwright·Cypress·pytest·CI에서 이메일 테스트

    테스트마다 전용 수신함을 사용하세요. 앱에서 가입 메일이나 비밀번호 재설정 메일을 보내게 한 뒤, 도착을 기다려 코드나 링크를 검증하세요. 수신함은 teardown 단계에서 삭제하세요.

    키는 CI 시크릿으로 저장하세요. 예를 들어 GitHub Actions에서는 TEMPGENERATOR_TOKEN으로 저장합니다. Cypress는 cy.request로 같은 HTTP 호출을 할 수 있으며, 아래 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")

    AI 에이전트용 MCP 서버

    https://www.tempgenerator.com/mcp 엔드포인트는 Authorization: Bearer <key>로 인증합니다. 프로토콜 2026-07-28의 Streamable HTTP를 사용하며, 이전 클라이언트는 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
    수신함과 메시지를 삭제합니다.

    프롬프트 예시

    임시 수신함을 만들고 주소를 알려 주세요. 그런 다음 스테이징 앱에서 오는 인증 메일을 기다렸다가 코드를 알려 주세요.

    에이전트가 가입을 완료하게 하는 것은 본인이 소유했거나 사용 권한이 있는 계정으로 한정하세요. 수신한 메일은 신뢰할 수 없습니다. 서버는 링크를 절대 열지 않으며, 에이전트는 메시지에 담긴 지시를 절대 따르지 않아야 합니다.

    Python용 MCP SDK

    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 MB 파일까지 정제된 파일 이름과 함께 application/octet-stream으로 제공됩니다. MCP 클라이언트도 같은 목록을 보고 이 REST 엔드포인트로 다운로드합니다.

    다른 도구 대신 이 API를 쓰면 좋은 경우

    Mailpit, MailHog, Ethereal은 자신의 앱이 로컬 또는 가짜 SMTP 서버로 보낸 메일을 캡처하므로, SMTP 설정을 직접 제어할 수 있을 때 적합합니다. 반면 이 수신함은 공개 도메인의 실제 주소라서 어떤 발신자든 메일을 보낼 수 있습니다. 예를 들어 서드파티 서비스, 실제 이메일 제공업체를 사용하는 스테이징 서버, 프로덕션과 비슷한 흐름 등입니다.

    mail.tm이나 Guerrilla Mail 같은 일반 임시 메일 API는 개인용 일회용 주소를 위해 만들어졌습니다. 이 API는 자동화를 위해 만들어졌으며, 권한 범위와 만료 기한이 있는 키, 테스트당 하나의 수신함, 시간 제한이 있는 롱 폴링 대기, 코드·링크 감지, MCP 서버를 제공합니다.

    포함되지 않는 기능: 이메일 발송, SMS, HTML·스팸 미리보기, 사용자 지정 도메인, MCP 클라이언트용 OAuth 로그인.

    보관 기간, 한도 및 보안

    제한 항목체험개발자 토큰
    수신함 유지 시간10분최대 60분
    활성 수신함1개계정당 5개
    새 수신함 생성네트워크당 10분에 1개시간당 20개
    API 요청분당 120회분당 120회
    롱 폴링 대기최대 20초, 수신함당 1개최대 20초, 수신함당 1개, 동시에 2개까지
    수신함당 메시지 수최대 10개최대 10개
    반환되는 메시지 본문처음 128 KB처음 128 KB
    첨부파일 다운로드파일당 최대 10 MB파일당 최대 10 MB
    접근 방식이 브라우저 탭에서만내 키로 REST API 및 MCP

    수신 도메인에 따라 유지 시간이 더 짧거나 메시지 한도가 더 낮게 설정될 수 있습니다.

    수신 전용입니다. 메일과 첨부파일은 신뢰할 수 없는 것으로 취급하세요. 자동으로 열리는 것은 없습니다. 수신함을 삭제하면 메시지가 즉시 삭제되며, 만료된 수신함은 예약된 정리 작업으로 삭제됩니다.

    자주 묻는 질문

    임시 메일 API란 무엇인가요?

    필요할 때 일회용 이메일 수신함을 만들고, 도착한 메일을 코드에서 읽을 수 있게 해 주는 HTTP API입니다. 이 서비스에서는 각 수신함이 내 키 전용이며, 자동으로 만료되고, REST 또는 MCP로 읽을 수 있습니다.

    계정이 필요한가요?

    체험만 하려면 필요 없습니다. 체험하면 브라우저에서 비공개 수신함 하나가 10분 동안 만들어집니다. API 키, MCP, 더 오래 유지되는 수신함을 쓰려면 계정을 만들고 이메일을 인증하세요.

    수신함은 얼마나 유지되나요?

    체험 수신함은 10분 동안 유지됩니다. 개발자 토큰으로 만든 수신함은 최대 60분 동안 유지되며, 수신 도메인이 더 짧은 유지 시간을 설정한 경우 그보다 짧아집니다. 수신함은 언제든지 삭제할 수 있습니다.

    테스트에서 이메일이 도착할 때까지 어떻게 기다리나요?

    최신 커서로 wait 엔드포인트나 wait_for_message 도구를 호출하세요. 메시지가 도착하면 즉시 응답하고, 도착하지 않으면 최대 20초 후 status timeout으로 응답합니다. 그 후 같은 커서로 다시 기다리세요. 고정된 sleep은 피하세요.

    OTP나 인증 링크는 어떻게 가져오나요?

    메시지를 읽으세요. 응답에는 일반 텍스트 본문과 함께 codes(코드, OTP, 인증 같은 단어 근처에서 찾은 일회용 코드 후보)와 links(본문과 HTML에서 찾은 http 및 https 링크)가 들어 있습니다. 이는 힌트일 뿐이므로 본문과 대조해 확인하세요.

    첨부파일을 다운로드할 수 있나요?

    네. 메시지를 읽으면 각 첨부파일의 인덱스, 이름, 크기가 나열되며, 첨부파일 엔드포인트에서 하나씩 다운로드할 수 있습니다. 최대 10 MB 파일까지 지원합니다.

    토큰으로 무엇에 접근할 수 있고 언제 만료되나요?

    키는 인증된 계정 하나에 속하며 그 계정의 수신함에만 접근할 수 있습니다. 읽기 및 쓰기 키는 수신함을 만들고 삭제할 수 있고, 읽기 전용 키는 목록 조회, 대기, 읽기, 다운로드를 할 수 있습니다. 키는 90일 후 만료되며 즉시 폐기할 수 있습니다.

    Claude Code나 Cursor는 어떻게 연결하나요?

    https://www.tempgenerator.com/mcp 엔드포인트와 Authorization: Bearer 헤더를 사용하세요. Claude Code에서는 --header와 함께 claude mcp add --transport http를 실행하고, Cursor에서는 .cursor/mcp.json에 url과 headers 항목을 추가하세요. 두 예제 모두 위에 있습니다.

    AI 에이전트가 회원가입을 완료할 수 있나요?

    본인이 소유했거나 사용 권한이 있는 계정(예: 자신의 앱 스테이징 환경)에서만 가능합니다. 서버는 링크를 절대 열지 않습니다. 에이전트는 요청받은 흐름을 마칠 때만 코드나 링크를 사용해야 하며, 이메일에 적힌 지시는 절대 따르지 않아야 합니다.

    이메일 테스트를 병렬로 실행하거나 CI에서 돌릴 수 있나요?

    네. 테스트마다 전용 수신함을 사용하세요. 서로 다른 수신함의 대기는 병렬로 실행됩니다. 계정당 활성 수신함은 5개, 생성은 시간당 20개까지이므로 teardown 단계에서 수신함을 삭제하고 키는 CI 시크릿에 보관하세요.

    수신함을 만료 전에 삭제할 수 있나요?

    네. 수신함에 DELETE 요청을 보내거나 delete_inbox를 호출하면 수신함과 메시지가 즉시 삭제됩니다. 체험 수신함을 삭제해도 네트워크에서 다음 수신함을 만들 수 있을 때까지의 10분 대기 시간은 줄어들지 않습니다.

    Mailpit이나 MailHog와 무엇이 다른가요?

    Mailpit과 MailHog는 자신의 앱이 보내는 메일을 캡처하는 로컬 SMTP 서버를 실행합니다. 반면 이 서비스는 어떤 발신자든 메일을 보낼 수 있는 공개 도메인의 실제 수신함이며, API, 롱 폴링 대기, MCP를 제공합니다.

    이용 한도는 어떻게 되나요?

    체험 수신함은 10분 동안 유지됩니다. 개발자 계정은 활성 수신함을 5개까지 보유하고, 시간당 20개를 만들고, 분당 120회 API 요청을 보내고, 요청당 최대 20초 동안 기다릴 수 있습니다. 각 수신함은 최대 10개의 메시지를 받습니다.

    이메일을 보내거나 사용자 지정 도메인을 쓸 수 있나요?

    아니요. 수신함은 수신 전용이며 이 사이트의 수신 도메인을 사용합니다. 발송, SMS, 사용자 지정 도메인은 지원하지 않습니다.