
スイスの自治体ドメインを解決し、ウェブサイトからメールアドレスをスクレイピングし、MX、SPF、DKIM、DMARC、およびSMTPプローブを介してメールプロバイダを分類し、デジタル依存関係をマッピングする自動パイプライン。
[!IMPORTANT] MXmap には後継があります。 このプロジェクトは、ドイツ・オーストリア・スイスの全自治体をカバーするチーム研究へと成長しました: secassure2026.mxmap-project.org (ソース)。mxmap.ch のスイスマップは引き続きオンラインですが、データは2026年4月時点で凍結されており、更新されません。
スイスの自治体がどこにメールをホストしているか、そしてそのDNSがスイスのプロバイダーや自社ホスティングソリューションと比較して、米国のハイパースケーラー(Microsoft、Google、AWS)にどの程度深く結びついているかを示すインタラクティブマップです。
データパイプラインには2つのステージがあります:
ドメインの解決 — WikidataとBFS(スイス統計局)APIから約2100のスイス自治体を取得し、手動のオーバーライドを適用し、自治体のウェブサイトをスクレイピングしてメールアドレスを収集し、自治体名からドメインを推測し、MXルックアップで候補を検証します。ソースの一致度をスコアリングして最適なドメインを選択します。municipality_domains.json を出力します。
プロバイダーの分類 — 解決された各ドメインについて、すべてのMXホストを検索してパターンマッチングを行い、10の並行プローブ(SPF、DKIM、DMARC、Autodiscover、CNAMEチェーン、SMTPバナー、Tenant、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 に修正を追加できます。