Email Spam Tester

API ตรวจสอบสแปมสำหรับอีเมล
กล่องจดหมาย และโดเมน

ส่งข้อความจริงหนึ่งฉบับให้เรา หรือระบุเพียงโดเมน ทุกอย่างตอบกลับเป็น JSON

ไม่ต้องใช้คีย์ ไม่ต้องมีบัญชี

คำขอ

# reserve a single-use address

$ curl -sX POST '.../api/v1/inbox?lang=en'

# send your message to that address, then

$ curl -s '.../api/v1/tests/k7m2x9qplw4tz8vn3b6c/status'

# read the report

$ curl -s '.../api/v1/tests/k7m2x9qplw4tz8vn3b6c'

การตอบกลับ

200 OK

{
  "address": "test-k7m2x9qplw4tz8vn3b6c@t.email-spam-tester.com",
  "slug": "k7m2x9qplw4tz8vn3b6c",
  "expires_at": "2026-10-31T13:00:00Z"
}

200 OK

{
  "analysis_status": "checks_ready",
  "ai_status": "running",
  "checks_done": 42,
  "checks_total": 42
}

200 OK

{
  "score_ours": 86.4,
  "score_compat": 9.2,
  "subscores": {"auth": 100.0, "infra_spam": 78.1, "content": 92.0},
  "complete": true,
  "checks": [{"id": "auth.dmarc", "status": "warn"}],
  "fixes": [{"id": "dmarc-enforce", "gain_ours": 4.0}]
}

คำขอ

# create a test

$ curl -sX POST '.../api/v1/placement' \ -d '{"public_results_accepted":true}'

# put the marker in the subject, send once to all, then

$ curl -s '.../api/v1/placement/wR3kP9xLq2vT8mZc'

การตอบกลับ

201 Created

{
  "marker": "est-3f9a1c7e2b4d6a80c5e1f2d3",
  "status": "waiting",
  "results": [{"provider": "gmail", "placement": "pending"}],
  "fleet": {"status": "observing", "results": [
    {"provider": "yahoo", "placement": "pending"},
    {"provider": "outlook", "placement": "pending"}
  ]}
}

200 OK

{
  "status": "complete",
  "results": [{"provider": "gmail", "placement": "primary"}],
  "fleet": {"status": "finished", "results": [
    {"provider": "yahoo", "placement": "inbox"},
    {"provider": "outlook", "placement": "spam"}
  ]}
}

คำขอ

# no email needed, one GET

$ curl -s '.../api/v1/infra/check?domain=example.com'

# compare with your last run

$ curl -s '.../api/v1/infra/check?domain=example.com&diff=true' \ | jq '.diff'

การตอบกลับ

200 OK

{
  "domain": "example.com",
  "ok": false,
  "status": "fail",
  "score": 78,
  "coverage": {"answered": 7, "total": 8},
  "sections": {"ptr": {"status": "fail", "core": true}}
}

200 OK

{
  "changed": true,
  "worsened": true,
  "status_from": "pass",
  "score_from": 100,
  "changes": [{"path": "dkim.key.mail.sha256", "kind": "removed",
               "severity": "critical", "effect": "worsened"}]
}
ในหน้านี้

การทดสอบอีเมล

เราอ่านข้อความจริงหนึ่งฉบับตั้งแต่ต้นจนจบ: เนื้อหา ลายเซ็น ส่วนหัว และเซิร์ฟเวอร์ที่ส่งข้อความ คุณจะได้รับคะแนน รายการสิ่งที่ต้องแก้ไข และผลการตรวจสอบทั้งหมดที่รองรับรายการเหล่านั้น

เริ่มต้นอย่างรวดเร็ว

เรียกสามครั้ง ไม่ต้องใช้คีย์ ไม่ต้องมีบัญชี ไม่ต้องสมัคร คำขอสองครั้งและอีเมลหนึ่งฉบับ การเรียกครั้งที่สามมีไว้เพียงเพราะการวิเคราะห์ใช้เวลาสองสามวินาที

  1. จองที่อยู่

    ส่ง POST ไปยัง endpoint ของกล่องจดหมาย คุณจะได้รับที่อยู่ที่รับข้อความได้เพียงหนึ่งฉบับและหมดอายุภายในหนึ่งชั่วโมง พร้อม slug ที่ใช้เป็นคีย์อ้างอิงสำหรับทุกอย่างที่เหลือ

    คำขอ

    # 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. ส่งข้อความจริงไปยังที่อยู่นั้น

    ส่งผ่าน SMTP จากแพลตฟอร์มที่จะใช้ส่งแคมเปญ การตรวจสอบครึ่งหนึ่งอ่านส่วนหัวที่แพลตฟอร์มส่งของคุณเพิ่มเข้ามา ดังนั้นข้อความที่เขียนขึ้นเองจึงวัดสิ่งที่ไม่ถูกต้อง

    คำขอ

    # 2. send your message to that address, from your own platform
    To: test-<slug>@t.email-spam-tester.com
  3. ตรวจสอบสถานะเป็นระยะ แล้วอ่านรายงาน

    endpoint สถานะมีขนาดไม่กี่ร้อยไบต์และแจ้งให้คุณทราบว่าควรดึงรายงานฉบับเต็มแล้วหรือยัง ตัวรายงานมีความยาวหลายพันบรรทัด

    คำขอ

    # 3. poll
    curl -s 'https://email-spam-tester.com/api/v1/tests/<slug>/status'

    การตอบกลับ

    {
      "slug": "<slug>",
      "analysis_status": "checks_ready",
      "ai_status": "running",
      "checks_done": 42,
      "checks_total": 42
    }

    คำขอ

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

