Email Spam Tester

API

তিনটি কল। কোনো কী, অ্যাকাউন্ট বা সাইনআপ নয়।

একটি ঠিকানা সংরক্ষণ করুন, আপনার তালিকায় যে বার্তাটি পাঠাতে যাচ্ছিলেন সেটি পাঠান, প্রতিবেদনটি পড়ুন। পৃষ্ঠায় দেখানো সবকিছু JSON-এ রয়েছে, যার মধ্যে আছে স্কোর, প্রমাণসহ ৪১টি পরীক্ষা এবং প্রতিটি ফলাফল যে মানদণ্ডের অনুচ্ছেদের ওপর ভিত্তি করে তার উল্লেখ।

প্রথম 100,000টি রিপোর্ট বিনামূল্যে, কোনো key বা account ছাড়াই। আপনি যদি script-এর বদলে agent সংযুক্ত করেন, তাহলে polling-এর চেয়ে MCP server বেশি উপযুক্ত।

স্যান্ডবক্সে চেষ্টা করুন → প্রতিটি এন্ডপয়েন্টের সঙ্গে একটি বোতাম রয়েছে, যা সেটিকে লাইভ সার্ভিসে চালায়। এখানে কোনো কিছুর জন্যই কী প্রয়োজন নেই, তাই এই পৃষ্ঠা থেকে পাঠানো আপনার অনুরোধটি বাস্তব: এটি একটি বাস্তব ঠিকানা সংরক্ষণ করে এবং এটি গণনায় ধরা হয়।

প্রক্রিয়া

দুটি অনুরোধ এবং একটি ইমেইল। তৃতীয় কলটি শুধু এ কারণে প্রয়োজন যে বিশ্লেষণে কয়েক সেকেন্ড সময় লাগে।

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

প্রমাণীকরণ

কোনোটিই নেই। অনুরোধ করার জন্য কোনো কী নেই, সেট করার জন্য কোনো হেডার নেই, তৈরি করার জন্য কোনো অ্যাকাউন্ট নেই। আপনি যে স্লাগটি ফেরত পান সেটিই সক্ষমতা: যার কাছে এটি থাকবে সে ওই রিপোর্ট পড়তে পারবে, এবং অন্য কেউ এটি অনুমান করতে পারবে না।

এর অর্থ এটিও যে একটি স্লাগকে পাসওয়ার্ডের মতো বিবেচনা করা উচিত। লিংকটি যার কাছে থাকবে, রিপোর্টটি তাকে বিষয়ের লাইন, প্রেরক, বাউন্স ঠিকানা এবং বার্তার সম্পূর্ণ সোর্স দেখায়।

এন্ডপয়েন্ট

মূল ঠিকানা https://email-spam-tester.com। সবকিছু JSON-এ উত্তর দেয়।

POST/api/v1/inbox

একবার ব্যবহারযোগ্য একটি ঠিকানা সংরক্ষণ করে। উভয় প্যারামিটারই ঐচ্ছিক।

langISO কোড হিসেবে যে ভাষায় সংশোধন পরিকল্পনা এবং প্রতিটি পরীক্ষার ফলাফল লেখা হবে। এটি এখনই নির্ধারিত হয়, কারণ বার্তাটি কয়েক মিনিট পরে 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

এখনও ব্যবহার করা হয়নি এমন একটি reservation-এর ভাষা পরিবর্তন করে। এমন একটি agent-এর জন্য, যা ঠিকানা চাওয়ার পর জানতে পারে তার user কোন ভাষা পড়ে। বার্তাটি পৌঁছে গেলে প্রত্যাখ্যাত হয়, কারণ ততক্ষণে analysis চলতে থাকে।

GET/api/health

Liveness। কোনো authentication নেই, কোনো side effect নেই।

রিপোর্ট পড়া

যে field-গুলোতে উত্তর থাকে, সম্ভবত আপনি যে ক্রমে সেগুলো চান সেই ক্রমে।

score_ours0 থেকে 100। আমাদের model। Authentication এবং infrastructure-এর ওজন সবচেয়ে বেশি, কারণ কোনো filter কপির একটি শব্দ পড়ার আগেই এগুলো delivery নির্ধারণ করে।
score_compat0 থেকে 10। লোকজন ইতিমধ্যে তুলনার জন্য ব্যবহার করে এমন SpamAssassin-ধাঁচের সংখ্যাটি পুনরুৎপাদন করে, যাতে রিপোর্টটি অন্য কোথাও কেউ যা দেখেছে তার সঙ্গে তুলনীয় হয়।
subscoresপ্রতিটি section-এর জন্য একই 0 থেকে 100 scale: auth, infra_spam, content, compliance।
checks[]সব ৪১টি, প্রতিটিতে একটি status, এক লাইনের finding, যে evidence-এর ভিত্তিতে সিদ্ধান্ত নেওয়া হয়েছে এবং দুই score-এ এর cost কত।
checks[].citationsফাইন্ডিংটি কোথা থেকে এসেছে: RFC-এর সংশ্লিষ্ট অনুচ্ছেদ, হুবহু উদ্ধৃত, এবং যে পৃষ্ঠায় Google তার নিজস্ব প্রয়োজনীয়তা উল্লেখ করেছে। তৈরি না করে হাতে বাছাই করা হয়েছে, তাই এগুলোর ওপর নির্ভর করা যায়।
সমাধানগুলি[]কী পরিবর্তন করতে হবে, ক্রমানুসারে, এবং প্রতিটি পরিবর্তনের জন্য কত পয়েন্ট পাওয়া যাবে। লাভ অনুমান করা হয় না, প্রতিবেদনটি পুনরায় স্কোর করে হিসাব করা হয়।
সম্পূর্ণকোনো পরীক্ষা চালানো না গেলে মিথ্যা। পরীক্ষা না করা কোনো আইটেম কখনোই উত্তীর্ণ নয়, তাই এটি সত্য না হওয়া পর্যন্ত স্কোরটিকে আশাবাদী ধরে নিন।
প্রতিবেদনের_urlমানুষের পড়ার উপযোগী পৃষ্ঠা। JSON-এর দেয়াল দেওয়ার পরিবর্তে এটি একজন ব্যক্তিকে দিন।

