mail.cx
高级版
登录

API 文档

通过 API 创建临时邮箱、长轮询新邮件、读取解析后的邮件正文、管理用户令牌和自定义域名,并通过 SSE 实时接收事件推送。

基础 URL

https://api.mail.cx/v1

所有接口都位于 /v1 前缀下,必须使用 HTTPS。每个请求的基础 URL 都相同。

认证

每个请求都必须通过 x-api-token 请求头携带 API 令牌。令牌类型决定调用者的权限:

  • 用户令牌(tm_live_…)在控制台 → 令牌中创建,用于 SDK / 自动化场景。受单用户速率限制 + 月度 Ops 配额约束。免费版 1 个,专业版 10 个。
  • 网页会话(tm_live_…)由登录 / 注册 / OAuth 颁发,7 天 TTL。用于浏览器 UI;不占用用户令牌配额,也不扣 Ops。
  • 匿名令牌(tm_anon_…)通过 POST /v1/sessions/anon 颁发(启用 Cloudflare Turnstile 时仅限浏览器)。默认 24 小时 TTL。仅能访问系统域名邮箱 — 无法访问自定义域名、/me、/tokens、/domains 或管理员接口。
curl https://api.mail.cx/v1/inbox \
  -X POST \
  -H "x-api-token: tm_live_your_token_here" \
  -H "Content-Type: application/json" \
  -d '{}'

快速开始

1. 创建临时邮箱。请求体为空时服务器会在默认系统域名上生成随机 local_part。返回邮箱地址和以 Unix 毫秒时间戳表示的过期时间。

curl -X POST https://api.mail.cx/v1/inbox \
  -H "x-api-token: tm_live_your_token_here" \
  -H "Content-Type: application/json" \
  -d '{}'

// → 201
{
  "address": "ab12cd@qabq.com",
  "expires_at": 1715706000000
}

2. 使用长轮询等待邮件。服务器会保持连接最长 25 秒。200 表示有新邮件;204 表示等待超时未收到邮件,使用返回的 next_since 游标重新发起请求即可。

curl "https://api.mail.cx/v1/inbox/ab12cd@qabq.com?since=0" \
  -H "x-api-token: tm_live_your_token_here"

// → 200
{
  "emails": [
    { "id": "uuid", "from_email": "sender@example.com", "subject": "...", "preview_text": "...", "created_at": "2026-05-14T12:00:00Z" }
  ],
  "next_since": "1715706012"
}

3. 通过邮件 id 读取完整邮件(纯文本正文、HTML 正文、附件元数据)。

curl https://api.mail.cx/v1/email/{email_id} \
  -H "x-api-token: tm_live_your_token_here"

速率限制与 Ops 配额

每次已认证请求都会在一次 Redis 往返内原子地跑两层校验:单用户滑动窗口速率限制 + 月度 Ops 计数。匿名令牌没有应用层速率限制 — IP 限速在网络边缘进行。

限制FreePro
单用户请求速率(1 秒窗口)8 / s10 / s
月度 Ops 配额1,500200,000

已认证响应包含 X-Ops-Limit 与 X-Ops-Remaining 响应头。响应体为 {"error":"rate_limit_exceeded"} 的 429 同时附带 Retry-After(秒);响应体为 {"error":"ops_quota_exceeded"} 的 429 在 UTC 次月 1 日重置。

什么算作一个 Op?

只有控制台创建的用户令牌(kind=user)会扣 Ops。网页会话令牌(UI 登录用)和匿名令牌不计入月度配额。

  • POST /v1/inbox 和 POST /v1/mailboxes — 创建地址
  • GET /v1/email/:id 和 GET /v1/emails/:id — 读取解析后的邮件
  • GET /v1/emails/:id/raw 与 /attachments/:index — 下载原始 EML 或附件
  • 列表收件、SSE 推送、/me、/ops、/config、登录注册和管理员接口均不计入 Ops

接口列表

Inbox(v1 AI 友好接口)

为 AI Agent 和 SDK 设计的简洁资源结构。GET 接口采用长轮询 — 服务器保持连接最长 25 秒(config wait_seconds,由服务端固定,客户端无法修改)。新邮件到达或等待结束时返回。204 = 等待超时无新邮件;200 = 至少匹配到一封;429 = 触发并发上限(响应中带 Retry-After 头)。

POST
/v1/inbox

