Plantillas de correo electrónico avanzadas

Pájaro

25 mar 2016

Correo electrónico

1 min read

Plantillas de correo electrónico avanzadas

Puntos clave

    • Las plantillas de SparkPost admiten la composición de correo electrónico simple y avanzada, incluyendo HTML, texto, lógica condicional, bucles y datos dinámicos por destinatario a través de variables de sustitución.

    • Se pueden pasar matrices en los datos de sustitución, permitiéndote recorrer elementos (por ejemplo, listas de archivos, actividad reciente, filas de tabla personalizadas) para generar secciones personalizadas para cada destinatario.

    • Las llaves triples {{{ }}} te permiten insertar HTML sin procesar y sin escapar, lo cual es esencial cuando tus datos de sustitución ya contienen marcado.

    • Los anexos se pueden enviar fácilmente al usar el punto final de transmisión (content.attachments), que abstrae los límites MIME y la codificación por ti.

    • Las imágenes en línea funcionan de manera similar a los anexos pero se muestran en el cuerpo usando referencias cid:.

    • Las plantillas en sí no admiten nativamente anexos, pero puedes incluirlos creando un correo electrónico RFC 5322 completo con partes MIME y almacenándolo como una plantilla email_rfc822.

    • Al crear plantillas RFC 5322 en crudo, las sustituciones aún funcionan, pero solo en las cabeceras y las primeras partes MIME de HTML y texto.

    • Utilizar el cliente de correo de tu lenguaje de programación (por ejemplo, JavaMail) ofrece otro camino: generar correos electrónicos MIME completos programáticamente y enviarlos a través de la API de transmisiones de SparkPost.

    • Para facilitar el mantenimiento, mantén el marcado y los datos separados siempre que sea posible, especialmente al construir plantillas que incluyen bucles o múltiples secciones MIME.

    • Las características avanzadas de las plantillas (condicionales, expresiones, iteración de arreglos) permiten a los desarrolladores construir correos electrónicos sofisticados y personalizados sin tener que reescribir plantillas completas para cada caso de uso.

Destacados de Q&A

  • ¿Pueden los templates de SparkPost manejar bucles y matrices?

    Sí. Las plantillas pueden iterar sobre matrices utilizando construcciones for each. Esto permite tablas dinámicas, listas o bloques HTML repetidos para cada destinatario.

  • ¿Para qué se utilizan las triple llaves?

    {{{ variable }}} inserta HTML sin procesar sin escape. Es necesario cuando sus datos de sustitución ya incluyen marcado HTML.

  • ¿Puedo enviar archivos adjuntos con templates?

    No directamente a través de campos de plantilla — pero puede hacerlo almacenando una plantilla email_rfc822 que incluya partes de la adjunta MIME.

  • ¿Funciona todavía la sustitución en las plantillas RFC 5322?

    Sí, pero solo dentro de los encabezados y las primeras partes MIME de HTML + texto.

  • ¿Cuándo debería usar el endpoint de transmisión en lugar de las plantillas?

    Cuando envíe archivos adjuntos dinámicos, imágenes en línea o cuando necesite que SparkPost maneje automáticamente la gestión de MIME.

  • ¿Es mejor integrar la lógica de vistas o mantenerla separada?

    La mejor práctica es mantener la marcación de su vista y los datos por separado. Usa plantillas para la presentación y pasa datos de sustitución limpios y estructurados.

  • ¿Puedo generar un correo electrónico MIME completo usando una biblioteca de programación?

    Sí. Librerías como JavaMail te permiten construir mensajes RFC 5322 de manera programática y enviarlos a través de la API de transmisión de SparkPost.

  • ¿Se utilizan ampliamente las funciones avanzadas de plantilla?

    Sorprendentemente pocos desarrolladores los utilizan, pero desbloquean una personalización poderosa: bucles, condicionales, lógica en línea y estructuras MIME personalizadas.

  • ¿Por qué necesitaría alguna vez las plantillas RFC 5322?

    Solo al enviar correos electrónicos complejos de varias partes (archivos adjuntos, tipos MIME personalizados) que la abstracción estándar de plantillas de SparkPost no admite.

Esta publicación está dirigida al desarrollador que quiere sacar el máximo provecho de las capacidades de plantillas de correo electrónico de SparkPost. Se supone que te sientes cómodo leyendo contenido JSON y siguiendo el flujo de programación básico. Los términos que pueden ser nuevos para ti se introducen como RFC 5322, el texto está vinculado a su referencia de fuente.

Con eso fuera del camino, saltemos de inmediato.

Las capacidades de plantillas y capacidades de transmisión de SparkPost hacen que el envío de correos electrónicos sea sencillo. Esas capacidades proporcionan una abstracción para el contenido de texto y HTML lo que significa que la mayoría de las veces no hay necesidad de codificar directamente el formato de correo electrónico bruto que se define en RFC 5322 anteriormente conocido como (RFC 822). Pero a veces puede que quieras crear mensajes más complejos que tengan otras Extensiones de Correo de Internet Multipropósito (MIME) partes que no están directamente expuestas a través de la interfaz RESTful de SparkPost.

Esta publicación está dirigida al desarrollador que quiere sacar el máximo provecho de las capacidades de plantillas de correo electrónico de SparkPost. Se supone que te sientes cómodo leyendo contenido JSON y siguiendo el flujo de programación básico. Los términos que pueden ser nuevos para ti se introducen como RFC 5322, el texto está vinculado a su referencia de fuente.

Con eso fuera del camino, saltemos de inmediato.

Las capacidades de plantillas y capacidades de transmisión de SparkPost hacen que el envío de correos electrónicos sea sencillo. Esas capacidades proporcionan una abstracción para el contenido de texto y HTML lo que significa que la mayoría de las veces no hay necesidad de codificar directamente el formato de correo electrónico bruto que se define en RFC 5322 anteriormente conocido como (RFC 822). Pero a veces puede que quieras crear mensajes más complejos que tengan otras Extensiones de Correo de Internet Multipropósito (MIME) partes que no están directamente expuestas a través de la interfaz RESTful de SparkPost.

