{"id":20560,"date":"2026-09-15T01:22:37","date_gmt":"2026-09-15T01:22:37","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/envio-emails-html-mailgun-go\/"},"modified":"2026-09-15T01:22:37","modified_gmt":"2026-09-15T01:22:37","slug":"envio-emails-html-mailgun-go","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/es\/blog\/email\/envio-emails-html-mailgun-go\/","title":{"rendered":"Env\u00edo de emails en HTML con Mailgun-Go"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">En este tutorial, te ense\u00f1ar\u00e9 c\u00f3mo enviar emails en HTML con im\u00e1genes incrustadas usando mailgun-go. Antes de meternos en la programaci\u00f3n, vamos a definir el problema y <b>c\u00f3mo podemos usar Mailgun para mejorar la experiencia de usuario de nuestra aplicaci\u00f3n.<\/b><\/p>\n\n\n\r\n    <nav data-content-type=\"longform\" class=\"toc-block longform-spacings px-5 py-6 px-md-6 px-lg-7 py-md-7 bg-light fs-sm rounded-lg\" aria-labelledby=\"toc-title-3470\"><p class=\"h5 m-0\" id=\"toc-title-3470\">\u00cdndice<\/p><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">01<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#presentamos-channel-stats\">Presentamos Channel-stats<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">02<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#email-en-html\">email en HTML<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">03<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#el-codigo\">El c\u00f3digo<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">04<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#conclusion\">Conclusi\u00f3n<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">Presentamos Channel-stats<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/thrawn01\/channel-stats\" target=\"_tabs\" rel=\"noopener noreferrer\">Channel-stats<\/a>\u00a0es un bot de Slack para recopilar estad\u00edsticas de los mensajes que se env\u00edan a un canal de Slack. Adem\u00e1s de contar los emojis y los enlaces que se comparten en el canal, tambi\u00e9n analiza la actitud de los mensajes y les asigna una puntuaci\u00f3n positiva o negativa que, m\u00e1s tarde, <b>los usuarios pueden revisar y representar en un gr\u00e1fico como porcentaje del total de mensajes.<\/b><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4173\" width=\"512\" height=\"367\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/mailgungo1.png\" alt=\"Image of statistics collected from Slack bot &quot;Channel-stats&quot;\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/mailgungo1.png 512w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/mailgungo1-300x215.png 300w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Queremos ampliar esta funcionalidad enviando por email un informe semanal sobre las estad\u00edsticas de un canal a nuestros usuarios. Como el email incluir\u00e1 datos en gr\u00e1ficos, los emails de texto sin formato ser\u00edan muy aburridos. Por eso, queremos enviar un email en HTML interactivo con gr\u00e1ficos a la bandeja de entrada de nuestro usuario. Para lograrlo, tenemos que crear un poco de HTML, con CSS en l\u00ednea e im\u00e1genes para que sea atractivo visualmente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">email en HTML<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Se ha escrito mucho sobre el env\u00edo de HTML en los emails, pero aqu\u00ed tienes unas cuantas reglas b\u00e1sicas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><b>S\u00cd: <\/b>usa CSS en l\u00ednea<\/li>\n\n\n\n<li><b>S\u00cd: <\/b>usa TABLAS HTML para el dise\u00f1o<\/li>\n\n\n\n<li><b>S\u00cd: <\/b>usa im\u00e1genes (mejor .png)<\/li>\n\n\n\n<li><b>S\u00cd: <\/b>usa im\u00e1genes en l\u00ednea<\/li>\n\n\n\n<li><b>NO <\/b>uses HTML5<\/li>\n\n\n\n<li><b>NO\u00a0<\/b>uses CSS de animaci\u00f3n<\/li>\n\n\n\n<li><b>NO\u00a0 <\/b>enlaces a una hoja de estilos externa<\/li>\n\n\n\n<li><b>NO <\/b>uses estilos CSS en el HEAD<\/li>\n\n\n\n<li><b>NO\u00a0<\/b>uses javascript<\/li>\n\n\n\n<li><b>NO\u00a0<\/b>uses flash<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">A menudo, no basta con seguir estas reglas, ya que no existen est\u00e1ndares establecidos sobre c\u00f3mo se visualiza el HTML en los emails. Si te empe\u00f1as en que tus emails se vean bien en el mayor n\u00famero de clientes posible, <b>quiz\u00e1s deber\u00edas usar un servicio como\u00a0<\/b><a href=\"https:\/\/litmus.com\/\" target=\"_tabs\" rel=\"noopener noreferrer\"><b>Litmus<\/b><\/a><b>\u00a0para dise\u00f1ar, generar una previsualizaci\u00f3n y probar tu email en diferentes clientes<\/b>. Sin embargo, para lo que queremos hacer y como channel-stats es un proyecto de c\u00f3digo abierto, voy a mantener los costes de producci\u00f3n al m\u00ednimo y a usar algunas plantillas gratuitas que ofrece\u00a0<a href=\"https:\/\/github.com\/mailgun\/transactional-email-templates\" target=\"_tabs\" rel=\"noopener noreferrer\">Mailgun<\/a>\u00a0(aunque me ech\u00f3 una mano el equipo de dise\u00f1o UX\/UI). Este es el resultado:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4174\" width=\"700\" height=\"549\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/mailgungo2-e1548433743913-700x549-1.png\" alt=\"Channel report designed using Mailgun&apos;s free templates\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/mailgungo2-e1548433743913-700x549-1.png 700w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/mailgungo2-e1548433743913-700x549-1-300x235.png 300w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora que tenemos nuestro HTML y CSS, tenemos que poner el CSS en l\u00ednea para que la mayor\u00eda de los clientes de email visualicen nuestro email correctamente. Hay varias herramientas en l\u00ednea para hacerlo, pero te recomendamos\u00a0<a href=\"http:\/\/premailer.dialect.ca\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Dialect Premailer<\/a>\u00a0para este fin.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">El c\u00f3digo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Como queremos que el email se env\u00ede cada semana, usamos una\u00a0<a href=\"http:\/\/github.com\/robfig\/cron\" target=\"_tabs\" rel=\"noopener noreferrer\">biblioteca cron<\/a>\u00a0para crear una funci\u00f3n que se ejecute todos los domingos a medianoche. A continuaci\u00f3n, tenemos que generar las im\u00e1genes que ir\u00e1n en nuestro email. Channel-stats ya usa\u00a0<a href=\"http:\/\/github.com\/wcharczuk\/go-chart\" target=\"_tabs\" rel=\"noopener noreferrer\">go-chart<\/a>\u00a0para renderizar las im\u00e1genes .png de los gr\u00e1ficos de la interfaz de usuario (UI), as\u00ed que podemos adaptarlo a nuestras necesidades.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Adem\u00e1s, a la hora de entregar el proyecto final, no queremos distribuir archivos HTML y CSS de manera separada a la de nuestro binario final de golang compilado, as\u00ed que <b>channel-stats usa el\u00a0<\/b><a href=\"http:\/\/github.com\/tmthrgd\/go-bindata\" target=\"_tabs\" rel=\"noopener noreferrer\"><b>go-bindata<\/b><\/a><b>\u00a0proyecto para agrupar el HTML y el CSS en un \u00fanico binario de channel-stats.<\/b><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora, echemos un vistazo al c\u00f3digo del renderizado.<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    func NewReporter(conf Config, list ChanLister, notify Mailer, store Storer) (Reporter, error) {rn  r := Report{rn     log:   GetLogger().WithField(&quot;prefix&quot;, &quot;reporter&quot;),rn     cron:  cron.New(),rn     mail:  notify,rn     store: store,rn     conf:  conf,rn     list:  list,rn}rn  return &amp;r, r.start()rn}rnrnfunc (r *Report) start() error {rn  err := r.cron.AddFunc(r.conf.Report.Schedule, func() {rn     timeRange := toTimeRange(r.conf.Report.ReportDuration.Duration)rn     r.log.Debugf(&quot;Creating report for %s to %s&quot;, timeRange.Start, timeRange.End)rnrn     for _, channel := range r.list.Channels() {rn        \/\/ Skip channels the bot is not inrn        if !channel.IsMember {rn           continuern        }rnrn        html, err := r.genHtml(&quot;html\/templates\/email.tmpl&quot;, channel.Name)rn        if err != nil {rn           r.log.Errorf(&quot;during email generate: %s&quot;, err)rn           returnrn        }rnrn        data := ReportData{rn           Images: make(map[string][]byte),rn           Html:   html,rn        }rnrn        \/\/ Generate the images for the reportrn        data.Images[&quot;most-active.png&quot;] = r.genImage(RenderSum, timeRange, channel.Id, &quot;messages&quot;)rn        data.Images[&quot;top-links.png&quot;] = r.genImage(RenderSum, timeRange, channel.Id, &quot;link&quot;)rn        data.Images[&quot;top-emoji.png&quot;] = r.genImage(RenderSum, timeRange, channel.Id, &quot;emoji&quot;)rn        data.Images[&quot;most-negative.png&quot;] = r.genImage(RenderPercentage, timeRange, channel.Id, &quot;negative&quot;)rn        data.Images[&quot;most-positive.png&quot;] = r.genImage(RenderPercentage, timeRange, channel.Id, &quot;positive&quot;)rnrn        \/\/ Email the reportrn        if err := r.mail.Report(channel.Name, data); err != nil {rn           r.log.Errorf(&quot;while sending report: %s&quot;, err)rn        }rn     }rn  })rn  if err != nil {rn     return errrn  }rnrn  r.cron.Start()rn  return nilrn}\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">En el m\u00e9todo\u00a0<code>Start()<\/code>\u00a0iteramos a trav\u00e9s de todos los canales de los que el bot es miembro y generamos un informe para cada canal. Luego, llamamos a\u00a0<code>genHtml()<\/code>, que recupera nuestro email en HTML como una plantilla llamada <code>templates\/email.tmpl<\/code> de nuestro almac\u00e9n de recursos compilado en el paquete\u00a0<code>HTML<\/code>. Despu\u00e9s, pasamos la plantilla por el motor est\u00e1ndar de golang\u00a0<code>HTML\/template<\/code>\u00a0para generar el HTML final. A continuaci\u00f3n,\u00a0<code>genImage()<\/code>\u00a0llama a la funci\u00f3n de renderizado con el rango de horas y el tipo de contador que queremos recuperar del almac\u00e9n de datos. Cuando\u00a0<code>ReportData<\/code> est\u00e1 completo, pasamos los datos a\u00a0<code>mail.Report()<\/code>\u00a0para su entrega.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Ahora que tenemos nuestras im\u00e1genes y el HTML, vamos a hacer una pausa para hablar un poco sobre el MIME de HTML y la codificaci\u00f3n de las im\u00e1genes.<\/b>\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/MIME\" target=\"_tabs\" rel=\"noopener noreferrer\">MIME<\/a>\u00a0es el formato en el que se codifican los cuerpos de los emails cuando se env\u00edan mediante el protocolo SMTP. Es el formato que permite a los clientes de email codificar HTML, adem\u00e1s de adjuntar y recuperar archivos e im\u00e1genes en un email.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para que nuestras im\u00e1genes se muestren correctamente en el HTML, tenemos que codificar las im\u00e1genes en el MIME. Para ello, tenemos dos opciones: podemos a\u00f1adir las im\u00e1genes como un adjunto, o podemos poner las im\u00e1genes en l\u00ednea. El RFC sobre la disposici\u00f3n de contenido dice que <code>inline<\/code> indica que la entidad debe mostrarse de inmediato al usuario, mientras que <code>attachment<\/code> significa que el usuario debe realizar una acci\u00f3n adicional para visualizar la entidad. Como nuestras im\u00e1genes se deben mostrar de inmediato al usuario a trav\u00e9s del HTML, elegimos en l\u00ednea.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Llegados a este punto, podr\u00edamos usar cualquier n\u00famero de bibliotecas MIME de golang para poner nuestras im\u00e1genes en l\u00ednea y generar el cuerpo del email en formato MIME, pero con Mailgun, no hace falta que lo hagamos. Mailgun generar\u00e1 el MIME por nosotros y nos ofrece <a href=\"https:\/\/documentation.mailgun.com\/en\/latest\/user_manual.html#sending-inline-images\" target=\"_tabs\" rel=\"noopener noreferrer\">opciones para poner archivos en l\u00ednea<\/a> e im\u00e1genes mediante la API p\u00fablica. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora que sabemos c\u00f3mo poner las im\u00e1genes en l\u00ednea en el MIME, tenemos que hacer referencia a ellas desde nuestro HTML. Para ello, usamos el prefijo\u00a0<code>cid:<\/code>\u00a0en nuestras etiquetas\u00a0<code><img><\/code>. De este modo, si nuestra imagen en l\u00ednea se llama\u00a0most-active.png, la etiqueta de nuestra imagen ser\u00eda\u00a0<code><img decoding=\"async\" src=\"most-active.png\"><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\nCon el HTML listo, veamos c\u00f3mo enviar el email y las im\u00e1genes con mailgun-go.<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    func NewMailgunNotifier(conf Config) (Mailer, error) {rn  return &amp;Mailgun{rn    mg:   mailgun.NewMailgun(conf.Mailgun.Domain, conf.Mailgun.APIKey),rn    log:  GetLogger().WithField(&quot;prefix&quot;, &quot;mailer&quot;),rn    conf: conf,rn  }, nilrn}rnrn\/\/ Send a report to the designated email address (could be mailing list)rnfunc (m *Mailgun) Report(channelName string, data ReportData) error {rn  if m.conf.Mailgun.ReportAddr == &quot;&quot; {rn    m.log.Errorf(&quot;mailgun.enabled = true; however mailgun.report-address is empty; skipping..&quot;)rn    return nilrn  }rnrn  \/\/ Create a subject for the reportrn  subject := fmt.Sprintf(&quot;[channel-stats] Report for %s&quot;, channelName)rn  \/\/ Create a message with no text bodyrn  message := m.mg.NewMessage(m.conf.Mailgun.From, subject, &quot;&quot;, m.conf.Mailgun.ReportAddr)rn  \/\/ Send the HTML to mailgun for MIME encodingrn  message.SetHtml(string(data.Html))rnrn  for file, contents := range data.Images {rn    message.AddReaderInline(file, ioutil.NopCloser(bytes.NewBuffer(contents)))rn  }rnrn  ctx, cancel := context.WithTimeout(context.Background(), m.conf.Mailgun.Timeout.Duration)rn  defer cancel()rnrn  _, id, err := m.mg.Send(ctx, message)rn  if err != nil {rn    return errrn  }rn  m.log.Infof(&quot;Sent report via mailgun (%s)&quot;, id)rn  return nilrn}\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Primero, creamos una nueva instancia de\u00a0Mailgun\u00a0usando nuestro nombre de dominio y la clave de API en\u00a0<code>NewMailgunNotifier()<\/code>. Luego, en el m\u00e9todo\u00a0<code>Report()<\/code>, llamamos a\u00a0<code>NewMessage()<\/code>\u00a0para crear un objeto al que a\u00f1adiremos nuestro HTML y las im\u00e1genes. F\u00edjate en que el argumento\u00a0<code>text<\/code>\u00a0de\u00a0<code>NewMessage()<\/code>\u00a0es una cadena vac\u00eda. <b>Aunque es posible codificar tanto texto sin formato como HTML en el mensaje MIME, aqu\u00ed solo proporcionamos HTML porque las im\u00e1genes de gr\u00e1ficos en l\u00ednea no servir\u00edan de nada en un cliente de solo texto.<\/b> A continuaci\u00f3n, llamamos a\u00a0<code>SetHtml()<\/code>\u00a0y agregamos nuestras im\u00e1genes en l\u00ednea mediante un objeto ReadCloser que creamos sobre la marcha desde nuestro\u00a0<code>[]byte buffer<\/code>. Por \u00faltimo, enviamos la solicitud creada a la API de Mailgun para la generaci\u00f3n del MIME y la entrega mediante el m\u00e9todo\u00a0<code>Send()<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusi\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Espero que este tutorial te haya dado una idea de c\u00f3mo enviar emails en HTML de gran calidad usando mailgun-go y la API de Mailgun. Si tienes comentarios o encuentras errores en alguno de los proyectos, puedes encontrar todo el c\u00f3digo y la biblioteca a continuaci\u00f3n.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/mailgun\/mailgun-go\" target=\"_tabs\" rel=\"noopener noreferrer\">Mailgun-go<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/mailgun\/mailgun-go\" target=\"_tabs\" rel=\"noopener noreferrer\">Channel Stats<\/a><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u00bfTe interesa trabajar en Mailgun? \u00a1Buscamos gente! Y tenemos varios puestos de desarrollo disponibles. <a href=\"https:\/\/apply.workable.com\/mailgun\/?lng=en\" target=\"_tabs\" rel=\"noopener noreferrer\">Echa un vistazo a nuestras ofertas de trabajo actuales aqu\u00ed<\/a>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><b>Webinar destacado: predicciones y prop\u00f3sitos para el env\u00edo en 2019<\/b><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u00bfTe perdiste este webinar a principios de 2019? No te preocupes. \u00a1Lo hemos grabado! Vuelve a ver a Nick y Natalie hablar sobre algunos hitos del email en 2018 y de lo que nos deparaba 2019. Los equipos t\u00e9cnico y de marketing aunaron posturas en este tema, y puedes\u00a0<a href=\"https:\/\/www.crowdcast.io\/e\/predictions-resolutions-2019\/register\" target=\"_tabs\" rel=\"noopener noreferrer\">volver a verlo aqu\u00ed.<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4175\" width=\"1024\" height=\"536\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Hubspot.png\" alt=\"Mailgun&apos;s Predictions &amp; Resolutions webinar banner featuring Nick Schafer and Natalie Hays\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Hubspot.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Hubspot-300x157.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Hubspot-768x402.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\r\n    <aside data-content-type=\"longform\"  class=\"banner-block longform-spacings rounded-lg shadow-lg px-5 py-6 px-md-6 py-md-7 p-lg-7 bg-light\" data-theme=\"dark\" aria-labelledby=\"banner-block-block_b7d83215dffd633b9a43d3d0584da199\">\r\n                    <p class=\"text-uppercase section-caption text-body-color\">\r\n                Reg\u00edstrate            <\/p>\r\n                            <p class=\"h4 text-accent fw-bold\" id=\"banner-block-block_b7d83215dffd633b9a43d3d0584da199\">\r\n                Empezar es facil\u00edsimo. Y gratis.            <\/p>\r\n                            <div class=\"mb-0 text-body-color\">\r\n                                    <div class=\"content-body mb-0 text-body-color\">Descubre todo lo que puedes lograr con la mejor plataforma de entrega de emails del mundo.<\/div>\r\n                            <\/div>\r\n        \r\n        <div class=\"text-start mt-5\"><a href=\"https:\/\/signup.mailgun.com\/new\/signup\"  class=\"btn btn-secondary\" >Get started<\/a><\/div>\r\n    <\/aside>\r\n\r\n","protected":false},"excerpt":{"rendered":"<p>En este tutorial, te ense\u00f1ar\u00e9 c\u00f3mo enviar emails en HTML con im\u00e1genes incrustadas usando mailgun-go. Antes de meternos en la programaci\u00f3n, vamos a definir el problema y c\u00f3mo podemos usar Mailgun para mejorar la experiencia de usuario de nuestra aplicaci\u00f3n.<\/p>\n","protected":false},"author":35,"featured_media":4074,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[20],"class_list":["post-20560","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog_category-email"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Env\u00edo de emails en HTML con Mailgun-GoLang - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"En este tutorial, te ense\u00f1ar\u00e9 c\u00f3mo enviar emails en HTML con im\u00e1genes incrustadas usando mailgun-go. M\u00e1s informaci\u00f3n...\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.mailgun.com\/es\/blog\/email\/envio-emails-html-mailgun-go\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Env\u00edo de emails en HTML con Mailgun-GoLang - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"En este tutorial, te ense\u00f1ar\u00e9 c\u00f3mo enviar emails en HTML con im\u00e1genes incrustadas usando mailgun-go. M\u00e1s informaci\u00f3n...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/es\/blog\/email\/envio-emails-html-mailgun-go\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png\" \/>\n\t<meta property=\"og:image:width\" content=\"720\" \/>\n\t<meta property=\"og:image:height\" content=\"448\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/email\\\/envio-emails-html-mailgun-go\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/email\\\/envio-emails-html-mailgun-go\\\/\",\"name\":\"Env\u00edo de emails en HTML con Mailgun-GoLang - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/email\\\/envio-emails-html-mailgun-go\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/email\\\/envio-emails-html-mailgun-go\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Email.png\",\"datePublished\":\"2026-09-15T01:22:37+00:00\",\"description\":\"En este tutorial, te ense\u00f1ar\u00e9 c\u00f3mo enviar emails en HTML con im\u00e1genes incrustadas usando mailgun-go. M\u00e1s informaci\u00f3n...\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/email\\\/envio-emails-html-mailgun-go\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/email\\\/envio-emails-html-mailgun-go\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/email\\\/envio-emails-html-mailgun-go\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Email.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Email.png\",\"width\":720,\"height\":448},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/email\\\/envio-emails-html-mailgun-go\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Env\u00edo de emails en HTML con Mailgun-Go\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Potentes API de email transaccional que te permiten enviar, recibir y hacer seguimiento de emails, creadas pensando en los desarrolladores. \u00a1Descubre m\u00e1s!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"width\":512,\"height\":512,\"caption\":\"Transactional Email API Service For Developers | Mailgun\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Env\u00edo de emails en HTML con Mailgun-GoLang - Transactional Email API Service For Developers | Mailgun","description":"En este tutorial, te ense\u00f1ar\u00e9 c\u00f3mo enviar emails en HTML con im\u00e1genes incrustadas usando mailgun-go. M\u00e1s informaci\u00f3n...","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.mailgun.com\/es\/blog\/email\/envio-emails-html-mailgun-go\/","og_locale":"es_ES","og_type":"article","og_title":"Env\u00edo de emails en HTML con Mailgun-GoLang - Transactional Email API Service For Developers | Mailgun","og_description":"En este tutorial, te ense\u00f1ar\u00e9 c\u00f3mo enviar emails en HTML con im\u00e1genes incrustadas usando mailgun-go. M\u00e1s informaci\u00f3n...","og_url":"https:\/\/www.mailgun.com\/es\/blog\/email\/envio-emails-html-mailgun-go\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","og_image":[{"width":720,"height":448,"url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/es\/blog\/email\/envio-emails-html-mailgun-go\/","url":"https:\/\/www.mailgun.com\/es\/blog\/email\/envio-emails-html-mailgun-go\/","name":"Env\u00edo de emails en HTML con Mailgun-GoLang - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/email\/envio-emails-html-mailgun-go\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/email\/envio-emails-html-mailgun-go\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png","datePublished":"2026-09-15T01:22:37+00:00","description":"En este tutorial, te ense\u00f1ar\u00e9 c\u00f3mo enviar emails en HTML con im\u00e1genes incrustadas usando mailgun-go. M\u00e1s informaci\u00f3n...","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/email\/envio-emails-html-mailgun-go\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/es\/blog\/email\/envio-emails-html-mailgun-go\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.mailgun.com\/es\/blog\/email\/envio-emails-html-mailgun-go\/#primaryimage","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png","width":720,"height":448},{"@type":"BreadcrumbList","@id":"https:\/\/www.mailgun.com\/es\/blog\/email\/envio-emails-html-mailgun-go\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/es\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/es\/blog\/"},{"@type":"ListItem","position":3,"name":"Env\u00edo de emails en HTML con Mailgun-Go"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/es\/#website","url":"https:\/\/www.mailgun.com\/es\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Potentes API de email transaccional que te permiten enviar, recibir y hacer seguimiento de emails, creadas pensando en los desarrolladores. \u00a1Descubre m\u00e1s!","publisher":{"@id":"https:\/\/www.mailgun.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/es\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.mailgun.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","width":512,"height":512,"caption":"Transactional Email API Service For Developers | Mailgun"},"image":{"@id":"https:\/\/www.mailgun.com\/es\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/20560","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/users\/35"}],"version-history":[{"count":0,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/20560\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/media\/4074"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/media?parent=20560"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog_category?post=20560"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}