MailLandDocs
E-Mail-Versand

Templates

Wiederverwendbare E-Mail-Templates mit dynamischer Variablenersetzung erstellen und verwalten

Erstellen Sie wiederverwendbare E-Mail-Templates mit dynamischen Variablen. Templates speichern Betreff, HTML- und Textinhalt Ihrer E-Mails, sodass Sie personalisierte E-Mails versenden können, ohne den Inhalt bei jeder Anfrage neu erstellen zu müssen.

Ein Template erstellen

POST https://api.mail.land/v1/templates
Create a template
curl -X POST https://api.mail.land/v1/templates \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Order Confirmation",
    "subject": "Your order #{{orderNumber}} is confirmed",
    "htmlContent": "<h1>Thanks, {{firstName}}!</h1><p>Order #{{orderNumber}} has been confirmed. Total: {{total}}</p>",
    "textContent": "Thanks, {{firstName}}! Order #{{orderNumber}} has been confirmed. Total: {{total}}",
    "categoryId": "k3v9q2m7xw4tpa"
  }'
Response: 201 Created
{
  "id": "t8x2m4q9zk7wpr",
  "name": "Order Confirmation",
  "subject": "Your order #{{orderNumber}} is confirmed",
  "htmlContent": "<h1>Thanks, {{firstName}}!</h1>...",
  "textContent": "Thanks, {{firstName}}!...",
  "categoryId": "k3v9q2m7xw4tpa",
  "categoryName": "Transactional",
  "categoryColor": "#3B82F6",
  "createdAt": "2026-02-17T10:00:00Z",
  "updatedAt": null
}

Validierungsregeln

FeldEinschränkung
nameErforderlich, max. 200 Zeichen
subjectErforderlich, max. 500 Zeichen
htmlContentErforderlich, max. 1 MB
textContentOptional, max. 1 MB
categoryIdOptional, muss auf eine vorhandene Kategorie verweisen

Variablen-Syntax

Verwenden Sie doppelte geschweifte Klammern für die Variablenersetzung:

Template with variables
<h1>Hello {{firstName}},</h1>
<p>Your order #{{orderNumber}} shipped on {{shipDate}}.</p>
<p>Track your package: <a href="{{trackingUrl}}">{{trackingNumber}}</a></p>

Variablen werden zum Sendezeitpunkt ersetzt. Übergeben Sie die Werte über das Feld variables in Ihrer Sendeanfrage:

Send with template variables
{
  "from": { "email": "[email protected]" },
  "to": [
    {
      "email": "[email protected]",
      "variables": {
        "firstName": "Jane",
        "orderNumber": "ORD-12345",
        "shipDate": "Feb 17, 2026",
        "trackingUrl": "https://track.example.com/ABC123",
        "trackingNumber": "ABC123"
      }
    }
  ],
  "templateId": "t8x2m4q9zk7wpr"
}

Variablen funktionieren sowohl im subject als auch in htmlContent/textContent. Jede {{Variable}}, die ein Template verwendet, braucht einen Wert, entweder in den variables der Anfrage oder in den eigenen variables des Empfängers. Hat eine keinen Wert, sendet MailLand die Nachricht nicht mit dem Platzhalter: POST /v1/transactional/send antwortet mit 422 TEMPLATE_VARIABLE_MISSING und nennt die fehlenden Variablen, und POST /v1/transactional/send-batch überspringt den Empfänger und führt ihn in rejectedRecipients auf. Auch Kampagnen und Automatisierungen überspringen den Empfänger. Inline-htmlContent, der ganz ohne variables gesendet wird, geht unverändert hinaus. Platzhalter sind genau {{name}}, ohne Filter, Bedingungen oder Schleifen. Ein Template meldet grammarVersion: "legacy-v1", die heute einzige Grammatik; beim Anlegen oder Ändern eines Templates können Sie das Feld weglassen.

Standardwerte

Ein Template kann für jedes Kontaktfeld, das es verwendet, einen Standardwert tragen, damit auch ein Abonnent ohne Wert für dieses Feld die E-Mail erhält. Setzen Sie sie mit variableDefaults, einem Objekt aus Platzhaltername und Wert, beim Erstellen und Aktualisieren. Beim Abrufen, Auflisten und Duplizieren eines Templates werden sie mit zurückgegeben.

Template mit Standardwert
{
  "name": "Welcome",
  "subject": "Hello {{firstName}}",
  "htmlContent": "<p>Hi {{firstName}}</p>",
  "variableDefaults": { "firstName": "Kunde" }
}

Regeln:

  • Standardwerte gelten nur für Sendungen von Kampagnen und Automatisierungen. Ein nicht leerer eigener Wert des Empfängers hat immer Vorrang vor dem Standardwert.
  • Ein Feld ohne Wert und ohne Standardwert wird weiterhin abgelehnt: MailLand sendet nie ein wörtliches {{firstName}}.
  • Transaktionale Sendungen über API und SMTP sind nicht betroffen. Dort stammen die Werte aus Ihrer Anfrage, und ein fehlender wird wie oben beschrieben abgelehnt.
  • Beim Aktualisieren bleiben die gespeicherten Standardwerte erhalten, wenn Sie variableDefaults weglassen. Senden Sie {}, um sie zu löschen.
  • Namen folgen der Platzhalter-Syntax. email und subscriberId werden immer geliefert und können keinen Standardwert haben. Ein Wert ist eine Zeile mit höchstens 200 Zeichen, ein Template hat höchstens 50 Standardwerte.

Im Dashboard-Editor hat jeder Platzhalter ein Eingabefeld für den Standardwert, das anzeigt, wie vielen Abonnenten dieses Feld fehlt. Beim Speichern warnt der Editor, wenn ein Feld mit fehlenden Abonnenten keinen Standardwert hat.