Esta publicación está dirigida al desarrollador que quiere sacar el máximo provecho de las capacidades de plantillas de correo electrónico de SparkPost. Se supone que te sientes cómodo leyendo contenido JSON y siguiendo el flujo de programación básico. Los términos que pueden ser nuevos para ti se introducen como RFC 5322, el texto está vinculado a su referencia de fuente.

Con eso fuera del camino, saltemos de inmediato.

Las capacidades de plantillas y capacidades de transmisión de SparkPost hacen que el envío de correos electrónicos sea sencillo. Esas capacidades proporcionan una abstracción para el contenido de texto y HTML lo que significa que la mayoría de las veces no hay necesidad de codificar directamente el formato de correo electrónico bruto que se define en RFC 5322 anteriormente conocido como (RFC 822). Pero a veces puede que quieras crear mensajes más complejos que tengan otras Extensiones de Correo de Internet Multipropósito (MIME) partes que no están directamente expuestas a través de la interfaz RESTful de SparkPost.

Enviando el Template

La buena noticia es que crear el contenido RFC 5322 fue la parte difícil. A partir de aquí, enviar esa plantilla con SparkPost es exactamente lo mismo que enviar cualquier otra plantilla.

Aquí está cómo enviamos esa plantilla y llenamos los datos de sustitución:

{
  "campaign_id": "MyCampaign",
  "return_path": "myReturnPath@yourdomain.com",
  "substitution_data": {
    "replyto": "myReplyToh@yourdomain.com",
    "from": "MyFrom@yourdomain.com",
    "subject": "my subject",
    "body1": "Extra content for the HTML part",
    "body2": "Extra content for the text part"
  },
  "recipients": [
    {
      "substitution_data": {},
      "address": {
        "email": "test1@domain.com",
        "name": "test1"
      }
    }
  ],
  "content": {
    "template_id": "xxxxxxx",
    "use_draft_template": true
  }
}

La buena noticia es que crear el contenido RFC 5322 fue la parte difícil. A partir de aquí, enviar esa plantilla con SparkPost es exactamente lo mismo que enviar cualquier otra plantilla.

Aquí está cómo enviamos esa plantilla y llenamos los datos de sustitución:

{
  "campaign_id": "MyCampaign",
  "return_path": "myReturnPath@yourdomain.com",
  "substitution_data": {
    "replyto": "myReplyToh@yourdomain.com",
    "from": "MyFrom@yourdomain.com",
    "subject": "my subject",
    "body1": "Extra content for the HTML part",
    "body2": "Extra content for the text part"
  },
  "recipients": [
    {
      "substitution_data": {},
      "address": {
        "email": "test1@domain.com",
        "name": "test1"
      }
    }
  ],
  "content": {
    "template_id": "xxxxxxx",
    "use_draft_template": true
  }
}

La buena noticia es que crear el contenido RFC 5322 fue la parte difícil. A partir de aquí, enviar esa plantilla con SparkPost es exactamente lo mismo que enviar cualquier otra plantilla.

Aquí está cómo enviamos esa plantilla y llenamos los datos de sustitución:

{
  "campaign_id": "MyCampaign",
  "return_path": "myReturnPath@yourdomain.com",
  "substitution_data": {
    "replyto": "myReplyToh@yourdomain.com",
    "from": "MyFrom@yourdomain.com",
    "subject": "my subject",
    "body1": "Extra content for the HTML part",
    "body2": "Extra content for the text part"
  },
  "recipients": [
    {
      "substitution_data": {},
      "address": {
        "email": "test1@domain.com",
        "name": "test1"
      }
    }
  ],
  "content": {
    "template_id": "xxxxxxx",
    "use_draft_template": true
  }
}

Composición de Email Simplificada

Primero, revisemos un escenario de día soleado para enviar un correo electrónico. Utiliza el transmission endpoint para proporcionar el text y contenido HTML. Detrás de escena, SparkPost se encarga de componer un correo electrónico válido RFC 5322. SparkPost insertará variables de sustitución de substitution_data en el texto y contenido HTML. Esta es una forma poderosa de generar contenido personalizado para cada destinatario en una plantilla común.

Aquí hay un ejemplo transmission con contenido HTML y de texto con substitution_data.

{
  "options": {
    "open_tracking": true,
    "click_tracking": true
  },
  "campaign_id": "christmas_campaign",
  "return_path": "bounces-christmas-campaign@domain.com",
  "metadata": {
    "user_type": "students"
  },
  "substitution_data": {
    "sender": "Big Store Team"
  },
  "recipients": [
    {
      "return_path": "123@bounces.domain.com",
      "address": {
        "email": "wilma@domain.com",
        "name": "Wilma Flintstone"
      },
      "tags": [
        "greeting",
        "prehistoric",
        "fred",
        "flintstone"
      ],
      "metadata": {
        "place": "Bedrock"
      },
      "substitution_data": {
        "customer_type": "Platinum"
      }
    }
  ],
  "content": {
    "from": {
      "name": "Fred Flintstone",
      "email": "fred@domain.com"
    },
    "subject": "Big Christmas savings!",
    "reply_to": "Christmas Sales <sales@domain.com>",
    "headers": {
      "X-Customer-Campaign-ID": "christmas_campaign"
    },
    "text": "Hi {{address.name}} \nSave big this Christmas in your area {{place}}! \nClick http://www.mysite.com and get huge discount\n Hurry, this offer is only to {{user_type}}\n {{sender}}",
    "html": "<p>Hi {{address.name}} <br>Save big this Christmas in your area {{place}}! <br>Click <a href=\"http://www.mysite.com\">here</a> and get huge discount</p><p>Hurry, this offer is only to {{user_type}}</p><p>{{sender}}</p>"
  }
}


