#pApiAuth
المرجع الكامل لحقول API وCLI: جميع أنواع الكائنات الاثني عشر ونقاط نهاية REST وPOST /api/v1/send
يوثّق هذا المرجع كل خاصية JSON ونوع بيانات وقيمة تعداد (enum) وإعداد افتراضي والحد الأدنى لدور RBAC عبر جميع كائنات الإدارة الاثني عشر (/api/admin/cli/objects/{type} & nextxch-cli) بالإضافة إلى تسليم البريد الإلكتروني للمعاملات (POST /api/v1/send). استخدموا مربع التصفية الفوري أعلى الجدول للبحث عن أي خاصية مثل dkimSigningMode أو tlsMode أو allowedCidrs أو warmingEnabled.
فحص مباشر في الطرفية أو عبر HTTP: يعرض كل nextxch هذا المخطط الكامل بصيغة JSON قابلة للقراءة آليًا على GET /api/admin/cli/schema (مع ترويسة SHA-256 باسم X-Nextxch-Schema-Version). وفي الطرفية، نفّذوا nextxch-cli describe <Type> (مثل nextxch-cli describe Domain أو nextxch-cli describe SmtpQueue) في أي وقت.
TransactionalSendRequest (POST /api/v1/send)
13
IntegrationKey (API v1)
9
CalendarEvent (API v1)
12
Rooms & Booking (API v1)
6
Contact, Directory & Sharing (API v1)
9
Webhook (API v1)
4
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)
المفتاح: Idempotency-Key
RBAC: User+
نقطة نهاية HTTP JSON عالية الإنتاجية لتسليم البريد من تطبيقات الويب وأنظمة ERP وCRM ورموز 2FA، مع تحديد الأولوية حسب الفئة وإحماء IP والفحص المسبق لقائمة المنع وIdempotency لمدة 24 ساعة.
/api/v1/send
يضع البريد الإلكتروني للمعاملات في قائمة الانتظار ويوقّعه (UTF-8 Multipart/Alternative + مرفقات)
/api/v1/unsubscribe/{token}
نقطة نهاية عامة لإلغاء الاشتراك بنقرة واحدة وفق RFC 8058 (رمز موقّع بـ DKIM)
from
string
اختياري
Key senderAddress
to
string[]
مطلوب
cc
string[]
اختياري
[]
bcc
string[]
اختياري
[]
replyTo
string
اختياري
subject
string
مطلوب
textBody
string
اختياري
htmlBody
string
اختياري
category
string
اختياري
transactional
"critical""transactional""notification""marketing"overflowMode
string
اختياري
DeferQueue
"DeferQueue""Reject429"idempotencyKey
string
اختياري
Header Idempotency-Key
headers
Record<string, string>
اختياري
{}
attachments
SendAttachmentDto[]
اختياري
[]
{
"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:
nextxch-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.nextxch.local | bounce@sink.nextxch.local | defer@sink.nextxch.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();
IntegrationKey (API v1)
المفتاح: id
RBAC: TenantAdmin+
مفتاح تكامل بنطاقات صلاحيات لـ /api/v1. يعمل المفتاح باسم مستخدم واحد، أو كتكامل على مستوى المستأجر باسم المستخدم المذكور في ترويسة X-Nextxch-Act-As. ودون نطاق الصلاحية تجيب API بالرمز 403؛ ويؤدي مستخدم من مستأجر آخر إلى 404. اختياريًا OAuth 2.0 client credentials (الرمز صالح لمدة ساعة واحدة).
/api/admin/integrations/keys
إنشاء مفتاح (للمسؤول، يُعرض مرة واحدة)
/api/admin/integrations/keys/{id}
تغيير النطاقات
/api/admin/integrations/keys/{id}
إلغاء مفتاح (ورموز OAuth الخاصة به)
/api/v1/oauth/token
OAuth 2.0 client_credentials: معرّف المفتاح + المفتاح للحصول على رمز وصول
/api/v1/me
المفتاح والنطاقات والمستخدم المنفّذ
/api/v1/openapi.json
مستند OpenAPI 3.1 الخاص بالتثبيت
label
string
مطلوب
mode
string
مطلوب
user
"user""tenant"userEmail
string
اختياري
scopes
string[]
مطلوب
"calendar.read""calendar.write""rooms.read""booking.read""booking.write""contacts.read""contacts.write""directory.read""sharing.manage""webhooks.manage""mail.send"domainId
guid
اختياري
allowedCidrs
string[]
اختياري
[]
expiresInDays
integer
اختياري
senderAddress
string
اختياري
apiKey
string
للقراءة فقط
{
"label": "CRM",
"mode": "tenant",
"scopes": ["calendar.write", "rooms.read", "contacts.write", "webhooks.manage"],
"allowedCidrs": ["203.0.113.0/24"],
"expiresInDays": 365
}
# Integrations-Schlüssel: Admin > API & Integrationen > Neuer Schlüssel
# Danach z. B. ein Access-Token per OAuth 2.0 Client Credentials holen:
curl -fsS -X POST "https://mail.firma.de/api/v1/oauth/token" \
-d grant_type=client_credentials \
-d client_id=0196c3a2-5f1e-7c11-9a20-1c2d3e4f5a6b \
-d client_secret=smk_0196c3a25f1e7c119a201c2d3e4f5a6b_... \
-d scope="calendar.read rooms.read"
curl -fsS "https://mail.firma.de/api/v1/me" \
-H "Authorization: Bearer smk_0196c3a2..." \
-H "X-Nextxch-Act-As: anna@firma.de"
using var http = new HttpClient { BaseAddress = new Uri("https://mail.firma.de") };
http.DefaultRequestHeaders.Authorization = new("Bearer", "smk_0196c3a2...");
http.DefaultRequestHeaders.Add("X-Nextxch-Act-As", "anna@firma.de");
var me = await http.GetFromJsonAsync<JsonElement>("/api/v1/me");
CalendarEvent (API v1)
المفتاح: hrefName
RBAC: User+
مواعيد مع سلاسل واستثناءات، والحضور، والغرف، والدعوات، والردود، ومتوفر/مشغول، والتقويمات المشتركة والعامة، وروابط الدعوة. النطاقات calendar.read وcalendar.write. الأوقات بتوقيت UTC (ISO-8601)، والمناطق الزمنية بأسماء IANA.
/api/v1/calendars
تقويمات خاصة ومشتركة وعامة وتقويمات الموارد
/api/v1/calendar/events?from&to&calendarId&limit&cursor
التكرارات ضمن نافذة زمنية (السلسلة موسّعة)
/api/v1/calendar/events
إنشاء موعد (دعوة أشخاص وغرف)
/api/v1/calendar/events/{hrefName}
موعد مع سلسلة واستثناءات
/api/v1/calendar/events/{hrefName}
تغيير؛ scope=occurrence|following لأجزاء من سلسلة
/api/v1/calendar/events/{hrefName}
حذف، مع إلغاءات اختيارية (notify=true)
/api/v1/calendar/events/{hrefName}/respond
الرد على دعوة
/api/v1/calendar/events/{hrefName}/invite-link
رابط دعوة موقّع
/api/v1/calendar/events/{hrefName}/ics
iCalendar خام
/api/v1/calendar/freebusy
حالة متوفر/مشغول للأشخاص والغرف
title
string
مطلوب
startUtc
datetime
مطلوب
endUtc
datetime
مطلوب
timeZone
string
اختياري
Europe/Berlin
allDay
boolean
اختياري
false
attendees
Attendee[]
اختياري
[]
sendInvitations
boolean
اختياري
false
recurrence
التكرار
اختياري
showAs
string
اختياري
busy
"free""tentative""busy""oof""workingElsewhere"isPrivate
boolean
اختياري
false
calendarId
string
اختياري
teamsMeeting
boolean
اختياري
{
"title": "Projektstart",
"startUtc": "2026-12-03T09:00:00Z",
"endUtc": "2026-12-03T10:00:00Z",
"timeZone": "Europe/Berlin",
"attendees": [
{ "email": "bernd@firma.de" },
{ "email": "raum-1@firma.de" }
],
"sendInvitations": true
}
# Benötigte Scopes: calendar.read (lesen), calendar.write (schreiben)
# Einen Raum buchen: Raumadresse als Teilnehmer eintragen
curl -fsS -X POST "https://mail.firma.de/api/v1/calendar/events" \
-H "Authorization: Bearer smk_0196c3a2..." \
-H "X-Nextxch-Act-As: anna@firma.de" \
-H "Content-Type: application/json" \
-d '{"title":"Projektstart","startUtc":"2026-12-03T09:00:00Z","endUtc":"2026-12-03T10:00:00Z","timeZone":"Europe/Berlin","attendees":[{"email":"raum-1@firma.de"}]}'
var res = await http.PostAsJsonAsync("/api/v1/calendar/events", new
{
title = "Projektstart",
startUtc = DateTimeOffset.Parse("2026-12-03T09:00:00Z"),
endUtc = DateTimeOffset.Parse("2026-12-03T10:00:00Z"),
timeZone = "Europe/Berlin",
attendees = new[] { new { email = "raum-1@firma.de" } }
});
string href = (await res.Content.ReadFromJsonAsync<JsonElement>()).GetProperty("data").GetProperty("hrefName").GetString()!;
Rooms & Booking (API v1)
المفتاح: id
RBAC: User+
الغرف والموارد مع التوفر (rooms.read) وصفحات الحجز على غرار Calendly (booking.read وbooking.write): صفحة الحجز، وأنواع المواعيد، والفترات المتاحة، وقراءة الحجوزات وإلغاؤها. وتُحجز الغرفة عبر موعد تكون فيه الغرفة مشاركًا.
/api/v1/rooms?startUtc&endUtc&category
الغرف والموارد، مع الأوقات المتاحة في النافذة الزمنية
/api/v1/rooms/{email}/availability
أوقات انشغال غرفة واحدة
/api/v1/booking/profile
صفحة الحجز مع ساعات العمل وأنواع المواعيد
/api/v1/booking/event-types
أنواع الأحداث
/api/v1/booking/event-types
إنشاء نوع موعد
/api/v1/booking/event-types/{id}/slots?from&to
أوقات البدء المتاحة (42 يومًا كحد أقصى)
/api/v1/booking/bookings?status&from&to
الحجوزات
/api/v1/booking/bookings/{id}/cancel
إلغاء حجز (يُبلَّغ الضيف)
slots[].startUtc
datetime
للقراءة فقط
slots[].endUtc
datetime
للقراءة فقط
slots[].staff
object[]
للقراءة فقط
status
string
للقراءة فقط
"confirmed""cancelled"guest
object
للقراءة فقط
free
boolean
للقراءة فقط
{
"ok": true,
"data": {
"eventTypeId": "beratung-3f2a",
"durationMinutes": 30,
"timeZone": "Europe/Berlin",
"slots": [
{ "startUtc": "2026-12-04T08:00:00Z", "endUtc": "2026-12-04T08:30:00Z", "staff": [] }
]
}
}
# Benötigte Scopes: rooms.read, booking.read, booking.write
curl -fsS "https://mail.firma.de/api/v1/rooms?startUtc=2026-12-03T09:00:00Z&endUtc=2026-12-03T10:00:00Z" \
-H "Authorization: Bearer smk_0196c3a2..."
var slots = await http.GetFromJsonAsync<JsonElement>("/api/v1/booking/event-types/beratung/slots");
foreach (var s in slots.GetProperty("data").GetProperty("slots").EnumerateArray())
Console.WriteLine(s.GetProperty("startUtc").GetString());
Contact, Directory & Sharing (API v1)
المفتاح: hrefName
RBAC: User+
جهات الاتصال الشخصية مع جميع الحقول والصورة (contacts.read وcontacts.write وIf-Match للحماية من التعارض)، وقائمة العناوين العامة (directory.read)، والمشاركات والتفويض (sharing.manage، والتفويض = إذن على صندوق البريد مع sendAs أو sendOnBehalf).
/api/v1/contacts?q
البحث في جهات الاتصال
/api/v1/contacts
إنشاء جهة اتصال
/api/v1/contacts/{hrefName}
تعديل جهة اتصال (الحقول الفارغة null تبقى كما هي)
/api/v1/contacts/{hrefName}
حذف جهة اتصال
/api/v1/directory?q&type
قائمة العناوين العامة
/api/v1/sharing/grants
الأذونات الخاصة
/api/v1/sharing/grants
تعيين تفويض أو إزالته
/api/v1/sharing/shared-with-me
مُشارَك معي
givenName
string
اختياري
familyName
string
اختياري
organization
string
اختياري
emails
TypedValue[]
اختياري
[]
phones
TypedValue[]
اختياري
[]
addresses
Address[]
اختياري
[]
birthday
string
اختياري
photo
string
للكتابة فقط (سري)
permissions
string[]
اختياري
"freeBusy""read""write""delete""sendOnBehalf""sendAs""manage"{
"givenName": "Clara",
"familyName": "Kunde",
"organization": "Kunde AG",
"emails": [{ "type": "work", "value": "clara@kunde.example" }],
"phones": [{ "type": "cell", "value": "+49 170 1234567" }]
}
# Benötigte Scopes: contacts.read, contacts.write, directory.read, sharing.manage
curl -fsS -X POST "https://mail.firma.de/api/v1/contacts" \
-H "Authorization: Bearer smk_0196c3a2..." \
-H "Content-Type: application/json" \
-d '{"givenName":"Clara","familyName":"Kunde","emails":[{"type":"work","value":"clara@kunde.example"}]}'
await http.PutAsJsonAsync("/api/v1/sharing/grants", new
{
kind = "calendar", granteeType = "user", grantee = "bernd@firma.de", permissions = new[] { "read" }
});
Webhook (API v1)
المفتاح: id
RBAC: User+
الأحداث بوصفها طلب JSON POST موقّعًا: calendar.event.created وcalendar.event.updated وcalendar.event.deleted وcalendar.invitation.replied وbooking.created وbooking.rescheduled وbooking.cancelled. التوقيع X-Nextxch-Signature: v1=hex(HMAC-SHA256(secret, X-Nextxch-Timestamp + "." + body)). إعادة المحاولة بعد 30 ثانية ودقيقتين و10 دقائق وساعة واحدة و6 ساعات.
/api/v1/webhooks
Webhooks الخاصة بالمستأجر
/api/v1/webhooks
تسجيل webhook (السر في الاستجابة فقط)
/api/v1/webhooks/{id}
حذف webhook
/api/v1/webhooks/{id}/deliveries
عمليات التسليم الأخيرة
/api/v1/webhooks/{id}/test
إرسال حدث تجريبي
url
string
مطلوب
events
string[]
مطلوب
"calendar.event.created""calendar.event.updated""calendar.event.deleted""calendar.invitation.replied""booking.created""booking.rescheduled""booking.cancelled""*"secret
string
للقراءة فقط
id (Ereignis)
string
للقراءة فقط
{
"id": "evt_5c1f0e9a2b7d4c3e8f601a2b",
"type": "calendar.invitation.replied",
"createdAtUtc": "2026-12-01T10:15:02Z",
"tenantId": "0196c3a2-0000-7000-8000-000000000001",
"data": {
"calendarId": "0196c3a25f1e7c11:default",
"hrefName": "0196c3a2@nextxch.ics",
"title": "Projektstart",
"startUtc": "2026-12-03T09:00:00Z",
"attendee": { "email": "bernd@firma.de", "partStat": "ACCEPTED" }
}
}
# Signatur prüfen (Bash):
# expected="v1=$(printf '%s.%s' "$TS" "$BODY" | openssl dgst -sha256 -hmac "$SECRET" | cut -d' ' -f2)"
curl -fsS -X POST "https://mail.firma.de/api/v1/webhooks" \
-H "Authorization: Bearer smk_0196c3a2..." \
-H "Content-Type: application/json" \
-d '{"url":"https://crm.firma.de/hooks/nextxch","events":["calendar.event.created","booking.created"]}'
// ASP.NET Core receiver
app.MapPost("/hooks/nextxch", async (HttpRequest req) =>
{
using var ms = new MemoryStream();
await req.Body.CopyToAsync(ms);
string ts = req.Headers["X-Nextxch-Timestamp"]!;
byte[] mac = HMACSHA256.HashData(Encoding.UTF8.GetBytes(secret), [.. Encoding.ASCII.GetBytes(ts + "."), .. ms.ToArray()]);
return req.Headers["X-Nextxch-Signature"] == "v1=" + Convert.ToHexStringLower(mac) ? Results.Ok() : Results.Unauthorized();
});
Tenant
المفتاح: slug
RBAC: ServerAdmin+
حدود مؤسسة متعددة المستأجرين تعزل النطاقات والجهات الأساسية وحصص التخزين (GiB) والاحتفاظ الافتراضي للامتثال وفق GoBD WORM.
/api/admin/cli/objects/Tenant
يسرد جميع المستأجرين
/api/admin/cli/objects/Tenant/{slugOrId}
يجلب المستأجر حسب slug أو UUID
/api/admin/cli/objects/Tenant
ينشئ مستأجرًا جديدًا
/api/admin/cli/objects/Tenant/{slugOrId}
يحدّث حصص المستأجر في مكانها
id
guid
للقراءة فقط
UUIDv7
slug
string
PRIMARY KEY
name
string
مطلوب
isActive
boolean
اختياري
true
maxDomains
integer
اختياري
100
maxPrincipals
integer
اختياري
10000
quotaGb
integer
اختياري
100
outboundDailyLimit
integer
اختياري
25000
defaultLockMode
string
اختياري
Normal
"Normal""Governance""Compliance""LegalHold"defaultRetentionDays
integer
اختياري
0
createdAtUtc
datetime
للقراءة فقط
{
"slug": "acme",
"name": "ACME Logistik GmbH",
"isActive": true,
"maxDomains": 50,
"maxPrincipals": 2500,
"quotaGb": 250,
"outboundDailyLimit": 25000,
"defaultLockMode": "Compliance",
"defaultRetentionDays": 3650
}
# Mandant anlegen:
nextxch-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:
nextxch-cli get Tenant acme
nextxch-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
المفتاح: name
RBAC: TenantAdmin+
نطاق بريد مستضاف مع توليد تلقائي متوازٍ لمفاتيح Dual-DKIM (RSA-2048 + Ed25519)، وسياسة احتفاظ GoBD WORM، والعناوين الإضافية (Plus-Addressing)، وحدود المعدل.
/api/admin/cli/objects/Domain
يسرد جميع النطاقات
/api/admin/cli/objects/Domain/{name}
يجلب إعدادات النطاق ومحددات DKIM
/api/admin/cli/objects/Domain
ينشئ النطاق ويولّد مفاتيح DKIM من نوع RSA-2048 + Ed25519
/api/admin/cli/objects/Domain/{name}
يحدّث وضع DKIM أو الحصص أو الاحتفاظ في 0 ms
/api/admin/cli/dns/{name}?live=true
يتحقق من سجلات DNS المباشرة أو يصدّر منطقة BIND وفق RFC 1035
id
guid
للقراءة فقط
UUIDv7
name
string
PRIMARY KEY
tenant
string
اختياري
default
isActive
boolean
اختياري
true
postmasterAddress
string
اختياري
postmaster@<name>
dkimSigningMode
string
اختياري
Dual
"Rsa2048""Ed25519""Dual"dkimRsaSelector
string
اختياري
s2026
dkimRsaDnsName
string
للقراءة فقط
s2026._domainkey.<name>
dkimEd25519Selector
string
اختياري
ed2026
dkimEd25519DnsName
string
للقراءة فقط
ed2026._domainkey.<name>
retentionLockMode
string
اختياري
Normal
"Normal""Governance""Compliance""LegalHold"retentionDays
integer
اختياري
0
quotaGb
integer
اختياري
50
maxMessageSizeMb
integer
اختياري
50
maxAccounts
integer
اختياري
1000
outboundDailyLimit
integer
اختياري
5000
outboundHourlyLimit
integer
اختياري
1000
usePlusAddressing
boolean
اختياري
true
createdAtUtc
datetime
للقراءة فقط
{
"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:
nextxch-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:
nextxch-cli dns muster-logistik.de --bind > muster-logistik.de.zone
nextxch-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)
المفتاح: email
RBAC: TenantAdmin+
يمثل صندوق بريد مستخدم (@type="User"، مع IMAP/JMAP/CalDAV/CardDAV/ActiveSync) أو قائمة توزيع (@type="List" مع members[]).
/api/admin/cli/objects/Account?filter=role=TenantAdmin
يسرد/يصفّي الحسابات وقوائم التوزيع
/api/admin/cli/objects/Account/User
ينشئ صندوق بريد مستخدم جديدًا مع مجلدات RFC 6154
/api/admin/cli/objects/Account/List
ينشئ قائمة توزيع جديدة
/api/admin/cli/objects/Account/{email}
يحدّث حصة التخزين أو إعادة التوجيه أو الرد التلقائي أو كلمة المرور
/api/admin/cli/objects/Account/{email}
يحذف الحساب حذفًا مبدئيًا (Soft Delete)
id
guid
للقراءة فقط
UUIDv7
@type
string
اختياري
User
"User""List"email
string
PRIMARY KEY
displayName
string
اختياري
Lokalteil
password
string
للكتابة فقط (سري)
role
string
اختياري
User
"User""ComplianceAuditor""TenantAdmin""ServerAdmin"isActive
boolean
اختياري
true
quotaMb
integer
اختياري
5120
usedBytes
long
للقراءة فقط
0
outboundDailyLimit
integer
اختياري
500
forwardAddress
string
اختياري
forwardKeepOriginal
boolean
اختياري
true
vacationEnabled
boolean
اختياري
false
vacationSubject
string
اختياري
vacationBody
string
للكتابة فقط (سري)
twoFactorEnabled
boolean
للقراءة فقط
false
members
string[]
اختياري
[]
createdAtUtc
datetime
للقراءة فقط
{
"@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:
nextxch-cli create Account/User \
--set email=anna.weber@muster-logistik.de \
--set displayName="Anna Weber" \
--set password="SicheresStartPasswort!2026" \
--set quotaMb=15360
# Verteilerliste anlegen:
nextxch-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
المفتاح: address
RBAC: TenantAdmin+
اسم مستعار ثانوي للبريد الإلكتروني أو اسم مستعار مقنّع مؤقت للخصوصية يُوجَّه إلى صندوق بريد Account أساسي أو قائمة توزيع.
/api/admin/cli/objects/Alias
يسرد جميع الأسماء المستعارة وعناوين البريد المقنّعة
/api/admin/cli/objects/Alias
ينشئ اسمًا مستعارًا جديدًا يُوجَّه إلى صندوق بريد هدف
/api/admin/cli/objects/Alias/{address}
يفعّل اسمًا مستعارًا أو يوقفه مؤقتًا أو يحدّث هدفه
/api/admin/cli/objects/Alias/{address}
يحذف الاسم المستعار
address
string
PRIMARY KEY
target
string
مطلوب
principalId
guid
للقراءة فقط
description
string
اختياري
""
isMasked
boolean
اختياري
false
isEnabled
boolean
اختياري
true
createdAtUtc
datetime
للقراءة فقط
{
"address": "shop-8f2k@muster-logistik.de",
"target": "anna.weber@muster-logistik.de",
"description": "Fachbuchhandlung / Online-Bestellung",
"isMasked": true,
"isEnabled": true
}
# Masked-Email-Alias anlegen:
nextxch-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:
nextxch-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
المفتاح: id
RBAC: TenantAdmin+
مفتاح API محصور (Scoped API Key) ثابت ومقيّد بـ RBAC وCIDR (smk_<id>_<secret>) لـ /api/v1/send أو SCIM 2.0 أو nextxch-cli.
/api/admin/cli/objects/ApiKey
يسرد مفاتيح API النشطة (دون السر)
/api/admin/cli/objects/ApiKey
ينشئ مفتاح API جديدًا ويعيد apiKey (smk_...) مرة واحدة
/api/admin/cli/objects/ApiKey/{id}
يُبطل مفتاح API فورًا
id
guid
للقراءة فقط
UUIDv7
apiKey
string
إنشاء فقط
smk_<id>_<secret>
label
string
مطلوب
role
string
اختياري
TenantAdmin
"User""ComplianceAuditor""TenantAdmin""ServerAdmin"senderAddress
string
اختياري
defaultCategory
string
اختياري
transactional
"critical""transactional""notification""marketing"allowedCidrs
string[]
اختياري
[] (Alle IPs)
expiresInDays
integer
للكتابة فقط (سري)
null (Kein Ablauf)
expiresAtUtc
datetime
للقراءة فقط
outboundDailyLimit
integer
اختياري
10000
isActive
boolean
للقراءة فقط
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 / nextxch-cli erstellen:
nextxch-cli create ApiKey \
--set label="GitLab CI / Ansible" \
--set role=TenantAdmin \
--set allowedCidrs=10.20.0.0/16 \
--set expiresInDays=90
# Schlüssel widerrufen:
nextxch-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
المفتاح: domain
RBAC: ServerAdmin+
توجيه SMTP صادر لكل نطاق أو استثناء لشهادة TLS (مثل StartTlsIgnoreCert لمضيفات MX لدى الشركاء ذات الشهادات غير المتطابقة، أو موصل Smart-Host).
/api/admin/cli/objects/Route
يسرد جميع مسارات البريد الصادر المخصصة
/api/admin/cli/objects/Route
ينشئ مسار نطاق مخصصًا أو تجاوزًا لإعدادات TLS
/api/admin/cli/objects/Route/{domain}
يحدّث المضيف الهدف أو المنفذ أو وضع TLS
/api/admin/cli/objects/Route/{domain}
يحذف المسار المخصص
domain
string
PRIMARY KEY
targetHost
string
اختياري
"" (Auto DNS-MX)
targetPort
integer
اختياري
25
tlsMode
string
اختياري
StartTlsOptional
"StartTlsOptional""StartTlsRequired""StartTlsIgnoreCert""ImplicitTls""ImplicitTlsIgnoreCert""None"username
string
اختياري
password
string
للكتابة فقط (سري)
hasPassword
boolean
للقراءة فقط
false
clearPassword
boolean
للكتابة فقط (سري)
false
description
string
اختياري
enabled
boolean
اختياري
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:
nextxch-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:
nextxch-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)
المفتاح: singleton
RBAC: TenantAdmin+
يتحكم في إحماء IP التدريجي لمدة 28 يومًا، وفئات الرسائل، والحصص الساعية/اليومية لكل مزود مستلم (Google وMicrosoft وYahoo/AOL ومزودو خدمة الإنترنت الألمان وiCloud و*).
/api/admin/cli/objects/TransactionalSend/singleton
يجلب سياسة إحماء IP النشطة وحصص المزودين
/api/admin/cli/objects/TransactionalSend/singleton
يحدّث يوم التسخين أو الإعداد المسبق أو حصص المزودين
enabled
boolean
اختياري
true
warmingEnabled
boolean
اختياري
false
startAtWarmingDay
integer
للكتابة فقط (سري)
1
currentWarmingDay
integer
للقراءة فقط
currentWarmingPercent
integer
للقراءة فقط
warmingDailyRampPercents
integer[]
اختياري
[5,7,10,...,100]
maxDeferHours
integer
اختياري
48
defaultCategory
string
اختياري
transactional
"critical""transactional""notification""marketing"preset
string
للكتابة فقط (سري)
"warming_28d""warming_14d""production_100"categories
CategoryPolicy[]
اختياري
4 Kategorien
providers
ProviderQuota[]
اختياري
6 Provider-Gruppen
{
"enabled": true,
"warmingEnabled": true,
"startAtWarmingDay": 1,
"maxDeferHours": 48,
"defaultCategory": "transactional",
"preset": "warming_28d"
}
# 28-Tage IP-Warming aktivieren:
nextxch-cli update TransactionalSend --set preset=warming_28d
# Direkt auf Warming-Tag 14 vorspringen:
nextxch-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)
المفتاح: singleton
RBAC: TenantAdmin+
حماية اختيارية لسمعة البريد الصادر: قائمة إيقاف تلقائية للارتدادات/الشكاوى، وإلغاء الاشتراك بنقرة واحدة وفق RFC 8058، وقاطع دائرة للارتدادات، وتراجع تكيّفي عند 421 من مزودي الإنترنت، وwebhooks بتوقيع HMAC-SHA256.
/api/admin/cli/objects/ReputationShield/singleton
يجلب إعداد Reputation Shield الحالي
/api/admin/cli/objects/ReputationShield/singleton
يحدّث علامات الحماية أو يطبّق إعدادًا مسبقًا
preset
string
للكتابة فقط (سري)
"off""recommended""strict_bulk"enableSuppressionPreCheck
boolean
اختياري
false
enforceSuppressionOnSmtpRelay
boolean
اختياري
false
allSuppressedBehavior
string
اختياري
reject_422
"reject_422""accept_noop"autoSuppressHardBounces
boolean
اختياري
false
hardBounceSuppressionDays
integer
اختياري
180
autoSuppressConsecutiveSoftBounces
boolean
اختياري
false
softBounceEscalationThreshold
integer
اختياري
5
autoSuppressFblComplaints
boolean
اختياري
false
enableOneClickUnsubscribe
boolean
اختياري
false
oneClickUnsubscribeCategories
string[]
اختياري
["marketing","notification"]
enableBounceCircuitBreaker
boolean
اختياري
false
maxHardBouncePercent
number
اختياري
5.0
maxComplaintPercent
number
اختياري
0.1
allowCriticalWhenTripped
boolean
اختياري
true
enableAdaptiveIspBackoff
boolean
اختياري
false
ispCooldownMinutes
integer
اختياري
15
webhookEnabled
boolean
اختياري
false
webhookUrl
string
اختياري
webhookSecret
string
للكتابة فقط (سري)
{
"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/nextxch"
}
# Empfohlenen Reputationsschutz aktivieren:
nextxch-cli update ReputationShield --set preset=recommended
# Webhook-Ziel konfigurieren:
nextxch-cli update ReputationShield \
--set webhookEnabled=true \
--set webhookUrl=https://erp.firma.de/webhooks/nextxch \
--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)
المفتاح: singleton
RBAC: ServerAdmin+
حماية واردة متعددة المراحل: التحقق من SPF/DKIM/DMARC/ARC، وSmart Greylisting (/24 IPv4 & /64 IPv6)، ومصنّف تعلّم آلي عبر الإنترنت (FTRL-Proximal)، ومناطق DNSBL، وقوائم السماح/الحظر، وفحص ClamAV عبر TCP.
/api/admin/cli/objects/SpamGuard/singleton
يجلب عتبات SpamGuard وعدادات التدريب
/api/admin/cli/objects/SpamGuard/singleton
يحدّث النتائج أو قوائم DNSBL أو قوائم السماح أو ClamAV في مكانها
enableEmailAuthChecks
boolean
اختياري
true
enableGreylisting
boolean
اختياري
true
greylistRetryDelaySeconds
integer
اختياري
240
junkScoreThreshold
number
اختياري
4.5
rejectScoreThreshold
number
اختياري
9.0
tagSubjectOnJunk
boolean
اختياري
false
subjectTagPrefix
string
اختياري
"[SPAM] "
enableStructuralHeuristics
boolean
اختياري
true
dnsblZones
string[]
اختياري
["bl.spamcop.net","ix.dnsbl.manitu.net"]
dnsblHitScore
number
اختياري
3.5
allowedSendersOrDomains
string[]
اختياري
[]
blockedSendersOrDomains
string[]
اختياري
[]
clamAvEnabled
boolean
اختياري
false
clamAvHost
string
اختياري
"127.0.0.1"
clamAvPort
integer
اختياري
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:
nextxch-cli update SpamGuard \
--set allowedSendersOrDomains=datev.de,partner-spedition.de
# Schwellenwerte anpassen:
nextxch-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)
المفتاح: singleton
RBAC: ServerAdmin+
يتحكم في قائمة انتظار تسليم MX الصادرة، وتزامن العمّال، وفترات إعادة المحاولة، وتقييد المعدل لدى مزودي الخدمة، والتحقق من TLS الصادر، والمضيف الذكي العام (Smart-Host)، وحدود ESMTP الواردة.
/api/admin/cli/objects/SmtpQueue/singleton
يجلب جميع إعدادات قائمة الانتظار وTLS وESMTP
/api/admin/cli/objects/SmtpQueue/singleton
يحدّث عمّال قائمة الانتظار أو جدول إعادة المحاولة أو حدود ESMTP خلال 0 ms
outboundQueuePaused
boolean
اختياري
false
outboundWorkerConcurrency
integer
اختياري
8
maxDeliveryAttempts
integer
اختياري
10
retryScheduleMinutes
integer[]
اختياري
[5,15,60,240,720]
maxConcurrentConnectionsPerMxDomain
integer
اختياري
4
strictThrottleDomains
string[]
اختياري
["t-online.de","gmx.de","web.de","yahoo.com"]
strictThrottleMaxConcurrency
integer
اختياري
2
outboundConnectTimeoutSeconds
integer
اختياري
30
outboundBindAddress
string
اختياري
"" (Auto)
outboundUseStartTls
boolean
اختياري
true
requireOutboundTls
boolean
اختياري
false
outboundTlsCertValidation
string
اختياري
Opportunistic
"Opportunistic""IgnoreErrors""Strict"outboundSmartHost
string
اختياري
""
outboundSmartPort
integer
اختياري
587
maxMessageSizeMb
long
اختياري
50
maxRecipientsPerTransaction
integer
اختياري
100
maxConnectionsPerIp
integer
اختياري
20
tarpitDelayMs
integer
اختياري
1500
requireTlsForAuth
boolean
اختياري
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:
nextxch-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)
المفتاح: singleton
RBAC: ServerAdmin+
إخلاء مسؤولية قانوني على مستوى المؤسسة (يُدرج قبل توقيع DKIM)، وسكربت Sieve عام للبريد الوارد، وعتبات الحظر التلقائي في Fail2Ban، وServerHostName القياسي.
/api/admin/cli/objects/TransportRules/singleton
يجلب إعدادات إخلاء المسؤولية وSieve العام والحظر التلقائي
/api/admin/cli/objects/TransportRules/singleton
يحدّث قواعد النقل في مكانها
/api/admin/cli/objects/Server/singleton
يجلب ServerHostName ومحرك التخزين وعمق قائمة الانتظار وحالة الترخيص
/api/admin/cli/objects/Server/singleton
يحدّث ServerHostName القياسي في 0 ms
outboundDisclaimerEnabled
boolean
اختياري
false
outboundDisclaimerExternalOnly
boolean
اختياري
true
outboundDisclaimerText
string
اختياري
""
outboundDisclaimerHtml
string
اختياري
""
inboundSystemSieve
string
اختياري
""
autoBanThreshold
integer
اختياري
8
autoBanDurationMinutes
integer
اختياري
30
serverHostName
string
اختياري
mail.<domain>
storageProvider
string
للقراءة فقط
Sqlite | SqlServer | Postgres
activeQueueCount
integer
للقراءة فقط
0
licenseState
string
للقراءة فقط
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:
nextxch-cli update TransportRules \
--set outboundDisclaimerEnabled=true \
--set autoBanThreshold=8
# Kanonischen Server-Hostnamen abfragen oder setzen:
nextxch-cli get Server
nextxch-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")}");