จองที่อยู่ ส่งข้อความที่คุณกำลังจะส่งไปยังรายชื่อผู้รับ แล้วอ่านรายงาน ทุกอย่างที่หน้าเว็บแสดงอยู่ใน JSON รวมถึงคะแนน ผลการตรวจสอบทั้ง 42 รายการพร้อมหลักฐาน และหัวข้อของมาตรฐานที่รองรับผลการตรวจสอบแต่ละรายการ

รายงาน 100,000 รายการแรกใช้งานได้ฟรี โดยไม่ต้องใช้คีย์และไม่ต้องมีบัญชี หากคุณกำลังเชื่อมต่อเอเจนต์แทนสคริปต์ เซิร์ฟเวอร์ MCP จะเหมาะกว่าการทำ polling

เอนด์พอยต์

ที่อยู่ฐาน 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

ข้อความตามที่ได้รับมาอย่างถูกต้องทุกประการ: ทุกเฮดเดอร์ตามลำดับที่ส่งผ่านสาย เนื้อหาทั้งสองส่วน รายการไฟล์แนบ และซอร์สดิบ ดึงข้อมูลแยกต่างหากเพราะมีการเรียกตรวจสอบรายงานซ้ำ และข้อมูลส่วนนี้อาจมีขนาดถึงหนึ่งเมกะไบต์

ข้อความดิบจะถูกลบตามกำหนดเวลาของตัวเอง ซึ่งเร็วกว่ารายงาน หลังจากนั้น endpoint นี้จะตอบกลับด้วยเหตุผลแทนเนื้อหาต้นฉบับ

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

เปลี่ยนภาษาของรายการจองที่ยังไม่ได้ใช้งาน สำหรับ agent ที่ทราบว่าผู้ใช้ของตนอ่านภาษาใดหลังจากขอที่อยู่ไปแล้ว ระบบจะปฏิเสธเมื่อข้อความมาถึงแล้ว เพราะเมื่อถึงตอนนั้นการวิเคราะห์กำลังทำงานอยู่

ตำแหน่งในกล่องจดหมายเบต้า

ส่งข้อความหนึ่งฉบับไปยังรายการกล่องจดหมายทดสอบ และดูว่าข้อความไปอยู่ที่ใดใน Gmail, Outlook, Yahoo และผู้ให้บริการรายอื่น: กล่องจดหมาย โปรโมชั่น หรือสแปม

เริ่มต้นอย่างรวดเร็ว

  1. สร้างการทดสอบ

    ส่ง POST ไปยัง endpoint สำหรับ placement คุณจะได้รับ marker และกล่องจดหมายทดสอบกลับมา

    คำขอ

    # 1. create a test
    curl -sX POST 'https://email-spam-tester.com/api/v1/placement' \
      -H 'Content-Type: application/json' \
      -d '{"public_results_accepted":true}'

    การตอบกลับ

    {
      "slug": "<slug>",
      "marker": "est-3f9a1c7e2b4d6a80c5e1f2d3",
      "status": "waiting",
      "deadline": "2026-10-31T12:30:00Z",
      "poll_after_seconds": 60,
      "results": [
        {"address": "<seed>", "provider": "gmail", "kind": "Gmail",
         "placement": "pending", "observed_at": null}
      ],
      "fleet": {
        "status": "observing",
        "results": [
          {"address": "<mailbox>", "provider": "yahoo", "available": true,
           "placement": "pending", "coverage": "pending"}
        ]
      }
    }
  2. ส่งหนึ่งข้อความไปยังทุกกล่องจดหมาย

    ใส่ marker ในหัวเรื่องและส่งจากแพลตฟอร์มที่คุณใช้ตามปกติไปยังที่อยู่ทั้งหมดในครั้งเดียว

    คำขอ

    # 2. one message to every address, with the marker in the subject
    Subject: October invoice est-3f9a1c7e2b4d6a80c5e1f2d3
    To: <seed>, <mailbox>, ...
  3. ตรวจสอบโฟลเดอร์เป็นระยะ

    แต่ละที่อยู่จะแสดงผู้ให้บริการและโฟลเดอร์ของตน ตรวจสอบเป็นระยะจนกว่าสถานะจะไม่เป็น waiting

    คำขอ

    # 3. poll for the folders
    curl -s 'https://email-spam-tester.com/api/v1/placement/<slug>'

    การตอบกลับ

    {
      "status": "complete",
      "received": 2,
      "total": 2,
      "results": [
        {"address": "<seed>", "provider": "gmail", "kind": "Gmail",
         "placement": "primary", "observed_at": "2026-10-31T12:04:11Z"},
        {"address": "<seed>", "provider": "gmail", "kind": "Google Workspace",
         "placement": "promotions", "observed_at": "2026-10-31T12:04:11Z"}
      ],
      "fleet": {
        "status": "finished",
        "results": [
          {"address": "<mailbox>", "provider": "yahoo", "available": true,
           "placement": "inbox", "coverage": "ok"},
          {"address": "<mailbox>", "provider": "outlook", "available": true,
           "placement": "spam", "coverage": "ok"}
        ]
      }
    }

เอนด์พอยต์

An optional test using public GMass seed inboxes and available project test mailboxes, alone or alongside the email score. Explain to the sender that GMass receives their email and publishes its subject, sender name and placement before creating a test. Use all test mailboxes for non-confidential test messages only.

GET /api/v1/placement/availability

Returns providers: the provider identifiers of currently healthy, admitted project mailboxes. No addresses or credentials are exposed. This read does not create a test or contact GMass. Actual recipients are allocated at creation and may differ as availability or capacity changes.