Visión general de capacidades de sustitución

Capacidad

Descripción

Sustitución básica de variables

Inserta valores dinámicos únicos en texto o contenido HTML

Lógica condicional

Genera contenido diferente basado en la evaluación de expresiones o valores booleanos

Iteración de arrays

Recorre arreglos (por ejemplo, listas de archivos) para generar contenido repetido

Inserción de HTML sin procesar ({{{ }}})

Permite HTML sin escapar para situaciones donde el marcado proviene de la fuente de datos

Personalización por destinatario

Soporta contenido completamente único para cada destinatario


Primero, revisemos un escenario de día soleado para enviar un correo electrónico. Utiliza el transmission endpoint para proporcionar el text y contenido HTML. Detrás de escena, SparkPost se encarga de componer un correo electrónico válido RFC 5322. SparkPost insertará variables de sustitución de substitution_data en el texto y contenido HTML. Esta es una forma poderosa de generar contenido personalizado para cada destinatario en una plantilla común.

Aquí hay un ejemplo transmission con contenido HTML y de texto con substitution_data.

{
  "options": {
    "open_tracking": true,
    "click_tracking": true
  },
  "campaign_id": "christmas_campaign",
  "return_path": "bounces-christmas-campaign@domain.com",
  "metadata": {
    "user_type": "students"
  },
  "substitution_data": {
    "sender": "Big Store Team"
  },
  "recipients": [
    {
      "return_path": "123@bounces.domain.com",
      "address": {
        "email": "wilma@domain.com",
        "name": "Wilma Flintstone"
      },
      "tags": [
        "greeting",
        "prehistoric",
        "fred",
        "flintstone"
      ],
      "metadata": {
        "place": "Bedrock"
      },
      "substitution_data": {
        "customer_type": "Platinum"
      }
    }
  ],
  "content": {
    "from": {
      "name": "Fred Flintstone",
      "email": "fred@domain.com"
    },
    "subject": "Big Christmas savings!",
    "reply_to": "Christmas Sales <sales@domain.com>",
    "headers": {
      "X-Customer-Campaign-ID": "christmas_campaign"
    },
    "text": "Hi {{address.name}} \nSave big this Christmas in your area {{place}}! \nClick http://www.mysite.com and get huge discount\n Hurry, this offer is only to {{user_type}}\n {{sender}}",
    "html": "<p>Hi {{address.name}} <br>Save big this Christmas in your area {{place}}! <br>Click <a href=\"http://www.mysite.com\">here</a> and get huge discount</p><p>Hurry, this offer is only to {{user_type}}</p><p>{{sender}}</p>"
  }
}


Visión general de capacidades de sustitución

Capacidad

Descripción

Sustitución básica de variables

Inserta valores dinámicos únicos en texto o contenido HTML

Lógica condicional

Genera contenido diferente basado en la evaluación de expresiones o valores booleanos

Iteración de arrays

Recorre arreglos (por ejemplo, listas de archivos) para generar contenido repetido

Inserción de HTML sin procesar ({{{ }}})

Permite HTML sin escapar para situaciones donde el marcado proviene de la fuente de datos

Personalización por destinatario

Soporta contenido completamente único para cada destinatario


Primero, revisemos un escenario de día soleado para enviar un correo electrónico. Utiliza el transmission endpoint para proporcionar el text y contenido HTML. Detrás de escena, SparkPost se encarga de componer un correo electrónico válido RFC 5322. SparkPost insertará variables de sustitución de substitution_data en el texto y contenido HTML. Esta es una forma poderosa de generar contenido personalizado para cada destinatario en una plantilla común.

Aquí hay un ejemplo transmission con contenido HTML y de texto con substitution_data.

{
  "options": {
    "open_tracking": true,
    "click_tracking": true
  },
  "campaign_id": "christmas_campaign",
  "return_path": "bounces-christmas-campaign@domain.com",
  "metadata": {
    "user_type": "students"
  },
  "substitution_data": {
    "sender": "Big Store Team"
  },
  "recipients": [
    {
      "return_path": "123@bounces.domain.com",
      "address": {
        "email": "wilma@domain.com",
        "name": "Wilma Flintstone"
      },
      "tags": [
        "greeting",
        "prehistoric",
        "fred",
        "flintstone"
      ],
      "metadata": {
        "place": "Bedrock"
      },
      "substitution_data": {
        "customer_type": "Platinum"
      }
    }
  ],
  "content": {
    "from": {
      "name": "Fred Flintstone",
      "email": "fred@domain.com"
    },
    "subject": "Big Christmas savings!",
    "reply_to": "Christmas Sales <sales@domain.com>",
    "headers": {
      "X-Customer-Campaign-ID": "christmas_campaign"
    },
    "text": "Hi {{address.name}} \nSave big this Christmas in your area {{place}}! \nClick http://www.mysite.com and get huge discount\n Hurry, this offer is only to {{user_type}}\n {{sender}}",
    "html": "<p>Hi {{address.name}} <br>Save big this Christmas in your area {{place}}! <br>Click <a href=\"http://www.mysite.com\">here</a> and get huge discount</p><p>Hurry, this offer is only to {{user_type}}</p><p>{{sender}}</p>"
  }
}


Visión general de capacidades de sustitución

Capacidad

Descripción

Sustitución básica de variables

Inserta valores dinámicos únicos en texto o contenido HTML

Lógica condicional

Genera contenido diferente basado en la evaluación de expresiones o valores booleanos

Iteración de arrays

Recorre arreglos (por ejemplo, listas de archivos) para generar contenido repetido

Inserción de HTML sin procesar ({{{ }}})

Permite HTML sin escapar para situaciones donde el marcado proviene de la fuente de datos

Personalización por destinatario

