#pApiAuth
sharpmail-cli Referenz: Befehle, Schema-Cache, jq-Filter & GitOps-IaC
Mit sharpmail-cli steuerst du Domains, Postfächer, Verteilerlisten, Aliase, Scoped API-Keys, ausgehende SMTP-Routen (inkl. TLS-Ausnahmen), IP-Warming, Reputation Shield und DNS-Zonen vollständig über die Kommandozeile oder in CI/CD-Pipelines (Ansible, GitLab CI, GitHub Actions) - mit 0 ms Hot-Reload ohne Dienstneustart.
Bereits im PATH vorinstalliert: Sowohl der Windows-.msi-Installer (C:\Program Files\SharpMailserver\sharpmail-cli.cmd), das Debian/Ubuntu-.deb-Paket (/usr/bin/sharpmail-cli), install.sh (/usr/local/bin/sharpmail-cli) als auch das OCI-Container-Image stellen sharpmail-cli direkt bereit. Übergib Zugangsdaten produktiv immer über SHARPMAIL_API_KEY (oder SHARPMAIL_TOKEN), damit keine Geheimnisse in der Prozessliste (ps aux) erscheinen.
1. Installation, Umgebungsvariablen, Auth & Exit-Codes
Funktioniert identisch lokal auf dem Mailserver wie remote vom Admin-Notebook oder CI-Runner über HTTPS.
# Linux / macOS / GitLab CI / GitHub Actions:
export SHARPMAIL_URL="https://mail.firma.de"
export SHARPMAIL_API_KEY="smk_01968f2a_..." # Alias: SHARPMAIL_TOKEN
# PowerShell (Windows Server / Admin-Workstation):
$env:SHARPMAIL_URL = "https://mail.firma.de"
$env:SHARPMAIL_API_KEY = "smk_01968f2a_..."
# Docker-Host ohne lokalen Wrapper (direkt im Container):
docker exec -i sharpmailserver sharpmail-cli describe
# Interaktive Erst-Anmeldung vor dem ersten API-Key (fragt Passwort verdeckt ab, nur ohne 2FA):
sharpmail-cli --url https://localhost --insecure -u admin@firma.de create ApiKey \
--set label="Ansible Prod" --set role=ServerAdmin --set allowedCidrs=10.0.0.0/8 --set expiresInDays=90
# Hilfe zu jedem Unterbefehl direkt im Terminal + definierte Exit-Codes für Skripte:
sharpmail-cli --help
sharpmail-cli help create
# Exit-Codes: 0 = Erfolg · 1 = HTTP-/Auth-/Server-Fehler · 2 = Ungültige CLI-Parameter / JSON
2. Schema-Inspektion (describe), Filter-Abfragen (query) & jq-Pipelines
Mit --json gibt get ein einzelnes kompaktes JSON-Objekt aus, während query ein zeilenweises NDJSON-Streaming-Format für jq oder PowerShell liefert.
# Alle 12 verfügbaren Objekttypen oder die Felder eines einzelnen Typs anzeigen:
sharpmail-cli describe
sharpmail-cli describe Route
sharpmail-cli describe TransactionalSend
# Einzelnes Objekt oder globale Singleton-Konfiguration lesen:
sharpmail-cli get Domain firma.de
sharpmail-cli get SmtpQueue --json | jq '{paused: .outboundQueuePaused, tls: .outboundTlsCertValidation}'
# Gefilterte Tabellen-Abfrage mit Spaltenprojektion:
sharpmail-cli query Account --filter domain=firma.de,isActive=true --fields email,role,quotaMb,twoFactorEnabled
# NDJSON-Pipeline (Bash + jq): Alle aktiven Admin-Konten ohne 2FA auflisten:
sharpmail-cli query Account --filter isActive=true --json \
| jq -r 'select(.role != "User" and .twoFactorEnabled == false) | "\(.email)\t\(.role)"'
# PowerShell-Pipeline auf Windows Server: Postfächer > 80 % Quota finden:
sharpmail-cli query Account --json | ForEach-Object { $_ | ConvertFrom-Json } |
Where-Object { $_.quotaMb -gt 0 -and ($_.usedBytes / 1MB) -gt ($_.quotaMb * 0.8) } |
Select-Object email, quotaMb, @{N="UsedMB";E={[math]::Round($_.usedBytes/1MB,1)}}
3. Objekte anlegen, ändern & löschen (create, update, delete · @file.json & stdin)
Skalare Werte, Booleans, Zahlen und kommagetrennte Listen werden über --set key=value automatisch typisiert; komplexe JSON-Objekte über --data @datei.json oder stdin (-).
# 1. Domain mit Dual-DKIM (RSA-2048 + Ed25519) und 10 Jahren GoBD-Aufbewahrung anlegen:
sharpmail-cli create Domain \
--set name=firma.de \
--set dkimSigningMode=Dual \
--set retentionLockMode=Compliance \
--set retentionDays=3650
# 2. Benutzerpostfach, Verteilerliste & Datenschutz-Alias anlegen:
sharpmail-cli create Account/User --set email=buchhaltung@firma.de --set displayName="Buchhaltung" --set password='...' --set quotaMb=15360
sharpmail-cli create Account/List --set email=rechnung@firma.de --set members=buchhaltung@firma.de,archiv@firma.de
sharpmail-cli create Alias --set address=info@firma.de --set target=buchhaltung@firma.de --set description="Zentrale"
# 3. Scoped API-Key für Webshop/ERP (nur /api/v1/send, feste Absenderadresse & Subnetz-Filter):
sharpmail-cli create ApiKey \
--set label="Shopware Produktion" \
--set role=User \
--set senderAddress=bestellung@firma.de \
--set defaultCategory=transactional \
--set allowedCidrs=10.20.0.0/16,198.51.100.12/32 \
--set expiresInDays=180
# 4. Ausgehende Route / TLS-Ausnahme für Partner-MX mit RemoteCertificateNameMismatch (Auto DNS-MX):
sharpmail-cli create Route --set domain=neff.me --set tlsMode=StartTlsIgnoreCert --set description="Shared-MX TLS Override"
# 5. IP-Warming & Reputation Shield aktivieren oder JSON per Pipe (stdin) übergeben:
sharpmail-cli update TransactionalSend --set preset=warming_28d
sharpmail-cli update ReputationShield --set preset=recommended
echo '{"junkScoreThreshold":4.2,"clamAvEnabled":true}' | sharpmail-cli update SpamGuard --data -
4. Live-DNS-Prüfung, BIND-Export & Deklaratives GitOps (snapshot & apply --dry-run)
Jede Zeile einer .ndjson-Plandatei beschreibt eine idempotente Operation (upsert oder delete); Kommentarzeilen mit # oder // sind ausdrücklich erlaubt.
# Öffentliche DNS-Einträge live gegen die konfigurierten DKIM/DMARC/TLSA-Werte prüfen & als BIND-Zone speichern:
sharpmail-cli dns firma.de --live
sharpmail-cli dns firma.de --bind --output firma.de.zone
# Aktuellen Serverzustand als versionierbaren NDJSON-Plan exportieren (ohne Geheimnisse für Git):
sharpmail-cli snapshot Domain Account Alias Route TransactionalSend ReputationShield --output infra/mail-prod.ndjson
# Beispiel für deklarative Zeilen in infra/mail-prod.ndjson (inkl. Kommentaren & gezieltem Löschen):
# {"op":"upsert","type":"Domain","key":"firma.de","fields":{"name":"firma.de","dkimSigningMode":"Dual","retentionDays":3650}}
# {"op":"upsert","type":"Route","key":"neff.me","fields":{"domain":"neff.me","tlsMode":"StartTlsIgnoreCert","enabled":true}}
# {"op":"delete","type":"Alias","key":"alt-kampagne@firma.de"}
# CI/CD Pull-Request Check (verändert NICHTS in der Datenbank, Exit-Code != 0 bei Fehlern):
sharpmail-cli apply --file infra/mail-prod.ndjson --dry-run
# Nach Freigabe idempotent auf Produktion anwenden:
sharpmail-cli apply --file infra/mail-prod.ndjson
Einstellungen, Standardwerte & Best Practices
| Einstellung / Ort | Funktion | Standardwert | Best Practice im Betrieb |
|---|---|---|---|
Globale Flags & Umgebungsvariablen |
Steuert Zielserver (--url / SHARPMAIL_URL), API-Key (--api-key, --token / SHARPMAIL_API_KEY, SHARPMAIL_TOKEN), Basic-Auth (-u/-p), Maschinen-JSON (--json), Labor-TLS (--insecure / -k), Farben (--no-color / NO_COLOR) und HTTP-Trace (--debug / SHARPMAIL_DEBUG=1). | URL: http://localhost |
In Skripten immer SHARPMAIL_URL + SHARPMAIL_API_KEY und --json setzen; --insecure (-k) ausschließlich in lokalen Testumgebungen mit selbstsigniertem Zertifikat nutzen. |
describe [Type] (Schema & Offline-Cache) |
Listet alle 12 Server-Objekttypen oder sämtliche Felder, Typen und Varianten eines bestimmten Typs auf und cached das Schema automatisch lokal. | Lokaler XDG/AppData-Cache |
Vor dem Schreiben neuer Skripte sharpmail-cli describe <Type> ausführen (z. B. sharpmail-cli describe TransactionalSend); Rollenminimum: ComplianceAuditor. |
get <Type> [IdOrName] [--json] |
Liest ein einzelnes Objekt anhand von Domainname, E-Mail-Adresse, Slug oder GUID bzw. eine globale Singleton-Policy ('singleton' wird automatisch ergänzt). | Kartenansicht / 1-Zeilen-JSON |
Für Singletons genügt die Kurzform sharpmail-cli get SpamGuard oder sharpmail-cli get ReputationShield --json. |
query <Type> (Alias: list) |
Durchsucht Sammlungen mit Komma-UND-Filtern (--filter k=v,k2=v2), Spaltenauswahl (--fields a,b,c) und Begrenzung (--limit N). Mit --json wird echtes NDJSON gestreamt. | Tabelle / NDJSON-Stream |
Perfekt für Audits: sharpmail-cli query Account --json | jq -r 'select(.twoFactorEnabled==false) | .email' findet sofort alle Konten ohne 2FA. |
create <Type[/Variant]> & update <Type> (Alias: patch) |
Erstellt neue Objekte oder ändert einzelne Felder bestehender Objekte/Singletons ohne Überschreiben unveränderter Werte (0 ms Cluster-Hot-Reload). | --set k=v · @file.json · stdin |
Einfache Werte per --set key=value übergeben (Arrays kommagetrennt, z. B. allowedCidrs=10.0.0.0/8,172.16.0.0/12); verschachtelte Policies per --data @policy.json oder Pipe (--data -). |
delete <Type> <IdOrName> (Alias: rm) |
Deaktiviert Domains/Postfächer revisionssicher (Soft-Delete), entfernt sekundäre Aliase oder SMTP-Routen und widerruft Scoped API-Keys sofort. | Schutz vor Selbstlöschung |
Der aktuell zur Authentifizierung genutzte API-Key oder Admin-Account kann sich nicht versehentlich selbst löschen (HTTP 400 Schutz). |
dns <Domain> [--live] [--bind] [-o Datei] |
Prüft MX, SPF, Dual-DKIM (RSA-2048 + Ed25519), DMARC, MTA-STS, DANE TLSA und BIMI live gegen das öffentliche DNS oder exportiert eine RFC-1035-BIND-Zonendatei. | Advisor-Tabelle / BIND-Zone |
Nach dem Anlegen einer neuen Domain direkt sharpmail-cli dns firma.de --bind -o firma.de.zone ausführen und in Cloudflare, Hetzner DNS oder BIND importieren. |
snapshot & apply --dry-run (GitOps IaC) |
snapshot exportiert den gesamten Server- oder Mandantenzustand als geordneten NDJSON-Plan; apply spielt Pläne inkl. Kommentaren (# / //) idempotent ein. | Atomarer Zeilen-Bericht |
In CI/CD immer zuerst sharpmail-cli apply -f plan.ndjson --dry-run prüfen (liefert Exit-Code 1 bei Validierungsfehlern auf einzelnen Zeilen, bevor etwas geändert wird). |
Sammlungen: Tenant, Domain, Account, Alias |
Verwaltet Mandanten (ServerAdmin), Domains inkl. automatischer Dual-DKIM-Schlüsselerzeugung, Postfächer (Account/User), Verteilerlisten (Account/List) und Aliase (inkl. isMasked). | Rolle: TenantAdmin+ |
Bei create Domain --set dkimSigningMode=Dual erzeugt der Server beide Schlüsselpaare (RSA-2048 + Ed25519) sofort automatisch im Hintergrund. |
Sammlungen: ApiKey & Route (OutboundRoute) |
ApiKey erstellt rollen- und CIDR-beschränkte smk_-Token (unveränderbar; Rotation durch Neuanlage + delete). Route steuert ausgehende Domain-Routen und TLS-Ausnahmen. | ApiKey: TenantAdmin+ · Route: ServerAdmin |
Meldet ein Partner-MX RemoteCertificateNameMismatch auf Port 25, genügt: sharpmail-cli create Route --set domain=partner.de --set tlsMode=StartTlsIgnoreCert (targetHost leer = Auto DNS-MX). |
Singletons: TransactionalSend & ReputationShield |
Steuert IP-/Domain-Warming, Kategorien und Empfänger-Anbieter-Limits (TransactionalSend) sowie Suppression-Listen, ARF, One-Click-Unsubscribe und Circuit-Breaker (ReputationShield). | Presets per 1 Befehl |
Schnellstart per Preset: sharpmail-cli update TransactionalSend --set preset=warming_28d und sharpmail-cli update ReputationShield --set preset=recommended. |
Singletons: SpamGuard, SmtpQueue, TransportRules & Server |
Konfiguriert Spam-Schwellen & ClamAV (SpamGuard), Queue-Worker, Smart-Host & TLS-Policy (SmtpQueue), Pflicht-Signaturen & Fail2Ban (TransportRules) sowie ServerHostName (Server). | Rolle: ServerAdmin |
Hostname-Wechsel ohne Neustart: sharpmail-cli update Server --set serverHostName=mail.firma.de aktualisiert EHLO, Banner und Autodiscover sofort. |