Ir al contenido

Guía de Handlebars

Las plantillas de Frontmail usan la sintaxis de Handlebars en el cuerpo HTML, la versión de texto, el asunto y los campos de destinatario. Frontmail ejecuta Handlebars en un entorno aislado y restringido: solo existen los helpers que aparecen en esta página, los partials no están disponibles y todos los valores se escapan.

<p>Hola, {{name}}:</p>
<p>Tu reserva para el {{booking.date}} está confirmada.</p> {{!-- objeto anidado --}}
<p>{{default company "(sin empresa)"}}</p> {{!-- valor alternativo --}}

Un valor que falta se renderiza como una cadena vacía. Usa {{!-- … --}} para comentarios que nunca llegan al correo.

{{#if newsletter}}
<p>¡Gracias por suscribirte!</p>
{{else}}
<p>Puedes suscribirte cuando quieras.</p>
{{/if}}
{{#unless paid}}<p>El pago está pendiente.</p>{{/unless}}
{{#if (eq topic "support")}}<p>Nuestro equipo de soporte te responderá en un día.</p>{{/if}}
{{#if (and vip (gt total 1000))}}<p>🎁 Envío gratis</p>{{/if}}
{{#if (or (eq country "ES") (eq country "MX"))}}<p>Envío gratis</p>{{/if}}

{{#if}} trata como falso false, 0, "", null, los valores que faltan y las listas vacías.

Usa un parámetro list con itemFields:

<table>
{{#each items}}
<tr>
<td>{{@index}}</td>
<td>{{title}}</td>
<td>{{qty}} × {{formatMoney price ../currency}}</td>
</tr>
{{else}}
<tr><td colspan="3">No hay artículos.</td></tr>
{{/each}}
</table>

Dentro de {{#each}}, this es el elemento actual; están disponibles @index (empieza en 0), @first y @last, y ../ accede al ámbito superior. {{#with customer}}…{{/with}} cambia de ámbito y {{lookup map key}} lee una clave dinámica.

Helper Ejemplo Resultado
formatDate value [style] [timeZone=…] [locale=…] {{formatDate arrival "long"}} October 1, 2026 / 1 de octubre de 2026
formatNumber value [decimals=n] {{formatNumber 1234.5 decimals=2}} 1,234.50 / 1234,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}} lucia@example.es
default value fallback… {{default nickname name "amigo"}} el primer valor no vacío
eq a b · ne a b {{#if (eq status "paid")}} igualdad flexible (1 es igual a "1")
gt a b · lt a b {{#if (gt qty 10)}} comparación numérica
and a b … · or a b … · not a {{#if (and a (not b))}} booleanos (los valores vacíos son falsos)
json value {{json items}} texto JSON (escapado); útil para depurar
nl2br value {{nl2br message}} texto escapado con los saltos de línea convertidos en <br>

Estilos de formatDate: date, datetime, time, short, long, full, iso. El idioma del resultado sigue el idioma en que se envía el correo – el idioma predeterminado de la plantilla o la traducción elegida –; puedes cambiarlo en cada llamada con locale="es". Las horas usan la zona horaria de la organización, salvo que pases timeZone="Europe/Madrid".

Llamar a cualquier otro helper es un error de compilación, que aparece en las comprobaciones de la plantilla.

Variable Valor
{{frontmail.message_id}} El ID del mensaje, p. ej. msg_01J9Z3K7Q2; útil como número de referencia.
{{frontmail.sent_at}} Marca de tiempo ISO del renderizado, p. ej. 2026-09-24T10:11:05.000Z. Combínala con formatDate.
{{frontmail.origin}} El Origin de la solicitud del navegador (p. ej. https://example.com); vacío en los envíos desde el servidor.

frontmail está reservado: no puedes definir un parámetro con ese nombre.

Frontmail escapa como HTML todo lo que se muestra, incluidas las formas {{{triple}}} y {{& ampersand}}. Un visitante que escriba <a href="…">clic</a> en tu formulario verá exactamente ese texto en el correo, no un enlace.

Cuando de verdad necesitas marcado procedente de los parámetros (por ejemplo, texto enriquecido de tu propio CMS), declara el parámetro con el tipo html. Su valor se sanea con una lista de elementos permitidos:

  • etiquetas: a, b, strong, i, em, u, s, p, br, div, span, h1–h6, ul, ol, li, blockquote, pre, code, hr, img, table y sus partes, small, sub, sup, center, font;
  • enlaces: http, https, mailto, tel; imágenes: http, https, cid;
  • estilos en línea: colores, grosor/estilo/tamaño de fuente, interlineado, alineación/decoración del texto, margin, padding, width, height, max-width;
  • todo lo demás (scripts, iframes, formularios, manejadores de eventos, URL javascript:) se elimina.

Muéstralo con un simple {{body_html}}: el valor saneado se imprime como marcado.

La versión de texto generada automáticamente se obtiene del HTML renderizado (los enlaces pasan a ser texto (url) y las tablas, líneas). Si editas la versión de texto a mano, se renderiza con las mismas reglas de Handlebars, pero sin escapado HTML.