临时邮箱 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> 认证。采用 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
    删除收件箱及其邮件。

    示例提示词

    创建一个临时收件箱并告诉我它的地址。然后等待我预发布环境中的应用发来的验证邮件,并告诉我验证码。

    只允许智能体为你拥有或获授权使用的账户完成注册。收到的邮件不可信:服务器从不打开链接,智能体也绝不应遵循邮件中的指令。

    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 服务器。

    不包括:发送邮件、短信、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 封邮件。

    可以发送邮件或使用自定义域名吗?

    不可以。收件箱仅用于接收,并使用本站的接收域名。不支持发送邮件、短信和自定义域名。