{"id":20835,"date":"2026-09-15T05:30:42","date_gmt":"2026-09-15T05:30:42","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/html-e-mails-mit-mailgun-go-versenden\/"},"modified":"2026-09-15T05:30:42","modified_gmt":"2026-09-15T05:30:42","slug":"html-e-mails-mit-mailgun-go-versenden","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/de\/blog\/email\/html-e-mails-mit-mailgun-go-versenden\/","title":{"rendered":"HTML-E-Mails mit Mailgun-Go versenden"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In diesem Tutorial zeige ich Ihnen, wie Sie mit mailgun-go HTML-E-Mails mit eingebetteten Bildern versenden. Bevor wir uns dem Code widmen, definieren wir zun\u00e4chst den Problembereich und <b>wie wir Mailgun nutzen, um das Nutzererlebnis unserer Anwendung zu verbessern.<\/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-1874\"><p class=\"h5 m-0\" id=\"toc-title-1874\">Inhaltsverzeichnis<\/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=\"#wir-stellen-vor-channel-stats\">Wir stellen vor: 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=\"#html-e-mail\">HTML-E-Mail<\/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=\"#der-code\">Der 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=\"#fazit\">Fazit<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">Wir stellen vor: 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>\u00a0ist ein Slack-Bot zur Erfassung von Statistiken zu Nachrichten, die an einen Slack-Kanal gesendet wurden. Neben der Erfassung von Emojis und Links, die im Kanal geteilt werden, f\u00fchrt der Bot auch eine Stimmungsanalyse der Nachrichten durch und vergibt eine positive oder negative Punktzahl. Diese Punktzahl kann sp\u00e4ter <b>von den Nutzern \u00fcberpr\u00fcft und als Prozentsatz der Gesamtnachrichten grafisch dargestellt werden.<\/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\">Wir m\u00f6chten diese Funktion um einen w\u00f6chentlichen E-Mail-Bericht zu den Kanalstatistiken f\u00fcr unsere Nutzer erweitern. Da unsere E-Mail grafisch dargestellte Daten enth\u00e4lt, w\u00e4ren reine Text-E-Mails ziemlich langweilig. Stattdessen m\u00f6chten wir ansprechende HTML-E-Mails mit Grafiken an den Posteingang unserer Nutzer senden. Um dies zu erreichen, m\u00fcssen wir etwas HTML mit Inline-CSS und Bildern erstellen, um es optisch ansprechend zu gestalten.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">HTML-E-Mail<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u00dcber den Versand von HTML-Inhalten in E-Mails wurde bereits viel geschrieben. Hier sind jedoch einige wichtige Regeln, die Sie befolgen sollten:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><b>JA: <\/b>Verwenden Sie Inline-CSS<\/li>\n\n\n\n<li><b>JA: <\/b>Verwenden Sie HTML-Tabellen f\u00fcr das Layout<\/li>\n\n\n\n<li><b>JA: <\/b>Verwenden Sie Bilder (vorzugsweise .png)<\/li>\n\n\n\n<li><b>JA: <\/b>Verwenden Sie Inline-Bilder<\/li>\n\n\n\n<li><b>NEIN: <\/b>Verwenden Sie kein HTML5<\/li>\n\n\n\n<li><b>NEIN:\u00a0<\/b>Verwenden Sie kein Animations-CSS<\/li>\n\n\n\n<li><b>NEIN:\u00a0 <\/b>Verlinken Sie nicht auf ein externes Stylesheet<\/li>\n\n\n\n<li><b>NEIN: <\/b>Verwenden Sie keine CSS-Stile im HEAD-Bereich<\/li>\n\n\n\n<li><b>NEIN:\u00a0<\/b>Verwenden Sie kein JavaScript<\/li>\n\n\n\n<li><b>NEIN:\u00a0<\/b>Verwenden Sie kein Flash<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Es reicht oft nicht aus, die oben genannten Regeln zu befolgen, da es keine einheitlichen Standards daf\u00fcr gibt, wie HTML in E-Mails gerendert wird. Wenn Sie sicherstellen m\u00f6chten, dass Ihre E-Mails auf m\u00f6glichst vielen Clients korrekt gerendert werden, <b>bietet sich ein Dienst wie\u00a0<\/b><a href=\"https:\/\/litmus.com\/\" target=\"_tabs\" rel=\"noopener noreferrer\"><b>Litmus<\/b><\/a><b>\u00a0an, um Ihre E-Mail zu erstellen, in der Vorschau anzuzeigen und \u00fcber verschiedene Clients hinweg zu testen<\/b>. F\u00fcr unsere Zwecke und da es sich bei Channel-stats um ein Open-Source-Projekt handelt, halte ich die Produktionskosten jedoch niedrig und verwende einige kostenlose Vorlagen von\u00a0<a href=\"https:\/\/github.com\/mailgun\/transactional-email-templates\" target=\"_tabs\" rel=\"noopener noreferrer\">Mailgun<\/a>\u00a0(Ich habe dabei etwas Unterst\u00fctzung aus unserem UX\/UI-Designteam erhalten). Das Ergebnis sieht wie folgt aus:<\/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\">Da wir nun unser HTML und CSS haben, m\u00fcssen wir das CSS einbetten, damit die meisten E-Mail-Clients unsere E-Mail korrekt rendern. Daf\u00fcr gibt es eine Reihe von Online-Tools, wir empfehlen jedoch\u00a0<a href=\"http:\/\/premailer.dialect.ca\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Dialect Premailer<\/a>\u00a0f\u00fcr diesen Zweck.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Der Code<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Da die E-Mail w\u00f6chentlich gesendet werden soll, verwenden wir eine\u00a0<a href=\"http:\/\/github.com\/robfig\/cron\" target=\"_tabs\" rel=\"noopener noreferrer\">Cron-Bibliothek<\/a>\u00a0, um eine Funktion zu erstellen, die jeden Sonntag um Mitternacht ausgef\u00fchrt wird. Als N\u00e4chstes m\u00fcssen wir die Bilder generieren, die in unserer E-Mail enthalten sein werden. Channel-stats verwendet bereits\u00a0<a href=\"http:\/\/github.com\/wcharczuk\/go-chart\" target=\"_tabs\" rel=\"noopener noreferrer\">go-chart<\/a>\u00a0, um .png-Diagrammbilder f\u00fcr die UI zu rendern, sodass wir dies einfach f\u00fcr unsere Zwecke anpassen k\u00f6nnen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Da wir bei der Auslieferung unseres finalen Projekts HTML- und CSS-Dateien nicht getrennt von unserem finalen kompilierten Golang-Binary bereitstellen m\u00f6chten, <b>verwendet Channel-stats das\u00a0<\/b><a href=\"http:\/\/github.com\/tmthrgd\/go-bindata\" target=\"_tabs\" rel=\"noopener noreferrer\"><b>go-bindata<\/b><\/a><b>\u00a0-Projekt, um HTML und CSS in einem einzigen Channel-stats-Binary zu b\u00fcndeln.<\/b><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Werfen wir nun einen Blick auf den Render-Code.<\/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=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\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\">In der Methode\u00a0<code>Start()<\/code>\u00a0durchlaufen wir alle Kan\u00e4le, in denen der Bot Mitglied ist, und generieren f\u00fcr jeden Kanal einen Bericht. Anschlie\u00dfend rufen wir\u00a0<code>genHtml()<\/code>\u00a0auf, das unsere HTML-E-Mail als Vorlage namens <code>templates\/email.tmpl<\/code> aus unserem kompilierten Asset-Speicher im\u00a0<code>HTML<\/code>-Paket abruft. Dann f\u00fchren wir die Vorlage durch die Standard-Engine\u00a0<code>HTML\/template<\/code>\u00a0von Golang aus, um das finale HTML zu erzeugen. Als N\u00e4chstes ruft\u00a0<code>genImage()<\/code>\u00a0die Render-Funktion mit dem Zeitraum in Stunden und dem Z\u00e4hlertyp auf, den wir aus dem Datenspeicher abrufen m\u00f6chten. Sobald\u00a0<code>ReportData<\/code> vollst\u00e4ndig ist, \u00fcbergeben wir die Daten zur Zustellung an\u00a0<code>mail.Report()<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Da wir nun unsere Bilder und das HTML haben, lassen Sie uns kurz \u00fcber HTML-MIME und Bildkodierung sprechen.<\/b>\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/MIME\" target=\"_tabs\" rel=\"noopener noreferrer\">MIME<\/a>\u00a0ist das Format, in das E-Mail-Inhalte beim Versand \u00fcber das SMTP-Protokoll kodiert werden. Dieses Format erm\u00f6glicht es E-Mail-Clients, HTML zu kodieren sowie Dateien und Bilder in einer E-Mail anzuh\u00e4ngen und abzurufen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Damit unsere Bilder im HTML richtig angezeigt werden, m\u00fcssen wir sie in den MIME-Standard kodieren. Daf\u00fcr haben wir zwei Optionen: Wir k\u00f6nnten die Bilder als Anhang hinzuf\u00fcgen oder sie inline einbetten. Der RFC zur Content-Disposition besagt, dass <code>inline<\/code> anzeigt, dass die Entit\u00e4t dem Nutzer sofort angezeigt werden soll, w\u00e4hrend <code>attachment<\/code> bedeutet, dass dieser eine zus\u00e4tzliche Aktion ausf\u00fchren muss, um die Entit\u00e4t anzuzeigen. Da unsere Bilder dem Nutzer sofort \u00fcber HTML angezeigt werden sollen, w\u00e4hlen wir \u201einline\u201c.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">An diesem Punkt k\u00f6nnten wir verschiedene MIME-Bibliotheken f\u00fcr Golang verwenden, um unsere Bilder einzubetten und den E-Mail-Inhalt im MIME-Format zu generieren. Mit Mailgun m\u00fcssen wir das jedoch nicht. Mailgun generiert das MIME f\u00fcr uns und bietet <a href=\"https:\/\/documentation.mailgun.com\/en\/latest\/user_manual.html#sending-inline-images\" target=\"_tabs\" rel=\"noopener noreferrer\">Optionen zum Einbetten von Dateien<\/a> und Bildern \u00fcber die \u00f6ffentliche API. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Da wir nun wissen, wie Bilder ins MIME eingebettet werden, m\u00fcssen wir sie aus unserem HTML heraus referenzieren. Dazu verwenden wir das Pr\u00e4fix\u00a0<code>cid:<\/code>\u00a0in unseren\u00a0<code><img><\/code>-Tags. Wenn unser eingebettetes Bild also\u00a0most-active.png\u00a0hei\u00dft, s\u00e4he unser Bild-Tag folgenderma\u00dfen aus:\u00a0<code><img decoding=\"async\" src=\"most-active.png\"><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\nDa unser HTML nun bereit ist, schauen wir uns an, wie wir die E-Mail und die Bilder mit mailgun-go versenden.<\/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=\"In die Zwischenablage kopieren\" data-clipboard-success-label=\"Kopiert\" data-clipboard-error-label=\"Kopieren nicht m\u00f6glich\" data-tooltip=\"In die Zwischenablage kopieren\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"In die Zwischenablage kopieren\">\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\">Zuerst erstellen wir mit unserem Domainnamen und API-Schl\u00fcssel eine neue Instanz von\u00a0Mailgun\u00a0in\u00a0<code>NewMailgunNotifier()<\/code>. Als N\u00e4chstes rufen wir in der Methode\u00a0<code>Report()<\/code>\u00a0die Funktion\u00a0<code>NewMessage()<\/code>\u00a0auf, um ein Objekt zu erstellen, dem wir unser HTML und unsere Bilder hinzuf\u00fcgen. Beachten Sie, dass das Argument\u00a0<code>text<\/code>\u00a0in\u00a0<code>NewMessage()<\/code>\u00a0ein leerer String ist. <b>Obwohl es m\u00f6glich ist, sowohl reinen Text als auch HTML in die MIME-Nachricht zu kodieren, stellen wir hier nur HTML bereit, da eingebettete Diagrammbilder f\u00fcr einen reinen Text-Client nutzlos w\u00e4ren.<\/b> Als N\u00e4chstes rufen wir\u00a0<code>SetHtml()<\/code>\u00a0auf und h\u00e4ngen unsere eingebetteten Bilder \u00fcber ein ReadCloser-Objekt an, das wir direkt aus unserem\u00a0<code>[]byte buffer<\/code> erstellen. Schlie\u00dflich senden wir unsere erstellte Anfrage mit der Methode\u00a0<code>Send()<\/code>\u00a0an die Mailgun-API, um das MIME zu generieren und zuzustellen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dieses Tutorial hat Ihnen hoffentlich einen Einblick gegeben, wie Sie mit mailgun-go und der Mailgun-API hochwertige HTML-E-Mails versenden. Sollten Sie Feedback haben oder Fehler in einem der Projekte finden, stehen der vollst\u00e4ndige Code und die Bibliothek unten zur Verf\u00fcgung.<\/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\">M\u00f6chten Sie bei Mailgun arbeiten? Wir stellen ein. Und es sind mehrere Stellen im Entwicklungsteam offen. <a href=\"https:\/\/apply.workable.com\/mailgun\/?lng=en\" target=\"_tabs\" rel=\"noopener noreferrer\">Aktuelle Stellenangebote hier ansehen<\/a>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><b>Vorgestelltes Webinar \u2013 Prognosen und Vors\u00e4tze: Versand im Jahr 2019<\/b><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Haben Sie dieses Webinar Anfang 2019 verpasst? Keine Sorge, wir haben es aufgezeichnet. Sehen Sie sich noch einmal an, wie Nick und Natalie \u00fcber einige Entwicklungen im E-Mail-Bereich 2018 sprachen und was ihrer Meinung nach 2019 bevorstand. Hier trafen Technik und Marketing aufeinander, und Sie k\u00f6nnen es sich\u00a0<a href=\"https:\/\/www.crowdcast.io\/e\/predictions-resolutions-2019\/register\" target=\"_tabs\" rel=\"noopener noreferrer\">hier noch einmal ansehen.<\/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_a3e6c4ff621288826d595203a95a7582\">\r\n                    <p class=\"text-uppercase section-caption text-body-color\">\r\n                Registrieren            <\/p>\r\n                            <p class=\"h4 text-accent fw-bold\" id=\"banner-block-block_a3e6c4ff621288826d595203a95a7582\">\r\n                Loslegen ist ganz einfach. Und es ist kostenlos.            <\/p>\r\n                            <div class=\"mb-0 text-body-color\">\r\n                                    <div class=\"content-body mb-0 text-body-color\">Erfahren Sie, was Sie mit der weltbesten Plattform f\u00fcr E-Mail-Zustellung alles erreichen k\u00f6nnen.<\/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>In diesem Tutorial zeige ich Ihnen, wie Sie mit mailgun-go HTML-E-Mails mit eingebetteten Bildern versenden. Bevor wir uns dem Code widmen, definieren wir zun\u00e4chst den Problembereich und wie wir Mailgun nutzen, um das Nutzererlebnis unserer Anwendung zu verbessern.<\/p>\n","protected":false},"author":35,"featured_media":4074,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[20],"class_list":["post-20835","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>HTML-E-Mails mit Mailgun-GoLang versenden - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"In diesem Tutorial zeige ich Ihnen, wie Sie mit mailgun-go HTML-E-Mails mit eingebetteten Bildern versenden. Weiterlesen...\" \/>\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\/de\/blog\/email\/html-e-mails-mit-mailgun-go-versenden\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"HTML-E-Mails mit Mailgun-GoLang versenden - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"In diesem Tutorial zeige ich Ihnen, wie Sie mit mailgun-go HTML-E-Mails mit eingebetteten Bildern versenden. Weiterlesen...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/de\/blog\/email\/html-e-mails-mit-mailgun-go-versenden\/\" \/>\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\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/email\\\/html-e-mails-mit-mailgun-go-versenden\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/email\\\/html-e-mails-mit-mailgun-go-versenden\\\/\",\"name\":\"HTML-E-Mails mit Mailgun-GoLang versenden - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/email\\\/html-e-mails-mit-mailgun-go-versenden\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/email\\\/html-e-mails-mit-mailgun-go-versenden\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Email.png\",\"datePublished\":\"2026-09-15T05:30:42+00:00\",\"description\":\"In diesem Tutorial zeige ich Ihnen, wie Sie mit mailgun-go HTML-E-Mails mit eingebetteten Bildern versenden. Weiterlesen...\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/email\\\/html-e-mails-mit-mailgun-go-versenden\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/email\\\/html-e-mails-mit-mailgun-go-versenden\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/email\\\/html-e-mails-mit-mailgun-go-versenden\\\/#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\\\/de\\\/blog\\\/email\\\/html-e-mails-mit-mailgun-go-versenden\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"HTML-E-Mails mit Mailgun-Go versenden\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Leistungsstarke Transaktions-E-Mail-APIs, mit denen Sie E-Mails senden, empfangen und nachverfolgen k\u00f6nnen, speziell f\u00fcr Entwickler konzipiert. Erfahren Sie noch heute mehr!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/de\\\/#\\\/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\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"HTML-E-Mails mit Mailgun-GoLang versenden - Transactional Email API Service For Developers | Mailgun","description":"In diesem Tutorial zeige ich Ihnen, wie Sie mit mailgun-go HTML-E-Mails mit eingebetteten Bildern versenden. Weiterlesen...","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\/de\/blog\/email\/html-e-mails-mit-mailgun-go-versenden\/","og_locale":"de_DE","og_type":"article","og_title":"HTML-E-Mails mit Mailgun-GoLang versenden - Transactional Email API Service For Developers | Mailgun","og_description":"In diesem Tutorial zeige ich Ihnen, wie Sie mit mailgun-go HTML-E-Mails mit eingebetteten Bildern versenden. Weiterlesen...","og_url":"https:\/\/www.mailgun.com\/de\/blog\/email\/html-e-mails-mit-mailgun-go-versenden\/","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\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/de\/blog\/email\/html-e-mails-mit-mailgun-go-versenden\/","url":"https:\/\/www.mailgun.com\/de\/blog\/email\/html-e-mails-mit-mailgun-go-versenden\/","name":"HTML-E-Mails mit Mailgun-GoLang versenden - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/email\/html-e-mails-mit-mailgun-go-versenden\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/email\/html-e-mails-mit-mailgun-go-versenden\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Email.png","datePublished":"2026-09-15T05:30:42+00:00","description":"In diesem Tutorial zeige ich Ihnen, wie Sie mit mailgun-go HTML-E-Mails mit eingebetteten Bildern versenden. Weiterlesen...","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/de\/blog\/email\/html-e-mails-mit-mailgun-go-versenden\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/de\/blog\/email\/html-e-mails-mit-mailgun-go-versenden\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.mailgun.com\/de\/blog\/email\/html-e-mails-mit-mailgun-go-versenden\/#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\/de\/blog\/email\/html-e-mails-mit-mailgun-go-versenden\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/de\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/de\/blog\/"},{"@type":"ListItem","position":3,"name":"HTML-E-Mails mit Mailgun-Go versenden"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/de\/#website","url":"https:\/\/www.mailgun.com\/de\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Leistungsstarke Transaktions-E-Mail-APIs, mit denen Sie E-Mails senden, empfangen und nachverfolgen k\u00f6nnen, speziell f\u00fcr Entwickler konzipiert. Erfahren Sie noch heute mehr!","publisher":{"@id":"https:\/\/www.mailgun.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/de\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.mailgun.com\/de\/#\/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\/de\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog\/20835","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/users\/35"}],"version-history":[{"count":0,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog\/20835\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/media\/4074"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/media?parent=20835"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/de\/wp-json\/wp\/v2\/blog_category?post=20835"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}