Soporta contenido completamente único para cada destinatario


Sustituir Arrays de Datos

Muchas personas se dan cuenta de que los puntos de transmisión y plantillas de SparkPost pueden hacer sustitución simple de contenido en encabezados de correo electrónico y cuerpos de correo electrónico. Pero muchos pasan por alto la capacidad de proporcionar contenido condicional o matrices de datos que también se pueden sustituir. También puedes proporcionar contenido único por destinatario. En este ejemplo, enviamos una matriz de enlaces únicos a cada destinatario.

Esto se logra proporcionando una matriz JSON de datos que se poblará en el cuerpo del correo electrónico. Una vez que se proporcionen los datos, SparkPost utilizará la lógica en la plantilla para poblarla.

En este ejemplo, SparkPost buscará datos de sustitución llamados “files_html” y hará un “for each” en cada elemento de la matriz. Creará una fila con el valor de “file” en el elemento “files_html”. Nota los triples corchetes alrededor de “loop_var.file“. Esto es porque cada elemento de la matriz contiene HTML y necesitamos indicarle al servidor que lo use tal cual y no lo escape. La parte de texto será una etiqueta de texto simple y la URL al archivo.

<table>
  {{each files_html}}
    <tr>
      <td>{{{loop_var.file}}}</td>
    </tr>
  {{ end }}
</table>


Aquí está el ejemplo completo en funcionamiento:

{
  "recipients": [
    {
      "address": {
        "email": "recipient1@domain.com"
      },
      "substitution_data": {
        "files_html": [
          {
            "file": "<a href=\"http://domain.com/file1a.txt\">File 1a Description</a>"
          },
          {
            "file": "<a href=\"http://domain.com/file2a.txt\">File 2a Description</a>"
          }
        ],
        "files_plain": [
          {
            "file": "File 1a -- http://domain.com/file1a.txt"
          },
          {
            "file": "File 2a -- http://domain.com/file2a.txt"
          }
        ]
      }
    },
    {
      "address": {
        "email": "recipient2@domain.com"
      },
      "substitution_data": {
        "files_html": [
          {
            "file": "<a href=\"http://domain.com/file1b.txt\">File 1b Description</a>"
          },
          {
            "file": "<a href=\"http://domain.com/file2b.txt\">File 2b Description</a>"
          }
        ],
        "files_plain": [
          {
            "file": "File 1b -- http://domain.com/file1b.txt"
          },
          {
            "file": "File 2b -- http://domain.com/file2b.txt"
          }
        ]
      }
    }
  ],
  "return_path": "chris@test.domain.com",
  "content": {
    "from": {
      "name": "chris@test.domain.com",
      "email": "chris@test.domain.com"
    },
    "subject": "Sending with SparkPost is Fun",
    "html": "<b>Your Files:</b><br>\n<table>\n  {{each files_html}}\n    <tr><td>{{{loop_var.file}}}</td></tr>\n  {{ end }}\n</table>\n",
    "text": "Your Files:\n{{each files_plain}} {{loop_var.file}}\n{{ end }}\n"
  }
}

Consejo profesional: En tu código, es recomendable mantener el marcado de vista separado de los datos, pero el objetivo aquí era mantener el ejemplo lo más simple y fácil de seguir posible, por lo que creamos dos matrices. Una matriz es para la parte HTML y la otra es para la parte de texto. En producción, sería común tener un conjunto de datos y escribir la lógica en el código de la plantilla.

Muchas personas se dan cuenta de que los puntos de transmisión y plantillas de SparkPost pueden hacer sustitución simple de contenido en encabezados de correo electrónico y cuerpos de correo electrónico. Pero muchos pasan por alto la capacidad de proporcionar contenido condicional o matrices de datos que también se pueden sustituir. También puedes proporcionar contenido único por destinatario. En este ejemplo, enviamos una matriz de enlaces únicos a cada destinatario.

Esto se logra proporcionando una matriz JSON de datos que se poblará en el cuerpo del correo electrónico. Una vez que se proporcionen los datos, SparkPost utilizará la lógica en la plantilla para poblarla.

En este ejemplo, SparkPost buscará datos de sustitución llamados “files_html” y hará un “for each” en cada elemento de la matriz. Creará una fila con el valor de “file” en el elemento “files_html”. Nota los triples corchetes alrededor de “loop_var.file“. Esto es porque cada elemento de la matriz contiene HTML y necesitamos indicarle al servidor que lo use tal cual y no lo escape. La parte de texto será una etiqueta de texto simple y la URL al archivo.

<table>
  {{each files_html}}
    <tr>
      <td>{{{loop_var.file}}}</td>
    </tr>
  {{ end }}
</table>


Aquí está el ejemplo completo en funcionamiento:

{
  "recipients": [
    {
      "address": {
        "email": "recipient1@domain.com"
      },
      "substitution_data": {
        "files_html": [
          {
            "file": "<a href=\"http://domain.com/file1a.txt\">File 1a Description</a>"
          },
          {
            "file": "<a href=\"http://domain.com/file2a.txt\">File 2a Description</a>"
          }
        ],
        "files_plain": [
          {
            "file": "File 1a -- http://domain.com/file1a.txt"
          },
          {
            "file": "File 2a -- http://domain.com/file2a.txt"
          }
        ]
      }
    },
    {
      "address": {
        "email": "recipient2@domain.com"
      },
      "substitution_data": {
        "files_html": [
          {
            "file": "<a href=\"http://domain.com/file1b.txt\">File 1b Description</a>"
          },
          {
            "file": "<a href=\"http://domain.com/file2b.txt\">File 2b Description</a>"
          }
        ],
        "files_plain": [
          {
            "file": "File 1b -- http://domain.com/file1b.txt"
          },
          {
            "file": "File 2b -- http://domain.com/file2b.txt"
          }
        ]
      }
    }
  ],
  "return_path": "chris@test.domain.com",
  "content": {
    "from": {
      "name": "chris@test.domain.com",
      "email": "chris@test.domain.com"
    },
    "subject": "Sending with SparkPost is Fun",
    "html": "<b>Your Files:</b><br>\n<table>\n  {{each files_html}}\n    <tr><td>{{{loop_var.file}}}</td></tr>\n  {{ end }}\n</table>\n",
    "text": "Your Files:\n{{each files_plain}} {{loop_var.file}}\n{{ end }}\n"
  }
}

