Volver a actualizaciones
Nuevo releaseAug 18, 2026

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.

Compartir

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.

CI

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.

Ver los mapas en vivo

Captura de pantalla de MXmap

Cómo funciona

El pipeline de datos tiene dos etapas:

  1. 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.

  2. 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) y data.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

Forks

Forks específicos por país, en orden alfabético por código de país:

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:

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.

Licencia

MIT

Categorías