在沙盒中试用 → 每个端点都配有一个按钮,可针对实时服务运行。这里无需密钥,因此你从此页面发出的请求是真实请求:它会预留一个真实地址,并计入使用量。
流程
两次请求和一封电子邮件。由于分析需要几秒钟,因此才需要第三次调用。
预留一个地址
向收件箱端点发送 POST 请求。你会得到一个仅接收一封邮件且在一小时后过期的地址,以及其他所有内容所关联的标识符。
向该地址发送真实邮件
通过 SMTP,从将要发送营销邮件的平台发送。一半的检查会读取发送平台添加的邮件头,因此手动编写的邮件测量的是错误的对象。
轮询状态,然后读取报告
状态端点返回的数据只有几百字节,并会告诉你是否已经值得获取完整报告。报告本身有数千行。
# 1. reserve a single-use address curl -sX POST 'https://email-spam-tester.com/api/v1/inbox?lang=en' { "address": "test-<slug>@t.email-spam-tester.com", "slug": "<slug>", "expires_at": "2026-01-01T12:00:00Z" }
# 2. send your message to that address, then poll curl -s 'https://email-spam-tester.com/api/v1/tests/<slug>/status' { "slug": "<slug>", "analysis_status": "checks_ready", "ai_status": "running", "checks_done": 39, "checks_total": 39 }
# 3. read the report once analysis_status is checks_ready curl -s 'https://email-spam-tester.com/api/v1/tests/<slug>' { "report_url": "https://email-spam-tester.com/t/<slug>", "score_ours": 86.4, "score_compat": 9.2, "subscores": {"auth": 100.0, "infra_spam": 78.1, "content": 92.0, "compliance": 75.0}, "complete": true, "checks": [ { "id": "auth.dmarc", "status": "warn", "title": "DMARC result", "summary": "DMARC passes, but the policy is p=none.", "weight_ours": -4.0, "evidence": {"policy": "none", "aligned": "dkim"}, "citations": {"standards": [{"title": "RFC 9989 §4.7", "quote": "..."}]} } ], "fixes": [ {"id": "dmarc-enforce", "gain_ours": 4.0, "gain_compat": 0.0, "fix": {"title": "Move DMARC to quarantine", "severity": "medium"}} ] }
身份验证
没有身份验证。无需申请密钥,无需设置请求头,也无需创建账户。返回的 slug 就是访问凭证:持有它的任何人都可以读取该报告,其他人无法猜出它。
端点
基地址为 https://email-spam-tester.com。所有响应均为 JSON。
POST/api/v1/inbox
预留一个一次性地址。两个参数均为可选参数。
| lang | 修复方案和各项检查结果所使用的语言,以 ISO 代码表示。此时即确定语言,因为邮件会在几分钟后通过 SMTP 到达,并且不包含任何关于等待接收者的信息。未知代码会回退到英语。 |
| utm_source, utm_medium, utm_campaign | 传递给我们的分析系统。如果你要衡量自己的集成效果,这些参数会很有用。 |
GET/api/v1/tests/{slug}/status
轮询成本低。仅返回两个状态字段和检查进度,不返回其他内容。
GET/api/v1/tests/{slug}
完整报告。地址已预留但尚未收到任何内容时返回 202,收到后返回 200。
GET/api/v1/tests/{slug}/message
邮件被投递时的原始内容:按线路顺序排列的每个请求头、两种正文、附件列表和原始源代码。由于报告会被轮询,而这些内容的大小可能达到一兆字节,因此需要单独获取。
PUT/api/v1/tests/{slug}/locale
更改尚未使用的预留地址的语言。适用于已请求地址后才得知用户阅读哪种语言的代理。邮件到达后将拒绝更改,因为此时分析已在运行。
GET/api/health
存活性。无需身份验证,无副作用。
阅读报告
包含结果的字段,按您可能需要的顺序排列。
| score_ours | 0 到 100。我们的模型。身份验证和基础设施占据大部分权重,因为它们会在过滤器读取邮件正文中的任何文字之前决定邮件能否送达。 |
| score_compat | 0 到 10。复现人们已用于比较的 SpamAssassin 风格分数,使报告能够与其他地方看到的结果进行比较。 |
| subscores | 每个部分采用相同的 0 到 100 分制:auth、infra_spam、content、compliance。 |
| checks[] | 全部 41 项,每项都包含状态、单行结论、作为判断依据的证据,以及对两个分数的影响。 |
| checks[].citations | 发现依据:RFC 中的对应章节、逐字引用的原文,以及 Google 声明其自身要求的页面。这些内容是人工整理而非自动生成,因此可以信赖。 |
| fixes[] | 按顺序列出需要更改的内容,以及每项更改对应的分值。收益通过对报告重新评分计算得出,而非估算。 |
| complete | 当某项检查无法运行时为 False。未检查的项目绝不会被视为通过,因此在该值变为 true 之前,应将分数视为乐观估计。 |
| report_url | 供人阅读的页面。应将它交给相关人员,而不是给他们一大段 JSON。 |
状态
检查有五种状态,其中两种状态之间的差异比看起来更重要。
| pass | 检查已运行,且未发现任何问题。 |
| warn | 值得修复。会扣分。 |
| fail | 会影响邮件送达。扣除更多分数。 |
| skip | 不适用。没有要扫描的附件,也没有要评估的 HTML 部分。不算通过。 |
| error | 我们无法确定。将其排除在评分之外并标记,而不是计为通过。 |
analysis_status 依次为 received、analyzing、checks_ready、failed。ai_status 依次为 pending、running、ready、fallback、error。确定性报告在 checks_ready 时即为最终结果;ai_status 只会添加方案。
可能返回的内容
| 202 | 该地址已被保留,且尚未收到邮件。响应正文包含地址、到期时间和语言,因此即使调用方并未创建该保留,也仍可显示这些信息。 |
| 404 | 不存在此 slug。它从未存在,或者该保留已被遗忘。 |
| 410 | 该地址在收到邮件前已过期。 |
| 409 | 你尝试在邮件已经到达后更改语言。 |
| 429 | 你的地址已达到免费测试限额。目前此服务没有每人限额;如果以后设置了限额,响应正文会说明限额何时重置。 |
值得了解的四件事
每个地址仅限一封邮件
第二封会被拒收。您之前的报告保持不变,这正是这样设计的目的。
一小时内使用
地址会过期;报告不会。报告链接是永久的,因此粘贴到工单中的链接会一直有效。
从平台发送
从个人账户测试营销活动,衡量的是该账户。身份验证部分的几乎所有内容都与发送基础设施有关,而不是文本。
修复后重新测试
预期提升是每次针对一项修复计算的,不能叠加。第二份报告中的数字才是真实结果。
面向机器
- /api/openapi.json OpenAPI 描述,由提供 API 的同一套代码生成。
- /llms.txt, /llms-full.txt 按照 llms.txt 约定为语言模型提供的本站简要导览,以及将完整流程和报告字段放在一个文件中的详细版本。
- /mcp 具备相同功能并支持阻塞式等待的 MCP 服务器,这优于从模型内部进行轮询。
- For agents 代理页面:何时使用此功能,如何区分跳过的检查与通过的检查,以及哪些发现属于必须由人员修改的 DNS 记录,而不是代理可以编辑的文本。