Aller au contenu

Guide Handlebars

Les modèles Frontmail utilisent la syntaxe Handlebars dans le corps HTML, la version texte, l’objet et les champs de destinataires. Frontmail exécute Handlebars dans un environnement isolé et verrouillé : seuls les helpers listés sur cette page existent, les partials ne sont pas disponibles et chaque valeur est échappée.

<p>Bonjour {{name}},</p>
<p>Votre réservation du {{booking.date}} est confirmée.</p> {{!-- objet imbriqué --}}
<p>{{default company "(sans entreprise)"}}</p> {{!-- valeur de repli --}}

Une valeur manquante est rendue comme une chaîne vide. Utilisez {{!-- … --}} pour les commentaires qui ne doivent jamais apparaître dans l’e-mail.

{{#if newsletter}}
<p>Merci pour votre inscription !</p>
{{else}}
<p>Vous pouvez vous inscrire à tout moment.</p>
{{/if}}
{{#unless paid}}<p>Le paiement est en attente.</p>{{/unless}}
{{#if (eq topic "support")}}<p>Notre support vous répondra sous un jour.</p>{{/if}}
{{#if (and vip (gt total 1000))}}<p>🎁 Livraison offerte</p>{{/if}}
{{#if (or (eq country "FR") (eq country "BE"))}}<p>Livraison gratuite</p>{{/if}}

{{#if}} considère comme faux false, 0, "", null, les valeurs manquantes et les listes vides.

Utilisez un paramètre list avec itemFields :

<table>
{{#each items}}
<tr>
<td>{{@index}}</td>
<td>{{title}}</td>
<td>{{qty}} × {{formatMoney price ../currency}}</td>
</tr>
{{else}}
<tr><td colspan="3">Aucun article.</td></tr>
{{/each}}
</table>

À l’intérieur de {{#each}}, this est l’élément courant, @index (à partir de 0), @first et @last sont disponibles, et ../ permet d’accéder au contexte parent. {{#with customer}}…{{/with}} change de contexte et {{lookup map key}} lit une clé dynamique.

Helper Exemple Résultat
formatDate value [style] [timeZone=…] [locale=…] {{formatDate arrival "long"}} October 1, 2026 / 1 octobre 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}} claire@example.fr
default value fallback… {{default nickname name "ami"}} première valeur non vide
eq a b · ne a b {{#if (eq status "paid")}} égalité souple (1 est égal à "1")
gt a b · lt a b {{#if (gt qty 10)}} comparaison numérique
and a b … · or a b … · not a {{#if (and a (not b))}} booléens (les valeurs vides sont fausses)
json value {{json items}} texte JSON (échappé) – pratique pour le débogage
nl2br value {{nl2br message}} texte échappé dont les retours à la ligne deviennent des <br>

Styles de formatDate : date, datetime, time, short, long, full, iso. La langue de sortie suit la langue dans laquelle l’e-mail est envoyé – la langue par défaut du modèle ou la traduction choisie ; remplacez-la ponctuellement avec locale="fr". Les heures utilisent le fuseau horaire de l’organisation, sauf si vous passez timeZone="Europe/Paris".

L’appel de tout autre helper est une erreur de compilation, affichée dans les vérifications du modèle.

Variable Valeur
{{frontmail.message_id}} L’identifiant du message, p. ex. msg_01J9Z3K7Q2 – utile comme numéro de référence.
{{frontmail.sent_at}} Horodatage ISO du rendu, p. ex. 2026-09-24T10:11:05.000Z. À combiner avec formatDate.
{{frontmail.origin}} L’Origin de la requête du navigateur (p. ex. https://example.com), vide pour les envois côté serveur.

frontmail est réservé – vous ne pouvez pas définir de paramètre portant ce nom.

Frontmail échappe en HTML chaque sortie, y compris les formes {{{triple}}} et {{& ampersand}}. Un visiteur qui saisit <a href="…">click</a> dans votre formulaire verra exactement ce texte dans l’e-mail, et non un lien.

Lorsque vous avez réellement besoin de balisage provenant des paramètres (par exemple du texte enrichi issu de votre propre CMS), déclarez le paramètre avec le type html. Sa valeur est assainie selon une liste blanche :

  • balises : a, b, strong, i, em, u, s, p, br, div, span, h1–h6, ul, ol, li, blockquote, pre, code, hr, img, table et ses éléments, small, sub, sup, center, font ;
  • liens : http, https, mailto, tel ; images : http, https, cid ;
  • styles en ligne : couleurs, graisse/style/taille de police, interligne, alignement/décoration du texte, margin, padding, width, height, max-width ;
  • tout le reste (scripts, iframes, formulaires, gestionnaires d’événements, URL javascript:) est supprimé.

Affichez-le avec un simple {{body_html}} – la valeur assainie est rendue comme du balisage.

La version texte générée automatiquement est produite à partir du HTML rendu (les liens deviennent texte (url), les tableaux deviennent des lignes). Si vous modifiez la version texte à la main, elle est rendue avec les mêmes règles Handlebars, mais sans échappement HTML.