#pApiAuth
Complete API & CLI Field Reference: All 12 Object Types, REST Endpoints & POST /api/v1/send
This reference documents every JSON property, data type, enum value, default setting, and minimum RBAC role across all 12 management objects (/api/admin/cli/objects/{type} & sharpmail-cli) as well as transactional email delivery (POST /api/v1/send). Use the instant filter box above the table to search any property such as dkimSigningMode, tlsMode, allowedCidrs, or warmingEnabled.
Live introspection in your terminal or via HTTP: every SharpMailserver exposes this complete schema in machine-readable JSON at GET /api/admin/cli/schema (with SHA-256 header X-SharpMail-Schema-Version). In your terminal, run sharpmail-cli describe <Type> (e.g. sharpmail-cli describe Domain or sharpmail-cli describe SmtpQueue) at any time.
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)
Key: Idempotency-Key
RBAC: User+
High-throughput HTTP JSON delivery endpoint for web apps, ERPs, CRMs, and 2FA codes with category prioritization, IP warming, suppression pre-check, and 24h idempotency.
/api/v1/send
Enqueues and signs transactional email (UTF-8 Multipart/Alternative + attachments)
/api/v1/unsubscribe/{token}
Public RFC 8058 One-Click-Unsubscribe endpoint (DKIM-signed token)
from
string
OPTIONAL
Key senderAddress
to
string[]
REQUIRED
cc
string[]
OPTIONAL
[]
bcc
string[]
OPTIONAL
[]
replyTo
string
OPTIONAL
subject
string
REQUIRED
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
Key: slug
RBAC: ServerAdmin+
Multi-tenant organization boundary isolating domains, principals, storage quotas (GiB), and default GoBD WORM compliance retention.
/api/admin/cli/objects/Tenant
Lists all tenants
/api/admin/cli/objects/Tenant/{slugOrId}
Gets tenant by slug or UUID
/api/admin/cli/objects/Tenant
Creates a new tenant
/api/admin/cli/objects/Tenant/{slugOrId}
Updates tenant quotas in place
id
guid
READ-ONLY
UUIDv7
slug
string
PRIMARY KEY
name
string
REQUIRED
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
Key: name
RBAC: TenantAdmin+
Hosted mail domain with automatic parallel Dual-DKIM key generation (RSA-2048 + Ed25519), GoBD WORM retention policy, plus-addressing, and rate limits.
/api/admin/cli/objects/Domain
Lists all domains
/api/admin/cli/objects/Domain/{name}
Gets domain configuration & DKIM selectors
/api/admin/cli/objects/Domain
Creates domain & generates RSA-2048 + Ed25519 DKIM keys
/api/admin/cli/objects/Domain/{name}
Updates DKIM mode, quotas, or retention in 0 ms
/api/admin/cli/dns/{name}?live=true
Verifies live DNS records or exports RFC 1035 BIND zone
id
guid
READ-ONLY
UUIDv7
name
string
PRIMARY KEY
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)
Key: email
RBAC: TenantAdmin+
Represents a user mailbox (@type="User", with IMAP/JMAP/CalDAV/CardDAV/ActiveSync) or a distribution list (@type="List" with members[]).
/api/admin/cli/objects/Account?filter=role=TenantAdmin
Lists/filters accounts and distribution lists
/api/admin/cli/objects/Account/User
Creates a new user mailbox with RFC 6154 folders
/api/admin/cli/objects/Account/List
Creates a new distribution list
/api/admin/cli/objects/Account/{email}
Updates quota, forwarding, vacation, or password
/api/admin/cli/objects/Account/{email}
Soft-deletes an account
id
guid
READ-ONLY
UUIDv7
@type
string
OPTIONAL
User
"User""List"email
string
PRIMARY KEY
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
Key: address
RBAC: TenantAdmin+
Secondary email alias or disposable masked privacy alias routed to a primary Account mailbox or distribution list.
/api/admin/cli/objects/Alias
Lists all aliases and masked emails
/api/admin/cli/objects/Alias
Creates a new alias routed to a target mailbox
/api/admin/cli/objects/Alias/{address}
Enables/pauses an alias or updates its target
/api/admin/cli/objects/Alias/{address}
Deletes the alias
address
string
PRIMARY KEY
target
string
REQUIRED
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
Key: id
RBAC: TenantAdmin+
Immutable, RBAC- and CIDR-restricted Scoped API Key (smk_<id>_<secret>) for /api/v1/send, SCIM 2.0, or sharpmail-cli.
/api/admin/cli/objects/ApiKey
Lists active API keys (secret omitted)
/api/admin/cli/objects/ApiKey
Mints a new API key and returns apiKey (smk_...) once
/api/admin/cli/objects/ApiKey/{id}
Revokes the API key immediately
id
guid
READ-ONLY
UUIDv7
apiKey
string
CREATE-ONLY
smk_<id>_<secret>
label
string
REQUIRED
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
Key: domain
RBAC: ServerAdmin+
Per-domain outbound SMTP routing or TLS certificate exception (e.g. StartTlsIgnoreCert for partner MX hosts with mismatched certificates, or smart-host connector).
/api/admin/cli/objects/Route
Lists all custom outbound routes
/api/admin/cli/objects/Route
Creates a custom domain route or TLS override
/api/admin/cli/objects/Route/{domain}
Updates target host, port, or TLS mode
/api/admin/cli/objects/Route/{domain}
Deletes the custom route
domain
string
PRIMARY KEY
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)
Key: singleton
RBAC: TenantAdmin+
Governs progressive 28-day IP warming, message categories, and per-recipient-provider hourly/daily quotas (Google, Microsoft, Yahoo/AOL, German ISPs, iCloud, *).
/api/admin/cli/objects/TransactionalSend/singleton
Gets active IP warming & provider quota policy
/api/admin/cli/objects/TransactionalSend/singleton
Updates warming day, preset, or 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)
Key: singleton
RBAC: TenantAdmin+
Optional outbound reputation protection: automatic bounce/complaint suppression list, RFC 8058 One-Click Unsubscribe, bounce circuit breaker, adaptive 421 ISP backoff, and HMAC-SHA256 webhooks.
/api/admin/cli/objects/ReputationShield/singleton
Gets current Reputation Shield configuration
/api/admin/cli/objects/ReputationShield/singleton
Updates protection flags or applies a preset
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)
Key: singleton
RBAC: ServerAdmin+
Multi-stage inbound defense: SPF/DKIM/DMARC/ARC verification, Smart Greylisting (/24 IPv4 & /64 IPv6), online ML classifier (FTRL-Proximal), DNSBL zones, allow/blocklists, and ClamAV TCP scan.
/api/admin/cli/objects/SpamGuard/singleton
Gets SpamGuard thresholds & training counters
/api/admin/cli/objects/SpamGuard/singleton
Updates scores, DNSBLs, allowlists, or ClamAV in place
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)
Key: singleton
RBAC: ServerAdmin+
Controls the outbound MX delivery queue, worker concurrency, retry intervals, ISP throttling, outbound TLS validation, global smart-host, and inbound ESMTP limits.
/api/admin/cli/objects/SmtpQueue/singleton
Gets all queue, TLS, and ESMTP settings
/api/admin/cli/objects/SmtpQueue/singleton
Updates queue workers, retry schedule, or ESMTP limits in 0 ms
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)
Key: singleton
RBAC: ServerAdmin+
Organization-wide legal disclaimer (inserted prior to DKIM signing), global inbound Sieve script, Fail2Ban auto-ban thresholds, and canonical ServerHostName.
/api/admin/cli/objects/TransportRules/singleton
Gets disclaimer, global Sieve, and auto-ban settings
/api/admin/cli/objects/TransportRules/singleton
Updates transport rules in place
/api/admin/cli/objects/Server/singleton
Gets ServerHostName, storage engine, queue depth, and license status
/api/admin/cli/objects/Server/singleton
Updates canonical ServerHostName in 0 ms
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")}");