স্ট্যাটাস

একটি পরীক্ষা পাঁচটি অবস্থার একটিতে থাকে, এবং সেগুলোর দুটির মধ্যে পার্থক্য যতটা মনে হয় তার চেয়ে বেশি গুরুত্বপূর্ণ।

উত্তীর্ণপরীক্ষাটি চালানো হয়েছে এবং কোনো সমস্যা পাওয়া যায়নি।
সতর্কতাসমাধান করা উচিত। পয়েন্ট কমায়।
ব্যর্থআপনার ডেলিভারি ক্ষতিগ্রস্ত হবে। বেশি পয়েন্ট কাটবে।
এড়িয়ে যাওয়াপ্রযোজ্য হয়নি। স্ক্যান করার মতো কোনো অ্যাটাচমেন্ট নেই, ওজন করার মতো কোনো HTML অংশ নেই। এটি পাস নয়।
ত্রুটিআমরা নির্ধারণ করতে পারিনি। পাস হিসেবে গণনা না করে, স্কোর থেকে বাদ দেওয়া হয়েছে এবং ফ্ল্যাগ করা হয়েছে।

analysis_status-এর মান received, analyzing, checks_ready, failed। ai_status-এর মান pending, running, ready, fallback, error। নির্ধারক প্রতিবেদনটি checks_ready-এ চূড়ান্ত হয়; ai_status শুধু পরিকল্পনাটি যোগ করে।

কী ফিরে আসতে পারে

202ঠিকানাটি সংরক্ষিত এবং কোনো message আসেনি। body-তে ঠিকানা, মেয়াদ শেষ হওয়ার সময় এবং ভাষা থাকে, তাই যে caller reservation তৈরি করেনি, সেও এটি দেখাতে পারে।
404এমন কোনো slug নেই। কখনোই ছিল না, অথবা reservation-টি ভুলে যাওয়া হয়েছে।
410কোনো message আসার আগেই ঠিকানাটির মেয়াদ শেষ হয়েছে।
409message ইতিমধ্যে আসার পরে আপনি ভাষা পরিবর্তন করার চেষ্টা করেছেন।
429আপনার ঠিকানার জন্য বিনামূল্যের test-এর সীমা। এই service-এ বর্তমানে ব্যক্তি-পিছু কোনো সীমা নেই; ভবিষ্যতে কখনো এমন সীমা নির্ধারণ করা হলে, body-তে কখন সেটি reset হবে তা বলা থাকবে।

জানার মতো চারটি বিষয়

প্রতি ঠিকানায় একটি বার্তা

দ্বিতীয়টি প্রত্যাখ্যান করা হয়। আপনার আগের প্রতিবেদন অক্ষত থাকে, সেটিই উদ্দেশ্য।

ব্যবহারের জন্য এক ঘণ্টা

ঠিকানাটির মেয়াদ শেষ হয়; প্রতিবেদনের হয় না। প্রতিবেদনের লিংক স্থায়ী, তাই টিকিটে পেস্ট করা লিংক কাজ করতে থাকে।

প্ল্যাটফর্ম থেকে পাঠান

ব্যক্তিগত অ্যাকাউন্ট থেকে কোনো ক্যাম্পেইন পরীক্ষা করলে সেই অ্যাকাউন্টেরই পরিমাপ হয়। প্রমাণীকরণ বিভাগের প্রায় সবকিছুই পাঠানোর অবকাঠামো সম্পর্কে, টেক্সট সম্পর্কে নয়।

সমাধানের পর আবার পরীক্ষা করুন

প্রত্যাশিত উন্নতি প্রতিবার একটি সমাধান ধরে গণনা করা হয় এবং সেগুলো একত্রে প্রযোজ্য নয়। দ্বিতীয় প্রতিবেদনটিই প্রকৃত সংখ্যা।

মেশিনের জন্য

প্রথমে একটি হাতে করে দেখুন

এতে প্রায় এক মিনিট সময় লাগে এবং JSON ঠিক কী বর্ণনা করে তা আপনাকে দেখায়।

একটি পরীক্ষার ঠিকানা নিন