#pApiAuth
完整的 API & CLI 字段参考:全部 12 种对象类型、REST 端点 & POST /api/v1/send
本参考文档记录了全部 12 个管理对象(/api/admin/cli/objects/{type} & nextxch-cli)以及事务性邮件投递(POST /api/v1/send)的每个 JSON 属性、数据类型、枚举值、默认设置和最低 RBAC 角色。可使用表格上方的即时筛选框搜索任意属性,例如 dkimSigningMode、tlsMode、allowedCidrs 或 warmingEnabled。
在终端或通过 HTTP 实时内省:每个 nextxch 都在 GET /api/admin/cli/schema 以机器可读的 JSON 提供完整架构(附带 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+
面向 Web 应用、ERP、CRM 和 2FA 验证码的高吞吐 HTTP JSON 投递端点,支持类别优先级、IP 预热、抑制预检和 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 客户端凭据(令牌有效期 1 小时)。
/api/admin/integrations/keys
创建密钥(管理员,仅显示一次)
/api/admin/integrations/keys/{id}
更改范围
/api/admin/integrations/keys/{id}
吊销密钥(及其 OAuth 令牌)
/api/v1/oauth/token
OAuth 2.0 client_credentials:使用密钥 ID + 密钥换取访问令牌
/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 秒、2 分钟、10 分钟、1 小时和 6 小时后重试。
/api/v1/webhooks
租户的 Webhook
/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+
托管的邮件域,自动并行生成双 DKIM 密钥(RSA-2048 + Ed25519),并支持 GoBD WORM 保留策略、加号寻址和速率限制。
/api/admin/cli/objects/Domain
列出所有域
/api/admin/cli/objects/Domain/{name}
获取域配置 & DKIM 选择器
/api/admin/cli/objects/Domain
创建域 & 生成 RSA-2048 + Ed25519 DKIM 密钥
/api/admin/cli/objects/Domain/{name}
在 0 ms 内更新 DKIM 模式、配额或保留设置
/api/admin/cli/dns/{name}?live=true
验证实时 DNS 记录或导出 RFC 1035 BIND 区域
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}
软删除账户
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+
不可变、受 RBAC 和 CIDR 限制的范围化 API 密钥 (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 证书例外(例如对证书不匹配的合作伙伴 MX 主机使用 StartTlsIgnoreCert,或智能主机连接器)。
/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+
管控渐进式 28 天 IP 预热、邮件类别以及按收件服务商划分的每小时/每日配额(Google、Microsoft、Yahoo/AOL、德国 ISP、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 ISP 退避,以及 HMAC-SHA256 webhook。
/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 验证、智能灰名单(/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 投递队列、工作线程并发数、重试间隔、ISP 限流、出站 TLS 验证、全局智能主机以及入站 ESMTP 限制。
/api/admin/cli/objects/SmtpQueue/singleton
获取所有队列、TLS 和 ESMTP 设置
/api/admin/cli/objects/SmtpQueue/singleton
在 0 ms 内更新队列工作线程、重试计划或 ESMTP 限制
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
0 ms 内更新规范的 ServerHostName
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")}");