Self-hosted DMARC + SMTP-TLS-RPT report viewer. Pulls from IMAP, Microsoft 365 or drop folder.
520
A self-hosted analyser for DMARC aggregate reports (RFC 7489) and SMTP TLS reports (RFC 8460). Pull reports from one or more mailboxes, parse the XML / JSON payloads, store them in SQLite and inspect the results in a MudBlazor UI — without sending data to a third party.
docker run -d \
--name dmarc-parser \
-p 18080:18080 \
-v "$(pwd)/data:/app/data" \
--restart unless-stopped \
christophmotal/dmarc-parser:latest
…or with docker-compose:
services:
dmarc-parser:
image: christophmotal/dmarc-parser:latest
container_name: dmarc-parser
ports:
- "18080:18080"
volumes:
- ./data:/app/data
restart: unless-stopped
Open http://localhost:18080/, configure a mail source under Mail Sources, run the self-test, enable polling.
Everything writeable lives under /app/data:
| Path | Purpose |
|---|---|
/app/data/db/ | SQLite database (dmarc.db) — reports, policies, config |
/app/data/drop/ | Drop folder source: place report files here, get auto-ingested. Sub-folders processed/, error/, unsupported/ are created automatically |
/app/data/logs/ | NLog file targets |
The IMAP / M365 secrets in the database are encrypted with the ASP.NET Core Data Protection API,
whose keys are persisted in the same SQLite database — back up dmarc.db to back up everything.
Defaults work out of the box. To override settings, mount an appsettings.Production.json next to
the container's working directory or pass standard ASP.NET Core environment variables:
environment:
ConnectionStrings__Default: "Data Source=data/db/dmarc.db"
FolderMailSource__DirectoryPath: "data/drop"
Logging__LogLevel__Default: "Information"
The polling background service ticks every 60 seconds; per-source poll intervals are configured in the UI (default 60 minutes).
linux/amd64mcr.microsoft.com/dotnet/aspnet:10.0user: "1654:1654" in
compose plus chown of the host data directory if you want non-root.latest — most recent releaseLayered .NET solution: Core (entities + interfaces) → Application (services, parsers, ingestion) → Infrastructure (EF Core / MailKit / Microsoft Graph) → Web (Blazor Server). SQLite is single-file, no external DB dependency.
MIT — Copyright (c) 2026 Christoph Motal. See the LICENSE file in the source repository.
Content type
Image
Digest
sha256:e2991262f…
Size
133.4 MB
Last updated
4 months ago
docker pull christophmotal/dmarc-parser