Consejo profesional: En tu código, es recomendable mantener el marcado de vista separado de los datos, pero el objetivo aquí era mantener el ejemplo lo más simple y fácil de seguir posible, por lo que creamos dos matrices. Una matriz es para la parte HTML y la otra es para la parte de texto. En producción, sería común tener un conjunto de datos y escribir la lógica en el código de la plantilla.

Muchas personas se dan cuenta de que los puntos de transmisión y plantillas de SparkPost pueden hacer sustitución simple de contenido en encabezados de correo electrónico y cuerpos de correo electrónico. Pero muchos pasan por alto la capacidad de proporcionar contenido condicional o matrices de datos que también se pueden sustituir. También puedes proporcionar contenido único por destinatario. En este ejemplo, enviamos una matriz de enlaces únicos a cada destinatario.

Esto se logra proporcionando una matriz JSON de datos que se poblará en el cuerpo del correo electrónico. Una vez que se proporcionen los datos, SparkPost utilizará la lógica en la plantilla para poblarla.

En este ejemplo, SparkPost buscará datos de sustitución llamados “files_html” y hará un “for each” en cada elemento de la matriz. Creará una fila con el valor de “file” en el elemento “files_html”. Nota los triples corchetes alrededor de “loop_var.file“. Esto es porque cada elemento de la matriz contiene HTML y necesitamos indicarle al servidor que lo use tal cual y no lo escape. La parte de texto será una etiqueta de texto simple y la URL al archivo.

<table>
  {{each files_html}}
    <tr>
      <td>{{{loop_var.file}}}</td>
    </tr>
  {{ end }}
</table>


Aquí está el ejemplo completo en funcionamiento:

{
  "recipients": [
    {
      "address": {
        "email": "recipient1@domain.com"
      },
      "substitution_data": {
        "files_html": [
          {
            "file": "<a href=\"http://domain.com/file1a.txt\">File 1a Description</a>"
          },
          {
            "file": "<a href=\"http://domain.com/file2a.txt\">File 2a Description</a>"
          }
        ],
        "files_plain": [
          {
            "file": "File 1a -- http://domain.com/file1a.txt"
          },
          {
            "file": "File 2a -- http://domain.com/file2a.txt"
          }
        ]
      }
    },
    {
      "address": {
        "email": "recipient2@domain.com"
      },
      "substitution_data": {
        "files_html": [
          {
            "file": "<a href=\"http://domain.com/file1b.txt\">File 1b Description</a>"
          },
          {
            "file": "<a href=\"http://domain.com/file2b.txt\">File 2b Description</a>"
          }
        ],
        "files_plain": [
          {
            "file": "File 1b -- http://domain.com/file1b.txt"
          },
          {
            "file": "File 2b -- http://domain.com/file2b.txt"
          }
        ]
      }
    }
  ],
  "return_path": "chris@test.domain.com",
  "content": {
    "from": {
      "name": "chris@test.domain.com",
      "email": "chris@test.domain.com"
    },
    "subject": "Sending with SparkPost is Fun",
    "html": "<b>Your Files:</b><br>\n<table>\n  {{each files_html}}\n    <tr><td>{{{loop_var.file}}}</td></tr>\n  {{ end }}\n</table>\n",
    "text": "Your Files:\n{{each files_plain}} {{loop_var.file}}\n{{ end }}\n"
  }
}

Consejo profesional: En tu código, es recomendable mantener el marcado de vista separado de los datos, pero el objetivo aquí era mantener el ejemplo lo más simple y fácil de seguir posible, por lo que creamos dos matrices. Una matriz es para la parte HTML y la otra es para la parte de texto. En producción, sería común tener un conjunto de datos y escribir la lógica en el código de la plantilla.

Attachments en Transmission Capabilities

El punto de transmisión también proporciona una abstracción para enviar archivos adjuntos. A continuación verá que los archivos adjuntos se especifican en la matriz content.attachments donde cada objeto en la matriz describe un elemento de archivo adjunto individual. Al igual que antes, SparkPost se encargará de codificar text, HTML, substitutions e iterar a través del array de archivos adjuntos para codificar un mensaje de correo electrónico correctamente formado.

Las mejores prácticas dictan que el envío de archivos adjuntos debe evitarse a menos que sea explícitamente requerido como parte de su servicio.

A continuación se presentan los campos requeridos para un archivo adjunto:

  • type: El tipo MIME del archivo adjunto

  • name: El nombre de archivo del archivo adjunto

  • data: Archivo codificado en Base64

Campos Requeridos para Archivos Adjuntos

Campo

Significado

type

Tipo MIME del archivo adjunto

name

Nombre de archivo tal como aparecerá al destinatario

data

Carga útil del archivo codificada en Base64


Así es como se ve un archivo adjunto dentro del contenido de transmisión:

"content": {
  "attachments": [
    {
      "type": "audio/mp3",
      "name": "voicemail.mp3",
      "data": "TVAzIERhdGEK"
    }
  ]
}

También puedes enviar “imágenes en línea” en una transmisión. Estas son muy similares a los archivos adjuntos y se especifican en la matriz content.inline_images donde cada uno de los objetos de inline_image son similares al objeto de archivo adjunto mostrado anteriormente.

