{"id":20719,"date":"2026-09-15T04:47:49","date_gmt":"2026-09-15T04:47:49","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/envio-de-emails-em-html-com-mailgun-go\/"},"modified":"2026-09-15T04:47:49","modified_gmt":"2026-09-15T04:47:49","slug":"envio-de-emails-em-html-com-mailgun-go","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/pt\/blog\/email\/envio-de-emails-em-html-com-mailgun-go\/","title":{"rendered":"Envio de e-mails em HTML com o mailgun-go"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Neste tutorial, vou demonstrar como voc\u00ea pode enviar e-mails em HTML com imagens incorporadas usando o mailgun-go. Antes de mergulharmos no c\u00f3digo, vamos primeiro definir o espa\u00e7o do problema e <b>como podemos usar o Mailgun para melhorar a experi\u00eancia do usu\u00e1rio da nossa aplica\u00e7\u00e3o.<\/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-1764\"><p class=\"h5 m-0\" id=\"toc-title-1764\">\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=\"#apresentando-o-channel-stats\">Apresentando o 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=\"#e-mail-em-html\">e-mail em 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=\"#o-codigo\">O 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=\"#conclusao\">Conclus\u00e3o<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">Apresentando o 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>\u00a0\u00e9 um bot do Slack para coletar estat\u00edsticas sobre mensagens enviadas a um canal do Slack. Al\u00e9m de contabilizar emojis e links compartilhados no canal, ele tamb\u00e9m realiza a an\u00e1lise de sentimento das mensagens e fornece uma pontua\u00e7\u00e3o positiva ou negativa que pode posteriormente <b>ser revisada pelos usu\u00e1rios e convertida em gr\u00e1fico como uma porcentagem do total de mensagens.<\/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 expandir esse recurso com um relat\u00f3rio semanal por e-mail com as estat\u00edsticas de um canal para nossos usu\u00e1rios. Como o nosso e-mail incluir\u00e1 dados em formato de gr\u00e1fico, os e-mails em texto simples seriam bem mon\u00f3tonos; em vez disso, queremos enviar um e-mail em HTML rico com gr\u00e1ficos para a caixa de entrada do nosso usu\u00e1rio. Para fazer isso, precisamos criar um HTML com CSS inline e imagens para torn\u00e1-lo visualmente atraente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">e-mail em HTML<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Muito j\u00e1 foi escrito sobre o assunto do envio de HTML em e-mails, mas aqui est\u00e3o algumas boas regras a seguir:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><b>SIM: <\/b>use CSS inline<\/li>\n\n\n\n<li><b>SIM: <\/b>use TABELAS em HTML para o layout<\/li>\n\n\n\n<li><b>SIM: <\/b>use imagens (d\u00ea prefer\u00eancia ao formato .png)<\/li>\n\n\n\n<li><b>SIM: <\/b>use imagens inline<\/li>\n\n\n\n<li><b>N\u00c3O: <\/b>use o HTML5<\/li>\n\n\n\n<li><b>N\u00c3O:\u00a0<\/b>use anima\u00e7\u00f5es em CSS<\/li>\n\n\n\n<li><b>N\u00c3O:\u00a0 <\/b>vincule a uma folha de estilos externa<\/li>\n\n\n\n<li><b>N\u00c3O: <\/b>use estilos CSS no HEAD<\/li>\n\n\n\n<li><b>N\u00c3O:\u00a0<\/b>use JavaScript<\/li>\n\n\n\n<li><b>N\u00c3O:\u00a0<\/b>use Flash<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Muitas vezes, n\u00e3o basta seguir as regras acima, pois n\u00e3o h\u00e1 padr\u00f5es estabelecidos sobre como o HTML em e-mails \u00e9 renderizado. Se voc\u00ea tem o compromisso de garantir que seus e-mails sejam renderizados corretamente no maior n\u00famero poss\u00edvel de clientes, <b>pode ser uma boa ideia usar um servi\u00e7o como o\u00a0<\/b><a href=\"https:\/\/litmus.com\/\" target=\"_tabs\" rel=\"noopener noreferrer\"><b>Litmus<\/b><\/a><b>\u00a0para criar, pr\u00e9-visualizar e testar seu e-mail em diversos clientes<\/b>. No entanto, para o nosso prop\u00f3sito, e como o channel-stats \u00e9 um projeto de c\u00f3digo aberto, vou manter os custos de produ\u00e7\u00e3o baixos usando alguns modelos gratuitos fornecidos pelo\u00a0<a href=\"https:\/\/github.com\/mailgun\/transactional-email-templates\" target=\"_tabs\" rel=\"noopener noreferrer\">Mailgun<\/a>\u00a0(recebi uma ajuda da nossa equipe de design de UX\/UI). O resultado \u00e9 o seguinte:<\/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\">Agora que temos nosso HTML e CSS, precisamos colocar o CSS inline para que a maioria dos clientes de e-mail renderize o nosso e-mail corretamente. H\u00e1 uma variedade de ferramentas on-line para fazer isso, mas recomendamos o\u00a0<a href=\"http:\/\/premailer.dialect.ca\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Dialect Premailer<\/a>\u00a0para essa finalidade.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">O c\u00f3digo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Como queremos que o e-mail seja enviado semanalmente, usamos uma\u00a0<a href=\"http:\/\/github.com\/robfig\/cron\" target=\"_tabs\" rel=\"noopener noreferrer\">biblioteca cron<\/a>\u00a0para criar uma fun\u00e7\u00e3o que ser\u00e1 executada todos os domingos \u00e0 meia-noite. Em seguida, precisamos gerar as imagens que ir\u00e3o no nosso e-mail. O channel-stats j\u00e1 usa o\u00a0<a href=\"http:\/\/github.com\/wcharczuk\/go-chart\" target=\"_tabs\" rel=\"noopener noreferrer\">go-chart<\/a>\u00a0para renderizar imagens de gr\u00e1ficos em .png para a UI, ent\u00e3o podemos apenas adaptar isso para nossos prop\u00f3sitos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Al\u00e9m disso, ao entregar o nosso projeto final, n\u00e3o queremos distribuir os arquivos HTML e CSS separadamente do bin\u00e1rio Go final compilado; por isso, <b>o channel-stats usa o projeto\u00a0<\/b><a href=\"http:\/\/github.com\/tmthrgd\/go-bindata\" target=\"_tabs\" rel=\"noopener noreferrer\"><b>go-bindata<\/b><\/a><b>\u00a0para agrupar o HTML e o CSS em um \u00fanico bin\u00e1rio do channel-stats.<\/b><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Agora, vamos dar uma olhada no c\u00f3digo de renderiza\u00e7\u00e3o.<\/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=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\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\">No m\u00e9todo\u00a0<code>Start()<\/code>, n\u00f3s iteramos sobre todos os canais dos quais o bot \u00e9 membro e geramos um relat\u00f3rio para cada canal. Em seguida, fazemos uma chamada para\u00a0<code>genHtml()<\/code>, que recupera nosso e-mail em HTML como um modelo chamado <code>templates\/email.tmpl<\/code> do nosso armazenamento de ativos compilados no pacote\u00a0<code>HTML<\/code>. Em seguida, executamos o modelo por meio do mecanismo de\u00a0<code>HTML\/template<\/code>\u00a0padr\u00e3o da linguagem Go para produzir o HTML final. Depois, a fun\u00e7\u00e3o\u00a0<code>genImage()<\/code>\u00a0chama a fun\u00e7\u00e3o de renderiza\u00e7\u00e3o com o intervalo de horas e o tipo de contador que queremos recuperar do armazenamento de dados. Assim que o\u00a0<code>ReportData<\/code> estiver completo, repassamos os dados para\u00a0<code>mail.Report()<\/code>\u00a0para a entrega.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Agora que temos nossas imagens e o HTML, vamos fazer uma pausa para falar um pouco sobre MIME HTML e codifica\u00e7\u00e3o de imagens.<\/b>\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/MIME\" target=\"_tabs\" rel=\"noopener noreferrer\">MIME<\/a>\u00a0\u00e9 o formato no qual os corpos dos e-mails s\u00e3o codificados quando enviados por meio do protocolo SMTP. \u00c9 o formato que permite aos clientes de e-mail codificar HTML, anexar e recuperar arquivos e imagens em um e-mail.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para que nossas imagens sejam exibidas corretamente no HTML, precisamos codificar as imagens no MIME. Para isso, temos duas op\u00e7\u00f5es: podemos adicionar as imagens como um anexo, ou podemos colocar as imagens inline. A RFC sobre a disposi\u00e7\u00e3o de conte\u00fado diz que o <code>inline<\/code> indica que a entidade deve ser exibida imediatamente ao usu\u00e1rio, ao passo que <code>attachment<\/code> significa que o usu\u00e1rio deve realizar uma a\u00e7\u00e3o adicional para visualizar a entidade. Como as nossas imagens devem ser exibidas imediatamente ao usu\u00e1rio por meio do HTML \u2014 optamos por usar a op\u00e7\u00e3o inline.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Neste ponto, poder\u00edamos usar v\u00e1rias bibliotecas MIME para a linguagem Go para colocar nossas imagens inline e gerar o corpo do e-mail no formato MIME, mas com o Mailgun, n\u00e3o precisamos disso. O Mailgun gerar\u00e1 o MIME para n\u00f3s e fornece <a href=\"https:\/\/documentation.mailgun.com\/en\/latest\/user_manual.html#sending-inline-images\" target=\"_tabs\" rel=\"noopener noreferrer\">op\u00e7\u00f5es para colocar arquivos inline<\/a> e imagens por meio da API p\u00fablica. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Agora que sabemos como colocar imagens inline no MIME, precisamos referenci\u00e1-las em nosso HTML. Para fazer isso, usamos o prefixo\u00a0<code>cid:<\/code>\u00a0em nossas tags\u00a0<code><img><\/code>. De forma que se a nossa imagem inline for chamada de\u00a0most-active.png,\u00a0nossa tag de imagem seria\u00a0<code><img decoding=\"async\" src=\"most-active.png\"><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\nCom o nosso HTML pronto, vamos ver como enviar o e-mail e as imagens com o 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=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-clipboard-success-label=\"Copiado!\" data-clipboard-error-label=\"N\u00e3o foi poss\u00edvel copiar\" data-tooltip=\"Copiar para a \u00e1rea de transfer\u00eancia\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copiar para a \u00e1rea de transfer\u00eancia\">\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\">Primeiro, criamos uma nova inst\u00e2ncia do\u00a0Mailgun\u00a0usando nosso nome de dom\u00ednio e chave de API em\u00a0<code>NewMailgunNotifier()<\/code>. A seguir, no m\u00e9todo\u00a0<code>Report()<\/code>, chamamos\u00a0<code>NewMessage()<\/code>\u00a0para criar um objeto ao qual adicionaremos o nosso HTML e as imagens. Observe que o argumento\u00a0<code>text<\/code>\u00a0para\u00a0<code>NewMessage()<\/code>\u00a0\u00e9 uma string vazia. <b>Embora seja poss\u00edvel codificar tanto o texto simples quanto o HTML na mensagem MIME, n\u00f3s fornecemos apenas o HTML aqui porque as imagens de gr\u00e1ficos inline seriam in\u00fateis para um cliente apenas de texto.<\/b> Em seguida, chamamos o m\u00e9todo\u00a0<code>SetHtml()<\/code>\u00a0e acrescentamos nossas imagens inline por meio de um objeto ReadCloser, que criamos dinamicamente a partir de nosso\u00a0<code>[]byte buffer<\/code>. Por fim, enviamos a solicita\u00e7\u00e3o elaborada \u00e0 API do Mailgun para a constru\u00e7\u00e3o e a entrega do MIME usando o m\u00e9todo\u00a0<code>Send()<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Esperamos que este tutorial tenha dado algumas dicas sobre como enviar e-mails baseados em HTML de alta qualidade usando o mailgun-go e a API do Mailgun. Se voc\u00ea tiver algum feedback ou encontrar bugs em algum dos projetos, o c\u00f3digo completo e a biblioteca podem ser encontrados abaixo.<\/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\">Tem interesse em trabalhar no Mailgun? Estamos contratando! E h\u00e1 v\u00e1rias vagas dispon\u00edveis para a equipe de desenvolvimento. <a href=\"https:\/\/apply.workable.com\/mailgun\/?lng=en\" target=\"_tabs\" rel=\"noopener noreferrer\">Confira nossas vagas atuais aqui<\/a>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><b>Webinar em destaque \u2013 Previs\u00f5es &amp; resolu\u00e7\u00f5es: envios em 2019<\/b><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Perdeu este webinar no in\u00edcio de 2019? N\u00e3o se preocupe, n\u00f3s o gravamos! Assista novamente ao Nick e \u00e0 Natalie falarem sobre algumas coisas que aconteceram com os e-mails em 2018 e o que eles achavam que estava por vir em 2019. As \u00e1reas t\u00e9cnica e de marketing chegaram a um meio-termo neste webinar, e voc\u00ea pode\u00a0<a href=\"https:\/\/www.crowdcast.io\/e\/predictions-resolutions-2019\/register\" target=\"_tabs\" rel=\"noopener noreferrer\">assistir a ele novamente aqui.<\/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_8707babdd56b0ccfc9f3eed3174b6fa6\">\r\n                    <p class=\"text-uppercase section-caption text-body-color\">\r\n                Cadastre-se            <\/p>\r\n                            <p class=\"h4 text-accent fw-bold\" id=\"banner-block-block_8707babdd56b0ccfc9f3eed3174b6fa6\">\r\n                \u00c9 f\u00e1cil come\u00e7ar. E \u00e9 gr\u00e1tis.            <\/p>\r\n                            <div class=\"mb-0 text-body-color\">\r\n                                    <div class=\"content-body mb-0 text-body-color\">Veja o que voc\u00ea pode alcan\u00e7ar com a melhor plataforma de entrega de e-mail do 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>Neste tutorial, vou demonstrar como voc\u00ea pode enviar e-mails em HTML com imagens incorporadas usando o mailgun-go. Antes de mergulharmos no c\u00f3digo, vamos primeiro definir o espa\u00e7o do problema e como podemos usar o Mailgun para melhorar a experi\u00eancia do usu\u00e1rio da nossa aplica\u00e7\u00e3o.<\/p>\n","protected":false},"author":35,"featured_media":4074,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[20],"class_list":["post-20719","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>Envio de e-mails em HTML com o Mailgun-GoLang - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Neste tutorial, vou demonstrar como voc\u00ea pode enviar e-mails em HTML com imagens incorporadas usando o mailgun-go. Leia mais...\" \/>\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\/pt\/blog\/email\/envio-de-emails-em-html-com-mailgun-go\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Envio de e-mails em HTML com o Mailgun-GoLang - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Neste tutorial, vou demonstrar como voc\u00ea pode enviar e-mails em HTML com imagens incorporadas usando o mailgun-go. Leia mais...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/pt\/blog\/email\/envio-de-emails-em-html-com-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\\\/pt\\\/blog\\\/email\\\/envio-de-emails-em-html-com-mailgun-go\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/envio-de-emails-em-html-com-mailgun-go\\\/\",\"name\":\"Envio de e-mails em HTML com o Mailgun-GoLang - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/envio-de-emails-em-html-com-mailgun-go\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/envio-de-emails-em-html-com-mailgun-go\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Email.png\",\"datePublished\":\"2026-09-15T04:47:49+00:00\",\"description\":\"Neste tutorial, vou demonstrar como voc\u00ea pode enviar e-mails em HTML com imagens incorporadas usando o mailgun-go. Leia mais...\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/envio-de-emails-em-html-com-mailgun-go\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/envio-de-emails-em-html-com-mailgun-go\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/email\\\/envio-de-emails-em-html-com-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\\\/pt\\\/blog\\\/email\\\/envio-de-emails-em-html-com-mailgun-go\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/inicio\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Envio de e-mails em HTML com o mailgun-go\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Poderosas APIs de e-mail transacional que permitem a voc\u00ea enviar, receber e rastrear e-mails, criadas com os desenvolvedores em mente. Saiba mais hoje mesmo!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/pt\\\/#\\\/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\\\/pt\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Envio de e-mails em HTML com o Mailgun-GoLang - Transactional Email API Service For Developers | Mailgun","description":"Neste tutorial, vou demonstrar como voc\u00ea pode enviar e-mails em HTML com imagens incorporadas usando o mailgun-go. Leia mais...","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\/pt\/blog\/email\/envio-de-emails-em-html-com-mailgun-go\/","og_locale":"pt_BR","og_type":"article","og_title":"Envio de e-mails em HTML com o Mailgun-GoLang - Transactional Email API Service For Developers | Mailgun","og_description":"Neste tutorial, vou demonstrar como voc\u00ea pode enviar e-mails em HTML com imagens incorporadas usando o mailgun-go. Leia mais...","og_url":"https:\/\/www.mailgun.com\/pt\/blog\/email\/envio-de-emails-em-html-com-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\/pt\/blog\/email\/envio-de-emails-em-html-com-mailgun-go\/","url":"https:\/\/www.mailgun.com\/pt\/blog\/email\/envio-de-emails-em-html-com-mailgun-go\/","name":"Envio de e-mails em HTML com o Mailgun-GoLang - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/email\/envio-de-emails-em-html-com-mailgun-go\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/email\/envio-de-emails-em-html-com-mailgun-go\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png","datePublished":"2026-09-15T04:47:49+00:00","description":"Neste tutorial, vou demonstrar como voc\u00ea pode enviar e-mails em HTML com imagens incorporadas usando o mailgun-go. Leia mais...","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/pt\/blog\/email\/envio-de-emails-em-html-com-mailgun-go\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/pt\/blog\/email\/envio-de-emails-em-html-com-mailgun-go\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.mailgun.com\/pt\/blog\/email\/envio-de-emails-em-html-com-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\/pt\/blog\/email\/envio-de-emails-em-html-com-mailgun-go\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/pt\/inicio\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/pt\/blog\/"},{"@type":"ListItem","position":3,"name":"Envio de e-mails em HTML com o mailgun-go"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/pt\/#website","url":"https:\/\/www.mailgun.com\/pt\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Poderosas APIs de e-mail transacional que permitem a voc\u00ea enviar, receber e rastrear e-mails, criadas com os desenvolvedores em mente. Saiba mais hoje mesmo!","publisher":{"@id":"https:\/\/www.mailgun.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/pt\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.mailgun.com\/pt\/#\/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\/pt\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog\/20719","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/users\/35"}],"version-history":[{"count":0,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog\/20719\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/media\/4074"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/media?parent=20719"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/pt\/wp-json\/wp\/v2\/blog_category?post=20719"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}