创建临时邮箱(不分配任何后端状态 — SMTP 网关本身就会接受系统域名下任意地址的邮件)。

任意令牌(匿名 / 网页会话 / 用户)
GET
/v1/inbox/:address

对单个地址长轮询。查询参数:since、count(默认 1,最大 50)、limit(默认 20,最大 50)、from、subject。

任意令牌(匿名 / 网页会话 / 用户)
DELETE
/v1/inbox/:address

销毁邮箱(删除该地址下的所有邮件与索引)。

任意令牌(匿名 / 网页会话 / 用户)
GET
/v1/email/:id

读取完整邮件(纯文本正文、HTML 正文、附件元数据、邮件头)。

任意令牌(匿名 / 网页会话 / 用户)
GET
/v1/domain/:domain

对一个已验证的自定义域名下所有地址长轮询。查询参数与 /v1/inbox/:address 相同。

需要专业版
GET
/v1/me

对当前用户所有拥有的地址长轮询(专业版自定义域名等)。游标是 Redis Stream ID。

非匿名令牌(网页会话或用户)

POST /v1/inbox 接受可选 JSON 请求体。所有字段均为可选。

ParameterRules
local_part2–20 个字符,仅限小写 a–z 0–9 . _ -。不能以 . _ 或 - 开头或结尾。保留名(admin、postmaster、abuse、support、noreply、root、webmaster、hostmaster、mail、ftp、www)会被拒绝。省略时生成随机 6 位地址。
domain默认使用系统默认域名。可设为你已验证且拥有的自定义域名(需非匿名令牌)。
ttl单位秒。默认值为服务端 mailbox.default_ttl(3600 秒 / 1 小时)。设置了 mailbox.max_ttl 时会被上限截断。注意:TTL 仅在 POST /v1/inbox 中作为参考值 — 实际邮件留存由服务端决定(免费/系统域名 1 小时热存储,专业版自定义域名 7 天归档)。

Mailboxes(按地址访问的兼容接口)

Web UI 使用的原始按地址寻址接口。数据模型与 v1 完全一致,区别在于返回分页列表而非长轮询。

POST
/v1/mailboxes

校验并回显一个地址。不分配状态。请求体:{ local_part?, domain? }。返回 { address, expires_at(RFC3339)}。

任意令牌(匿名 / 网页会话 / 用户)
GET
/v1/inbox/:address/emails

按地址分页列出邮件。查询参数:offset、limit(默认 20,最大 50)。返回 { emails, total, offset, limit }。

任意令牌(匿名 / 网页会话 / 用户)
DELETE
/v1/inbox/:address/emails

删除指定地址下所有当前已索引的邮件。返回 { deleted: <count> }。

任意令牌(匿名 / 网页会话 / 用户)

邮件内容

GET
/v1/emails/:id

读取完整邮件 — /v1/email/:id 的别名。

任意令牌(匿名 / 网页会话 / 用户)
GET
/v1/emails/:id/raw

流式返回原始 .eml。Content-Type 为 message/rfc822,附带 Content-Disposition: attachment。若底层对象已被 TTL 清理则返回 410。

任意令牌(匿名 / 网页会话 / 用户)
GET
/v1/emails/:id/attachments/:index

按零起索引下载单个附件。返回邮件中原始 Content-Type。

任意令牌(匿名 / 网页会话 / 用户)
DELETE
/v1/emails/:id

删除单封邮件,并从所有按地址/按域名的索引中移除。成功时返回 204 No Content。

任意令牌(匿名 / 网页会话 / 用户)

API 令牌

管理用户令牌(kind=user)。网页会话令牌(登录产生)不会出现在列表中也无法在此接口吊销 — 退出登录即可。免费版 1 个;专业版 10 个。

POST
/v1/tokens

创建新的用户令牌。请求体:{ name? }。返回 { id, name, token, created_at }。明文 token 只在创建时返回一次。

非匿名令牌(网页会话或用户)
GET
/v1/tokens

列出你的用户令牌。创建后无法再获取明文 — 只能拿到 id、name、prefix、created_at、last_used_at。

非匿名令牌(网页会话或用户)
DELETE
/v1/tokens/:id

吊销用户令牌。成功时返回 204 No Content,缓存立即失效。

非匿名令牌(网页会话或用户)

自定义域名(专业版)

