#pApiAuth
Vollständige API- & CLI-Feld-Referenz: Alle 12 Objekttypen, REST-Endpunkte & POST /api/v1/send
Dieses Nachschlagewerk dokumentiert jedes einzelne JSON-Feld, jeden Datentyp, alle Enum-Werte, Standardwerte und Mindest-Rollen (RBAC) für sämtliche 12 Management-Objekte (/api/admin/cli/objects/{type} & sharpmail-cli) sowie für den transaktionalen E-Mail-Versand (POST /api/v1/send). Nutze das Filterfeld rechts über der Tabelle, um in Echtzeit nach Feldnamen wie dkimSigningMode, tlsMode, allowedCidrs oder warmingEnabled zu suchen.
Live-Introspektion direkt im Terminal oder per HTTP: Jeder SharpMailserver stellt dieses komplette Schema zusätzlich maschinenlesbar unter GET /api/admin/cli/schema (inkl. SHA-256-Versionsheader X-SharpMail-Schema-Version) bereit. Im Terminal zeigt dir sharpmail-cli describe <Type> (z. B. sharpmail-cli describe Domain oder sharpmail-cli describe SmtpQueue) jederzeit alle Felder offline-gecached an.
TransactionalSendRequest (POST /api/v1/send)
13
Tenant
11
Domain
19
Account (Account/User & Account/List)
18
Alias
7
ApiKey
11
Route
10
TransactionalSend (Singleton)
11
ReputationShield (Singleton)
20
SpamGuard (Singleton)
15
SmtpQueue (Singleton)
19
TransportRules & Server (Singletons)
11
TransactionalSendRequest (POST /api/v1/send)
Schlüssel: Idempotency-Key
RBAC: User+
Hochperformanter HTTP-JSON-Versandendpunkt für Shops, ERP, CRM und 2FA-Codes mit Kategorie-Priorisierung, IP-Warming, Suppression-Vorprüfung und 24h-Idempotenz.
/api/v1/send
Sendet E-Mail (UTF-8 Multipart/Alternative + Anhänge) über die Outbound-Pipeline
/api/v1/unsubscribe/{token}
Öffentlicher RFC-8058 One-Click-Unsubscribe-Endpunkt (DKIM-signierter Token)
from
string
OPTIONAL
Key senderAddress
to
string[]
PFLICHTFELD
cc
string[]
OPTIONAL
[]
bcc
string[]
OPTIONAL
[]
replyTo
string
OPTIONAL
subject
string
PFLICHTFELD
textBody
string
OPTIONAL
htmlBody
string
OPTIONAL
category
string
OPTIONAL
transactional
"critical""transactional""notification""marketing"overflowMode
string
OPTIONAL
DeferQueue
"DeferQueue""Reject429"idempotencyKey
string
OPTIONAL
Header Idempotency-Key
headers
Record<string, string>
OPTIONAL
{}
attachments
SendAttachmentDto[]
OPTIONAL
[]
{
"from": "Abrechnung <rechnung@firma.de>",
"to": ["einkauf@kunde.de"],
"cc": ["buchhaltung@firma.de"],
"subject": "Ihre elektronische Rechnung RE-2026-90412",
"category": "transactional",
"overflowMode": "DeferQueue",
"textBody": "Guten Tag,\nanbei erhalten Sie Ihre Rechnung RE-2026-90412.",
"htmlBody": "<p>Guten Tag,</p><p>anbei erhalten Sie Ihre Rechnung <strong>RE-2026-90412</strong>.</p>",
"headers": {
"X-ERP-Document-Id": "RE-2026-90412"
},
"attachments": [
{
"fileName": "RE-2026-90412.pdf",
"contentType": "application/pdf",
"base64Content": "JVBERi0xLjcKJcfs..."
}
]
}
# 1) Kleinstprivilegierten Sende-Key (Role=User) für rechnung@firma.de erstellen:
sharpmail-cli create ApiKey \
--set label="ERP Rechnungsversand" \
--set role=User \
--set senderAddress=rechnung@firma.de \
--set defaultCategory=transactional \
--set allowedCidrs=10.20.0.0/16
# 2) Risikofreier Trockentest gegen die integrierte Sandbox-Sink-Domain:
# ok@sink.sharpmail.local | bounce@sink.sharpmail.local | defer@sink.sharpmail.local
curl -fsS -X POST "https://mail.firma.de/api/v1/send" \
-H "Authorization: Bearer smk_01968f2a_..." \
-H "Idempotency-Key: inv-2026-90412" \
-H "Content-Type: application/json" \
-d '{
"from": "rechnung@firma.de",
"to": ["einkauf@kunde.de"],
"subject": "Ihre Rechnung RE-2026-90412",
"category": "transactional",
"textBody": "Guten Tag, anbei Ihre Rechnung RE-2026-90412.",
"htmlBody": "<p>Guten Tag, anbei Ihre Rechnung <b>RE-2026-90412</b>.</p>"
}'
using System.Net.Http.Headers;
using System.Net.Http.Json;
using var http = new HttpClient { BaseAddress = new Uri("https://mail.firma.de") };
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "smk_01968f2a_...");
http.DefaultRequestHeaders.Add("Idempotency-Key", "inv-2026-90412");
var response = await http.PostAsJsonAsync("/api/v1/send", new
{
from = "rechnung@firma.de",
to = new[] { "einkauf@kunde.de" },
subject = "Ihre Rechnung RE-2026-90412",
category = "transactional",
textBody = "Guten Tag, anbei Ihre Rechnung RE-2026-90412.",
htmlBody = "<p>Guten Tag, anbei Ihre Rechnung <strong>RE-2026-90412</strong>.</p>"
});
response.EnsureSuccessStatusCode();
Tenant
Schlüssel: slug
RBAC: ServerAdmin+
Mandanten-Organisationseinheit mit isolierten Kontingenten für Domains, Postfächer, Speicherplatz (GiB) und Standard-GoBD-WORM-Aufbewahrung.
/api/admin/cli/objects/Tenant
Listet alle Mandanten
/api/admin/cli/objects/Tenant/{slugOrId}
Liest einen Mandanten per Slug oder UUID
/api/admin/cli/objects/Tenant
Erstellt einen neuen Mandanten
/api/admin/cli/objects/Tenant/{slugOrId}
Aktualisiert Mandanten-Limits im laufenden Betrieb
id
guid
READ-ONLY
UUIDv7
slug
string
PRIMÄRSCHLÜSSEL
name
string
PFLICHTFELD
isActive
boolean
OPTIONAL
true
maxDomains
integer
OPTIONAL
100
maxPrincipals
integer
OPTIONAL
10000
quotaGb
integer
OPTIONAL
100
outboundDailyLimit
integer
OPTIONAL
25000
defaultLockMode
string
OPTIONAL
Normal
"Normal""Governance""Compliance""LegalHold"defaultRetentionDays
integer
OPTIONAL
0
createdAtUtc
datetime
READ-ONLY
{
"slug": "acme",
"name": "ACME Logistik GmbH",
"isActive": true,
"maxDomains": 50,
"maxPrincipals": 2500,
"quotaGb": 250,
"outboundDailyLimit": 25000,
"defaultLockMode": "Compliance",
"defaultRetentionDays": 3650
}
# Mandant anlegen:
sharpmail-cli create Tenant \
--set slug=acme \
--set name="ACME Logistik GmbH" \
--set quotaGb=250 \
--set defaultLockMode=Compliance \
--set defaultRetentionDays=3650
# Mandant abfragen & Kontingent erhöhen:
sharpmail-cli get Tenant acme
sharpmail-cli update Tenant acme --set quotaGb=500
curl -fsS -X POST "https://mail.firma.de/api/admin/cli/objects/Tenant" \
-H "Authorization: Bearer smk_..." \
-H "Content-Type: application/json" \
-d '{"slug":"acme","name":"ACME Logistik GmbH","quotaGb":250,"defaultLockMode":"Compliance","defaultRetentionDays":3650}'
var payload = new
{
slug = "acme",
name = "ACME Logistik GmbH",
quotaGb = 250,
defaultLockMode = "Compliance",
defaultRetentionDays = 3650
};
using var res = await http.PostAsJsonAsync("/api/admin/cli/objects/Tenant", payload);
Domain
Schlüssel: name
RBAC: TenantAdmin+
E-Mail-Domain inklusive automatischer Dual-DKIM-Schlüsselgenerierung (RSA-2048 + Ed25519), GoBD-WORM-Policy, Plus-Adressierung und Versandlimits.
/api/admin/cli/objects/Domain
Listet alle Domains des Mandanten
/api/admin/cli/objects/Domain/{name}
Liest Domain-Konfiguration & DKIM-Selektoren
/api/admin/cli/objects/Domain
Erstellt Domain & generiert RSA-2048 + Ed25519 DKIM-Schlüssel
/api/admin/cli/objects/Domain/{name}
Aktualisiert DKIM-Modus, Quotas oder GoBD-Aufbewahrung (0 ms Hot-Reload)
/api/admin/cli/dns/{name}?live=true
Prüft MX, SPF, Dual-DKIM, DMARC, MTA-STS & DANE live
id
guid
READ-ONLY
UUIDv7
name
string
PRIMÄRSCHLÜSSEL
tenant
string
OPTIONAL
default
isActive
boolean
OPTIONAL
true
postmasterAddress
string
OPTIONAL
postmaster@<name>
dkimSigningMode
string
OPTIONAL
Dual
"Rsa2048""Ed25519""Dual"dkimRsaSelector
string
OPTIONAL
s2026
dkimRsaDnsName
string
READ-ONLY
s2026._domainkey.<name>
dkimEd25519Selector
string
OPTIONAL
ed2026
dkimEd25519DnsName
string
READ-ONLY
ed2026._domainkey.<name>
retentionLockMode
string
OPTIONAL
Normal
"Normal""Governance""Compliance""LegalHold"retentionDays
integer
OPTIONAL
0
quotaGb
integer
OPTIONAL
50
maxMessageSizeMb
integer
OPTIONAL
50
maxAccounts
integer
OPTIONAL
1000
outboundDailyLimit
integer
OPTIONAL
5000
outboundHourlyLimit
integer
OPTIONAL
1000
usePlusAddressing
boolean
OPTIONAL
true
createdAtUtc
datetime
READ-ONLY
{
"name": "muster-logistik.de",
"tenant": "default",
"isActive": true,
"postmasterAddress": "postmaster@muster-logistik.de",
"dkimSigningMode": "Dual",
"dkimRsaSelector": "s2026",
"dkimEd25519Selector": "ed2026",
"retentionLockMode": "Compliance",
"retentionDays": 3650,
"quotaGb": 100,
"maxMessageSizeMb": 50,
"maxAccounts": 500,
"outboundDailyLimit": 10000,
"outboundHourlyLimit": 2000,
"usePlusAddressing": true
}
# Domain mit Dual-DKIM und 10 Jahren GoBD-Compliance anlegen:
sharpmail-cli create Domain \
--set name=muster-logistik.de \
--set dkimSigningMode=Dual \
--set retentionLockMode=Compliance \
--set retentionDays=3650
# Fertige RFC-1035 BIND-Zonendatei exportieren & DNS live prüfen:
sharpmail-cli dns muster-logistik.de --bind > muster-logistik.de.zone
sharpmail-cli dns muster-logistik.de --live
curl -fsS -X PATCH "https://mail.firma.de/api/admin/cli/objects/Domain/muster-logistik.de" \
-H "Authorization: Bearer smk_..." \
-H "Content-Type: application/json" \
-d '{"dkimSigningMode":"Dual","retentionLockMode":"Compliance","retentionDays":3650}'
using var res = await http.PatchAsJsonAsync(
"/api/admin/cli/objects/Domain/muster-logistik.de",
new { dkimSigningMode = "Dual", quotaGb = 200 });
res.EnsureSuccessStatusCode();
Account (Account/User & Account/List)
Schlüssel: email
RBAC: TenantAdmin+
Repräsentiert ein Benutzerpostfach (@type="User", inkl. IMAP/JMAP/CalDAV/CardDAV/ActiveSync) oder eine Verteilerliste (@type="List" mit members[]).
/api/admin/cli/objects/Account?filter=role=TenantAdmin
Listet/filtert Konten und Verteilerlisten
/api/admin/cli/objects/Account/User
Erstellt ein neues Benutzerpostfach inkl. Standard-IMAP-Ordnern
/api/admin/cli/objects/Account/List
Erstellt eine neue Verteilerliste mit members[]
/api/admin/cli/objects/Account/{email}
Aktualisiert Quota, Weiterleitung, Abwesenheit oder Passwort
/api/admin/cli/objects/Account/{email}
Deaktiviert/Soft-Deleted ein Konto revisionssicher
id
guid
READ-ONLY
UUIDv7
@type
string
OPTIONAL
User
"User""List"email
string
PRIMÄRSCHLÜSSEL
displayName
string
OPTIONAL
Lokalteil
password
string
WRITE-ONLY (SECRET)
role
string
OPTIONAL
User
"User""ComplianceAuditor""TenantAdmin""ServerAdmin"isActive
boolean
OPTIONAL
true
quotaMb
integer
OPTIONAL
5120
usedBytes
long
READ-ONLY
0
outboundDailyLimit
integer
OPTIONAL
500
forwardAddress
string
OPTIONAL
forwardKeepOriginal
boolean
OPTIONAL
true
vacationEnabled
boolean
OPTIONAL
false
vacationSubject
string
OPTIONAL
vacationBody
string
WRITE-ONLY (SECRET)
twoFactorEnabled
boolean
READ-ONLY
false
members
string[]
OPTIONAL
[]
createdAtUtc
datetime
READ-ONLY
{
"@type": "User",
"email": "anna.weber@muster-logistik.de",
"displayName": "Anna Weber (IT-Leitung)",
"password": "SicheresStartPasswort!2026",
"role": "TenantAdmin",
"isActive": true,
"quotaMb": 15360,
"outboundDailyLimit": 1000,
"forwardAddress": null,
"forwardKeepOriginal": true,
"vacationEnabled": false,
"vacationSubject": "Abwesenheitsnotiz: Anna Weber",
"vacationBody": "Ich bin ab Montag wieder erreichbar."
}
# Benutzerpostfach (15 GiB Quota) anlegen:
sharpmail-cli create Account/User \
--set email=anna.weber@muster-logistik.de \
--set displayName="Anna Weber" \
--set password="SicheresStartPasswort!2026" \
--set quotaMb=15360
# Verteilerliste anlegen:
sharpmail-cli create Account/List \
--set email=team@muster-logistik.de \
--set displayName="Disposition & Einkauf" \
--set members=anna.weber@muster-logistik.de,dispo@muster-logistik.de
curl -fsS -X POST "https://mail.firma.de/api/admin/cli/objects/Account/User" \
-H "Authorization: Bearer smk_..." \
-H "Content-Type: application/json" \
-d '{"email":"anna.weber@muster-logistik.de","displayName":"Anna Weber","password":"SicheresStartPasswort!2026","quotaMb":15360}'
await http.PostAsJsonAsync("/api/admin/cli/objects/Account/User", new
{
email = "anna.weber@muster-logistik.de",
displayName = "Anna Weber",
password = "SicheresStartPasswort!2026",
quotaMb = 15360
});
Alias
Schlüssel: address
RBAC: TenantAdmin+
Zusätzliche E-Mail-Alias-Adresse oder Datenschutz-Masked-Email-Alias, der auf ein primäres Account-Postfach oder eine Liste zeigt.
/api/admin/cli/objects/Alias
Listet alle Aliase und Masked-Emails
/api/admin/cli/objects/Alias
Legt einen neuen Alias für ein Ziel-Postfach an
/api/admin/cli/objects/Alias/{address}
Pausiert/aktiviert einen Alias oder ändert das Ziel-Postfach
/api/admin/cli/objects/Alias/{address}
Löscht den Alias
address
string
PRIMÄRSCHLÜSSEL
target
string
PFLICHTFELD
principalId
guid
READ-ONLY
description
string
OPTIONAL
""
isMasked
boolean
OPTIONAL
false
isEnabled
boolean
OPTIONAL
true
createdAtUtc
datetime
READ-ONLY
{
"address": "shop-8f2k@muster-logistik.de",
"target": "anna.weber@muster-logistik.de",
"description": "Fachbuchhandlung / Online-Bestellung",
"isMasked": true,
"isEnabled": true
}
# Masked-Email-Alias anlegen:
sharpmail-cli create Alias \
--set address=shop-8f2k@muster-logistik.de \
--set target=anna.weber@muster-logistik.de \
--set description="Fachbuchhandlung" \
--set isMasked=true
# Alias bei Spam-Aufkommen mit 1 Befehl stummschalten:
sharpmail-cli update Alias shop-8f2k@muster-logistik.de --set isEnabled=false
curl -fsS -X POST "https://mail.firma.de/api/admin/cli/objects/Alias" \
-H "Authorization: Bearer smk_..." \
-H "Content-Type: application/json" \
-d '{"address":"vertrieb@muster-logistik.de","target":"anna.weber@muster-logistik.de","description":"Vertrieb & Angebote"}'
await http.PostAsJsonAsync("/api/admin/cli/objects/Alias", new
{
address = "vertrieb@muster-logistik.de",
target = "anna.weber@muster-logistik.de",
description = "Vertrieb & Angebote",
isEnabled = true
});
ApiKey
Schlüssel: id
RBAC: TenantAdmin+
Unveränderbarer (immutable), rollen- und CIDR-beschränkter Scoped API-Schlüssel (smk_<id>_<secret>) für /api/v1/send, SCIM 2.0 oder sharpmail-cli.
/api/admin/cli/objects/ApiKey
Listet alle aktiven API-Keys (ohne geheimes Token)
/api/admin/cli/objects/ApiKey
Erstellt neuen API-Key und gibt apiKey (smk_...) einmalig zurück
/api/admin/cli/objects/ApiKey/{id}
Widerruft den API-Key sofort
id
guid
READ-ONLY
UUIDv7
apiKey
string
CREATE-ONLY
smk_<id>_<secret>
label
string
PFLICHTFELD
role
string
OPTIONAL
TenantAdmin
"User""ComplianceAuditor""TenantAdmin""ServerAdmin"senderAddress
string
OPTIONAL
defaultCategory
string
OPTIONAL
transactional
"critical""transactional""notification""marketing"allowedCidrs
string[]
OPTIONAL
[] (Alle IPs)
expiresInDays
integer
WRITE-ONLY (SECRET)
null (Kein Ablauf)
expiresAtUtc
datetime
READ-ONLY
outboundDailyLimit
integer
OPTIONAL
10000
isActive
boolean
READ-ONLY
true
{
"label": "Shopware 6 ERP Rechnungsversand",
"role": "User",
"senderAddress": "rechnung@muster-logistik.de",
"defaultCategory": "transactional",
"allowedCidrs": ["10.20.10.15/32", "2a01:4f8:120:44aa::/64"],
"expiresInDays": 180,
"outboundDailyLimit": 10000
}
# CIDR-geschützten Key für Ansible / sharpmail-cli erstellen:
sharpmail-cli create ApiKey \
--set label="GitLab CI / Ansible" \
--set role=TenantAdmin \
--set allowedCidrs=10.20.0.0/16 \
--set expiresInDays=90
# Schlüssel widerrufen:
sharpmail-cli delete ApiKey 0195f2a0-8b14-7000-9a10-001122334455
curl -fsS -X POST "https://mail.firma.de/api/admin/cli/objects/ApiKey" \
-H "Authorization: Bearer smk_..." \
-H "Content-Type: application/json" \
-d '{"label":"Shopware 6","role":"User","senderAddress":"rechnung@muster-logistik.de","allowedCidrs":["10.20.10.15/32"],"expiresInDays":180}'
var res = await http.PostAsJsonAsync("/api/admin/cli/objects/ApiKey", new
{
label = "Shopware 6",
role = "User",
senderAddress = "rechnung@muster-logistik.de",
allowedCidrs = new[] { "10.20.10.15/32" },
expiresInDays = 180
});
var created = await res.Content.ReadFromJsonAsync<JsonElement>();
string oneTimeSecretKey = created.GetProperty("apiKey").GetString()!;
Route
Schlüssel: domain
RBAC: ServerAdmin+
Domänenspezifische ausgehende SMTP-Route oder TLS-Zertifikatsausnahme (z. B. StartTlsIgnoreCert bei Partner-MX mit Zertifikats-Mismatch oder dedizierter Relay-Connector).
/api/admin/cli/objects/Route
Listet alle ausgehenden Sonderrouten
/api/admin/cli/objects/Route
Legt eine neue Domain-Route oder TLS-Ausnahme an
/api/admin/cli/objects/Route/{domain}
Aktualisiert Ziel-Host, Port oder TLS-Modus
/api/admin/cli/objects/Route/{domain}
Entfernt die Sonderroute
domain
string
PRIMÄRSCHLÜSSEL
targetHost
string
OPTIONAL
"" (Auto DNS-MX)
targetPort
integer
OPTIONAL
25
tlsMode
string
OPTIONAL
StartTlsOptional
"StartTlsOptional""StartTlsRequired""StartTlsIgnoreCert""ImplicitTls""ImplicitTlsIgnoreCert""None"username
string
OPTIONAL
password
string
WRITE-ONLY (SECRET)
hasPassword
boolean
READ-ONLY
false
clearPassword
boolean
WRITE-ONLY (SECRET)
false
description
string
OPTIONAL
enabled
boolean
OPTIONAL
true
{
"domain": "neff.me",
"targetHost": "",
"targetPort": 25,
"tlsMode": "StartTlsIgnoreCert",
"username": null,
"description": "Shared-Hosting-MX mit abweichendem Zertifikatsnamen (Auto DNS-MX)",
"enabled": true
}
# Partner-Domain mit fehlerhaftem MX-Zertifikat per Auto-DNS-MX freigeben:
sharpmail-cli create Route \
--set domain=neff.me \
--set tlsMode=StartTlsIgnoreCert \
--set description="TLS NameMismatch auf Partner-MX erlauben"
# Internes ERP-Subnetz an lokalen Connector routen:
sharpmail-cli create Route \
--set domain=erp.firma.intern \
--set targetHost=10.40.2.15 \
--set targetPort=25
curl -fsS -X POST "https://mail.firma.de/api/admin/cli/objects/Route" \
-H "Authorization: Bearer smk_..." \
-H "Content-Type: application/json" \
-d '{"domain":"neff.me","targetHost":"","targetPort":25,"tlsMode":"StartTlsIgnoreCert","enabled":true}'
await http.PostAsJsonAsync("/api/admin/cli/objects/Route", new
{
domain = "neff.me",
targetHost = "",
targetPort = 25,
tlsMode = "StartTlsIgnoreCert",
enabled = true
});
TransactionalSend (Singleton)
Schlüssel: singleton
RBAC: TenantAdmin+
Steuert progressives 28-Tage-IP-Warming, E-Mail-Kategorien (critical, transactional, notification, marketing) und getrennte Stunden-/Tageslimits pro Empfänger-Provider (Google, Microsoft, Yahoo/AOL, T-Online/GMX/WEB.DE, iCloud, *).
/api/admin/cli/objects/TransactionalSend/singleton
Liest aktive IP-Warming- & Provider-Quota-Policy
/api/admin/cli/objects/TransactionalSend/singleton
Aktualisiert Warming-Tag, Preset oder Provider-Quotas
enabled
boolean
OPTIONAL
true
warmingEnabled
boolean
OPTIONAL
false
startAtWarmingDay
integer
WRITE-ONLY (SECRET)
1
currentWarmingDay
integer
READ-ONLY
currentWarmingPercent
integer
READ-ONLY
warmingDailyRampPercents
integer[]
OPTIONAL
[5,7,10,...,100]
maxDeferHours
integer
OPTIONAL
48
defaultCategory
string
OPTIONAL
transactional
"critical""transactional""notification""marketing"preset
string
WRITE-ONLY (SECRET)
"warming_28d""warming_14d""production_100"categories
CategoryPolicy[]
OPTIONAL
4 Kategorien
providers
ProviderQuota[]
OPTIONAL
6 Provider-Gruppen
{
"enabled": true,
"warmingEnabled": true,
"startAtWarmingDay": 1,
"maxDeferHours": 48,
"defaultCategory": "transactional",
"preset": "warming_28d"
}
# 28-Tage IP-Warming aktivieren:
sharpmail-cli update TransactionalSend --set preset=warming_28d
# Direkt auf Warming-Tag 14 vorspringen:
sharpmail-cli update TransactionalSend --set startAtWarmingDay=14
curl -fsS -X PATCH "https://mail.firma.de/api/admin/cli/objects/TransactionalSend/singleton" \
-H "Authorization: Bearer smk_..." \
-H "Content-Type: application/json" \
-d '{"preset":"warming_28d","enabled":true}'
await http.PatchAsJsonAsync(
"/api/admin/cli/objects/TransactionalSend/singleton",
new { preset = "warming_28d", enabled = true });
ReputationShield (Singleton)
Schlüssel: singleton
RBAC: TenantAdmin+
Optionaler Outbound-Reputationsschutz: Automatische Bounce-/Complaint-Suppression-Liste, RFC 8058 One-Click-Unsubscribe, Bounce-Circuit-Breaker, adaptives 421-ISP-Backoff und HMAC-SHA256-Webhooks.
/api/admin/cli/objects/ReputationShield/singleton
Liest aktuelle Reputation-Shield-Konfiguration
/api/admin/cli/objects/ReputationShield/singleton
Aktualisiert Schutzmodule oder lädt ein Preset (off | recommended | strict_bulk)
preset
string
WRITE-ONLY (SECRET)
"off""recommended""strict_bulk"enableSuppressionPreCheck
boolean
OPTIONAL
false
enforceSuppressionOnSmtpRelay
boolean
OPTIONAL
false
allSuppressedBehavior
string
OPTIONAL
reject_422
"reject_422""accept_noop"autoSuppressHardBounces
boolean
OPTIONAL
false
hardBounceSuppressionDays
integer
OPTIONAL
180
autoSuppressConsecutiveSoftBounces
boolean
OPTIONAL
false
softBounceEscalationThreshold
integer
OPTIONAL
5
autoSuppressFblComplaints
boolean
OPTIONAL
false
enableOneClickUnsubscribe
boolean
OPTIONAL
false
oneClickUnsubscribeCategories
string[]
OPTIONAL
["marketing","notification"]
enableBounceCircuitBreaker
boolean
OPTIONAL
false
maxHardBouncePercent
number
OPTIONAL
5.0
maxComplaintPercent
number
OPTIONAL
0.1
allowCriticalWhenTripped
boolean
OPTIONAL
true
enableAdaptiveIspBackoff
boolean
OPTIONAL
false
ispCooldownMinutes
integer
OPTIONAL
15
webhookEnabled
boolean
OPTIONAL
false
webhookUrl
string
OPTIONAL
webhookSecret
string
WRITE-ONLY (SECRET)
{
"preset": "recommended",
"enableSuppressionPreCheck": true,
"autoSuppressHardBounces": true,
"hardBounceSuppressionDays": 180,
"enableOneClickUnsubscribe": true,
"oneClickUnsubscribeCategories": ["marketing", "notification"],
"enableBounceCircuitBreaker": true,
"maxHardBouncePercent": 5.0,
"maxComplaintPercent": 0.1,
"allowCriticalWhenTripped": true,
"enableAdaptiveIspBackoff": true,
"webhookEnabled": true,
"webhookUrl": "https://erp.firma.de/webhooks/sharpmail"
}
# Empfohlenen Reputationsschutz aktivieren:
sharpmail-cli update ReputationShield --set preset=recommended
# Webhook-Ziel konfigurieren:
sharpmail-cli update ReputationShield \
--set webhookEnabled=true \
--set webhookUrl=https://erp.firma.de/webhooks/sharpmail \
--set webhookSecret=whsec_9f8e7d6c5b4a
curl -fsS -X PATCH "https://mail.firma.de/api/admin/cli/objects/ReputationShield/singleton" \
-H "Authorization: Bearer smk_..." \
-H "Content-Type: application/json" \
-d '{"preset":"recommended"}'
await http.PatchAsJsonAsync(
"/api/admin/cli/objects/ReputationShield/singleton",
new { preset = "recommended" });
SpamGuard (Singleton)
Schlüssel: singleton
RBAC: ServerAdmin+
Mehrstufige Inbound-Abwehr: SPF/DKIM/DMARC/ARC-Prüfung, Smart Greylisting (/24 IPv4 & /64 IPv6), Online-ML-Klassifikator (FTRL-Proximal), DNSBL-Zonen, Allow-/Blocklisten und nativer ClamAV-TCP-Scan.
/api/admin/cli/objects/SpamGuard/singleton
Liest aktuelle SpamGuard-Schwellenwerte & Trainingszähler
/api/admin/cli/objects/SpamGuard/singleton
Aktualisiert Scores, DNSBLs, Allowlists oder ClamAV im laufenden Betrieb
enableEmailAuthChecks
boolean
OPTIONAL
true
enableGreylisting
boolean
OPTIONAL
true
greylistRetryDelaySeconds
integer
OPTIONAL
240
junkScoreThreshold
number
OPTIONAL
4.5
rejectScoreThreshold
number
OPTIONAL
9.0
tagSubjectOnJunk
boolean
OPTIONAL
false
subjectTagPrefix
string
OPTIONAL
"[SPAM] "
enableStructuralHeuristics
boolean
OPTIONAL
true
dnsblZones
string[]
OPTIONAL
["bl.spamcop.net","ix.dnsbl.manitu.net"]
dnsblHitScore
number
OPTIONAL
3.5
allowedSendersOrDomains
string[]
OPTIONAL
[]
blockedSendersOrDomains
string[]
OPTIONAL
[]
clamAvEnabled
boolean
OPTIONAL
false
clamAvHost
string
OPTIONAL
"127.0.0.1"
clamAvPort
integer
OPTIONAL
3310
{
"enableEmailAuthChecks": true,
"enableGreylisting": true,
"greylistRetryDelaySeconds": 240,
"junkScoreThreshold": 4.5,
"rejectScoreThreshold": 9.0,
"enableStructuralHeuristics": true,
"dnsblZones": ["bl.spamcop.net", "ix.dnsbl.manitu.net"],
"dnsblHitScore": 3.5,
"allowedSendersOrDomains": ["datev.de", "partner-spedition.de"],
"blockedSendersOrDomains": [],
"clamAvEnabled": false,
"clamAvHost": "127.0.0.1",
"clamAvPort": 3310
}
# Partner-Domains auf die Allowlist setzen:
sharpmail-cli update SpamGuard \
--set allowedSendersOrDomains=datev.de,partner-spedition.de
# Schwellenwerte anpassen:
sharpmail-cli update SpamGuard --set junkScoreThreshold=4.5 --set rejectScoreThreshold=9.0
curl -fsS -X PATCH "https://mail.firma.de/api/admin/cli/objects/SpamGuard/singleton" \
-H "Authorization: Bearer smk_..." \
-H "Content-Type: application/json" \
-d '{"junkScoreThreshold":4.5,"rejectScoreThreshold":9.0,"allowedSendersOrDomains":["datev.de"]}'
await http.PatchAsJsonAsync(
"/api/admin/cli/objects/SpamGuard/singleton",
new { junkScoreThreshold = 4.5, rejectScoreThreshold = 9.0 });
SmtpQueue (Singleton)
Schlüssel: singleton
RBAC: ServerAdmin+
Steuert die ausgehende MX-Zustell-Queue, Worker-Parallelität, Retry-Intervalle, ISP-Throttling, ausgehende TLS-Zertifikatsprüfung, globalen Smart-Host und eingehende ESMTP-Schutzlimits.
/api/admin/cli/objects/SmtpQueue/singleton
Liest alle Queue-, TLS- und ESMTP-Parameter
/api/admin/cli/objects/SmtpQueue/singleton
Aktualisiert Queue-Worker, Retry-Zeiten oder ESMTP-Limits sofort
outboundQueuePaused
boolean
OPTIONAL
false
outboundWorkerConcurrency
integer
OPTIONAL
8
maxDeliveryAttempts
integer
OPTIONAL
10
retryScheduleMinutes
integer[]
OPTIONAL
[5,15,60,240,720]
maxConcurrentConnectionsPerMxDomain
integer
OPTIONAL
4
strictThrottleDomains
string[]
OPTIONAL
["t-online.de","gmx.de","web.de","yahoo.com"]
strictThrottleMaxConcurrency
integer
OPTIONAL
2
outboundConnectTimeoutSeconds
integer
OPTIONAL
30
outboundBindAddress
string
OPTIONAL
"" (Auto)
outboundUseStartTls
boolean
OPTIONAL
true
requireOutboundTls
boolean
OPTIONAL
false
outboundTlsCertValidation
string
OPTIONAL
Opportunistic
"Opportunistic""IgnoreErrors""Strict"outboundSmartHost
string
OPTIONAL
""
outboundSmartPort
integer
OPTIONAL
587
maxMessageSizeMb
long
OPTIONAL
50
maxRecipientsPerTransaction
integer
OPTIONAL
100
maxConnectionsPerIp
integer
OPTIONAL
20
tarpitDelayMs
integer
OPTIONAL
1500
requireTlsForAuth
boolean
OPTIONAL
true
{
"outboundQueuePaused": false,
"outboundWorkerConcurrency": 8,
"maxDeliveryAttempts": 10,
"retryScheduleMinutes": [5, 15, 60, 240, 720],
"maxConcurrentConnectionsPerMxDomain": 4,
"strictThrottleDomains": ["t-online.de", "gmx.de", "web.de", "yahoo.com"],
"strictThrottleMaxConcurrency": 2,
"outboundUseStartTls": true,
"requireOutboundTls": false,
"outboundTlsCertValidation": "Opportunistic",
"maxMessageSizeMb": 50,
"maxRecipientsPerTransaction": 100,
"tarpitDelayMs": 1500,
"requireTlsForAuth": true
}
# Outbound-TLS auf Opportunistic (RFC 7435) setzen & MaxMessageSize auf 75 MiB erhöhen:
sharpmail-cli update SmtpQueue \
--set outboundTlsCertValidation=Opportunistic \
--set maxMessageSizeMb=75
curl -fsS -X PATCH "https://mail.firma.de/api/admin/cli/objects/SmtpQueue/singleton" \
-H "Authorization: Bearer smk_..." \
-H "Content-Type: application/json" \
-d '{"outboundTlsCertValidation":"Opportunistic","maxMessageSizeMb":75}'
await http.PatchAsJsonAsync(
"/api/admin/cli/objects/SmtpQueue/singleton",
new { outboundTlsCertValidation = "Opportunistic", maxMessageSizeMb = 75 });
TransportRules & Server (Singletons)
Schlüssel: singleton
RBAC: ServerAdmin+
Unternehmensweite Pflicht-Signatur (HGB/GmbHG-Disclaimer vor DKIM-Signatur), globales System-Sieve-Skript, Fail2Ban-Auto-Ban sowie Server-Hostname & Status.
/api/admin/cli/objects/TransportRules/singleton
Liest Pflicht-Signatur, System-Sieve & Auto-Ban
/api/admin/cli/objects/TransportRules/singleton
Aktualisiert Transportregeln sofort
/api/admin/cli/objects/Server/singleton
Liest ServerHostName, Datenbank-Engine, Queue-Stand & Lizenzstatus
/api/admin/cli/objects/Server/singleton
Ändert den kanonischen ServerHostName im laufenden Betrieb
outboundDisclaimerEnabled
boolean
OPTIONAL
false
outboundDisclaimerExternalOnly
boolean
OPTIONAL
true
outboundDisclaimerText
string
OPTIONAL
""
outboundDisclaimerHtml
string
OPTIONAL
""
inboundSystemSieve
string
OPTIONAL
""
autoBanThreshold
integer
OPTIONAL
8
autoBanDurationMinutes
integer
OPTIONAL
30
serverHostName
string
OPTIONAL
mail.<domain>
storageProvider
string
READ-ONLY
Sqlite | SqlServer | Postgres
activeQueueCount
integer
READ-ONLY
0
licenseState
string
READ-ONLY
EnterpriseActive
{
"outboundDisclaimerEnabled": true,
"outboundDisclaimerExternalOnly": true,
"outboundDisclaimerText": "-- \nMuster Logistik GmbH · Industriestraße 18 · 70565 Stuttgart · HRB 774819",
"outboundDisclaimerHtml": "<p style='font-size:11px;color:#64748b'><strong>Muster Logistik GmbH</strong> · 70565 Stuttgart · HRB 774819</p>",
"inboundSystemSieve": "require [\"fileinto\"];\nif header :contains \"X-Spam-Flag\" \"YES\" { fileinto \"Junk\"; }",
"autoBanThreshold": 8,
"autoBanDurationMinutes": 30
}
# Pflicht-Impressum & Auto-Ban aktualisieren:
sharpmail-cli update TransportRules \
--set outboundDisclaimerEnabled=true \
--set autoBanThreshold=8
# Kanonischen Server-Hostnamen abfragen oder setzen:
sharpmail-cli get Server
sharpmail-cli update Server --set serverHostName=mail.muster-logistik.de
curl -fsS -X GET "https://mail.firma.de/api/admin/cli/objects/Server/singleton" \
-H "Authorization: Bearer smk_..."
var status = await http.GetFromJsonAsync<JsonElement>("/api/admin/cli/objects/Server/singleton");
Console.WriteLine($"Host: {status.GetProperty("serverHostName")}, Queue: {status.GetProperty("activeQueueCount")}");