{"id":32093710,"url":"https://github.com/cry-inc/dmarc-report-viewer","last_synced_at":"2026-03-03T22:05:49.699Z","repository":{"id":227920825,"uuid":"771192370","full_name":"cry-inc/dmarc-report-viewer","owner":"cry-inc","description":"Lightweight Standalone DMARC and SMTP TLS Report Viewer with IMAP Client","archived":false,"fork":false,"pushed_at":"2026-02-26T21:15:14.000Z","size":1615,"stargazers_count":255,"open_issues_count":12,"forks_count":10,"subscribers_count":9,"default_branch":"master","last_synced_at":"2026-02-27T02:14:51.114Z","etag":null,"topics":["dmarc","dmarc-aggregate-reports","e-mail","smtp-tls-reports","webui"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cry-inc.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"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":null,"dco":null,"cla":null}},"created_at":"2024-03-12T21:19:03.000Z","updated_at":"2026-02-26T21:14:59.000Z","dependencies_parsed_at":"2024-03-15T20:26:55.677Z","dependency_job_id":"2ba98c5b-54b0-4d75-b577-5b3ca5805bd5","html_url":"https://github.com/cry-inc/dmarc-report-viewer","commit_stats":null,"previous_names":["cry-inc/dmarc-report-viewer"],"tags_count":21,"template":false,"template_full_name":null,"purl":"pkg:github/cry-inc/dmarc-report-viewer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cry-inc%2Fdmarc-report-viewer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cry-inc%2Fdmarc-report-viewer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cry-inc%2Fdmarc-report-viewer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cry-inc%2Fdmarc-report-viewer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cry-inc","download_url":"https://codeload.github.com/cry-inc/dmarc-report-viewer/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cry-inc%2Fdmarc-report-viewer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30063391,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-03T18:21:05.932Z","status":"ssl_error","status_checked_at":"2026-03-03T18:20:59.341Z","response_time":61,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["dmarc","dmarc-aggregate-reports","e-mail","smtp-tls-reports","webui"],"created_at":"2025-10-19T21:01:14.666Z","updated_at":"2026-03-03T22:05:49.694Z","avatar_url":"https://github.com/cry-inc.png","language":"Rust","funding_links":[],"categories":["Rust"],"sub_categories":[],"readme":"# DMARC Report Viewer\r\n[![Build Status](https://github.com/cry-inc/dmarc-report-viewer/workflows/CI/badge.svg)](https://github.com/cry-inc/dmarc-report-viewer/actions)\r\n[![No Unsafe](https://img.shields.io/badge/unsafe-forbidden-brightgreen.svg)](https://doc.rust-lang.org/nomicon/meet-safe-and-unsafe.html)\r\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)\r\n[![Dependencies](https://deps.rs/repo/github/cry-inc/dmarc-report-viewer/status.svg)](https://deps.rs/repo/github/cry-inc/dmarc-report-viewer)\r\n\r\nA lightweight standalone [DMARC](https://en.wikipedia.org/wiki/DMARC#Aggregate_reports) and [SMTP TLS](https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol#SMTP_TLS_Reporting) report viewer.\r\nIdeal for smaller selfhosted mailservers to browse, visualize and analyze the reports.\r\n\r\nThe application is a single fully statically linked executable written in Rust.\r\nIt combines a report parser with an IMAP client and an HTTP server.\r\nThe embedded HTTP server offers a web UI for easy access and filtering of the reports.\r\n\r\nYou can run the precompiled executable directly on any Linux, Windows or MacOS system.\r\nAlternatively, you can use the tiny 10 MB Docker image to deploy the application.\r\nIt is also easy to [build the application](#build-from-source) directly from source.\r\n\r\n![Screenshot of Dashboard with DMARC Summary](screenshots/dashboard_cropped.png \"Screenshot of Dashboard with DMARC Summary\")\r\nYou can find more screenshots [here](screenshots/screenshots.md).\r\n\r\n## Features\r\n- [x] Lightweight Docker image for easy deployment\r\n- [x] Prebuilt binaries and Docker images\r\n- [x] Runs out of the box on a Raspberry Pi\r\n- [x] Secure IMAP client (TLS \u0026 STARTTLS)\r\n- [x] Robust parsing of XML DMARC reports\r\n- [x] Robust parsing of JSON SMTP TLS reports\r\n- [x] Filters all report types for duplicates\r\n- [x] Embedded HTTP server for Web UI\r\n- [x] Responsive Web UI that works also on small screens\r\n- [x] Automatic fetching of reports from IMAP inbox\r\n- [x] Updates are scheduled via simple update interval or cron expression\r\n- [x] Automatic HTTPS via ACME/Let's Encrypt\r\n- [x] Basic Auth password protection for HTTP server\r\n- [x] Easy configuration via command line arguments or ENV variables\r\n- [x] Configurable maximum size of mails (to skip oversized mails)\r\n- [x] Summary with charts for domains, organizations and passed/failed checks\r\n- [x] Filter charts summary by domain or time span\r\n- [x] Viewing of ranked sources/IPs by domain and report type\r\n- [x] Viewing filtered lists of reports\r\n- [x] Viewing of individual reports\r\n- [x] Export reports as XML or JSON documents\r\n- [x] List all mails in the IMAP inbox\r\n- [x] Viewing of individual mail metadata with a list of extracted reports\r\n- [x] Show parsing errors for reports\r\n- [x] Lookup of DNS, location, whois and other source IP properties\r\n- [x] Web Hook to notify external services about new mails\r\n- [x] HTTP Health Check Endpoint and Docker Health Check integration\r\n\r\n## Changelog\r\nRead the [CHANGELOG.md](CHANGELOG.md) file for a list of all released versions and their corresponding changes.\r\n\r\n## Run with Docker\r\nThe latest versions are automatically published as Docker images in the GitHub container registry.\r\nYou can download the latest release using the command `sudo docker pull ghcr.io/cry-inc/dmarc-report-viewer`.\r\nAlternatively, you can also pull from Docker Hub: `sudo docker pull cryinc/dmarc-report-viewer`.\r\n\r\n### Available Docker Tags\r\nThe following tags are available (aside from the versioned tag for all individual releases):\r\n* `latest` (Latest stable release)\r\n* `develop` (Last development build from master branch)\r\n\r\n## Configuration\r\nList all available configuration parameters with the corresponding environment variables and default values by running this command:\r\n`sudo docker run --rm ghcr.io/cry-inc/dmarc-report-viewer ./dmarc-report-viewer --help`.\r\n\r\nYou can configure the application with command line arguments or environment variables.\r\nFor the Docker use case, environment variables are recommended.\r\nDo not forget to forward the port for the HTTP server!\r\nBy default the HTTP server will use port 8080.\r\n\r\nHere is an example: \r\n\r\n    sudo docker run --rm \\\r\n      -e IMAP_HOST=imap.mymailserver.com \\\r\n      -e IMAP_USER=dmarc@mymailserver.com \\\r\n      -e IMAP_PASSWORD=mysecurepassword \\\r\n      -e HTTP_SERVER_USER=webui-user \\\r\n      -e HTTP_SERVER_PASSWORD=webui-password \\\r\n      -p 8080:8080 \\\r\n      ghcr.io/cry-inc/dmarc-report-viewer\r\n\r\n### Application Data\r\nThis application does not store any reports in a database or in any other kind of file.\r\nAll data is kept in memory and retrieved each time fresh from the configured IMAP account.\r\nThe only exception is the certificate cache folder when using Let's Encrypt,\r\nthis folder should be persisted and saved between application restarts.\r\n\r\n### IMAP Folders\r\nYou can define separate IMAP folders for fetching DMARC and TLS reports.\r\nBy default one single `INBOX` is used to look for both kind of reports.\r\nIf you specify at least one of the dedicated folders, the default folder will be disabled.\r\nPlease note that fetching reports from different IMAP accounts is currently not supported.\r\nYou might have to setup some forwarding if you are receiving them on separate accounts.\r\n\r\n### IMAP with STARTTLS\r\nBy default the IMAP client will attempt to use a TLS encrypted connection using port 993.\r\nFor STARTTLS set the ENV variables `IMAP_STARTTLS=true` and `IMAP_PORT=143`.\r\n\r\n### HTTPS for UI\r\nBy default, the application will start an unencrypted and unsecure HTTP server.\r\nIt is *strongly* recommended use the automatic HTTPS feature that will automatically fetch and renew a certificate from Let's Encrypt.\r\nThis feature uses the TLS-ALPN-01 challenge, which uses the HTTPS port 443 also for the challenge. No port 80 required!\r\nAlternatively, you can use an separate HTTPS reverse proxy like [Caddy](https://caddyserver.com/) to secure the application.\r\nThe application works also when being served via reverse-proxy on a non-root folder!\r\n\r\nTo use the included HTTPS feature you need to make sure that the public port exposed to the internet is 443.\r\nYou should also persist the certificate caching directory on your host file system:\r\n\r\n    sudo docker run --rm \\\r\n      -e IMAP_HOST=imap.mymailserver.com \\\r\n      -e IMAP_USER=dmarc@mymailserver.com \\\r\n      -e IMAP_PASSWORD=mysecurepassword \\\r\n      -e HTTP_SERVER_PORT=8443 \\\r\n      -e HTTP_SERVER_USER=webui-user \\\r\n      -e HTTP_SERVER_PASSWORD=webui-password \\\r\n      -e HTTPS_AUTO_CERT=true \\\r\n      -e HTTPS_AUTO_CERT_CACHE=/certs \\\r\n      -e HTTPS_AUTO_CERT_MAIL=admin@mymailserver.com \\\r\n      -e HTTPS_AUTO_CERT_DOMAIN=dmarc.mymailserver.com \\\r\n      -v /host/cert/folder:/certs \\\r\n      -p 443:8443 \\\r\n      ghcr.io/cry-inc/dmarc-report-viewer\r\n\r\n### IPv6 Support\r\nBy default the HTTP server will bind to any IPv4 address of the machine.\r\nThis is because the default bind setting is `0.0.0.0`.\r\nYou can use the configuration option `--http-server-binding [::]` or ENV variable `HTTP_SERVER_BINDING=[::]` for IPv6.\r\nNote that on Linux this will bind to both, IPv4 and IPv6 by default.\r\n\r\n### Disable Basic HTTP Auth\r\nBy default the application requires you to set an password to secure access via basic HTTP authentication.\r\nIf you want to use other access controls (e.g. via reverse proxy),\r\nyou can disable basic authentication by setting an empty string as password.\r\n\r\n### Health Checks\r\nThe service provides an health check endpoint at `/health` that always returns an empty HTTP 200 OK response.\r\nThe Docker image also contains a HEALTHCHECK statement and allows containers to check themselves.\r\nThe health check works by executing the binary in a special mode by providing the `--health-check` argument.\r\nIt will then try to get the HTTP/HTTPS configuration from the ENV vars to build an URL to query the health check endpoint.\r\nIf you have an exotic network setup this might fail and you need to override or disable the health check.\r\nFeel free to create an issue in this case!\r\n\r\n## Build from Source\r\n1. Install Rust toolchain (see https://rustup.rs/)\r\n2. Check out this repository (or download and extract the ZIP file)\r\n3. Run the command `cargo build --release` in the folder with this README file\r\n4. Find the compiled executable in the folder `target/release`\r\n5. Use the help argument to list all possible configuration parameters: `dmarc-report-viewer --help`\r\n\r\n### Docker Builds (Linux only)\r\nThe Dockerfile works for `amd64` and `arm64` architectures.\r\n1. Install Docker\r\n2. Check out this repository (or download and extract the ZIP file)\r\n3. Run the command `sudo docker build . --pull --tag dmarc-report-viewer` in the folder with this README file\r\n4. You should now be able to see the new Docker image using the command `sudo docker images`\r\n\r\n## Development Setup\r\nYou only need git and the Rust toolchain to work on this project.\r\nNo JavaScript tooling like Node, NPM or a bundler is required for the UI.\r\nThe UI code has all dependencies included and does not need any build steps.\r\n\r\nWhen running debug builds, the UI files can be reloaded from your checkout.\r\nThis means you can iterate on the UI without rebuilding the Rust backend every time!\r\nThis does not work for release builds where the UI load the files directly from the binary.\r\n\r\n## Contributing\r\nPlease create an issue before creating a PR for a bigger feature, so we can discuss your idea.\r\nI might decline some contributions because I want to keep the scope as small as possible.\r\n\r\nOnce you are ready to create a PR, please do the following:\r\n* Format the code (run `cargo fmt`).\r\n* Run Clippy for linting (run `cargo clippy --all --all-targets --all-features`).\r\n* Execute the included test suite (run `cargo test`).\r\n\r\nThe PR validation pipeline will also run the commands and fails if there are any issues.\r\n\r\n## Acknowledgments\r\n- Thanks to all the Rust dependencies in [Cargo.toml](Cargo.toml) that make this application possible!\r\n- Thanks to the JavaScript libraries [Charts.js](https://github.com/chartjs/Chart.js) and [Lit](https://lit.dev/) which are used for the UI.\r\n- Thanks to [@bbustin](https://github.com/bbustin) for his [dmarc_aggregate_parser](https://github.com/bbustin/dmarc_aggregate_parser) that was used as starting point for the DMARC report parser.\r\n- Thanks to [@marvinruder](https://github.com/marvinruder) for implementing SMTP TLS support!\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcry-inc%2Fdmarc-report-viewer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcry-inc%2Fdmarc-report-viewer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcry-inc%2Fdmarc-report-viewer/lists"}