
mxmap v2026.08.18
自动化管道,用于解析瑞士市政域名、抓取网站上的电子邮件地址,并通过 MX、SPF、DKIM、DMARC 和 SMTP 探测对电子邮件提供商进行分类,从而映射数字依赖关系。
MXmap — 市政电子邮件基础设施地图
[!IMPORTANT] MXmap 已有继任者。 这个项目已发展为一个团队研究项目,覆盖德国、奥地利和瑞士的所有市政当局:secassure2026.mxmap-project.org(源代码)。瑞士地图 mxmap.ch 仍保持在线,但其数据自 2026 年 4 月起已冻结,不再更新。
交互式地图,展示瑞士市政当局将电子邮件托管在何处,以及它们的 DNS 在多大程度上绑定到美国超大规模云服务商(Microsoft、Google、AWS),而非瑞士本地提供商和自托管解决方案。
工作原理
数据管道分为两个阶段:
-
解析域名 — 从 Wikidata 和 BFS(瑞士联邦统计局)API 获取全部约 2100 个瑞士市政当局,应用手动覆盖规则,抓取市政网站以获取电子邮件地址,根据市政名称推测域名,并通过 MX 查询验证候选域名。对来源一致性进行评分,以选出最佳域名。输出
municipality_domains.json。 -
分类提供商 — 对每个解析出的域名,查找所有 MX 主机并进行模式匹配,然后运行 10 个并发探测(SPF、DKIM、DMARC、Autodiscover、CNAME 链、SMTP banner、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
相关项目
- SecAssure2026 — 本项目的继任者:覆盖德国、奥地利和瑞士约 15,300 个市政当局的电子邮件提供商与电子邮件安全地图(源代码)
- hpr4379 :: 绘制市政当局的数字依赖关系
- 如果你还知道其他类似项目,欢迎提交 issue 或 PR 将它们添加到这里!
分支(Forks)
按国家代码字母顺序排列的特定国家分支:
- 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/
欢迎创建新的国家分支 — 可以考虑从继任者的管道开始,其中新增了 DANE/DNSSEC/SPF/DMARC 扫描阶段。
相关项目:
- CAmap Nordic & Baltic — 北欧和波罗的海市政当局的 TLS CA 主权(源代码)
另请参阅本仓库的分支。
贡献
如果你发现分类错误,请提交包含 BFS 编号和正确提供商的 issue。
对于自动检测失败的市政当局,可以将更正添加到 overrides.json 中。
