{"id":13528150,"url":"https://github.com/domainaware/parsedmarc","last_synced_at":"2026-04-28T07:00:58.691Z","repository":{"id":37547910,"uuid":"120373756","full_name":"domainaware/parsedmarc","owner":"domainaware","description":"A Python package and CLI for parsing aggregate and forensic DMARC reports","archived":false,"fork":false,"pushed_at":"2026-04-23T06:27:08.000Z","size":66495,"stargazers_count":1233,"open_issues_count":88,"forks_count":254,"subscribers_count":25,"default_branch":"master","last_synced_at":"2026-04-23T06:27:59.021Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://domainaware.github.io/parsedmarc/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/domainaware.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"github":["seanthegeek"]}},"created_at":"2018-02-05T23:08:59.000Z","updated_at":"2026-04-23T06:13:35.000Z","dependencies_parsed_at":"2023-02-10T09:45:16.886Z","dependency_job_id":"262509a1-2585-49ea-aaf3-e216ceabfa5d","html_url":"https://github.com/domainaware/parsedmarc","commit_stats":{"total_commits":944,"total_committers":79,"mean_commits":"11.949367088607595","dds":0.3411016949152542,"last_synced_commit":"7d2b431e5f20bdcdb330c4fbb23ce7df5fb0642f"},"previous_names":[],"tags_count":44,"template":false,"template_full_name":null,"purl":"pkg:github/domainaware/parsedmarc","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/domainaware%2Fparsedmarc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/domainaware%2Fparsedmarc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/domainaware%2Fparsedmarc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/domainaware%2Fparsedmarc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/domainaware","download_url":"https://codeload.github.com/domainaware/parsedmarc/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/domainaware%2Fparsedmarc/sbom","scorecard":{"id":54207,"data":{"date":"2025-08-11","repo":{"name":"github.com/domainaware/parsedmarc","commit":"0720bffcb66fc478ba7467428e672e3fe9584a39"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.7,"checks":[{"name":"Maintained","score":10,"reason":"23 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 1/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":10,"reason":"GitHub workflow tokens follow principle of least privilege","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/docker.yml:22","Info: topLevel 'contents' permission set to 'read': .github/workflows/docker.yml:4","Info: topLevel 'contents' permission set to 'read': .github/workflows/python-tests.yml:4","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Pinned-Dependencies","score":2,"reason":"dependency not pinned by hash detected -- score normalized to 2","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docker.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/domainaware/parsedmarc/docker.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docker.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/domainaware/parsedmarc/docker.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-tests.yml:36: update your workflow using https://app.stepsecurity.io/secureworkflow/domainaware/parsedmarc/python-tests.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-tests.yml:38: update your workflow using https://app.stepsecurity.io/secureworkflow/domainaware/parsedmarc/python-tests.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/python-tests.yml:68: update your workflow using https://app.stepsecurity.io/secureworkflow/domainaware/parsedmarc/python-tests.yml/master?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:8","Warn: containerImage not pinned by hash: Dockerfile:21","Warn: pipCommand not pinned by hash: Dockerfile:12","Warn: pipCommand not pinned by hash: build.sh:10","Warn: pipCommand not pinned by hash: .github/workflows/python-tests.yml:47","Warn: pipCommand not pinned by hash: .github/workflows/python-tests.yml:48","Warn: pipCommand not pinned by hash: .github/workflows/python-tests.yml:61","Info:   0 out of   3 GitHub-owned GitHubAction dependencies pinned","Info:   2 out of   4 third-party GitHubAction dependencies pinned","Info:   0 out of   2 containerImage dependencies pinned","Info:   1 out of   6 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/docker.yml:19"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 1 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-15T00:20:06.382Z","repository_id":37547910,"created_at":"2025-08-15T00:20:06.382Z","updated_at":"2025-08-15T00:20:06.382Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32370030,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-27T20:07:02.737Z","status":"online","status_checked_at":"2026-04-28T02:00:07.250Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-01T06:02:14.997Z","updated_at":"2026-04-28T07:00:58.663Z","avatar_url":"https://github.com/domainaware.png","language":"Python","funding_links":["https://github.com/sponsors/seanthegeek"],"categories":["Python","Security","\u003ca id=\"ecb63dfb62722feb6d43a9506515b4e3\"\u003e\u003c/a\u003e新添加"],"sub_categories":["DMARC"],"readme":"# parsedmarc\n\n[![Build\nStatus](https://github.com/domainaware/parsedmarc/actions/workflows/python-tests.yml/badge.svg)](https://github.com/domainaware/parsedmarc/actions/workflows/python-tests.yml)\n[![Code\nCoverage](https://codecov.io/gh/domainaware/parsedmarc/branch/master/graph/badge.svg)](https://codecov.io/gh/domainaware/parsedmarc)\n[![PyPI\nPackage](https://img.shields.io/pypi/v/parsedmarc.svg)](https://pypi.org/project/parsedmarc/)\n[![PyPI - Downloads](https://img.shields.io/pypi/dm/parsedmarc?color=blue)](https://pypistats.org/packages/parsedmarc)\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/domainaware/parsedmarc/refs/heads/master/docs/source/_static/screenshots/dmarc-summary-charts.png?raw=true\" alt=\"A screenshot of DMARC summary charts in Kibana\"/\u003e\n\u003c/p\u003e\n\n`parsedmarc` is a Python module and CLI utility for parsing DMARC\nreports. When used with Elasticsearch and Kibana (or Splunk), it works\nas a self-hosted open-source alternative to commercial DMARC report\nprocessing services such as Agari Brand Protection, Dmarcian, OnDMARC,\nProofPoint Email Fraud Defense, and Valimail.\n\n\u003e [!NOTE]\n\u003e __Domain-based Message Authentication, Reporting, and Conformance__ (DMARC) is an email authentication protocol.\n\n## Sponsors\n\nThis is a project is maintained by one developer.\nPlease consider [sponsoring my work](https://github.com/sponsors/seanthegeek) if you or your organization benefit from it.\n\n## Features\n\n- Parses draft and 1.0 standard aggregate/rua DMARC reports\n- Parses forensic/failure/ruf DMARC reports\n- Parses reports from SMTP TLS Reporting\n- Can parse reports from an inbox over IMAP, Microsoft Graph, or Gmail API\n- Transparently handles gzip or zip compressed reports\n- Consistent data structures\n- Simple JSON and/or CSV output\n- Optionally email the results\n- Optionally send the results to Elasticsearch, Opensearch, and/or Splunk, for\n  use with premade dashboards\n- Optionally send reports to Apache Kafka\n\n## Python Compatibility\n\nThis project supports the following Python versions, which are either actively maintained or are the default versions\nfor RHEL or Debian.\n\n| Version | Supported | Reason                                                     |\n|---------|-----------|------------------------------------------------------------|\n| \u003c 3.6   | ❌         | End of Life (EOL)                                          |\n| 3.6     | ❌         | Used in RHEL 8, but not supported by project dependencies |\n| 3.7     | ❌         | End of Life (EOL)                                          |\n| 3.8     | ❌         | End of Life (EOL)                                          |\n| 3.9     | ❌         | Used in Debian 11 and RHEL 9, but not supported by project dependencies |\n| 3.10    | ✅         | Actively maintained                                        |\n| 3.11    | ✅         | Actively maintained; supported until June 2028 (Debian 12) |\n| 3.12    | ✅         | Actively maintained; supported until May 2035 (RHEL 10)    |\n| 3.13    | ✅         | Actively maintained; supported until June 2030 (Debian 13) |\n| 3.14    | ✅         | Supported (requires `imapclient\u003e=3.1.0`)                  |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdomainaware%2Fparsedmarc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdomainaware%2Fparsedmarc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdomainaware%2Fparsedmarc/lists"}