
mxmap v2026.08.18
Pipeline automatizado que resuelve dominios de municipios suizos, extrae direcciones de correo electrónico de los sitios web y clasifica los proveedores de correo mediante sondas MX, SPF, DKIM, DMARC y SMTP para mapear dependencias digitales.
MXmap — mapas de infraestructura de correo electrónico municipal
[!IMPORTANT] MXmap tiene un sucesor. Este proyecto se convirtió en un esfuerzo de investigación en equipo que cubre todos los municipios de Alemania, Austria y Suiza: secassure2026.mxmap-project.org (código fuente). El mapa suizo en mxmap.ch permanece en línea, pero sus datos están congelados desde abril de 2026 y no se actualizarán.
Mapas interactivos que muestran dónde alojan su correo electrónico los municipios suizos y cuán profundamente está vinculado su DNS a los hiperescaladores estadounidenses (Microsoft, Google, AWS) frente a proveedores suizos y soluciones autoalojadas.
Cómo funciona
El pipeline de datos tiene dos etapas:
-
Resolver dominios — Obtiene los ~2100 municipios suizos de Wikidata y de la API de la BFS (Estadística Suiza), aplica sobrescrituras manuales, extrae direcciones de correo electrónico de los sitios web municipales, infiere dominios a partir de los nombres de los municipios y verifica los candidatos con consultas MX. Puntúa la concordancia de fuentes para elegir el mejor dominio. Genera
municipality_domains.json. -
Clasificar proveedores — Para cada dominio resuelto, busca todos los hosts MX, los compara con patrones y luego ejecuta 10 sondas concurrentes (SPF, DKIM, DMARC, Autodiscover, cadena CNAME, banner SMTP, Tenant, ASN, verificación TXT, IP de SPF). Agrega la evidencia ponderada y calcula puntuaciones de confianza (0–100). Genera
data.json(completo) ydata.min.json(minificado para el frontend).
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"]
Sistema de clasificación
Consulta classifier.py para conocer todos los detalles de implementación, pero en resumen, usamos un sistema de evidencia ponderada en el que cada sonda contribuye con señales de distinta intensidad hacia diferentes clasificaciones de proveedor.
Inicio rápido
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
Desarrollo
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
Trabajos relacionados
- SecAssure2026 — el sucesor de este proyecto: mapas de proveedores de correo electrónico y de seguridad de correo para ~15,300 municipios de Alemania, Austria y Suiza (código fuente)
- hpr4379 :: Mapeo de las dependencias digitales de los municipios
- Si conoces otros proyectos similares, por favor abre un issue o envía un PR para añadirlos aquí.
Forks
Forks específicos por país, en orden alfabético por código de país:
- 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/
Los forks de nuevos países son bienvenidos: considera comenzar desde el pipeline del sucesor, que añade una etapa de escaneo de DANE/DNSSEC/SPF/DMARC.
Proyectos relacionados:
- CAmap Nordic & Baltic — soberanía de las CA TLS para los municipios nórdicos y bálticos (fuente)
Consulta también los forks de este repositorio.
Cómo contribuir
Si detectas una clasificación incorrecta, abre un issue con el número de la BFS y el proveedor correcto. Para los municipios en los que la detección automática falla, se pueden añadir correcciones en overrides.json.