POST /api/v1/placement

Send JSON {"public_results_accepted":true}. Returns HTTP 201 with slug, marker, results (the seed addresses), deadline and expires_at. Limit: 20 tests per IP per UTC day.

For one-send combined testing, first reserve an email score address and include its score_slug in the placement creation JSON. Repeated creation for that score returns the same placement test. Send the marked email to the score address, every returned seed and every available fleet.results address; keep the main /t/<score_slug> report link. Creating a link after the score address was used or expired returns HTTP 409.

GET /api/v1/placement/by-score/{score_slug}

Read and refresh the placement run attached to the main email test. The response has the same format and polling limits as the standalone endpoint below. HTTP 404 means placement was not included or its stored results have been removed.

GET /api/v1/placement/{slug}

Use poll_after_seconds (normally 60 seconds) while the page is open. Upstream errors trigger a shared cooldown. Add the marker to the subject and send through the sender's normal platform to every seed. Observations are saved for 30 days. Collection ends after 30 minutes or when all seeds have results.

status: waiting, complete or timed_out. Each result has an address, provider, kind, placement and observed_at. Placement is primary, promotions, inbox, updates, social, forums, spam, unknown, pending or not_observed. Missing results do not mean Spam; Promotions is an inbox category. provider_error indicates an upstream outage without discarding saved observations. HTTP 404 means unknown, 410 expired, 429 quota exhausted, and 503 no test inboxes available at creation.

The optional fleet object contains independently collected project mailbox results, with status observing, settling or finished. Refresh every 30 seconds until it finishes, even when Gmail has completed. Each fleet result includes address, provider, available, placement, category and coverage. Exclude unavailable addresses from new sends; retain their saved observations. Category data may be unavailable even when the physical folder is known.

If GMass is unavailable at creation but project mailboxes can be allocated, provider is fleet and the top-level seed results are empty. Use fleet.results; do not interpret an empty Gmail list as successful delivery. Existing runs never gain new recipient addresses silently.

ตรวจสอบโครงสร้างพื้นฐาน

คำขอ GET หนึ่งครั้งจะตรวจสอบการตั้งค่าอีเมลของโดเมนโดยไม่ส่งสิ่งใด เก็บผลลัพธ์ไว้ และแจ้งคุณว่ามีอะไรเปลี่ยนแปลงไปนับจากการเรียกใช้ครั้งล่าสุดของคุณ ไม่ต้องใช้คีย์ ใน cron บรรทัดด้านล่างจะจบการทำงานด้วยรหัสที่ไม่ใช่ศูนย์เมื่อโดเมนมีปัญหาหรือการตั้งค่าเปลี่ยนแปลงในลักษณะที่มีนัยสำคัญ

เริ่มต้นอย่างรวดเร็ว

  1. ส่ง GET หนึ่งครั้ง

    ส่งค่าโดเมน โดย ip เพิ่มที่อยู่สำหรับส่งของคุณ และ selector ระบุชื่อ DKIM selector ที่จะอ่าน

    คำขอ

    curl -s 'https://email-spam-tester.com/api/v1/infra/check?domain=example.com&selector=mail&diff=true'
  2. อ่านผลลัพธ์

    ok คือคำตอบสำหรับสคริปต์ และ sections แสดงว่าส่วนใดล้มเหลว

    การตอบกลับ

    {
      "id": "ir_01JB8Y4T2M6K9QZ7H3V5N1XWDA",
      "domain": "example.com",
      "checked_at": "2026-10-31T12:00:00Z",
      "ok": false,
      "status": "fail",
      "score": 78,
      "coverage": {"answered": 7, "total": 8},
      "ips": [{"ip": "203.0.113.5", "sources": ["mx", "spf"], "managed": false}],
      "sections": {
        "dkim": {"status": "pass", "core": true, "findings": [], "data": {}},
        "ptr": {"status": "fail", "core": true, "findings": [], "data": {}}
      },
      "not_checked": [
        {"check": "dkim_signature", "reason": "needs_a_message"},
        {"check": "alignment", "reason": "needs_a_message"}
      ],
      "diff": {
        "baseline": {"id": "ir_01JB2...", "checked_at": "2026-10-24T12:00:00Z"},
        "first_run": false,
        "changed": true,
        "worsened": true,
        "status_from": "pass",
        "score_from": 100,
        "changes": [
          {"path": "dkim.key.mail.sha256", "section": "dkim", "kind": "removed",
           "severity": "critical", "effect": "worsened", "from": "9f2c...", "to": null}
        ],
        "not_compared": [
          {"path": "blocklist_ip.203.0.113.5.bl.spamcop.net.listed", "reason": "lookup_failed"}
        ]
      }
    }
  3. ใส่ไว้ใน cron

    เมื่อใช้ diff=true การทำงานแต่ละครั้งจะถูกเปรียบเทียบกับครั้งล่าสุดของคุณ และ jq จะแปลงคำตอบเป็นรหัสออก

    คำขอ

    # exits non-zero if the domain is broken or its setup changed
    curl -s 'https://email-spam-tester.com/api/v1/infra/check?domain=example.com&selector=mail&diff=true' \
      | jq -e '.ok and (.diff.changed | not)'
