- Syslog-style table (postfix, dovecot, sogo, netfilter, acme):
Time | Priority badge (colour-coded debug→info→notice→warn→error→crit)
| Process | Message — columns hidden when unused by that log type
- API access log: Time | Method badge (GET=green, POST=blue,
PUT=orange, DELETE=red) | Endpoint | Remote IP | Data
- Autodiscover: Time | User | Service badge (ActiveSync, CalDAV,
CardDAV, IMAP, SMTP) | User Agent
- Watchdog: Time | Service | Health badge (Healthy/Degraded/Critical
based on lvl) | Processes (now/total) | Change (+/-/±0 coloured)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Renders ratelimited log entries as a structured table instead of raw
JSON, showing: timestamp, sender (header_from), recipient, subject,
IP address, rate-limit rule name (orange badge, tooltip with rl_info),
and queue ID.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Rspamd log type renders a structured table instead of raw JSON
- Each row shows: timestamp, sender, recipient, subject, colour-coded
score (green/amber/red relative to required threshold), action badge
- Expand button reveals a detail panel per message with:
- Meta grid: Sender SMTP/MIME, IP, size, process time, Message-ID
- Threshold strip showing all configured score boundaries
- Symbol table sorted by impact, with dashicons (warning/check/minus),
+/- score in colour, description, and option values
- Zero-score informational symbols shown dimmed at the bottom
- Other log types (postfix, dovecot, etc.) still render as before
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Features added:
- Admin > Domains: add domains to Mailcow servers, auto-generate DKIM,
display full DNS record set (MX, SPF, DMARC, DKIM, autoconfig CNAMEs)
with one-click copy per record
- Admin > Transports: manage sender-dependent relay hosts (add/delete)
- Admin > Logs: view Postfix, Dovecot, Rspamd, Ratelimit, API and other
server logs in a dark scrollable panel
- My Account: per-domain Quarantine panel — view score, sender, subject,
date; permanently delete quarantined messages
- My Account: per-mailbox Spam Filter slider (1–15 threshold) saved via API
- My Account: Aliases & Forwarders (alias creation doubles as forwarder
to any external address)
UX fixes:
- Quota 0 now displays ∞ (unlimited) in both admin and account views
- Admin mailbox action buttons replaced with Dashicon icon buttons
(lock, chart-bar, trash) with title tooltips
i18n:
- load_plugin_textdomain registered on init hook
- All user-facing PHP strings wrapped in __() / esc_html__()
- Translated strings array passed to account JS via wp_localize_script
- woocow-es_ES.po/.mo — Spanish translation
- woocow-ro_RO.po/.mo — Romanian translation (with correct plural forms)
- English remains the fallback
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add Reset PW and Set Quota action buttons to each mailbox row
- Shared edit modal that switches between password / quota modes
- New woocow_admin_mailbox_edit AJAX handler in PHP
- Quota reloads mailbox list after save; password closes modal silently
- Customer-facing Change Password was already implemented in account JS
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- get_domain_mailboxes: was POST /api/v1/get/mailboxes/{domain},
correct path is GET /api/v1/get/mailbox/all/{domain}
- Quota percentage field is percent_in_use, not quota_used_in_percent
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Mailcow's GET /api/v1/get/domain/all returns domain_name (not domain)
in each response object. Using the wrong key caused the dropdown to
display 'null' for every entry.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>