
स्वचालित पाइपलाइन जो स्विस नगर पालिका डोमेन को हल करती है, ईमेल पतों के लिए वेबसाइटों को स्क्रैप करती है, और डिजिटल निर्भरताओं का मानचित्रण करने के लिए MX, SPF, DKIM, DMARC, और SMTP प्रोब के माध्यम से ईमेल प्रदाताओं को वर्गीकृत करती है।
[!IMPORTANT] MXmap का एक उत्तराधिकारी है। यह प्रोजेक्ट एक टीम शोध प्रयास में विकसित हुआ है जो जर्मनी, ऑस्ट्रिया और स्विट्ज़रलैंड की सभी नगरपालिकाओं को कवर करता है: secassure2026.mxmap-project.org (स्रोत)। mxmap.ch पर स्विस नक्शा ऑनलाइन बना रहेगा, लेकिन इसका डेटा अप्रैल 2026 से फ्रीज़ है और इसे अपडेट नहीं किया जाएगा।
इंटरैक्टिव नक्शे जो दिखाते हैं कि स्विस नगरपालिकाएँ अपना ईमेल कहाँ होस्ट करती हैं, और उनका DNS अमेरिकी हाइपरस्केलर्स (Microsoft, Google, AWS) से कितनी गहराई से जुड़ा है, बनाम स्विस प्रदाताओं और सेल्फ-होस्टेड समाधानों से।
डेटा पाइपलाइन के दो चरण हैं:
डोमेन रिज़ॉल्व करें — Wikidata और BFS (स्विस स्टैटिस्टिक्स) API से सभी ~2100 स्विस नगरपालिकाओं को प्राप्त करता है, मैन्युअल ओवरराइड लागू करता है, ईमेल पतों के लिए नगरपालिका वेबसाइटों को स्क्रेप करता है, नगरपालिका के नामों से डोमेन का अनुमान लगाता है, और MX लुकअप के साथ उम्मीदवारों को सत्यापित करता है। सर्वोत्तम डोमेन चुनने के लिए स्रोत सहमति को स्कोर करता है। आउटपुट municipality_domains.json।
प्रदाताओं का वर्गीकरण करें — प्रत्येक रिज़ॉल्व किए गए डोमेन के लिए, सभी MX होस्टों का लुकअप करता है, उनका पैटर्न-मिलान करता है, फिर 10 समवर्ती प्रोब चलाता है (SPF, DKIM, DMARC, Autodiscover, CNAME श्रृंखला, SMTP बैनर, टेनेंट, ASN, TXT सत्यापन, SPF IP)। भारित साक्ष्य एकत्रित करता है, कॉन्फिडेंस स्कोर (0–100) की गणना करता है। आउटपुट data.json (पूर्ण) और data.min.json (फ्रंटएंड के लिए मिनिफ़ाइड)।
flowchart TD
subgraph resolve ["1 · Resolve domains"]
bfs[/"BFS Statistics API"/] --> merge["Merge ~2100 municipalities"]
wikidata[/"Wikidata SPARQL"/] --> merge
overrides[/"overrides.json"/] --> per_muni
merge --> per_muni["Per municipality"]
per_muni --> scrape["Scrape website for<br/>email addresses"]
per_muni --> guess["Guess domains<br/>from name"]
scrape --> mx_verify["MX lookup to<br/>verify domains"]
guess --> mx_verify
mx_verify --> score["Score source<br/>agreement"]
end
score --> domains[("municipality_domains.json")]
domains --> classify_in
subgraph classify ["2 · Classify providers"]
classify_in["Per unique domain"] --> mx_lookup["MX lookup<br/>(all hosts)"]
mx_lookup --> mx_match["Pattern-match MX<br/>+ detect gateway"]
mx_match --> concurrent["10 concurrent probes<br/>SPF · DKIM · DMARC<br/>Autodiscover · CNAME chain<br/>SMTP · Tenant · ASN<br/>TXT verification · SPF IP"]
concurrent --> aggregate["Aggregate weighted<br/>evidence"]
aggregate --> vote["Primary vote<br/>+ confidence scoring"]
end
vote --> data[("data.json + data.min.json")]
data --> frontend["Leaflet map<br/>mxmap.ch"]
पूर्ण कार्यान्वयन विवरण के लिए classifier.py देखें, लेकिन संक्षेप में, हम एक भारित साक्ष्य प्रणाली का उपयोग करते हैं जिसमें प्रत्येक प्रोब विभिन्न प्रदाता वर्गीकरणों की दिशा में अलग-अलग ताकत के संकेत योगदान करता है।
uv sync
# Stage 1: resolve municipality domains
uv run resolve-domains
# Stage 2: classify email providers
uv run classify-providers
# Serve the map locally
python -m http.server
uv sync --group dev
# Run tests (90% coverage threshold enforced)
uv run pytest --cov --cov-report=term-missing
# Lint & format
uv run ruff check src tests
uv run ruff format src tests
देश-विशिष्ट फोर्क्स, देश कोड के वर्णानुक्रम में:
नए देशों के फोर्क्स का स्वागत है — उत्तराधिकारी की पाइपलाइन से शुरू करने पर विचार करें, जो एक DANE/DNSSEC/SPF/DMARC स्कैनिंग चरण जोड़ती है।
संबंधित प्रोजेक्ट:
इस रिपॉज़िटरी के फोर्क्स भी देखें।
यदि आपको कोई गलत वर्गीकरण दिखाई दे, तो कृपया BFS नंबर और सही प्रदाता के साथ एक issue खोलें। जिन नगरपालिकाओं के लिए स्वचालित पहचान विफल होती है, उनके लिए सुधार overrides.json में जोड़े जा सकते हैं।