El punto de transmisión también proporciona una abstracción para enviar archivos adjuntos. A continuación verá que los archivos adjuntos se especifican en la matriz content.attachments donde cada objeto en la matriz describe un elemento de archivo adjunto individual. Al igual que antes, SparkPost se encargará de codificar text, HTML, substitutions e iterar a través del array de archivos adjuntos para codificar un mensaje de correo electrónico correctamente formado.

Las mejores prácticas dictan que el envío de archivos adjuntos debe evitarse a menos que sea explícitamente requerido como parte de su servicio.

A continuación se presentan los campos requeridos para un archivo adjunto:

  • type: El tipo MIME del archivo adjunto

  • name: El nombre de archivo del archivo adjunto

  • data: Archivo codificado en Base64

Campos Requeridos para Archivos Adjuntos

Campo

Significado

type

Tipo MIME del archivo adjunto

name

Nombre de archivo tal como aparecerá al destinatario

data

Carga útil del archivo codificada en Base64


Así es como se ve un archivo adjunto dentro del contenido de transmisión:

"content": {
  "attachments": [
    {
      "type": "audio/mp3",
      "name": "voicemail.mp3",
      "data": "TVAzIERhdGEK"
    }
  ]
}

También puedes enviar “imágenes en línea” en una transmisión. Estas son muy similares a los archivos adjuntos y se especifican en la matriz content.inline_images donde cada uno de los objetos de inline_image son similares al objeto de archivo adjunto mostrado anteriormente.

El punto de transmisión también proporciona una abstracción para enviar archivos adjuntos. A continuación verá que los archivos adjuntos se especifican en la matriz content.attachments donde cada objeto en la matriz describe un elemento de archivo adjunto individual. Al igual que antes, SparkPost se encargará de codificar text, HTML, substitutions e iterar a través del array de archivos adjuntos para codificar un mensaje de correo electrónico correctamente formado.

Las mejores prácticas dictan que el envío de archivos adjuntos debe evitarse a menos que sea explícitamente requerido como parte de su servicio.

A continuación se presentan los campos requeridos para un archivo adjunto:

  • type: El tipo MIME del archivo adjunto

  • name: El nombre de archivo del archivo adjunto

  • data: Archivo codificado en Base64

Campos Requeridos para Archivos Adjuntos

Campo

Significado

type

Tipo MIME del archivo adjunto

name

Nombre de archivo tal como aparecerá al destinatario

data

Carga útil del archivo codificada en Base64


Así es como se ve un archivo adjunto dentro del contenido de transmisión:

"content": {
  "attachments": [
    {
      "type": "audio/mp3",
      "name": "voicemail.mp3",
      "data": "TVAzIERhdGEK"
    }
  ]
}

También puedes enviar “imágenes en línea” en una transmisión. Estas son muy similares a los archivos adjuntos y se especifican en la matriz content.inline_images donde cada uno de los objetos de inline_image son similares al objeto de archivo adjunto mostrado anteriormente.

Archivos adjuntos en Templates

Ahora que tenemos el contexto adecuado para enviar archivos adjuntos con el endpoint de transmisión, echemos un vistazo a cómo hacer esto con plantillas. En el momento de escribir esto, no existe una abstracción de archivos adjuntos como la que se encuentra para transmisiones en línea. Uno podría concluir que las plantillas no se pueden crear con adjuntos. Estarías parcialmente en lo correcto, pero hay una solución, aunque ya no estarás aislado del formato RFC 5322.

Puedes lograr incluir archivos adjuntos en las plantillas codificando tú mismo el contenido RFC 5322, lo que incluye los adjuntos. La buena noticia es que no perderás la capacidad de seguir usando Datos de Sustitución en tus cabeceras de correo electrónico, partes de HTML y texto. Ten en cuenta que este tipo de plantilla limita las sustituciones a las cabeceras y a la primera parte de HTML y de texto.


Limitaciones de Plantillas RFC 5322

Limitación

Descripción

Sustituciones restringidas

Solo se aplican a cabeceras, primera parte de HTML y primera parte de texto

Manejo manual de MIME

El desarrollador debe construir todos los límites MIME y partes de adjuntos

Mayor carga de mantenimiento

Más difícil de actualizar, auditar y versionar

No amigable con la abstracción

Omite la conveniencia del sistema de plantillas de SparkPost


Aquí tienes un ejemplo de cómo se hace.

Email RFC822

Crea tu email RFC 5322 con los datos de sustitución que deseas. Creé este en mi cliente de correo y me lo envié a mí mismo. Una vez que lo recibí, copié el origen y reemplacé los campos que quiero sustituir dinámicamente.

MIME-Version: 1.0
Reply-To: {{replyto}}
Subject: {{subject}}
From: {{from}}
To: {{address.email}}
Content-Type: multipart/mixed; boundary="001a113c48b0b89d92052d3051da"
--001a113c48b0b89d92052d3051da
Content-Type: multipart/alternative; boundary="001a113c48b0b89d89052d3051d8"
--001a113c48b0b89d89052d3051d8
Content-Type: text/plain; charset=UTF-8
Email with a *text attachment*.
{{body2}}
--001a113c48b0b89d89052d3051d8
Content-Type: text/html; charset=UTF-8
<div dir="ltr">
  <div>Email with a <i>text attachment</i>.</div>
  {{body1}}
<

La última parte MIME en este mensaje verás Content-Disposition: attachment; filename=myfile.txt”. Ahí es donde se define el nombre del archivo. Tu contenido de adjunto será seguramente mucho más complejo, pero este ejemplo intenta mantenerlo simple.

Ahora que tenemos el contexto adecuado para enviar archivos adjuntos con el endpoint de transmisión, echemos un vistazo a cómo hacer esto con plantillas. En el momento de escribir esto, no existe una abstracción de archivos adjuntos como la que se encuentra para transmisiones en línea. Uno podría concluir que las plantillas no se pueden crear con adjuntos. Estarías parcialmente en lo correcto, pero hay una solución, aunque ya no estarás aislado del formato RFC 5322.

