
mxmap v2026.08.18
Pipeline automatisé qui résout les domaines des communes suisses, extrait les adresses e-mail des sites web et classe les fournisseurs de messagerie via des sondes MX, SPF, DKIM, DMARC et SMTP afin de cartographier les dépendances numériques.
MXmap — cartes de l'infrastructure de messagerie des communes
[!IMPORTANT] MXmap a un successeur. Ce projet a évolué en un effort de recherche d'équipe couvrant toutes les communes d'Allemagne, d'Autriche et de Suisse : secassure2026.mxmap-project.org (source). La carte suisse sur mxmap.ch reste en ligne, mais ses données sont figées depuis avril 2026 et ne seront plus mises à jour.
Cartes interactives montrant où les communes suisses hébergent leur messagerie et à quel point leur DNS est lié aux hyperscalers américains (Microsoft, Google, AWS) par rapport aux fournisseurs suisses et aux solutions auto-hébergées.
Comment ça fonctionne
Le pipeline de données comporte deux étapes :
-
Résoudre les domaines — Récupère les ~2100 communes suisses depuis Wikidata et l'API BFS (Office fédéral de la statistique), applique des corrections manuelles, extrait les adresses e-mail des sites web communaux, devine les domaines à partir des noms de communes et vérifie les candidats avec des requêtes MX. Évalue l'accord entre les sources pour choisir le meilleur domaine. Génère
municipality_domains.json. -
Classifier les fournisseurs — Pour chaque domaine résolu, recherche tous les hôtes MX, les compare à des motifs, puis lance 10 sondes concurrentes (SPF, DKIM, DMARC, Autodiscover, chaîne CNAME, bannière SMTP, Tenant, ASN, vérification TXT, IP SPF). Agrège les preuves pondérées, calcule les scores de confiance (0–100). Génère
data.json(complet) etdata.min.json(minifié pour le frontal).
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"]
Système de classification
voir classifier.py pour le détail complet de l'implémentation, mais en résumé,
nous utilisons un système de preuves pondérées où chaque sonde apporte des signaux de force variable vers différentes classifications de fournisseurs.
Démarrage rapide
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
Développement
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
Travaux connexes
- SecAssure2026 — le successeur de ce projet : des cartes des fournisseurs de messagerie et de la sécurité e-mail pour ~15 300 communes d'Allemagne, d'Autriche et de Suisse (source)
- hpr4379 :: Mapping Municipalities' Digital Dependencies
- Si vous connaissez d'autres projets similaires, veuillez ouvrir une issue ou soumettre une PR pour les ajouter ici !
Forks
Forks spécifiques à chaque pays, classés par ordre alphabétique de code pays :
- BE — https://mxmap.be/
- DE — https://b42labs.github.io/mxmap/ · https://mx-map.de/
- EU — https://livenson.github.io/mxmap/
- FR — https://mxmairies.fr/
- IT — https://mxmap.it/
- LV — https://securit.lv/mxmap
- NL — https://mxmap.nl/
- NO — https://kommune-epost-norge.netlify.app/
- PT — https://mxmap.pt/
- SE — https://swedish-mail-dependency.netlify.app/
- UK — https://mxmap.uk/
Les nouveaux forks par pays sont les bienvenus — pensez à partir du pipeline du successeur, qui ajoute une étape de scan DANE/DNSSEC/SPF/DMARC.
Projets associés :
- CAmap Nordic & Baltic — souveraineté des CA TLS pour les communes nordiques et baltes (source)
Voir aussi les forks de ce dépôt.
Contribuer
Si vous repérez une mauvaise classification, veuillez ouvrir une issue avec le numéro BFS et le bon fournisseur.
Pour les communes où la détection automatique échoue, des corrections peuvent être ajoutées dans overrides.json.
