Plantillas de correo electrónico avanzadas
Pájaro
25 mar 2016
Correo electrónico
1 min read

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_rfc822que 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.
Composición de Email Simplificada
Primero, revisemos un escenario en un día soleado para enviar un correo electrónico. Utiliza el endpoint transmission para proporcionar el contenido de text y HTML. Detrás de escena, SparkPost se encarga de componer un correo electrónico válido según el RFC 5322. SparkPost insertará variables de sustitución desde substitution_data en el contenido de texto y 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>" } }
Primero, revisemos un escenario en un día soleado para enviar un correo electrónico. Utiliza el endpoint transmission para proporcionar el contenido de text y HTML. Detrás de escena, SparkPost se encarga de componer un correo electrónico válido según el RFC 5322. SparkPost insertará variables de sustitución desde substitution_data en el contenido de texto y 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>" } }
Primero, revisemos un escenario en un día soleado para enviar un correo electrónico. Utiliza el endpoint transmission para proporcionar el contenido de text y HTML. Detrás de escena, SparkPost se encarga de componer un correo electrónico válido según el RFC 5322. SparkPost insertará variables de sustitución desde substitution_data en el contenido de texto y 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>" } }
Sustituir Arrays de Datos
Muchas personas se dan cuenta de que los puntos finales de transmisión y plantilla de SparkPost pueden realizar una sustitución de contenido simple en los encabezados 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 rellenará en el cuerpo del correo electrónico. Una vez proporcionados los datos, SparkPost utilizará lógica en la plantilla para generar el contenido.
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". Note el triple encorchetado alrededor de "loop_var.file“. Esto se debe a que cada elemento de la matriz contiene HTML y necesitamos decirle al servidor que lo use tal cual y no lo escape. La parte de texto será una etiqueta de texto simple y la URL del archivo.
<table> {{each files_html}} <tr> <td>{{{loop_var.file}}}</td> </tr> {{ end }} </table>
Aquí está el ejemplo completo trabajando:
{ "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 aconsejable mantener la marca de vista separada 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 uso de 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 finales de transmisión y plantilla de SparkPost pueden realizar una sustitución de contenido simple en los encabezados 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 rellenará en el cuerpo del correo electrónico. Una vez proporcionados los datos, SparkPost utilizará lógica en la plantilla para generar el contenido.
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". Note el triple encorchetado alrededor de "loop_var.file“. Esto se debe a que cada elemento de la matriz contiene HTML y necesitamos decirle al servidor que lo use tal cual y no lo escape. La parte de texto será una etiqueta de texto simple y la URL del archivo.
<table> {{each files_html}} <tr> <td>{{{loop_var.file}}}</td> </tr> {{ end }} </table>
Aquí está el ejemplo completo trabajando:
{ "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 aconsejable mantener la marca de vista separada 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 uso de 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 finales de transmisión y plantilla de SparkPost pueden realizar una sustitución de contenido simple en los encabezados 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 rellenará en el cuerpo del correo electrónico. Una vez proporcionados los datos, SparkPost utilizará lógica en la plantilla para generar el contenido.
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". Note el triple encorchetado alrededor de "loop_var.file“. Esto se debe a que cada elemento de la matriz contiene HTML y necesitamos decirle al servidor que lo use tal cual y no lo escape. La parte de texto será una etiqueta de texto simple y la URL del archivo.
<table> {{each files_html}} <tr> <td>{{{loop_var.file}}}</td> </tr> {{ end }} </table>
Aquí está el ejemplo completo trabajando:
{ "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 aconsejable mantener la marca de vista separada 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 uso de 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 el content.attachments array donde cada objeto en el array 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 enviar archivos adjuntos es mejor evitarlo a menos que sea requerido explícitamente como parte de su servicio.
A continuación, se muestran los campos requeridos para un archivo adjunto:
type: El tipo MIME del archivo adjunto
name: El nombre del archivo del archivo adjunto
data: Datos del archivo codificados en Base64
Esto es lo que parece un archivo adjunto dentro de la estrofa de contenido de transmisión:
"content": { "attachments": [ { "type": "audio/mp3", "name": "voicemail.mp3", "data": "TVAzIERhdGEK" } ] }
También puede enviar “imágenes incrustadas” en una transmisión. Estas son muy similares a los archivos adjuntos y se especifican en el array content.inline_images donde cada uno de los objetos inline_image son similares al objeto de archivo adjunto mostrado arriba.
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 el content.attachments array donde cada objeto en el array 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 enviar archivos adjuntos es mejor evitarlo a menos que sea requerido explícitamente como parte de su servicio.
A continuación, se muestran los campos requeridos para un archivo adjunto:
type: El tipo MIME del archivo adjunto
name: El nombre del archivo del archivo adjunto
data: Datos del archivo codificados en Base64
Esto es lo que parece un archivo adjunto dentro de la estrofa de contenido de transmisión:
"content": { "attachments": [ { "type": "audio/mp3", "name": "voicemail.mp3", "data": "TVAzIERhdGEK" } ] }
También puede enviar “imágenes incrustadas” en una transmisión. Estas son muy similares a los archivos adjuntos y se especifican en el array content.inline_images donde cada uno de los objetos inline_image son similares al objeto de archivo adjunto mostrado arriba.
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 el content.attachments array donde cada objeto en el array 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 enviar archivos adjuntos es mejor evitarlo a menos que sea requerido explícitamente como parte de su servicio.
A continuación, se muestran los campos requeridos para un archivo adjunto:
type: El tipo MIME del archivo adjunto
name: El nombre del archivo del archivo adjunto
data: Datos del archivo codificados en Base64
Esto es lo que parece un archivo adjunto dentro de la estrofa de contenido de transmisión:
"content": { "attachments": [ { "type": "audio/mp3", "name": "voicemail.mp3", "data": "TVAzIERhdGEK" } ] }
También puede enviar “imágenes incrustadas” en una transmisión. Estas son muy similares a los archivos adjuntos y se especifican en el array content.inline_images donde cada uno de los objetos inline_image son similares al objeto de archivo adjunto mostrado arriba.
Archivos adjuntos en Templates
Ahora que tenemos la preparación adecuada 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 para archivos adjuntos como la que se encuentra para transmisiones inline. 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 adjuntos en plantillas codificando el contenido RFC 5322 tú mismo, lo cual incluye los archivos adjuntos. La buena noticia es que no perderás la capacidad de seguir usando Substitution Data en tus encabezados de correo electrónico, partes de HTML y texto. Ten en cuenta que este tipo de plantilla limita las sustituciones a los encabezados y la primera parte de HTML y la primera parte de texto.
Aquí tienes un ejemplo de cómo se hace.
Ahora que tenemos la preparación adecuada 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 para archivos adjuntos como la que se encuentra para transmisiones inline. 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 adjuntos en plantillas codificando el contenido RFC 5322 tú mismo, lo cual incluye los archivos adjuntos. La buena noticia es que no perderás la capacidad de seguir usando Substitution Data en tus encabezados de correo electrónico, partes de HTML y texto. Ten en cuenta que este tipo de plantilla limita las sustituciones a los encabezados y la primera parte de HTML y la primera parte de texto.
Aquí tienes un ejemplo de cómo se hace.
Ahora que tenemos la preparación adecuada 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 para archivos adjuntos como la que se encuentra para transmisiones inline. 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 adjuntos en plantillas codificando el contenido RFC 5322 tú mismo, lo cual incluye los archivos adjuntos. La buena noticia es que no perderás la capacidad de seguir usando Substitution Data en tus encabezados de correo electrónico, partes de HTML y texto. Ten en cuenta que este tipo de plantilla limita las sustituciones a los encabezados y la primera parte de HTML y la primera parte de texto.
Aquí tienes un ejemplo de cómo se hace.
RFC822 Email
Crea tu correo electrónico RFC 5322 con los datos de sustitución que desees. 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 quería 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 de este mensaje verás Content-Disposition: attachment; filename=myfile.txt”. Ahí es donde se define el nombre del archivo. El contenido de tu archivo adjunto será seguramente mucho más complejo, pero este ejemplo intenta mantenerlo simple.
Crea tu correo electrónico RFC 5322 con los datos de sustitución que desees. 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 quería 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 de este mensaje verás Content-Disposition: attachment; filename=myfile.txt”. Ahí es donde se define el nombre del archivo. El contenido de tu archivo adjunto será seguramente mucho más complejo, pero este ejemplo intenta mantenerlo simple.
Crea tu correo electrónico RFC 5322 con los datos de sustitución que desees. 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 quería 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 de este mensaje verás Content-Disposition: attachment; filename=myfile.txt”. Ahí es donde se define el nombre del archivo. El contenido de tu archivo adjunto será seguramente mucho más complejo, pero este ejemplo intenta mantenerlo simple.
Stored Template
Una vez que tengas un correo electrónico RFC 5322 válido, guárdalo usando la forma email_rfc822 del endpoint de la plantilla en lugar de usar los campos text y HTML. Aquí tienes 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 tu nueva plantilla. Por ejemplo xxxxxxx.
Una vez que tengas un correo electrónico RFC 5322 válido, guárdalo usando la forma email_rfc822 del endpoint de la plantilla en lugar de usar los campos text y HTML. Aquí tienes 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 tu nueva plantilla. Por ejemplo xxxxxxx.
Una vez que tengas un correo electrónico RFC 5322 válido, guárdalo usando la forma email_rfc822 del endpoint de la plantilla en lugar de usar los campos text y HTML. Aquí tienes 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 tu nueva plantilla. Por ejemplo xxxxxxx.
Enviando el Template
La buena noticia es que crear el contenido RFC 5322 fue la parte difícil. De aquí en adelante, 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. De aquí en adelante, 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. De aquí en adelante, 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 } }
Plantillas de un Mail Client’s API
Si estás usando un lenguaje de programación que tiene una biblioteca para componer un correo electrónico, puedes usarla para crear programáticamente la plantilla o incluso enviar el mensaje en línea. Aquí hay un ejemplo de cómo usar JavaMail a través del endpoint de transmisión de SparkPost. Este método debería ser fácilmente traducible a PHP o el lenguaje de tu elección.
/** * Demonstration of using JavaMail MIME message with the SparkPost RESTful interface */ public class App extends SparkPostBaseApp { public static void main(String[] args) throws Exception { Logger.getRootLogger().setLevel(Level.DEBUG); App app = new App(); app.runApp(); } private void runApp() throws Exception { Message message = createMultipartMessage(); // Convert JavaMail message into a string for transmission String rfc822Content = getMessageAsString(message); // Add dynamic To and From using SparkPost substitution syntax rfc822Content = "To: {{address.email}}\r\nFrom: {{from}}\r\n" + rfc822Content; String fromAddress = getFromAddress(); String[] recipients = getTestRecipients(); sendEmail(fromAddress, recipients, rfc822Content); } private void sendEmail(String from, String[] recipients, String email) throws SparkPostException, IOException { Client sparkpostClient = newConfiguredClient(); TransmissionWithRecipientArray transmission = new TransmissionWithRecipientArray(); // Populate Recipients List<RecipientAttributes> recipientArray = new ArrayList<>(); for (String recipient : recipients) { RecipientAttributes recipientAttribs = new RecipientAttributes(); recipientAttribs.setAddress(new AddressAttributes(recipient)); recipientArray.add(recipientAttribs); } transmission.setRecipientArray(recipientArray); transmission.setReturnPath(from); // Populate Substitution Data Map<String, String> substitutionData = new HashMap<>(); substitutionData.put("from", from); substitutionData.put("name", "Your Name Here"); transmission.setSubstitutionData(substitutionData); // Populate Email Body with RFC822 MIME TemplateContentAttributes contentAttributes = new TemplateContentAttributes(); contentAttributes.setEmailRFC822(email); transmission.setContentAttributes(contentAttributes); // Send Email RestConnection connection = new RestConnection(sparkpostClient, getEndPoint()); Response response = ResourceTransmissions.create(connection, 0, transmission); if (response.getResponseCode() == 200) { System.out.println("✅ Transmission Response: " + response); } else { System.err.println("❌ TRANSMISSION ERROR: " + response); } } /** * Builds an email with text, HTML, and attachment parts */ private Message createMultipartMessage() throws MessagingException { Properties props = new Properties(); props.put("mail.smtp.host", "none"); // Required for JavaMail to work Session session = Session.getDefaultInstance(props, null); Message message = new MimeMessage(session); message.setSubject("A multipart MIME message demo"); // Main multipart container Multipart multiPart = new MimeMultipart("mixed"); // Sub multipart for text + HTML MimeMultipart altPart = new MimeMultipart("alternative"); // Text part MimeBodyPart textPart = new MimeBodyPart(); textPart.setText("{{name}},\r\nplain text content", "utf-8"); // HTML part MimeBodyPart htmlPart = new MimeBodyPart(); htmlPart.setContent("<b>{{name}},<br><br>Our HTML content</b>", "text/html; charset=utf-8"); // Add text and HTML to the alternative container altPart.addBodyPart(textPart); altPart.addBodyPart(htmlPart); // Wrap alternative part in a MimeBodyPart so it can be added to mixed container MimeBodyPart altBodyPart = new MimeBodyPart(); altBodyPart.setContent(altPart); // Add alternative section to mixed container multiPart.addBodyPart(altBodyPart); // Add attachment MimeBodyPart attachmentPart = new MimeBodyPart(); String filename = "java_SparkPost_background.pdf"; DataSource source = new FileDataSource(filename); attachmentPart.setDataHandler(new DataHandler(source)); attachmentPart.setFileName(filename); multiPart.addBodyPart(attachmentPart); // Set full content message.setContent(multiPart); return message; } /** * Converts a JavaMail message into an RFC822 string */ private String getMessageAsString(Message msg) throws IOException, MessagingException { ByteArrayOutputStream out = new ByteArrayOutputStream(); try { msg.writeTo(out); return out.toString("UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException("UTF-8 not found! " + e.getMessage()); } finally { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } }
Si estás usando un lenguaje de programación que tiene una biblioteca para componer un correo electrónico, puedes usarla para crear programáticamente la plantilla o incluso enviar el mensaje en línea. Aquí hay un ejemplo de cómo usar JavaMail a través del endpoint de transmisión de SparkPost. Este método debería ser fácilmente traducible a PHP o el lenguaje de tu elección.
/** * Demonstration of using JavaMail MIME message with the SparkPost RESTful interface */ public class App extends SparkPostBaseApp { public static void main(String[] args) throws Exception { Logger.getRootLogger().setLevel(Level.DEBUG); App app = new App(); app.runApp(); } private void runApp() throws Exception { Message message = createMultipartMessage(); // Convert JavaMail message into a string for transmission String rfc822Content = getMessageAsString(message); // Add dynamic To and From using SparkPost substitution syntax rfc822Content = "To: {{address.email}}\r\nFrom: {{from}}\r\n" + rfc822Content; String fromAddress = getFromAddress(); String[] recipients = getTestRecipients(); sendEmail(fromAddress, recipients, rfc822Content); } private void sendEmail(String from, String[] recipients, String email) throws SparkPostException, IOException { Client sparkpostClient = newConfiguredClient(); TransmissionWithRecipientArray transmission = new TransmissionWithRecipientArray(); // Populate Recipients List<RecipientAttributes> recipientArray = new ArrayList<>(); for (String recipient : recipients) { RecipientAttributes recipientAttribs = new RecipientAttributes(); recipientAttribs.setAddress(new AddressAttributes(recipient)); recipientArray.add(recipientAttribs); } transmission.setRecipientArray(recipientArray); transmission.setReturnPath(from); // Populate Substitution Data Map<String, String> substitutionData = new HashMap<>(); substitutionData.put("from", from); substitutionData.put("name", "Your Name Here"); transmission.setSubstitutionData(substitutionData); // Populate Email Body with RFC822 MIME TemplateContentAttributes contentAttributes = new TemplateContentAttributes(); contentAttributes.setEmailRFC822(email); transmission.setContentAttributes(contentAttributes); // Send Email RestConnection connection = new RestConnection(sparkpostClient, getEndPoint()); Response response = ResourceTransmissions.create(connection, 0, transmission); if (response.getResponseCode() == 200) { System.out.println("✅ Transmission Response: " + response); } else { System.err.println("❌ TRANSMISSION ERROR: " + response); } } /** * Builds an email with text, HTML, and attachment parts */ private Message createMultipartMessage() throws MessagingException { Properties props = new Properties(); props.put("mail.smtp.host", "none"); // Required for JavaMail to work Session session = Session.getDefaultInstance(props, null); Message message = new MimeMessage(session); message.setSubject("A multipart MIME message demo"); // Main multipart container Multipart multiPart = new MimeMultipart("mixed"); // Sub multipart for text + HTML MimeMultipart altPart = new MimeMultipart("alternative"); // Text part MimeBodyPart textPart = new MimeBodyPart(); textPart.setText("{{name}},\r\nplain text content", "utf-8"); // HTML part MimeBodyPart htmlPart = new MimeBodyPart(); htmlPart.setContent("<b>{{name}},<br><br>Our HTML content</b>", "text/html; charset=utf-8"); // Add text and HTML to the alternative container altPart.addBodyPart(textPart); altPart.addBodyPart(htmlPart); // Wrap alternative part in a MimeBodyPart so it can be added to mixed container MimeBodyPart altBodyPart = new MimeBodyPart(); altBodyPart.setContent(altPart); // Add alternative section to mixed container multiPart.addBodyPart(altBodyPart); // Add attachment MimeBodyPart attachmentPart = new MimeBodyPart(); String filename = "java_SparkPost_background.pdf"; DataSource source = new FileDataSource(filename); attachmentPart.setDataHandler(new DataHandler(source)); attachmentPart.setFileName(filename); multiPart.addBodyPart(attachmentPart); // Set full content message.setContent(multiPart); return message; } /** * Converts a JavaMail message into an RFC822 string */ private String getMessageAsString(Message msg) throws IOException, MessagingException { ByteArrayOutputStream out = new ByteArrayOutputStream(); try { msg.writeTo(out); return out.toString("UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException("UTF-8 not found! " + e.getMessage()); } finally { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } }
Si estás usando un lenguaje de programación que tiene una biblioteca para componer un correo electrónico, puedes usarla para crear programáticamente la plantilla o incluso enviar el mensaje en línea. Aquí hay un ejemplo de cómo usar JavaMail a través del endpoint de transmisión de SparkPost. Este método debería ser fácilmente traducible a PHP o el lenguaje de tu elección.
/** * Demonstration of using JavaMail MIME message with the SparkPost RESTful interface */ public class App extends SparkPostBaseApp { public static void main(String[] args) throws Exception { Logger.getRootLogger().setLevel(Level.DEBUG); App app = new App(); app.runApp(); } private void runApp() throws Exception { Message message = createMultipartMessage(); // Convert JavaMail message into a string for transmission String rfc822Content = getMessageAsString(message); // Add dynamic To and From using SparkPost substitution syntax rfc822Content = "To: {{address.email}}\r\nFrom: {{from}}\r\n" + rfc822Content; String fromAddress = getFromAddress(); String[] recipients = getTestRecipients(); sendEmail(fromAddress, recipients, rfc822Content); } private void sendEmail(String from, String[] recipients, String email) throws SparkPostException, IOException { Client sparkpostClient = newConfiguredClient(); TransmissionWithRecipientArray transmission = new TransmissionWithRecipientArray(); // Populate Recipients List<RecipientAttributes> recipientArray = new ArrayList<>(); for (String recipient : recipients) { RecipientAttributes recipientAttribs = new RecipientAttributes(); recipientAttribs.setAddress(new AddressAttributes(recipient)); recipientArray.add(recipientAttribs); } transmission.setRecipientArray(recipientArray); transmission.setReturnPath(from); // Populate Substitution Data Map<String, String> substitutionData = new HashMap<>(); substitutionData.put("from", from); substitutionData.put("name", "Your Name Here"); transmission.setSubstitutionData(substitutionData); // Populate Email Body with RFC822 MIME TemplateContentAttributes contentAttributes = new TemplateContentAttributes(); contentAttributes.setEmailRFC822(email); transmission.setContentAttributes(contentAttributes); // Send Email RestConnection connection = new RestConnection(sparkpostClient, getEndPoint()); Response response = ResourceTransmissions.create(connection, 0, transmission); if (response.getResponseCode() == 200) { System.out.println("✅ Transmission Response: " + response); } else { System.err.println("❌ TRANSMISSION ERROR: " + response); } } /** * Builds an email with text, HTML, and attachment parts */ private Message createMultipartMessage() throws MessagingException { Properties props = new Properties(); props.put("mail.smtp.host", "none"); // Required for JavaMail to work Session session = Session.getDefaultInstance(props, null); Message message = new MimeMessage(session); message.setSubject("A multipart MIME message demo"); // Main multipart container Multipart multiPart = new MimeMultipart("mixed"); // Sub multipart for text + HTML MimeMultipart altPart = new MimeMultipart("alternative"); // Text part MimeBodyPart textPart = new MimeBodyPart(); textPart.setText("{{name}},\r\nplain text content", "utf-8"); // HTML part MimeBodyPart htmlPart = new MimeBodyPart(); htmlPart.setContent("<b>{{name}},<br><br>Our HTML content</b>", "text/html; charset=utf-8"); // Add text and HTML to the alternative container altPart.addBodyPart(textPart); altPart.addBodyPart(htmlPart); // Wrap alternative part in a MimeBodyPart so it can be added to mixed container MimeBodyPart altBodyPart = new MimeBodyPart(); altBodyPart.setContent(altPart); // Add alternative section to mixed container multiPart.addBodyPart(altBodyPart); // Add attachment MimeBodyPart attachmentPart = new MimeBodyPart(); String filename = "java_SparkPost_background.pdf"; DataSource source = new FileDataSource(filename); attachmentPart.setDataHandler(new DataHandler(source)); attachmentPart.setFileName(filename); multiPart.addBodyPart(attachmentPart); // Set full content message.setContent(multiPart); return message; } /** * Converts a JavaMail message into an RFC822 string */ private String getMessageAsString(Message msg) throws IOException, MessagingException { ByteArrayOutputStream out = new ByteArrayOutputStream(); try { msg.writeTo(out); return out.toString("UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException("UTF-8 not found! " + e.getMessage()); } finally { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } }
Conclusión
Ahora que ves cómo se puede usar SparkPost para enviar correos electrónicos de casi cualquier complejidad, es posible que quieras 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 arreglos" directamente dentro de tu plantilla o contenido de transmisión.
Ahora que ves cómo se puede usar SparkPost para enviar correos electrónicos de casi cualquier complejidad, es posible que quieras 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 arreglos" directamente dentro de tu plantilla o contenido de transmisión.
Ahora que ves cómo se puede usar SparkPost para enviar correos electrónicos de casi cualquier complejidad, es posible que quieras 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 arreglos" directamente dentro de tu plantilla o contenido de transmisión.



