Two configuration steps are required in server/ponymail.yaml:
ui: mgmtconsole: true
oauth: authoritative_domains: - googleapis.com admins: - admin@example.org - another-admin@example.org
Restart the server after changes.
Admin users see a yellow cog icon in the context menu of each email. Clicking it opens the management interface for that message.
| Action | Effect |
|---|---|
| Hide | Marks the email as hidden. It remains in OpenSearch but is not shown to users. Recoverable. |
| Unhide | Restores a previously hidden email. |
| Delete | Permanently removes the email from both mbox and source indices. Only available when allow_delete: true. Irreversible. |
| Edit | Change metadata (e.g. move to different list-ID). |
For full GDPR compliance (right to erasure), set:
ui: mgmtconsole: true allow_delete: true
When allow_delete is true:
mbox and source indices)When allow_delete is false (default):
source indexAll admin actions are logged. View the audit log via the API:
curl -X POST https://your-instance/api/mgmt.json \ -H "Content-Type: application/json" \ -H "Cookie: ponymail=your-session-cookie" \ -d '{"action": "log", "size": 50, "page": 0}'
Or filter by action type:
curl -X POST https://your-instance/api/mgmt.json \ -H "Content-Type: application/json" \ -H "Cookie: ponymail=your-session-cookie" \ -d '{"action": "log", "filter": "delete"}'
tools/bulk-edit.py)Perform batch metadata changes across many emails. Useful for:
tools/rethread.py)Recompute threading metadata for all emails. Run this after:
archiver.threadinfo after initial importcd tools python3 rethread.py
If you need to rebuild the OpenSearch indices from scratch:
curl -X DELETE http://localhost:9200/ponymail-*python3 tools/setup.pypython3 tools/import-mbox.py --source /path/to/archives/curl -s http://localhost:8080/api/pminfo.json | python3 -m json.tool
curl -s http://localhost:9200/_cat/indices/ponymail-*?v
| Symptom | Likely Cause |
|---|---|
| 404 on all API calls | Server not running or proxy misconfigured |
| Empty list overview | Background refresh hasn't run yet (wait refresh_rate seconds) |
| Private emails visible without login | authoritative_domains not set, or AAA plugin bypassed |
| “API error occurred” with traceback | Set ui.traceback: false in production, check journal for details |
| Compose/reply silently fails | Check ui.mailhost and ui.sender_domains config |