domainจำเป็น รับข้อมูลแบบเดียวกับที่เครื่องมือรองรับ: โดเมน, URL, ที่อยู่อีเมล
ipที่อยู่สำหรับส่งของคุณ ระบุซ้ำเพื่อเพิ่มที่อยู่อื่นได้สูงสุด 6 รายการ
selectorตัวเลือก DKIM ระบุซ้ำเพื่อเพิ่มตัวเลือกอื่นได้สูงสุด 10 รายการ ทุกตัวเลือกที่คุณส่งมาต้องมีอยู่ มิฉะนั้นส่วน DKIM จะล้มเหลว
heloชื่อที่เซิร์ฟเวอร์ของคุณระบุใน HELO ซึ่งนำไปเปรียบเทียบกับ PTR ของเซิร์ฟเวอร์
accountผู้ที่คำขอนี้มีไว้สำหรับ จำเป็นเมื่อใช้คีย์ที่ให้บริการหลายคน
checksส่วนที่จะเรียกใช้ โดยคั่นด้วยเครื่องหมายจุลภาค ค่าเริ่มต้นคือทุกส่วน
difftrue จะเปรียบเทียบการรันครั้งนี้กับการรันโดเมนครั้งล่าสุดของคุณ
since7d, 12h หรือวันที่แบบ ISO 8601 โดยจะเปรียบเทียบกับการรันของคุณที่ใกล้กับเวลานั้นที่สุดภายใน 12 ชั่วโมง มิฉะนั้นจะเปรียบเทียบกับการรันครั้งล่าสุดก่อนเวลาดังกล่าว เปิดใช้ diff
baselineid ของการรันรายการหนึ่งของคุณที่จะใช้เปรียบเทียบ เปิดใช้ diff
freshtrue จะข้ามแคช 60 วินาที

การอ่านคำตอบ

การตรวจสอบที่เสร็จสิ้นจะตอบกลับด้วย 200 และ verdict อยู่ใน body โดย status คือสถานะที่แย่ที่สุดของส่วนที่จำเป็น ได้แก่ spf, dkim, dmarc, ptr, blocklist_ip, blocklist_domain, mx และ smtp ค่า unknown ในส่วนที่จำเป็นจะนับเป็น warn ค่า ok เป็น true เมื่อ status เป็น pass หรือ warn ค่า score มีค่าตั้งแต่ 0 ถึง 100 โดยคำนวณจากส่วนที่จำเป็นซึ่งมีคำตอบ และเป็น null เมื่อ error และ unknown ทำให้น้ำหนักที่มีผลเหลือน้อยกว่าครึ่งหนึ่ง mta_sts, tls_rpt, bimi, dnssec, dane, ns และ registration จะถูกรายงานและเปรียบเทียบ แต่ไม่มีผลต่อ ok หรือ score

แต่ละส่วนอาจเป็น pass, warn, fail, error (เราไม่สามารถตรวจสอบได้), unknown (มีข้อมูลไม่เพียงพอ) หรือ skipped (ใช้ไม่ได้กับกรณีนี้) skipped ไม่มีผลต่อผลลัพธ์ และเหตุผลอยู่ใน not_checked ส่วน dkim_signature และ alignment จะมีอยู่เสมอ เพราะต้องใช้ข้อความจริง

สิ่งที่ ip และ selector เปลี่ยนแปลง

PTR และรายการบล็อกเกี่ยวข้องกับที่อยู่ ดังนั้นการรันจึงต้องมีที่อยู่บางส่วน ระบบจะใช้ค่า ip ที่คุณส่งมา หากไม่มี ระบบจะใช้สูงสุดสี่ค่าจากโฮสต์ MX ของคุณและจากพจน์ ip4: และ ip6: ที่ระบุที่อยู่เดียวในระเบียน SPF ราก ที่อยู่ของผู้ให้บริการอีเมลที่รู้จักจะถูกระบุเป็น managed และไม่ถูกตรวจสอบ และหากไม่มีที่อยู่เหลืออยู่ ptr และ blocklist_ip จะตอบเป็น skipped ไม่สามารถอ่าน selector จาก DNS ได้ ดังนั้นการรันจะลองใช้ selector ของคุณ, selector ที่พบจากการรันก่อนหน้าของคุณ และรายการชื่อที่ใช้กันทั่วไป การไม่พบอะไรไม่ได้พิสูจน์อะไร และ dkim จะตอบเป็น unknown หากคุณส่งจากเซิร์ฟเวอร์ของคุณเอง ให้ส่งทั้งสองค่า

สิ่งที่เปลี่ยนแปลง

แต่ละรายการใน diff.changes มี path, kind (added, removed, changed), severity (critical, warning, info) และ effect (worsened, improved, neutral) เฉพาะ critical และ warning เท่านั้นที่กำหนด diff.changed ดังนั้นคีย์ DKIM ที่หมุนเวียนแล้วซึ่งมีความยาวเท่าเดิม ที่อยู่ MX ใหม่ หรือใบรับรองที่ต่ออายุแล้วจะไม่ทำให้บรรทัด cron ล้มเหลว diff.worsened เป็นไปตาม effect ของการเปลี่ยนแปลงใดๆ ในการรันครั้งแรกจะไม่มีข้อมูลให้เปรียบเทียบ และ diff.first_run จะระบุเรื่องนี้

baseline จะเป็นการรันของคุณเองเสมอ ดังนั้นการที่บุคคลอื่นตรวจสอบโดเมนระหว่างการรันสองครั้งของคุณจะไม่ปิดบังสิ่งใด ข้อมูลใดๆ ที่เราไม่สามารถอ่านได้ในครั้งนี้จะอยู่ใน diff.not_compared โดยเก็บค่าล่าสุดที่ทราบไว้ ซึ่งหมายความว่าการเปลี่ยนแปลงที่เกิดขึ้นระหว่างระบบขัดข้องจะแสดงขึ้นเมื่อการค้นหากลับมาทำงานอีกครั้ง การรันที่ใช้ ip หรือ selector ต่างกันจะยังอยู่ในชุดเดียวกัน และสิ่งที่การรันนั้นไม่ได้ขอให้ตรวจสอบก็จะไม่ถูกเปรียบเทียบเช่นกัน

