Handlebars-Leitfaden
Frontmail-Vorlagen verwenden die Handlebars-Syntax im HTML-Body, in der Textversion, im Betreff und in den Empfängerfeldern. Frontmail führt Handlebars in einer isolierten, abgesicherten Umgebung aus: Es gibt nur die auf dieser Seite aufgeführten Helper, Partials sind nicht verfügbar, und jeder Wert wird maskiert.
Variablen
Abschnitt betitelt „Variablen“<p>Guten Tag {{name}},</p><p>Ihre Buchung für den {{booking.date}} ist bestätigt.</p> {{!-- verschachteltes Objekt --}}<p>{{default company "(ohne Firma)"}}</p> {{!-- Ersatzwert --}}Ein fehlender Wert wird als leerer String gerendert. Für Kommentare, die nie in der E-Mail landen,
verwenden Sie {{!-- … --}}.
Bedingungen
Abschnitt betitelt „Bedingungen“{{#if newsletter}} <p>Danke für Ihre Anmeldung!</p>{{else}} <p>Sie können sich jederzeit anmelden.</p>{{/if}}
{{#unless paid}}<p>Die Zahlung steht noch aus.</p>{{/unless}}
{{#if (eq topic "support")}}<p>Unser Support antwortet innerhalb eines Tages.</p>{{/if}}{{#if (and vip (gt total 1000))}}<p>🎁 Kostenloser Versand</p>{{/if}}{{#if (or (eq country "DE") (eq country "AT"))}}<p>Versandkostenfrei</p>{{/if}}{{#if}} behandelt false, 0, "", null, fehlende Werte und leere Listen als falsch.
Schleifen
Abschnitt betitelt „Schleifen“Verwenden Sie einen Parameter vom Typ list mit itemFields:
<table> {{#each items}} <tr> <td>{{@index}}</td> <td>{{title}}</td> <td>{{qty}} × {{formatMoney price ../currency}}</td> </tr> {{else}} <tr><td colspan="3">Keine Artikel.</td></tr> {{/each}}</table>Innerhalb von {{#each}} ist this der aktuelle Eintrag; verfügbar sind @index (ab 0), @first
und @last, und mit ../ erreichen Sie den übergeordneten Kontext. {{#with customer}}…{{/with}}
wechselt den Kontext, und {{lookup map key}} liest einen dynamischen Schlüssel.
| Helper | Beispiel | Ergebnis |
|---|---|---|
formatDate value [style] [timeZone=…] [locale=…] |
{{formatDate arrival "long"}} |
October 1, 2026 / 1. Oktober 2026 |
formatNumber value [decimals=n] |
{{formatNumber 1234.5 decimals=2}} |
1,234.50 / 1.234,50 |
formatMoney amount currency [minor=true] |
{{formatMoney 49 "EUR"}} · {{formatMoney 4900 "EUR" minor=true}} |
€49.00 / 49,00 € |
uppercase value |
{{uppercase code}} |
ABC123 |
lowercase value |
{{lowercase email}} |
anna@example.de |
default value fallback… |
{{default nickname name "Freund"}} |
erster nicht leerer Wert |
eq a b · ne a b |
{{#if (eq status "paid")}} |
lockere Gleichheit (1 ist gleich "1") |
gt a b · lt a b |
{{#if (gt qty 10)}} |
numerischer Vergleich |
and a b … · or a b … · not a |
{{#if (and a (not b))}} |
Booleans (leere Werte sind falsch) |
json value |
{{json items}} |
JSON-Text (maskiert) – praktisch zum Debuggen |
nl2br value |
{{nl2br message}} |
maskierter Text, Zeilenumbrüche werden zu <br> |
Stile von formatDate: date, datetime, time, short, long, full, iso. Die Sprache der
Ausgabe richtet sich nach der Sprache, in der die E-Mail versendet wird – der Standardsprache der
Vorlage oder der gewählten Übersetzung; pro Aufruf überschreiben Sie
sie mit locale="de". Zeiten verwenden die Zeitzone der Organisation, es sei denn, Sie übergeben
timeZone="Europe/Berlin".
Der Aufruf jedes anderen Helpers ist ein Kompilierfehler und erscheint in den Prüfungen der Vorlage.
Systemvariablen
Abschnitt betitelt „Systemvariablen“| Variable | Wert |
|---|---|
{{frontmail.message_id}} |
Die ID der Nachricht, z. B. msg_01J9Z3K7Q2 – praktisch als Referenznummer. |
{{frontmail.sent_at}} |
ISO-Zeitstempel des Renderns, z. B. 2026-09-24T10:11:05.000Z. Kombinieren Sie ihn mit formatDate. |
{{frontmail.origin}} |
Der Origin der Browser-Anfrage (z. B. https://example.com), leer bei serverseitigem Versand. |
frontmail ist reserviert – Sie können keinen Parameter mit diesem Namen definieren.
Maskierung und der Typ html
Abschnitt betitelt „Maskierung und der Typ html“Frontmail maskiert jede Ausgabe als HTML, auch in den Formen {{{triple}}} und {{& ampersand}}.
Tippt ein Besucher <a href="…">klick</a> in Ihr Formular, sieht er in der E-Mail genau diesen Text –
keinen Link.
Wenn Sie wirklich Markup aus Parametern brauchen (z. B. formatierten Text aus Ihrem eigenen CMS),
deklarieren Sie den Parameter mit dem Typ html. Sein Wert wird anhand einer Allowlist bereinigt:
- Tags:
a,b,strong,i,em,u,s,p,br,div,span,h1–h6,ul,ol,li,blockquote,pre,code,hr,img,tableund seine Bestandteile,small,sub,sup,center,font; - Links:
http,https,mailto,tel; Bilder:http,https,cid; - Inline-Styles: Farben, Schriftstärke/-stil/-größe, Zeilenhöhe, Textausrichtung/-dekoration, Margin, Padding, Breite, Höhe, max-width;
- alles andere (Skripte, iframes, Formulare, Event-Handler,
javascript:-URLs) wird entfernt.
Geben Sie ihn mit einfachem {{body_html}} aus – der bereinigte Wert wird als Markup ausgegeben.
Textversion
Abschnitt betitelt „Textversion“Die automatisch erzeugte Textversion entsteht aus dem gerenderten HTML (Links werden zu
Text (URL), Tabellen zu Zeilen). Bearbeiten Sie die Textversion selbst, wird sie nach denselben
Handlebars-Regeln gerendert, allerdings ohne HTML-Maskierung.