添加你拥有的域名,即可在该域名下任意地址收信。验证需要两条 DNS 记录:TXT 记录 _tempmail.<domain> 值为 tempmail-verify=<token>,MX 记录指向 smtp.mail.cx。后台校验每 5 分钟轮询一次;72 小时未验证将标记为失败。

POST
/v1/domains

添加自定义域名。请求体:{ domain }。返回需要配置的 DNS 记录。配额:10 个。

需要专业版
GET
/v1/domains

列出你的自定义域名及 verify_status(pending / verified / failed)和 verified_at。

非匿名令牌(网页会话或用户)
DELETE
/v1/domains/:id

移除自定义域名。同时清除 Redis 路由条目,SMTP 立即停止接受该域名邮件。

非匿名令牌(网页会话或用户)

账户与用量

GET
/v1/config

服务端配置:系统域名列表、local-part 规则、默认 TTL、OAuth 客户端 ID、Turnstile 开关。响应缓存 5 分钟。

公开 — 无需认证
POST
/v1/sessions/anon

颁发匿名令牌(仅限浏览器;启用 Cloudflare Turnstile 时需通过校验)。返回 { token, expires_at, kind: "anon" }。

公开 — 无需认证
GET
/v1/ops

当月 Ops 用量:{ plan, limit, used, remaining, resets_at }。

非匿名令牌(网页会话或用户)
GET
/v1/me/usage

近 7 天滚动存储字节用量与配额(专业版 5 GiB;免费版 0)。

非匿名令牌(网页会话或用户)
GET
/v1/me/messages

跨地址的分页历史。?cursor=<stream-id> 读热数据;默认 ?before=<unix-ms> 读 PG 冷归档。

非匿名令牌(网页会话或用户)

实时推送(SSE)

实时邮件事件使用 HTTP 上的 Server-Sent Events(SSE)。浏览器的 EventSource API 会自动带 Last-Event-ID 头重连,服务端用它作为 Redis Stream 游标回放断连期间丢失的事件。由于 EventSource 不支持自定义请求头,令牌通过查询参数传递。

GET
/v1/sse/addr?address=<addr>&token=<token>

推送单个地址的事件流。系统域名地址对任意令牌开放;自定义域名地址需提供拥有者用户令牌。

任意令牌(匿名 / 网页会话 / 用户)
GET
/v1/sse/user?token=<token>

汇总推送当前用户所有拥有的地址,仅限非匿名令牌。

非匿名令牌(网页会话或用户)

每封新邮件以 SSE 事件形式推送。每 30 秒发送一次心跳注释行(:ka <id>),防止反向代理断开连接。

const es = new EventSource(
  "https://api.mail.cx/v1/sse/user?token=tm_live_your_token_here"
);

es.addEventListener("email", (e) => {
  const data = JSON.parse(e.data);
  // { id, address, from, subject, preview }
});

// Heartbeat lines (":ka <last-id>") are surfaced as comments — no handler needed.
// On disconnect EventSource auto-reconnects and sends Last-Event-ID;
// the server replays any missed events from the Redis Stream.

错误处理

错误返回 JSON 对象,包含机器可读的 "error" 字段。HTTP 状态码表示错误类别。

{ "error": "rate_limit_exceeded" }
状态码说明
400请求错误 — 参数或请求体无效。
401x-api-token 缺失或无效。
403禁止 — 匿名令牌访问需要非匿名的接口、非 Pro 用户访问 Pro 接口、账户已禁用,或 Turnstile 校验未通过。
404资源不存在,或你不是该自定义域名 / 地址的拥有者。
409冲突 — 域名已被注册。
410已过期 — 邮件正文已被 TTL 清理(error: email_expired)。
429速率限制(rate_limit_exceeded,带 Retry-After)、Ops 配额(ops_quota_exceeded,按月重置)或并发上限(带 Retry-After)。
503实时推送通道不可用(NATS 故障)或验证码服务离线。

安全性

  • 所有流量仅通过 HTTPS。明文 HTTP 请求会在边缘被升级。
  • 令牌以 SHA-256 哈希存储,创建后服务端不再保留明文。吊销时立即清除 Redis 令牌缓存。
  • 自定义域名邮箱仅对注册的拥有者可见。系统域名邮箱按设计是公开的 — 任何知道地址的匿名调用方都可读取,请勿用于敏感信息。