เหตุผลที่การตรวจสอบตามกำหนดเวลาควรใช้คีย์

หากไม่มีคีย์ ประวัติของคุณจะผูกกับแฮชที่มีคีย์ของที่อยู่ IP ของคุณ ดังนั้นประวัติจะสิ้นสุดลงเมื่อที่อยู่เปลี่ยน และผู้ที่อยู่เบื้องหลังที่อยู่เดียวกันจะใช้ประวัติร่วมกัน: การรันของเพื่อนร่วมงานจะเปลี่ยน baseline ของคุณ เมื่อใช้คีย์ API ส่วนตัวใน Authorization: Bearer ประวัติจะติดตามคีย์ การรันที่มีคีย์จะถูกเก็บไว้ 365 วันและเปิดได้ด้วยคีย์นั้นเท่านั้น การรันที่ไม่มีคีย์จะถูกเก็บไว้ 30 วันและเปิดให้ทุกคนที่มี id ของการรันเข้าถึงได้

6 คำขอต่อนาทีและ 50 คำขอต่อวันต่อ IP หรือ 30 และ 500 คำขอต่อคีย์ หากเกินขีดจำกัด คำตอบจะเป็น 429 พร้อม Retry-After คำขอที่เหมือนกันภายใน 60 วินาทีจะมาจากแคช, ถูกทำเครื่องหมายเป็น cached: true, ไม่บันทึกการรัน และไม่นับรวม การอ่านการรันที่จัดเก็บไว้รองรับ 120 คำขอต่อนาทีต่อไคลเอนต์ 503 พร้อม Retry-After หมายความว่ามีการตรวจสอบทำงานอยู่มากเกินไป หรือเมื่ออ่านการรันที่จัดเก็บไว้ หมายความว่าพื้นที่จัดเก็บไม่พร้อมใช้งาน 401 หมายถึงคีย์ไม่ถูกต้อง 422 มี detail.code: invalid_domain, invalid_ip, invalid_selector, invalid_check, invalid_since, unknown_baseline หรือ account_required

เอนด์พอยต์

GET/api/v1/infra/check

เรียกใช้การตรวจสอบ พารามิเตอร์อยู่ในตารางด้านบน

GET/api/v1/infra/runs/{public_id}

การเรียกใช้ที่จัดเก็บไว้หนึ่งรายการแบบเต็ม 404 หากไม่มีอยู่หรือเป็นของคีย์อื่น

GET/api/v1/infra/domains/{domain}/runs

รายการเรียกใช้ของโดเมนของคุณ โดยเรียงจากใหม่ที่สุด: id, เวลา, สถานะ, คะแนน และจำนวนการเปลี่ยนแปลง รับค่า limit (1 ถึง 100, ค่าเริ่มต้นคือ 30) และ before ซึ่งเป็น id ของการเรียกใช้

GET/api/v1/infra/diff

การเปรียบเทียบแบบเดียวกันระหว่างการเรียกใช้ที่จัดเก็บไว้สองรายการ ?from=<id>&to=<id> คุณต้องมีสิทธิ์เข้าถึงทั้งสองรายการ

GET/api/v1/infra/checks

ทุกส่วนพร้อมค่าน้ำหนัก เวอร์ชันคะแนน และขีดจำกัด

การตรวจสอบแยกรายการ

การเรียกแต่ละครั้งตอบคำถามหนึ่งข้อและไม่เก็บประวัติ เครื่องมือจะเรียกใช้ส่วนหนึ่งของการตรวจสอบโครงสร้างพื้นฐานด้วยตนเอง ยกเว้นเครื่องมือตรวจสอบส่วนหัว ซึ่งจะอ่านข้อความที่คุณได้รับแล้ว

เริ่มต้นอย่างรวดเร็ว

  1. เลือกการตรวจสอบ

    เลือกเครื่องมือจากรายการด้านล่างและส่งโดเมน ที่อยู่ หรือ IP ที่เครื่องมือร้องขอ

    คำขอ

    curl -s 'https://email-spam-tester.com/api/v1/tools/spf?domain=example.com'
  2. อ่านสถานะและผลการตรวจสอบ

    ทุกเครื่องมือจะตอบกลับพร้อมสถานะและผลการตรวจสอบ ฟิลด์ที่อยู่ถัดจากนั้นจะแตกต่างกันไปตามเครื่องมือ

    การตอบกลับ

    {
      "tool": "spf",
      "query": {"domain": "example.com"},
      "checked_at": "2026-10-31T12:00:00Z",
      "duration_ms": 412,
      "status": "fail",
      "findings": [
        {"code": "spf.too_many_lookups", "level": "fail",
         "params": {"limit": 10, "count": 12},
         "message": "RFC 7208 §4.6.4 allows at most 10 DNS lookups, and this record needs 12, so receivers return permerror."}
      ],
      "record": "v=spf1 include:_spf.example.net ~all",
      "lookups": {"count": 12, "limit": 10, "void": 0}
    }

เอนด์พอยต์

