Sean Whalen 7ba078bff1 Translate AS-name source rows via MMDB; classify reverse DNS batch (#745)
* feat(maps): translate AS-name source rows via MMDB

When parsedmarc's ASN-fallback path in utils.get_ip_address_info surfaces
a raw MMDB as_name (e.g. "Vodafone Group PLC") for an IP that has no PTR
and whose as_domain isn't in the map, find_unknown_base_reverse_dns.py
now looks the as_name up in the bundled ipinfo_lite.mmdb and substitutes
the matching as_domain so the row enters the unknown pipeline as a
researchable domain instead of being dropped or polluting the list.

Normalize non-breaking spaces (U+00A0) and runs of whitespace when
building and querying the as_name index — the source CSV and MMDB
disagree on NBSP placement for several names (e.g. "UDomain\xa0Web
Hosting Company Ltd" in the CSV vs. "UDomain Web Hosting Company Ltd"
in the MMDB), causing exact-match lookups to miss otherwise-identical
entries.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore(maps): classify a batch of unknown reverse DNS base domains

40 map additions (35 source domains + 5 redirect-target/promotion
aliases) and 35 known-unknown additions, covering the 71-entry
unknown_base_reverse_dns.csv refresh.

Newly mapped operators include several MMDB-AS-translated regional
ISPs (Babilon-T/TJ, MegaFon Tajikistan, Ucell, Ufone, PinPro, Teraline
Telecom, Transtelecom Kazakhstan, Satis, AlmaTV, Radius-NET, Burlington
Telecom), aliases of existing brands (Telstra/bigpond.net.au,
UDomain/udomain.hk, AG Telekom/katv1.net, EWE/ewe-ip-backbone.de,
Hostinger/hstgr.cloud, Docusign/docusign.net, Brevo/sp2-brevo.net,
MegaFon/megafon.tj, Beeline/beeline.uz), Tier-0 brands (Visa, Tripster,
Verde Agritech), one healthcare entry (Sanwakai Hospital), one
government entry (Special Communication Service of Azerbaijan), one
education entry (KazRENA), and an MSP (Otava). Redirect-target aliases
added for burlingtontelecom.com, alma.plus, cn.at, and
teraline-telecom.net per the post-batch sweep rule. fea.net promoted
out of known-unknown to West Coast Internet (WCI) after its homepage
redirect-target was already mapped.

Domains with single-source corroboration (privacy WHOIS plus
unreachable site, parked-domain pages, ambiguous categorizations) went
to known_unknown_base_reverse_dns.txt rather than the map.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Sean Whalen <seanthegeek@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 13:17:43 -04:00
2026-05-03 12:36:06 -04:00
2026-04-19 21:20:41 -04:00
2025-12-12 15:56:52 -05:00
2026-03-09 18:16:47 -04:00
2026-03-23 17:08:26 -04:00
2018-02-05 20:23:07 -05:00
2022-10-04 18:45:57 -04:00
2026-03-09 18:24:16 -04:00

parsedmarc

Build
Status Code
Coverage PyPI
Package PyPI - Downloads

A screenshot of DMARC summary charts in Kibana

parsedmarc is a Python module and CLI utility for parsing DMARC reports. When used with Elasticsearch and Kibana (or Splunk), it works as a self-hosted open-source alternative to commercial DMARC report processing services such as Agari Brand Protection, Dmarcian, OnDMARC, ProofPoint Email Fraud Defense, and Valimail.

Note

Domain-based Message Authentication, Reporting, and Conformance (DMARC) is an email authentication protocol.

Sponsors

This is a project is maintained by one developer. Please consider sponsoring my work if you or your organization benefit from it.

Features

  • Parses draft and 1.0 standard aggregate/rua DMARC reports
  • Parses forensic/failure/ruf DMARC reports
  • Parses reports from SMTP TLS Reporting
  • Can parse reports from an inbox over IMAP, Microsoft Graph, or Gmail API
  • Transparently handles gzip or zip compressed reports
  • Consistent data structures
  • Simple JSON and/or CSV output
  • Optionally email the results
  • Optionally send the results to Elasticsearch, Opensearch, and/or Splunk, for use with premade dashboards
  • Optionally send reports to Apache Kafka

Python Compatibility

This project supports the following Python versions, which are either actively maintained or are the default versions for RHEL or Debian.

Version Supported Reason
< 3.6 End of Life (EOL)
3.6 Used in RHEL 8, but not supported by project dependencies
3.7 End of Life (EOL)
3.8 End of Life (EOL)
3.9 Used in Debian 11 and RHEL 9, but not supported by project dependencies
3.10 Actively maintained
3.11 Actively maintained; supported until June 2028 (Debian 12)
3.12 Actively maintained; supported until May 2035 (RHEL 10)
3.13 Actively maintained; supported until June 2030 (Debian 13)
3.14 Supported (requires imapclient>=3.1.0)
S
Description
No description provided
Readme Apache-2.0 160 MiB
Languages
Python 98.7%
Shell 1.3%