Puedes lograr incluir archivos adjuntos en las plantillas codificando tú mismo el contenido RFC 5322, lo que incluye los adjuntos. La buena noticia es que no perderás la capacidad de seguir usando Datos de Sustitución en tus cabeceras de correo electrónico, partes de HTML y texto. Ten en cuenta que este tipo de plantilla limita las sustituciones a las cabeceras y a la primera parte de HTML y de texto.


Limitaciones de Plantillas RFC 5322

Limitación

Descripción

Sustituciones restringidas

Solo se aplican a cabeceras, primera parte de HTML y primera parte de texto

Manejo manual de MIME

El desarrollador debe construir todos los límites MIME y partes de adjuntos

Mayor carga de mantenimiento

Más difícil de actualizar, auditar y versionar

No amigable con la abstracción

Omite la conveniencia del sistema de plantillas de SparkPost


Aquí tienes un ejemplo de cómo se hace.

Email RFC822

Crea tu email RFC 5322 con los datos de sustitución que deseas. Creé este en mi cliente de correo y me lo envié a mí mismo. Una vez que lo recibí, copié el origen y reemplacé los campos que quiero sustituir dinámicamente.

MIME-Version: 1.0
Reply-To: {{replyto}}
Subject: {{subject}}
From: {{from}}
To: {{address.email}}
Content-Type: multipart/mixed; boundary="001a113c48b0b89d92052d3051da"
--001a113c48b0b89d92052d3051da
Content-Type: multipart/alternative; boundary="001a113c48b0b89d89052d3051d8"
--001a113c48b0b89d89052d3051d8
Content-Type: text/plain; charset=UTF-8
Email with a *text attachment*.
{{body2}}
--001a113c48b0b89d89052d3051d8
Content-Type: text/html; charset=UTF-8
<div dir="ltr">
  <div>Email with a <i>text attachment</i>.</div>
  {{body1}}
<

La última parte MIME en este mensaje verás Content-Disposition: attachment; filename=myfile.txt”. Ahí es donde se define el nombre del archivo. Tu contenido de adjunto será seguramente mucho más complejo, pero este ejemplo intenta mantenerlo simple.

Ahora que tenemos el contexto adecuado para enviar archivos adjuntos con el endpoint de transmisión, echemos un vistazo a cómo hacer esto con plantillas. En el momento de escribir esto, no existe una abstracción de archivos adjuntos como la que se encuentra para transmisiones en línea. Uno podría concluir que las plantillas no se pueden crear con adjuntos. Estarías parcialmente en lo correcto, pero hay una solución, aunque ya no estarás aislado del formato RFC 5322.

Puedes lograr incluir archivos adjuntos en las plantillas codificando tú mismo el contenido RFC 5322, lo que incluye los adjuntos. La buena noticia es que no perderás la capacidad de seguir usando Datos de Sustitución en tus cabeceras de correo electrónico, partes de HTML y texto. Ten en cuenta que este tipo de plantilla limita las sustituciones a las cabeceras y a la primera parte de HTML y de texto.


Limitaciones de Plantillas RFC 5322

Limitación

Descripción

Sustituciones restringidas

Solo se aplican a cabeceras, primera parte de HTML y primera parte de texto

Manejo manual de MIME

El desarrollador debe construir todos los límites MIME y partes de adjuntos

Mayor carga de mantenimiento

Más difícil de actualizar, auditar y versionar

No amigable con la abstracción

Omite la conveniencia del sistema de plantillas de SparkPost


Aquí tienes un ejemplo de cómo se hace.

Email RFC822

Crea tu email RFC 5322 con los datos de sustitución que deseas. Creé este en mi cliente de correo y me lo envié a mí mismo. Una vez que lo recibí, copié el origen y reemplacé los campos que quiero sustituir dinámicamente.

MIME-Version: 1.0
Reply-To: {{replyto}}
Subject: {{subject}}
From: {{from}}
To: {{address.email}}
Content-Type: multipart/mixed; boundary="001a113c48b0b89d92052d3051da"
--001a113c48b0b89d92052d3051da
Content-Type: multipart/alternative; boundary="001a113c48b0b89d89052d3051d8"
--001a113c48b0b89d89052d3051d8
Content-Type: text/plain; charset=UTF-8
Email with a *text attachment*.
{{body2}}
--001a113c48b0b89d89052d3051d8
Content-Type: text/html; charset=UTF-8
<div dir="ltr">
  <div>Email with a <i>text attachment</i>.</div>
  {{body1}}
<

La última parte MIME en este mensaje verás Content-Disposition: attachment; filename=myfile.txt”. Ahí es donde se define el nombre del archivo. Tu contenido de adjunto será seguramente mucho más complejo, pero este ejemplo intenta mantenerlo simple.

Stored Template

Una vez que tenga un almacén de correo electrónico válido RFC 5322, guárdelo usando la forma email_rfc822 del extremo del template en lugar de usar los campos text y HTML. Aquí hay un ejemplo de cómo se ve el content para ese mensaje:

{
  "content": {
    "email_rfc822": "MIME-Version: 1.0\nReply-To: {{replyto}}\nSubject: {{subject}}\nFrom: {{from}}\nTo: {{address.email}}\nContent-Type: multipart/mixed; boundary=001a113c48b0b89d92052d3051da\n\n--001a113c48b0b89d92052d3051da\nContent-Type: multipart/alternative; boundary=001a113c48b0b89d89052d3051d8\n\n--001a113c48b0b89d89052d3051d8\nContent-Type: text/plain; charset=UTF-8\n\nEmail with a *text attachment*.\n\n{{body2}}\n\n--001a113c48b0b89d89052d3051d8\nContent-Type: text/html; charset=UTF-8\n\n<div dir=\"ltr\"><div>Email with a <i>text attachment</i>.</div>\n\n{{body1}}\n</div>\n\n--001a113c48b0b89d89052d3051d8--\n--001a113c48b0b89d92052d3051da\nContent-Type: text/plain; charset=US-ASCII; name=\"myfile.txt\"\nContent-Disposition: attachment; filename=\"myfile.txt\"\nContent-Transfer-Encoding: base64\nX-Attachment-Id: f_ild455ce0\n\nVGhpcyBpcyBteSBzaW1wbGUgdGV4dCBmaWxlLgo=\n--001a113c48b0b89d92052d3051da--"
  },
  "name": "_TMP_TEMPLATE_TEST"
}