เครื่องมือทั้งหมดตอบกลับด้วย 200 พร้อมสถานะและรายการผลการตรวจสอบ โดยแต่ละรายการมีรหัสและพารามิเตอร์ สถานะคือ pass, warn, fail หรือ error และเครื่องมือที่ใช้ร่วมกับการตรวจสอบโครงสร้างพื้นฐานยังสามารถตอบ unknown หรือ skipped ได้ด้วย การค้นหาที่หมดเวลาหรือรายการที่ปฏิเสธคำขอจะไม่นับเป็น pass จำกัด 30 คำขอต่อนาทีและ 300 คำขอต่อวันต่อ IP สำหรับเครื่องมือทั้งหมด หากเกินขีดจำกัด การตอบกลับจะเป็น 429 พร้อม Retry-After

GET/api/v1/tools/spf

ระเบียน SPF ของโดเมน: ไวยากรณ์ การติดตาม include และ redirect ทุกรายการ และจำนวนการค้นหา DNS ที่ทั้งโครงสร้างใช้เมื่อเทียบกับขีดจำกัดสิบครั้ง ส่ง ?domain=example.com

GET/api/v1/tools/dmarc

ระเบียน DMARC ของโดเมน หรือของโดเมนระดับองค์กรเมื่อโดเมนนั้นไม่มีระเบียน: แท็ก นโยบาย และที่อยู่สำหรับรับรายงานภายนอกแต่ละแห่งได้ตกลงรับรายงานหรือไม่ ส่ง ?domain=example.com

GET/api/v1/tools/dkim

คีย์ DKIM ที่เผยแพร่สำหรับ selector: มีอยู่และถอดรหัสได้หรือไม่ ชนิดและขนาด รวมถึงแฟล็กการเพิกถอนและการทดสอบ ส่ง ?domain=example.com&selector=s1

GET/api/v1/tools/blocklist

ตรวจสอบที่อยู่ IPv4 ที่อยู่ IPv6 หรือโดเมนกับรายการบล็อก DNS ที่รายงานใช้ พร้อมผลตอบจากแต่ละรายการ ส่ง ?target=203.0.113.5

GET/api/v1/tools/mx

ระเบียน MX ของโดเมนตามลำดับที่ผู้ส่งลองใช้ พร้อมที่อยู่ IPv4 และ IPv6 ของทุกโฮสต์ ระบบจะรายงาน Null MX, โดเมนที่ไม่มี MX, โฮสต์ที่เป็นที่อยู่ IP หรือ CNAME และโฮสต์ที่ไม่สามารถแปลงชื่อได้ รวมถึงระเบียน MTA-STS และ TLS-RPT ส่ง ?domain=example.com

GET/api/v1/tools/bimi

การตั้งค่า BIMI ของโดเมนในสี่ขั้นตอน: นโยบาย DMARC ที่ BIMI กำหนด ระเบียนที่ default._bimi โลโก้ SVG ที่ตรวจสอบกับโปรไฟล์ Tiny PS และใบรับรองเครื่องหมายพร้อมประเภท โดเมน และวันหมดอายุ ส่ง ?domain=example.com และ &selector= สำหรับ selector ที่ไม่ใช่ default

GET/api/v1/tools/ptr

ระเบียน PTR ของที่อยู่และตรวจสอบว่าชื่อใดในระเบียนเหล่านั้นแปลงกลับมายังที่อยู่นั้นได้หรือไม่ การค้นหาที่ล้มเหลวจะให้สถานะ error ส่วนระเบียนที่ไม่มีจะให้สถานะ fail ส่ง ?ip=8.8.8.8

GET/api/v1/tools/mta-sts

ระเบียน MTA-STS ของโดเมนและไฟล์นโยบายที่ระเบียนชี้ไป: โหมด โฮสต์ที่ระบุไว้ และโฮสต์ MX ใดๆ ที่นโยบายไม่ได้รวมไว้ ส่ง ?domain=example.com

GET/api/v1/tools/tls-rpt

ระเบียน TLS-RPT ของโดเมนและที่อยู่ที่รับรายงาน ส่ง ?domain=example.com

GET/api/v1/tools/dnssec

ตรวจสอบว่าโซนของโดเมนมีการลงนาม ไม่ได้ลงนาม หรือมีปัญหา โดยดูจากระเบียน DNSKEY และ DS ลายเซ็นที่ไม่ถูกต้องจะแยกออกจากเหตุขัดข้องของรีโซลเวอร์ ส่ง ?domain=example.com

GET/api/v1/tools/dane

ระเบียน TLSA ของโฮสต์ MX โดยเปรียบเทียบกับใบรับรองที่โฮสต์แสดง เมื่อสามารถอ่านใบรับรองนั้นได้ ส่ง ?domain=example.com

GET/api/v1/tools/smtp

STARTTLS และใบรับรองบนโฮสต์ MX สองรายการแรก: เวอร์ชัน TLS ผู้ออกใบรับรอง วันที่หมดอายุ และตรวจสอบว่าเชนและชื่อถูกต้องหรือไม่ เราเชื่อมต่อเฉพาะโฮสต์ภายใต้โดเมนที่คุณสอบถามและข้ามผู้ให้บริการอีเมล โดยผลลัพธ์หนึ่งรายการต่อที่อยู่จะใช้ร่วมกันเป็นเวลา 6 ชั่วโมง ไม่มีการส่งอีเมล ส่ง ?domain=example.com

GET/api/v1/tools/ns

เนมเซิร์ฟเวอร์ของโดเมนและตรวจสอบว่าโซนมีระเบียน SOA หรือไม่ การมีเนมเซิร์ฟเวอร์เพียงหนึ่งรายการเป็นคำเตือน ส่ง ?domain=example.com

GET/api/v1/tools/registration

เวลาที่การจดทะเบียนโดเมนจะหมดอายุ โดยดูจาก RDAP หากเหลือน้อยกว่า 30 วันจะเป็นคำเตือน โซนที่ไม่มีบริการ RDAP จะตอบกลับเป็น skipped ส่ง ?domain=example.com

