{"id":20669,"date":"2026-09-15T03:53:00","date_gmt":"2026-09-15T03:53:00","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/envoyer-emails-html-mailgun-go\/"},"modified":"2026-09-15T03:53:00","modified_gmt":"2026-09-15T03:53:00","slug":"envoyer-emails-html-mailgun-go","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/fr\/blog\/email\/envoyer-emails-html-mailgun-go\/","title":{"rendered":"Envoyer des emails HTML avec Mailgun-Go"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Dans ce tutoriel, je vais vous montrer comment envoyer des emails HTML avec des images int\u00e9gr\u00e9es gr\u00e2ce \u00e0 mailgun-go. Avant de nous plonger dans le code, d\u00e9finissons d&rsquo;abord le probl\u00e8me et <b>comment utiliser Mailgun pour am\u00e9liorer l&rsquo;exp\u00e9rience utilisateur de notre application.<\/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-5165\"><p class=\"h5 m-0\" id=\"toc-title-5165\">Table des mati\u00e8res<\/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=\"#presentation-de-channel-stats\">Pr\u00e9sentation de 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-html\">email 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=\"#le-code\">Le code<\/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\">Conclusion<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">Pr\u00e9sentation de 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>\u00a0est un bot Slack qui permet de collecter des statistiques sur les messages envoy\u00e9s sur un canal Slack. En plus de comptabiliser les emojis et les liens partag\u00e9s dans le canal, il effectue \u00e9galement une analyse de sentiment des messages et attribue un score positif ou n\u00e9gatif. Ce score peut ensuite <b>\u00eatre examin\u00e9 par les utilisateurs et repr\u00e9sent\u00e9 sous forme de pourcentage du total des messages.<\/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\">Nous voulons d\u00e9velopper cette fonctionnalit\u00e9 en envoyant un rapport email hebdomadaire sur les statistiques d&rsquo;un canal \u00e0 nos utilisateurs. \u00c9tant donn\u00e9 que notre email inclura des donn\u00e9es sous forme de graphique, les emails en texte brut seraient plut\u00f4t ennuyeux. Nous voulons plut\u00f4t envoyer un email HTML enrichi de graphiques dans la bo\u00eete de r\u00e9ception de nos utilisateurs. Pour y parvenir, nous devons cr\u00e9er du code HTML, avec du CSS en ligne et des images pour le rendre visuellement attrayant.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">email HTML<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Beaucoup de choses ont \u00e9t\u00e9 \u00e9crites sur l&rsquo;envoi de HTML dans les emails, mais voici quelques bonnes r\u00e8gles \u00e0 suivre\u00a0:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><b>\u00c0 FAIRE\u00a0: <\/b>utiliser du CSS en ligne<\/li>\n\n\n\n<li><b>\u00c0 FAIRE\u00a0: <\/b>utiliser des TABLEAUX HTML pour la mise en page<\/li>\n\n\n\n<li><b>\u00c0 FAIRE\u00a0: <\/b>utiliser des images (de pr\u00e9f\u00e9rence au format .png)<\/li>\n\n\n\n<li><b>\u00c0 FAIRE\u00a0: <\/b>int\u00e9grer les images en ligne<\/li>\n\n\n\n<li><b>\u00c0 NE PAS FAIRE\u00a0: <\/b>utiliser le HTML5<\/li>\n\n\n\n<li><b>\u00c0 NE PAS FAIRE\u00a0: <\/b>utiliser les animations CSS<\/li>\n\n\n\n<li><b>\u00c0 NE PAS FAIRE\u00a0: <\/b>cr\u00e9er de lien vers une feuille de style externe<\/li>\n\n\n\n<li><b>\u00c0 NE PAS FAIRE\u00a0: <\/b>utiliser des styles CSS dans le HEAD<\/li>\n\n\n\n<li><b>\u00c0 NE PAS FAIRE\u00a0: <\/b>utiliser du javascript<\/li>\n\n\n\n<li><b>\u00c0 NE PAS FAIRE\u00a0: <\/b>utiliser du flash<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Il ne suffit souvent pas de suivre les r\u00e8gles ci-dessus, car il n&rsquo;existe pas de normes \u00e9tablies sur la fa\u00e7on dont le HTML dans les emails est rendu. Si vous tenez \u00e0 ce que vos emails s&rsquo;affichent correctement sur autant de clients que possible, <b>vous pourriez envisager d&rsquo;utiliser un service tel que\u00a0<\/b><a href=\"https:\/\/litmus.com\/\" target=\"_tabs\" rel=\"noopener noreferrer\"><b>Litmus<\/b><\/a><b>\u00a0pour cr\u00e9er, afficher la pr\u00e9visualisation et tester votre email sur divers clients de messagerie<\/b>. Cependant, pour notre objectif et puisque channel-stats est un projet open source, je maintiens les co\u00fbts de production \u00e0 un niveau bas et j&rsquo;utilise des mod\u00e8les gratuits fournis par\u00a0<a href=\"https:\/\/github.com\/mailgun\/transactional-email-templates\" target=\"_tabs\" rel=\"noopener noreferrer\">Mailgun<\/a>\u00a0(J&rsquo;ai re\u00e7u de l&rsquo;aide de l&rsquo;un de nos designers UX\/UI). Voici le r\u00e9sultat obtenu\u00a0:<\/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\">Maintenant que nous avons notre HTML et notre CSS, nous devons mettre le CSS en ligne afin que la majorit\u00e9 des clients de messagerie affichent correctement notre email. Il existe une multitude d&rsquo;outils en ligne pour y parvenir, mais nous recommandons\u00a0<a href=\"http:\/\/premailer.dialect.ca\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Dialect Premailer<\/a>\u00a0\u00e0 cet effet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Le code<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Puisque nous voulons que l&#8217;email soit envoy\u00e9 de fa\u00e7on hebdomadaire, nous utilisons une\u00a0<a href=\"http:\/\/github.com\/robfig\/cron\" target=\"_tabs\" rel=\"noopener noreferrer\">biblioth\u00e8que cron<\/a>\u00a0pour cr\u00e9er une fonction qui s&rsquo;ex\u00e9cutera tous les dimanches soirs \u00e0 minuit. Ensuite, nous devons g\u00e9n\u00e9rer les images qui appara\u00eetront dans notre email. Channel-stats utilise d\u00e9j\u00e0\u00a0<a href=\"http:\/\/github.com\/wcharczuk\/go-chart\" target=\"_tabs\" rel=\"noopener noreferrer\">go-chart<\/a>\u00a0pour rendre les images de graphiques .png pour l&rsquo;interface utilisateur, nous pouvons donc simplement l&rsquo;adapter \u00e0 nos besoins.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">De plus, lors de la livraison de notre projet final, nous ne voulons pas distribuer les fichiers HTML et CSS s\u00e9par\u00e9ment de notre binaire golang final compil\u00e9. C&rsquo;est pourquoi <b>channel-stats utilise le projet\u00a0<\/b><a href=\"http:\/\/github.com\/tmthrgd\/go-bindata\" target=\"_tabs\" rel=\"noopener noreferrer\"><b>go-bindata<\/b><\/a><b>\u00a0pour regrouper le HTML et le CSS dans un seul binaire channel-stats.<\/b><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Examinons maintenant le code de rendu.<\/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=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\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\">Dans la m\u00e9thode\u00a0<code>Start()<\/code>, nous parcourons tous les canaux dont le bot est membre et g\u00e9n\u00e9rons un rapport pour chacun d&rsquo;eux. Nous appelons ensuite\u00a0<code>genHtml()<\/code>, qui r\u00e9cup\u00e8re notre email HTML sous forme de mod\u00e8le appel\u00e9 <code>templates\/email.tmpl<\/code> depuis notre magasin d&rsquo;assets compil\u00e9 dans le package\u00a0<code>HTML<\/code>. Nous ex\u00e9cutons ensuite le mod\u00e8le via le moteur standard de golang\u00a0<code>HTML\/template<\/code>\u00a0pour produire le HTML final. Ensuite, l&rsquo;appel \u00e0\u00a0<code>genImage()<\/code>\u00a0d\u00e9clenche la fonction de rendu avec la plage d&rsquo;heures et le type de compteur que nous souhaitons r\u00e9cup\u00e9rer du magasin de donn\u00e9es. Une fois que\u00a0<code>ReportData<\/code> est termin\u00e9, nous transmettons les donn\u00e9es \u00e0\u00a0<code>mail.Report()<\/code>\u00a0pour la livraison.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Maintenant que nous avons nos images et notre HTML, faisons une pause pour parler un peu du format MIME HTML et de l&rsquo;encodage des images.<\/b>\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/MIME\" target=\"_tabs\" rel=\"noopener noreferrer\">MIME<\/a>\u00a0est le format dans lequel le corps des emails est encod\u00e9 lors de l&rsquo;envoi via le protocole SMTP. C&rsquo;est le format qui permet aux clients de messagerie d&rsquo;encoder le HTML, de joindre et de r\u00e9cup\u00e9rer des fichiers et des images dans un email.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour que nos images s&rsquo;affichent correctement en HTML, nous devons les encoder dans le MIME. Pour cela, nous avons deux options\u00a0: nous pourrions ajouter les images en tant que pi\u00e8ce jointe, ou nous pourrions les int\u00e9grer en ligne. La RFC sur la disposition du contenu (Content-Disposition) indique que <code>inline<\/code> signifie que l&rsquo;entit\u00e9 doit s&rsquo;afficher imm\u00e9diatement pour l&rsquo;utilisateur, tandis que <code>attachment<\/code> signifie que l&rsquo;utilisateur doit effectuer une action suppl\u00e9mentaire pour consulter l&rsquo;entit\u00e9. Puisque nos images doivent s&rsquo;afficher imm\u00e9diatement pour l&rsquo;utilisateur via le HTML, nous choisissons l&rsquo;option en ligne (inline).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c0 ce stade, nous pourrions utiliser n&rsquo;importe quelle biblioth\u00e8que MIME pour golang afin d&rsquo;int\u00e9grer nos images en ligne et g\u00e9n\u00e9rer le corps de l&#8217;email au format MIME, mais avec Mailgun, ce n&rsquo;est pas n\u00e9cessaire. Mailgun g\u00e9n\u00e9rera le MIME pour nous et fournit <a href=\"https:\/\/documentation.mailgun.com\/en\/latest\/user_manual.html#sending-inline-images\" target=\"_tabs\" rel=\"noopener noreferrer\">des options pour int\u00e9grer des fichiers en ligne<\/a> et des images via l&rsquo;API publique. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Maintenant que nous savons comment int\u00e9grer des images en ligne dans le MIME, nous devons les r\u00e9f\u00e9rencer depuis notre HTML. Pour ce faire, nous utilisons le pr\u00e9fixe\u00a0<code>cid:<\/code>\u00a0dans nos balises\u00a0<code><img><\/code>. De telle sorte que si notre image en ligne s&rsquo;appelle\u00a0most-active.png, notre balise d&rsquo;image serait\u00a0<code><img decoding=\"async\" src=\"most-active.png\"><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\nNotre HTML \u00e9tant pr\u00eat, voyons comment envoyer l&#8217;email et les images avec 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=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\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\">Tout d&rsquo;abord, nous cr\u00e9ons une nouvelle instance de\u00a0Mailgun\u00a0en utilisant notre nom de domaine et notre cl\u00e9 API dans\u00a0<code>NewMailgunNotifier()<\/code>. Ensuite, dans la m\u00e9thode\u00a0<code>Report()<\/code>, nous appelons\u00a0<code>NewMessage()<\/code>\u00a0pour cr\u00e9er un objet auquel nous ajouterons notre HTML et nos images. Remarquez que l&rsquo;argument\u00a0<code>text<\/code>\u00a0de\u00a0<code>NewMessage()<\/code>\u00a0est une cha\u00eene vide. <b>Bien qu&rsquo;il soit possible d&rsquo;encoder \u00e0 la fois du texte brut et du HTML dans le message MIME, nous ne fournissons que du HTML ici, car les images de graphiques en ligne seraient inutiles pour un client de messagerie uniquement textuel.<\/b> Ensuite, nous appelons\u00a0<code>SetHtml()<\/code>\u00a0et ajoutons nos images en ligne via un objet read closer que nous cr\u00e9ons \u00e0 la vol\u00e9e \u00e0 partir de notre tampon\u00a0<code>[]byte buffer<\/code>. Enfin, nous envoyons notre requ\u00eate pr\u00e9par\u00e9e \u00e0 l&rsquo;API de Mailgun pour la construction du MIME et la livraison en utilisant la m\u00e9thode\u00a0<code>Send()<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nous esp\u00e9rons que ce tutoriel vous a donn\u00e9 un aper\u00e7u de la mani\u00e8re d&rsquo;envoyer des emails HTML de haute qualit\u00e9 \u00e0 l&rsquo;aide de mailgun-go et de l&rsquo;API de Mailgun. Si vous avez des commentaires ou trouvez des bugs dans l&rsquo;un ou l&rsquo;autre des projets, le code complet et la biblioth\u00e8que se trouvent ci-dessous.<\/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\">Envie de travailler chez Mailgun\u00a0? Nous recrutons\u00a0! Et plusieurs postes de d\u00e9veloppement sont \u00e0 pourvoir. <a href=\"https:\/\/apply.workable.com\/mailgun\/?lng=en\" target=\"_tabs\" rel=\"noopener noreferrer\">D\u00e9couvrez nos offres d&#8217;emploi actuelles ici<\/a>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><b>Webinar \u00e0 la une \u2013 Pr\u00e9dictions et r\u00e9solutions\u00a0: les envois en 2019<\/b><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Vous avez rat\u00e9 ce webinar d\u00e9but 2019\u00a0? Pas d&rsquo;inqui\u00e9tude, nous l&rsquo;avons enregistr\u00e9\u00a0! Revoyez Nick et Natalie discuter des \u00e9v\u00e9nements survenus dans le domaine de l&#8217;email en 2018, et de ce qu&rsquo;ils anticipaient pour 2019. Les \u00e9quipes technique et marketing se sont retrouv\u00e9es sur ce point, et vous pouvez\u00a0<a href=\"https:\/\/www.crowdcast.io\/e\/predictions-resolutions-2019\/register\" target=\"_tabs\" rel=\"noopener noreferrer\">le revoir ici.<\/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_2866a2a3be80c34d85e1bcdd801570f2\">\r\n                    <p class=\"text-uppercase section-caption text-body-color\">\r\n                S&rsquo;inscrire            <\/p>\r\n                            <p class=\"h4 text-accent fw-bold\" id=\"banner-block-block_2866a2a3be80c34d85e1bcdd801570f2\">\r\n                Lancez-vous, c&rsquo;est facile ! Et c&rsquo;est gratuit.            <\/p>\r\n                            <div class=\"mb-0 text-body-color\">\r\n                                    <div class=\"content-body mb-0 text-body-color\">D\u00e9couvrez ce que vous pouvez accomplir avec la meilleure plateforme de livraison d\u2019emails au monde.<\/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>Dans ce tutoriel, je vais vous montrer comment envoyer des emails HTML avec des images int\u00e9gr\u00e9es gr\u00e2ce \u00e0 mailgun-go. Avant de nous plonger dans le code, d\u00e9finissons d&rsquo;abord le probl\u00e8me et comment utiliser Mailgun pour am\u00e9liorer l&rsquo;exp\u00e9rience utilisateur de notre application.<\/p>\n","protected":false},"author":35,"featured_media":4074,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[20],"class_list":["post-20669","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>Envoyer des emails HTML avec Mailgun-GoLang - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Dans ce tutoriel, je vais vous montrer comment envoyer des emails HTML avec des images int\u00e9gr\u00e9es gr\u00e2ce \u00e0 mailgun-go. En savoir plus...\" \/>\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\/fr\/blog\/email\/envoyer-emails-html-mailgun-go\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Envoyer des emails HTML avec Mailgun-GoLang - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Dans ce tutoriel, je vais vous montrer comment envoyer des emails HTML avec des images int\u00e9gr\u00e9es gr\u00e2ce \u00e0 mailgun-go. En savoir plus...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/fr\/blog\/email\/envoyer-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 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/email\\\/envoyer-emails-html-mailgun-go\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/email\\\/envoyer-emails-html-mailgun-go\\\/\",\"name\":\"Envoyer des emails HTML avec Mailgun-GoLang - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/email\\\/envoyer-emails-html-mailgun-go\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/email\\\/envoyer-emails-html-mailgun-go\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Email.png\",\"datePublished\":\"2026-09-15T03:53:00+00:00\",\"description\":\"Dans ce tutoriel, je vais vous montrer comment envoyer des emails HTML avec des images int\u00e9gr\u00e9es gr\u00e2ce \u00e0 mailgun-go. En savoir plus...\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/email\\\/envoyer-emails-html-mailgun-go\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/email\\\/envoyer-emails-html-mailgun-go\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/email\\\/envoyer-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\\\/fr\\\/blog\\\/email\\\/envoyer-emails-html-mailgun-go\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Envoyer des emails HTML avec Mailgun-Go\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Des API d\u2019emails transactionnels puissantes qui vous permettent d'envoyer, de recevoir et de suivre des emails, con\u00e7ues pour les d\u00e9veloppeurs. En savoir plus d\u00e8s aujourd'hui !\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#\\\/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\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Envoyer des emails HTML avec Mailgun-GoLang - Transactional Email API Service For Developers | Mailgun","description":"Dans ce tutoriel, je vais vous montrer comment envoyer des emails HTML avec des images int\u00e9gr\u00e9es gr\u00e2ce \u00e0 mailgun-go. En savoir plus...","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\/fr\/blog\/email\/envoyer-emails-html-mailgun-go\/","og_locale":"fr_FR","og_type":"article","og_title":"Envoyer des emails HTML avec Mailgun-GoLang - Transactional Email API Service For Developers | Mailgun","og_description":"Dans ce tutoriel, je vais vous montrer comment envoyer des emails HTML avec des images int\u00e9gr\u00e9es gr\u00e2ce \u00e0 mailgun-go. En savoir plus...","og_url":"https:\/\/www.mailgun.com\/fr\/blog\/email\/envoyer-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 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/fr\/blog\/email\/envoyer-emails-html-mailgun-go\/","url":"https:\/\/www.mailgun.com\/fr\/blog\/email\/envoyer-emails-html-mailgun-go\/","name":"Envoyer des emails HTML avec Mailgun-GoLang - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/fr\/blog\/email\/envoyer-emails-html-mailgun-go\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/fr\/blog\/email\/envoyer-emails-html-mailgun-go\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png","datePublished":"2026-09-15T03:53:00+00:00","description":"Dans ce tutoriel, je vais vous montrer comment envoyer des emails HTML avec des images int\u00e9gr\u00e9es gr\u00e2ce \u00e0 mailgun-go. En savoir plus...","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/fr\/blog\/email\/envoyer-emails-html-mailgun-go\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/fr\/blog\/email\/envoyer-emails-html-mailgun-go\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.mailgun.com\/fr\/blog\/email\/envoyer-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\/fr\/blog\/email\/envoyer-emails-html-mailgun-go\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/fr\/blog\/"},{"@type":"ListItem","position":3,"name":"Envoyer des emails HTML avec Mailgun-Go"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/fr\/#website","url":"https:\/\/www.mailgun.com\/fr\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Des API d\u2019emails transactionnels puissantes qui vous permettent d'envoyer, de recevoir et de suivre des emails, con\u00e7ues pour les d\u00e9veloppeurs. En savoir plus d\u00e8s aujourd'hui !","publisher":{"@id":"https:\/\/www.mailgun.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/fr\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.mailgun.com\/fr\/#\/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\/fr\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog\/20669","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/users\/35"}],"version-history":[{"count":0,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog\/20669\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/media\/4074"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/media?parent=20669"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog_category?post=20669"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}