Ein Template in der Vorschau anzeigen

Zeigen Sie ein Template mit automatisch befüllten Beispielwerten für erkannte Variablen in der Vorschau an:

GET https://api.mail.land/v1/templates/{id}/preview
Preview a template
curl https://api.mail.land/v1/templates/t8x2m4q9zk7wpr/preview \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Preview response
{
  "id": "t8x2m4q9zk7wpr",
  "name": "Order Confirmation",
  "subject": "Your order #12345 is confirmed",
  "renderedHtml": "<h1>Thanks, John!</h1><p>Order #12345 has been confirmed.</p>",
  "renderedText": "Thanks, John! Order #12345 has been confirmed."
}

Ein Template duplizieren

Klonen Sie ein vorhandenes Template:

POST https://api.mail.land/v1/templates/{id}/duplicate
Duplicate a template
curl -X POST https://api.mail.land/v1/templates/t8x2m4q9zk7wpr/duplicate \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Das Duplikat erhält einen automatisch generierten Namen: "Order Confirmation (Copy)". Wenn bereits eine Kopie vorhanden ist, wird der Name hochgezählt: "Order Confirmation (Copy 2)" usw.

Template-Kategorien

Organisieren Sie Templates in Kategorien mit optionalen Farben.

Eine Kategorie erstellen

POST https://api.mail.land/v1/templates/categories
Create a category
curl -X POST https://api.mail.land/v1/templates/categories \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Transactional",
    "description": "Order confirmations, receipts, and shipping notifications",
    "color": "#3B82F6"
  }'
FeldEinschränkung
nameErforderlich, 1–100 Zeichen
descriptionOptional, max. 500 Zeichen
colorOptional, Hex-Format (#3B82F6 oder #38F)

Kategorien auflisten

GET https://api.mail.land/v1/templates/categories
List template categories
curl https://api.mail.land/v1/templates/categories \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Categories response
{
  "categories": [
    {
      "id": "k3v9q2m7xw4tpa",
      "name": "Transactional",
      "description": "Order confirmations, receipts",
      "color": "#3B82F6",
      "templateCount": 12,
      "createdAt": "2026-01-15T10:00:00Z"
    }
  ],
  "totalCount": 3
}

Templates auflisten

GET https://api.mail.land/v1/templates?limit=50
List templates
curl "https://api.mail.land/v1/templates?limit=50" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Nach Kategorie filtern:

GET https://api.mail.land/v1/templates?categoryId=k3v9q2m7xw4tpa
List templates by category
curl "https://api.mail.land/v1/templates?categoryId=k3v9q2m7xw4tpa" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Template list response
{
  "items": [
    {
      "id": "t8x2m4q9zk7wpr",
      "name": "Order Confirmation",
      "subject": "Your order #{{orderNumber}} is confirmed",
      "htmlContent": "...",
      "categoryName": "Transactional",
      "categoryColor": "#3B82F6",
      "createdAt": "2026-02-17T10:00:00Z"
    }
  ],
  "nextCursor": "eyJ2IjoxLCJzIjoiY3JlYXRlZGF0OmRlc2MiLCJrIjoi...",
  "hasMore": true
}

Ein Template aktualisieren

PUT https://api.mail.land/v1/templates/{id}

Alle Felder sind in der Aktualisierungsanfrage erforderlich (dies ist eine vollständige Ersetzung, kein partielles Update):

Update a template
curl -X PUT https://api.mail.land/v1/templates/t8x2m4q9zk7wpr \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Order Confirmation v2",
    "subject": "Order #{{orderNumber}} confirmed - {{companyName}}",
    "htmlContent": "<h1>Thanks, {{firstName}}!</h1><p>Updated template content.</p>",
    "textContent": "Thanks, {{firstName}}! Updated template content.",
    "categoryId": "k3v9q2m7xw4tpa"
  }'

Ein Template löschen

DELETE https://api.mail.land/v1/templates/{id}
Delete a template
curl -X DELETE https://api.mail.land/v1/templates/t8x2m4q9zk7wpr \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Gibt bei Erfolg 204 No Content zurück. Ein gelöschtes Template kann danach nicht mehr abgerufen, aufgelistet oder zum Versand verwendet werden: eine Sendeanfrage, die darauf verweist, ob sofort oder geplant, wird mit 400 TEMPLATE_NOT_FOUND abgelehnt; das gilt auch für eine Planung, deren Template vor ihrem Fälligkeitszeitpunkt gelöscht wird.

Templates beim Versenden verwenden

Verweisen Sie in Ihrer Sendeanfrage per ID auf ein Template. Betreff und Inhalt des Templates werden verwendet, wobei Variablen ersetzt werden:

Send with template
{
  "from": { "email": "[email protected]" },
  "to": [
    {
      "email": "[email protected]",
      "variables": {
        "firstName": "Jane",
        "orderNumber": "ORD-12345"
      }
    }
  ],
  "templateId": "t8x2m4q9zk7wpr",
  "variables": {
    "companyName": "Acme Inc"
  }
}

Wenn templateId gesetzt ist, wird immer der gerenderte Betreff des Templates verwendet; ein subject in der Sendeanfrage wird ignoriert.

Planlimits

Die Anzahl der Templates, die Sie erstellen können, hängt von Ihrem Tarif ab. Wenn Sie das Limit erreichen, gibt das Erstellen eines neuen Templates 403 PLAN_LIMIT_REACHED zurück.

Nächste Schritte

  • REST API: E-Mails mit Templates versenden
  • Batch-Versand: Templates mit Massen-E-Mails verwenden
  • Geplante E-Mails: Templates über /v1/transactional/send mit scheduledAt verwenden (der Planungs-Endpunkt hat kein templateId-Feld)

Auf dieser Seite