Cuando la solicitud se complete, SparkPost responderá con un identificador único para su nuevo template. Por ejemplo, xxxxxxx.

Una vez que tenga un almacén de correo electrónico válido RFC 5322, guárdelo usando la forma email_rfc822 del extremo del template en lugar de usar los campos text y HTML. Aquí hay un ejemplo de cómo se ve el content para ese mensaje:

{
  "content": {
    "email_rfc822": "MIME-Version: 1.0\nReply-To: {{replyto}}\nSubject: {{subject}}\nFrom: {{from}}\nTo: {{address.email}}\nContent-Type: multipart/mixed; boundary=001a113c48b0b89d92052d3051da\n\n--001a113c48b0b89d92052d3051da\nContent-Type: multipart/alternative; boundary=001a113c48b0b89d89052d3051d8\n\n--001a113c48b0b89d89052d3051d8\nContent-Type: text/plain; charset=UTF-8\n\nEmail with a *text attachment*.\n\n{{body2}}\n\n--001a113c48b0b89d89052d3051d8\nContent-Type: text/html; charset=UTF-8\n\n<div dir=\"ltr\"><div>Email with a <i>text attachment</i>.</div>\n\n{{body1}}\n</div>\n\n--001a113c48b0b89d89052d3051d8--\n--001a113c48b0b89d92052d3051da\nContent-Type: text/plain; charset=US-ASCII; name=\"myfile.txt\"\nContent-Disposition: attachment; filename=\"myfile.txt\"\nContent-Transfer-Encoding: base64\nX-Attachment-Id: f_ild455ce0\n\nVGhpcyBpcyBteSBzaW1wbGUgdGV4dCBmaWxlLgo=\n--001a113c48b0b89d92052d3051da--"
  },
  "name": "_TMP_TEMPLATE_TEST"
}

Cuando la solicitud se complete, SparkPost responderá con un identificador único para su nuevo template. Por ejemplo, xxxxxxx.

Una vez que tenga un almacén de correo electrónico válido RFC 5322, guárdelo usando la forma email_rfc822 del extremo del template en lugar de usar los campos text y HTML. Aquí hay un ejemplo de cómo se ve el content para ese mensaje:

{
  "content": {
    "email_rfc822": "MIME-Version: 1.0\nReply-To: {{replyto}}\nSubject: {{subject}}\nFrom: {{from}}\nTo: {{address.email}}\nContent-Type: multipart/mixed; boundary=001a113c48b0b89d92052d3051da\n\n--001a113c48b0b89d92052d3051da\nContent-Type: multipart/alternative; boundary=001a113c48b0b89d89052d3051d8\n\n--001a113c48b0b89d89052d3051d8\nContent-Type: text/plain; charset=UTF-8\n\nEmail with a *text attachment*.\n\n{{body2}}\n\n--001a113c48b0b89d89052d3051d8\nContent-Type: text/html; charset=UTF-8\n\n<div dir=\"ltr\"><div>Email with a <i>text attachment</i>.</div>\n\n{{body1}}\n</div>\n\n--001a113c48b0b89d89052d3051d8--\n--001a113c48b0b89d92052d3051da\nContent-Type: text/plain; charset=US-ASCII; name=\"myfile.txt\"\nContent-Disposition: attachment; filename=\"myfile.txt\"\nContent-Transfer-Encoding: base64\nX-Attachment-Id: f_ild455ce0\n\nVGhpcyBpcyBteSBzaW1wbGUgdGV4dCBmaWxlLgo=\n--001a113c48b0b89d92052d3051da--"
  },
  "name": "_TMP_TEMPLATE_TEST"
}

Cuando la solicitud se complete, SparkPost responderá con un identificador único para su nuevo template. Por ejemplo, xxxxxxx.

Conclusión

Ahora que ves cómo SparkPost se puede usar para enviar correos electrónicos de casi cualquier complejidad, es posible que desees echar un vistazo a “SparkPost Supports Sending Email on Apple Watch” o echar un vistazo a la sintaxis de sustitución para ver cómo se puede usar con “if then else”, “expresiones en condicionales” o “Iteración de arrays” directamente en tu plantilla o contenido de transmisión.

Ahora que ves cómo SparkPost se puede usar para enviar correos electrónicos de casi cualquier complejidad, es posible que desees echar un vistazo a “SparkPost Supports Sending Email on Apple Watch” o echar un vistazo a la sintaxis de sustitución para ver cómo se puede usar con “if then else”, “expresiones en condicionales” o “Iteración de arrays” directamente en tu plantilla o contenido de transmisión.

Ahora que ves cómo SparkPost se puede usar para enviar correos electrónicos de casi cualquier complejidad, es posible que desees echar un vistazo a “SparkPost Supports Sending Email on Apple Watch” o echar un vistazo a la sintaxis de sustitución para ver cómo se puede usar con “if then else”, “expresiones en condicionales” o “Iteración de arrays” directamente en tu plantilla o contenido de transmisión.

Otras noticias

Leer más de esta categoría

A person is standing at a desk while typing on a laptop.

La plataforma completa AI-native que escala con tu negocio.

© 2025 Bird

A person is standing at a desk while typing on a laptop.

La plataforma completa AI-native que escala con tu negocio.

© 2025 Bird