Files
selfpost/internal/web/view/templates/dmarc.html
T
mix 20d88e1d9c release: 1.7.0: DMARC aggregate report ingest and panel summaries
Optional DMARC aggregate report ingest: accept `rua=` mail on port 25, parse gzip/XML into SQLite, and show summaries in the panel.
Added:
  - Optional DMARC aggregate report ingest (`DMARC_REPORTS_ENABLE`): port 25
  - Per-domain **SelfPost hosted** `rua=` mode when ingest is enabled

Full detail: CHANGELOG.md (1.7.0).
2026-09-22 15:24:52 +03:00

64 lines
2.2 KiB
HTML

{{define "wide"}}wide{{end}}
{{define "content"}}
<h1>DMARC reports</h1>
<p class="muted">Aggregate reports SelfPost accepted for <code>rua=</code>.
Forensic (<code>ruf=</code>) is out of scope. Open a report for the parsed
XML — not a dashboard.</p>
<div class="pair">
<div class="card">
<h2>Ingest {{if .IngestStats.IngestOK}}<span class="st st-ok">ok</span>{{else}}<span class="st st-warn">quiet</span>{{end}}</h2>
{{if .LastReceivedLabel}}
<p>Last report {{.LastReceivedLabel}} UTC. Port 25 accepts only configured report addresses.</p>
{{else}}
<p>No reports received yet. Point <code>rua=</code> at
<code>{{.HostedAddress}}</code> (or a per-domain hosted address) and publish
MX for {{.HostedAddress}} on this server.</p>
{{end}}
</div>
<div class="card">
<h2>This week</h2>
<p>{{.IngestStats.KeptThisWeek}} kept{{if .IngestStats.ParseFailures}}, {{.IngestStats.ParseFailures}} parse failures{{end}}.
Older summaries are pruned ({{.RetentionMax}} max, {{.RetentionDays}} days).</p>
</div>
</div>
<div class="card">
<h2>Recent reports</h2>
{{if .Reports}}
<table class="desk-only">
<thead><tr><th>Received</th><th>Domain</th><th>Reporter</th><th>Window</th><th>Pass</th><th>Fail</th><th></th></tr></thead>
<tbody>
{{range .Reports}}
<tr>
<td class="time muted">{{.ReceivedLabel}}</td>
<td>{{if .DomainID}}<a href="/dmarc/domains/{{.DomainID}}">{{.Domain}}</a>{{else}}{{.Domain}}{{end}}</td>
<td class="muted">{{.Reporter}}</td>
<td>{{.PeriodLabel}}</td>
<td>{{.PassCount}}</td>
<td>{{.FailCount}}</td>
<td class="actions"><a href="/dmarc/reports/{{.ID}}">View</a></td>
</tr>
{{end}}
</tbody>
</table>
<ul class="phone-list phone-only">
{{range .Reports}}
<li>
<a href="/dmarc/reports/{{.ID}}">
<span class="st {{if gt .FailCount 0}}st-warn{{else}}st-ok{{end}}">{{.PassCount}} pass</span>
<span class="when">{{.ReceivedLabel}}</span>
<span class="meta">{{.Domain}} · {{.Reporter}}</span>
<span class="subj">{{.FailCount}} fail</span>
</a>
</li>
{{end}}
</ul>
{{else}}
<p class="muted">No reports yet.</p>
{{end}}
</div>
{{end}}