Email Spam Tester

API'et

Tre kald. Ingen nøgle, ingen konto, ingen tilmelding.

Reservér en adresse, send den meddelelse, du var ved at sende til din liste, og læs rapporten. Alt, hvad siden viser, findes i JSON, herunder scoren, alle 41 kontroller med deres dokumentation og det afsnit i standarden, som hver konstatering bygger på.

De første 100.000 rapporter er gratis, uden nøgle og uden konto. Hvis du konfigurerer en agent frem for et script, er MCP-serveren bedre egnet end polling.

Prøv det i sandkassen → Hvert endpoint har en knap, der kører det mod live-tjenesten. Intet her kræver en nøgle, så en anmodning, du sender fra denne side, er reel: Den reserverer en rigtig adresse, og den tæller med.

Forløbet

To forespørgsler og én email. Det tredje kald er kun nødvendigt, fordi analysen tager nogle få sekunder.

  1. Reservér en adresse

    Send en POST-anmodning til indbakke-endpointet. Du får en adresse tilbage, som accepterer præcis én meddelelse og udløber efter en time, samt den slug, som alt andet bruger som nøgle.

  2. Send den rigtige meddelelse til den

    Via SMTP fra den platform, der skal sende kampagnen. Halvdelen af kontrollerne læser headere, som din afsendelsesplatform tilføjer, så en meddelelse, der er skrevet manuelt, måler det forkerte.

  3. Poll status, og læs derefter rapporten

    Status-endpointet fylder nogle få hundrede byte og fortæller dig, om det er værd at hente hele rapporten endnu. Selve rapporten fylder flere tusinde linjer.

# 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"}}
  ]
}

Godkendelse

Der er ingen. Ingen nøgle at anmode om, ingen header at angive, ingen konto at oprette. Den slug, du får tilbage, er adgangsmuligheden: Den, der har den, kan læse rapporten, og ingen andre kan gætte den.

Det betyder også, at en slug bør behandles som en adgangskode. En rapport viser emnelinjen, afsenderen, returadressen og meddelelsens fulde kilde til enhver, der har linket.

Endpoints

Basisadresse https://email-spam-tester.com. Alt svarer med JSON.

POST/api/v1/inbox

Reserverer en engangsadresse. Begge parametre er valgfrie.

langDet sprog, som rettelsesplanen og resultaterne for hvert tjek skrives på, som en ISO-kode. Det afgøres nu, fordi meddelelsen ankommer via SMTP flere minutter senere og ikke indeholder nogen indikation af, hvem der venter på den. En ukendt kode falder tilbage til engelsk.
utm_source, utm_medium, utm_campaignSendes videre til vores analyseværktøj. Nyttigt, hvis du måler din egen integration.

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

Billigt at polle. Returnerer de to statusfelter og oplysning om, hvor langt tjekkene er nået, og intet andet.

Poll dette i stedet for rapporten. analysis_status når først checks_ready, og AI-planen lander under ai_status cirka et minut senere, så en klient, der kun vil have de deterministiske tjek, ikke behøver at vente på planen.

GET/api/v1/tests/{slug}

Hele rapporten. Svarer med 202, mens adressen er reserveret, og intet endnu er ankommet, og med 200, når det er sket.

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

Meddelelsen præcis som den blev leveret: alle headere i wire-rækkefølge, begge brødtekster, listen over vedhæftede filer og den rå kilde. Hentes separat, fordi rapporten polles, og dette kan fylde op til en megabyte.

Den rå meddelelse slettes efter sin egen tidsplan, tidligere end rapporten. Derefter svarer dette slutpunkt med årsagen i stedet for kilden.

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

Ændrer sproget for en reservation, der endnu ikke er blevet brugt. Til en agent, der finder ud af, hvilket sprog dens bruger læser, efter at den allerede har bedt om adressen. Afvises, når meddelelsen er ankommet, fordi analysen på det tidspunkt kører.

GET/api/health

Livstegn. Ingen godkendelse, ingen bivirkninger.

Læsning af rapporten

Felterne, der indeholder svaret, i den rækkefølge, du sandsynligvis ønsker dem.

score_ours0 til 100. Vores model. Godkendelse og infrastruktur vægter mest, fordi de afgør leveringen, før et filter læser et eneste ord af teksten.
score_compat0 til 10. Gengiver det SpamAssassin-lignende tal, som folk allerede sammenligner med, så rapporten kan sammenlignes med det, nogen har set et andet sted.
subscoresDen samme skala fra 0 til 100 pr. sektion: auth, infra_spam, content, compliance.
checks[]Alle 41, hver med en status, en konklusion på én linje, det evidensgrundlag, den blev afgjort ud fra, og hvad den kostede på de to scorer.
checks[].citationsHvor resultatet kommer fra: afsnittet i RFC'en, citeret ordret, og siden, hvor Google angiver sit eget krav. Udvalgt manuelt frem for genereret, så der kan stoles på dem.
fixes[]Hvad der skal ændres, i rækkefølge, med det antal point, som hver ændring er værd. Gevinsterne beregnes ved at score rapporten igen, ikke ved et skøn.
completeFalse, når en kontrol ikke kunne køres. Et ukontrolleret punkt er aldrig godkendt, så betragt scoren som optimistisk, indtil værdien er true.
report_urlDen menneskeligt læsbare side. Giv den til en person i stedet for en mur af JSON.

Statusser

En kontrol har én af fem statusser, og forskellen mellem to af dem betyder mere, end det ser ud til.

passKontrollen blev kørt og fandt ingen fejl.
warnVærd at rette. Koster point.
failVil koste dig levering. Koster flere point.
spring overFandt ikke anvendelse. Ingen vedhæftede filer at scanne, ingen HTML-del at vægte. Ikke godkendt.
fejlVi kunne ikke afgøre det. Udeladt fra scoren og markeret i stedet for at blive talt som godkendt.

analysis_status gennemgår received, analyzing, checks_ready, failed. ai_status gennemgår pending, running, ready, fallback, error. Den deterministiske rapport er endelig ved checks_ready; ai_status tilføjer altid kun planen.

Hvad der kan returneres

202Adressen er reserveret, og ingen meddelelse er ankommet. Svarteksten indeholder adressen, udløbstidspunktet og sproget, så en klient, der ikke oprettede reservationen, stadig kan vise den.
404Denne slug findes ikke. Den har aldrig eksisteret, eller reservationen blev glemt.
410Adressen udløb, før en meddelelse ankom.
409Du forsøgte at ændre sproget, efter at meddelelsen allerede var ankommet.
429Grænsen for gratis test for din adresse. Der er lige nu ingen grænse pr. person for denne tjeneste; hvis en sådan grænse nogensinde fastsættes, angiver svarteksten, hvornår den nulstilles.

Fire ting, der er værd at vide

Én meddelelse pr. adresse

Den anden afvises. Din tidligere rapport forbliver intakt, hvilket er formålet.

En time til at bruge den

Adressen udløber; det gør rapporten ikke. Rapportlinks er permanente, så et link, der indsættes i en sag, bliver ved med at virke.

Send fra platformen

Hvis du tester en kampagne fra en personlig konto, måler du denne konto. Næsten alt i afsnittet om autentificering handler om afsendelsesinfrastrukturen, ikke teksten.

Test igen efter rettelse

De forventede forbedringer beregnes én rettelse ad gangen, og de kan ikke kombineres. Den anden rapport er det ærlige tal.

Til maskiner

Prøv først én manuelt

Det tager cirka et minut og viser dig præcis, hvad JSON beskriver.

Få en testadresse