POST/api/v1/tools/header

ส่วนหัวของข้อความที่ได้รับ ซึ่งส่งเป็น JSON {"headers": "..."} หรือเป็น text/plain: เส้นทางแบบทีละ hop พร้อมความล่าช้า TLS และความคลาดเคลื่อนของนาฬิกา, Authentication-Results ของผู้รับเอง, การจัดแนวของโดเมน From, DKIM d= และ Return-Path และส่วนหัว DKIM, ARC, ยกเลิกการรับข่าวสาร และตัวกรองสแปม ทุกอย่างหลังบรรทัดว่างแรกจะถูกทิ้งโดยไม่อ่าน ส่วนหัวจะได้รับการประมวลผลในหน่วยความจำ และไม่มีการจัดเก็บ แคช หรือบันทึกในล็อก

ตรวจสอบโดเมนทุกคืน
ทดสอบอีเมลก่อนส่ง

ใช้ร่วมกันในทุกผลิตภัณฑ์

การเข้าถึง คีย์ รูปแบบรายงาน สถานะ ข้อผิดพลาด รวมถึง OpenAPI และ llms.txt สำหรับระบบอัตโนมัติ

การยืนยันตัวตน

ไม่มี ไม่ต้องขอคีย์ ไม่ต้องตั้งค่าเฮดเดอร์ และไม่ต้องสร้างบัญชี slug ที่ได้รับกลับมาคือสิทธิ์ในการเข้าถึง: ใครก็ตามที่ถือ slug นี้สามารถอ่านรายงานนั้นได้ และไม่มีใครอื่นเดา slug นี้ได้

นั่นหมายความว่าควรปฏิบัติต่อ slug เสมือนเป็นรหัสผ่านด้วย รายงานจะแสดงหัวเรื่อง ผู้ส่ง ที่อยู่สำหรับรับข้อความตีกลับ และซอร์สทั้งหมดของข้อความแก่ทุกคนที่ถือลิงก์

คีย์ API ส่วนบุคคล

Everything above works without a key. A key is for automation platforms such as Zapier, where every user's calls come from the platform's servers and per-IP limits would be shared by all of them. With a key, limits count per key (50 tests a day, 3 with placement, 5 permanent mailboxes), the key's tests form a history, and the key can keep permanent mailboxes whose reports only it can read. Send the key as Authorization: Bearer est_live_… on any call on this page. The routes below also take account, a short name of your choosing ([A-Za-z0-9_-], up to 64 characters) that keeps separate lists under one key. GET /api/v1/installations/tests requires it; pass the same one on POST /api/v1/inbox so the test shows up there. The Zapier integration uses zapier.

POST /api/v1/keys

Send JSON {"email":"you@example.com"}. Returns HTTP 201 with key and email. The key is shown once; only its hash is kept. Asking again gives a new key and leaves the earlier ones working. Limit: 5 keys per IP per UTC day. The form on /zapier/ calls this.

GET /api/v1/keys/me

Returns email, key_prefix and created_at of the key in the header, or HTTP 401. Use it to check a key.

GET /api/v1/installations/tests

The key's tests, newest first: ?account=…&limit=50 (up to 100), and before=<slug> for the next page. Each item has slug, created_at, analysis_status (waiting or expired before an email arrived), score_ours, score_compat, placement and changes, the checks that moved since the previous test of the same sending domain. Read the full report at /api/v1/tests/{slug}.

POST /api/v1/installations/mailboxes

Send JSON {"domain":"example.com","account":"…"}. Returns the permanent mailbox of that sending domain: id, address, domain, state, daily_cap and created. HTTP 201 when it is new, 200 when it already existed, 409 when the key keeps as many mailboxes as it may. Subscribe the address to a newsletter or a sequence and every email that arrives is checked. GET on the same path with ?account=… lists them, and DELETE /api/v1/installations/mailboxes/{mailbox_id} stops one.

GET /api/v1/installations/mailboxes/{mailbox_id}/letters

The emails that arrived, oldest first, paged with after_id and next_after_id. settled=true ends the page before the first email still being checked, so paging never skips one. newest=true turns the order round, for a quick look at the latest; settled does nothing with it. Each has test_id, slug, received_at, analysis_status, score_ours, score_compat, subject, from_addr and kind.

GET /api/v1/installations/letters/{slug}

The report of one email in a permanent mailbox, the same JSON as /api/v1/tests/{slug} with report_url null: there is no public page for it. HTTP 410 once the report has expired.

การอ่านรายงาน

ฟิลด์ที่มีคำตอบ ตามลำดับที่คุณน่าจะต้องการ

