Email Spam Tester

API

三次调用。无需密钥、账户或注册。

预留一个地址,发送你原本准备发给邮件列表的邮件,然后读取报告。页面显示的所有内容都包含在 JSON 中,包括评分、全部 41 项检查及其证据,以及每项发现所依据的标准章节。

前 100,000 份报告免费,无需密钥,也无需账户。如果你接入的是代理而不是脚本,MCP 服务器比轮询更合适。

在沙盒中试用 → 每个端点都配有一个按钮,可针对实时服务运行。这里无需密钥,因此你从此页面发出的请求是真实请求:它会预留一个真实地址,并计入使用量。

流程

两次请求和一封电子邮件。由于分析需要几秒钟,因此才需要第三次调用。

  1. 预留一个地址

    向收件箱端点发送 POST 请求。你会得到一个仅接收一封邮件且在一小时后过期的地址,以及其他所有内容所关联的标识符。

  2. 向该地址发送真实邮件

    通过 SMTP,从将要发送营销邮件的平台发送。一半的检查会读取发送平台添加的邮件头,因此手动编写的邮件测量的是错误的对象。

  3. 轮询状态,然后读取报告

    状态端点返回的数据只有几百字节,并会告诉你是否已经值得获取完整报告。报告本身有数千行。

# 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 就是访问凭证:持有它的任何人都可以读取该报告,其他人无法猜出它。

这也意味着应像对待密码一样对待 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

轮询成本低。仅返回两个状态字段和检查进度,不返回其他内容。

请轮询此端点,而不是报告端点。analysis_status 会先变为 checks_ready,AI 方案会在大约一分钟后出现在 ai_status 下,因此只需要确定性检查结果的调用方不必等待该方案。

GET/api/v1/tests/{slug}

完整报告。地址已预留但尚未收到任何内容时返回 202,收到后返回 200。

GET/api/v1/tests/{slug}/message

邮件被投递时的原始内容:按线路顺序排列的每个请求头、两种正文、附件列表和原始源代码。由于报告会被轮询,而这些内容的大小可能达到一兆字节,因此需要单独获取。

原始邮件按其自身的时限删除,早于报告。之后,此端点返回原因而不是邮件源文。

PUT/api/v1/tests/{slug}/locale

更改尚未使用的预留地址的语言。适用于已请求地址后才得知用户阅读哪种语言的代理。邮件到达后将拒绝更改,因为此时分析已在运行。

GET/api/health

存活性。无需身份验证,无副作用。

阅读报告

包含结果的字段,按您可能需要的顺序排列。

score_ours0 到 100。我们的模型。身份验证和基础设施占据大部分权重,因为它们会在过滤器读取邮件正文中的任何文字之前决定邮件能否送达。
score_compat0 到 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你的地址已达到免费测试限额。目前此服务没有每人限额;如果以后设置了限额,响应正文会说明限额何时重置。

值得了解的四件事

每个地址仅限一封邮件

第二封会被拒收。您之前的报告保持不变,这正是这样设计的目的。

一小时内使用

地址会过期;报告不会。报告链接是永久的,因此粘贴到工单中的链接会一直有效。

从平台发送

从个人账户测试营销活动,衡量的是该账户。身份验证部分的几乎所有内容都与发送基础设施有关,而不是文本。

修复后重新测试

预期提升是每次针对一项修复计算的,不能叠加。第二份报告中的数字才是真实结果。

面向机器

先手动试一次

大约需要一分钟,并会准确展示 JSON 所描述的内容。

获取测试地址