score_ours0 ถึง 100 โมเดลของเรา การยืนยันตัวตนและโครงสร้างพื้นฐานมีน้ำหนักมากที่สุด เพราะสิ่งเหล่านี้ตัดสินการนำส่งก่อนที่ตัวกรองจะอ่านข้อความในเนื้อหา
score_compat0 ถึง 10 จำลองตัวเลขแบบ SpamAssassin ที่ผู้ใช้คุ้นเคยในการนำไปเปรียบเทียบ เพื่อให้รายงานสามารถเปรียบเทียบกับสิ่งที่ผู้อื่นเห็นจากที่อื่นได้
subscoresใช้สเกล 0 ถึง 100 เดียวกันในแต่ละส่วน: auth, infra_spam, content, compliance
checks[]ครบทั้ง 42 รายการ แต่ละรายการมีสถานะ ข้อค้นพบหนึ่งบรรทัด หลักฐานที่ใช้ตัดสิน และผลกระทบต่อคะแนนทั้งสอง
checks[].citationsที่มาของข้อค้นพบ: ส่วนของ RFC ที่ยกมาตามต้นฉบับ และหน้าที่ Google ระบุข้อกำหนดของตนเอง จัดทำด้วยมือแทนการสร้างขึ้นโดยอัตโนมัติ จึงเชื่อถือได้
fixes[]สิ่งที่ต้องเปลี่ยนแปลงตามลำดับ พร้อมคะแนนที่จะได้รับจากการเปลี่ยนแปลงแต่ละรายการ คะแนนที่เพิ่มขึ้นคำนวณโดยให้คะแนนรายงานใหม่ ไม่ใช่ค่าประมาณ
completeเป็น False เมื่อไม่สามารถเรียกใช้การตรวจสอบได้ รายการที่ไม่ได้ตรวจสอบจะไม่ถือว่าผ่าน ดังนั้นให้ถือว่าคะแนนเป็นค่าที่มองในแง่ดีจนกว่าค่านี้จะเป็น true
report_urlหน้าที่มนุษย์อ่านได้ ส่งหน้านี้ให้บุคคลแทน JSON จำนวนมาก

สถานะ

การตรวจสอบมีสถานะได้หนึ่งในห้าแบบ และความแตกต่างระหว่างสองสถานะในนั้นสำคัญกว่าที่เห็น

passการตรวจสอบทำงานและไม่พบสิ่งผิดปกติ
warnควรแก้ไข มีการหักคะแนน
failทำให้การส่งถึงปลายทางเสียหาย ถูกหักคะแนนมากกว่า
ข้ามใช้ไม่ได้กับกรณีนี้ ไม่มีไฟล์แนบให้สแกน ไม่มีส่วน HTML ให้ประเมิน ไม่ถือว่าผ่าน
ข้อผิดพลาดเราไม่สามารถระบุผลได้ จึงไม่นำมาคำนวณคะแนนและทำเครื่องหมายไว้ แทนที่จะนับว่าผ่าน

analysis_status มีค่า received, analyzing, checks_ready, failed ส่วน ai_status มีค่า pending, running, ready, fallback, error รายงานแบบกำหนดผลตายตัวจะถือเป็นผลสุดท้ายเมื่อเป็น checks_ready ส่วน ai_status จะเพิ่มเฉพาะแผนเท่านั้น

สิ่งที่อาจส่งกลับมา

202ที่อยู่นี้ถูกจองไว้และยังไม่มีข้อความมาถึง เนื้อหาการตอบกลับระบุที่อยู่ เวลาหมดอายุ และภาษา ดังนั้นไคลเอนต์ที่ไม่ได้สร้างการจองก็ยังสามารถแสดงข้อมูลดังกล่าวได้
404ไม่มี slug ดังกล่าว อาจไม่เคยมีอยู่ หรือการจองถูกลืม
410ที่อยู่หมดอายุก่อนที่ข้อความจะมาถึง
409คุณพยายามเปลี่ยนภาษาหลังจากที่ข้อความมาถึงแล้ว
429ถึงขีดจำกัดการทดสอบฟรีสำหรับที่อยู่ของคุณ ขณะนี้บริการนี้ไม่มีขีดจำกัดต่อบุคคล หากมีการกำหนดในภายหลัง เนื้อหาการตอบกลับจะระบุว่าเมื่อใดขีดจำกัดจะรีเซ็ต

สี่สิ่งที่ควรรู้

หนึ่งข้อความต่อหนึ่งที่อยู่

ข้อความที่สองจะถูกปฏิเสธ รายงานก่อนหน้าของคุณยังคงอยู่ครบถ้วน ซึ่งเป็นจุดประสงค์ของข้อจำกัดนี้

ใช้ภายในหนึ่งชั่วโมง

ที่อยู่จะหมดอายุ แต่รายงานจะไม่หมดอายุ ลิงก์รายงานจะใช้ได้ถาวร ดังนั้นลิงก์ที่วางไว้ในทิกเก็ตจะยังคงใช้งานได้

ส่งจากแพลตฟอร์ม

การทดสอบแคมเปญจากบัญชีส่วนตัวเป็นการวัดบัญชีนั้น เกือบทุกอย่างในส่วนการยืนยันตัวตนเกี่ยวข้องกับโครงสร้างพื้นฐานที่ใช้ส่ง ไม่ใช่ข้อความ

ทดสอบอีกครั้งหลังแก้ไข

ผลที่คาดว่าจะดีขึ้นจะคำนวณจากการแก้ไขทีละรายการ และไม่สามารถนำมารวมกันได้ รายงานฉบับที่สองคือตัวเลขที่ตรงกับความเป็นจริง

สำหรับระบบอัตโนมัติ

GET/api/health

การตรวจสอบว่ายังทำงานอยู่ ไม่มีการยืนยันตัวตน ไม่มีผลข้างเคียง

ลองทำด้วยตนเองก่อนหนึ่งครั้ง

ใช้เวลาประมาณหนึ่งนาทีและแสดงให้คุณเห็นอย่างชัดเจนว่า JSON อธิบายอะไร

รับที่อยู่สำหรับทดสอบ

แซนด์บ็อกซ์

ทุก endpoint มีปุ่มสำหรับเรียกใช้กับบริการจริง ทุกอย่างที่นี่ไม่ต้องใช้คีย์ ดังนั้นคำขอที่คุณส่งจากหน้านี้จึงเป็นคำขอจริง: คำขอนี้จะจองที่อยู่จริงและถูกนับรวม

ลองใช้ในแซนด์บ็อกซ์