Produkt

Golang-E-Mail-Versand: Transaktions-E-Mails mit Go in wenigen Minuten versenden

Wir haben einen neuen Golang-Wrapper veröffentlicht, mit dem die Verwaltung von Kontakten und die Verarbeitung von E-Mails einfacher denn je wird.
Oktober 22, 2025

Wenn Sie mit Go arbeiten und zuverlässige E-Mails für Anmeldungen, Bestellbestätigungen, Passwortrücksetzungen oder wichtige Mitteilungen benötigen, zeigt Ihnen dieser Leitfaden den schnellsten Weg.

Sie richten einen Absender ein, versenden Ihre erste Nachricht mit dem Go SDK von Mailjet und lernen Muster für Vorlagen, Anhänge, Massenversand, Webhooks und SMTP kennen.

Dies ist ein beispielorientierter, produktionsreifer Ansatz für die E-Mail-Integration.

Im Jahr 2009 veröffentlichte Google eine Sprache namens Go, die oft auch als „Golang“ bezeichnet wird. Go wurde als robuste serverseitige Programmiersprache eingeführt. Seitdem hat sie mit Low-Level-Programmiermustern und leistungsfähigen Datenstrukturen immer wieder ihr Versprechen erfüllt.

Für wen dieser Leitfaden bestimmt ist

Dieser Leitfaden richtet sich an:

  • Entwickler und DevOps-Ingenieure, die eine einfache, dauerhafte Lösung zum Senden von E-Mails mit Go wünschen
  • Teams, denen Zustellbarkeit, Analysen und Skalierung wichtig sind, und das ohne die Komplexität des SMTP-Managements

Voraussetzungen

Bevor Sie beginnen, benötigen Sie Folgendes:

  • Ein Mailjet-Konto mit API und geheimen Schlüsseln
  • Eine validierte Absender-E-Mail/-Domain (SPF und DKIM empfohlen für eine optimale Posteingangsplatzierung)
  • Go 1.20+ (das SDK unterstützt Go 1.13+) und Zugang zum Festlegen von Umgebungsvariablen

💡 Profi-Tipp: Authentifizieren Sie Ihre Domain über SPF/DKIM, um die Zustellraten im Posteingang zu verbessern. Einzelheiten und Beispiele zur Einrichtung finden Sie in unserer umfassenden Authentifizierungsanleitung.

Schnellstart: Senden Sie Ihre erste Go-E-Mail (API v3.1)

Mit dem offiziellen Mailjet Go SDK und der v3.1 Send API können Sie schon in kurzer Zeit E-Mails versenden.

1. Abhängigkeiten installieren und API-Schlüssel festlegen

Installieren Sie zunächst das Mailjet Go SDK:

                            

                                go get github.com/mailjet/mailjet-apiv3-go/v4
                            
                        

Setzen Sie dann Ihre Umgebungsvariablen:

                            

                                export MJ_APIKEY_PUBLIC=your_api_key
export MJ_APIKEY_PRIVATE=your_secret_key
export SENDER_EMAIL=your_verified_sender@yourdomain.com
                            
                        

2. Erstellen Sie Ihr erstes E-Mail-Programm

Erstellen Sie eine main.go-Datei mit dem folgenden Code:

                            

                                package main

import (
    "fmt"
    "log"
    "os"

    "github.com/mailjet/mailjet-apiv3-go/v4"
)

func main() {
    mj := mailjet.NewMailjetClient(os.Getenv("MJ_APIKEY_PUBLIC"), os.Getenv("MJ_APIKEY_PRIVATE"))

    msgs := []mailjet.InfoMessagesV31{
        {
            From: &mailjet.RecipientV31{Email: os.Getenv("SENDER_EMAIL"), Name: "Go App"},
            To: &mailjet.RecipientsV31{
                {Email: "recipient@example.com", Name: "Recipient"},
            },
            Subject:  "Hello from Go + Mailjet",
            TextPart: "This is a plain-text fallback.",
            HTMLPart: "<h3>Hello from Go + Mailjet</h3><p>It works.</p>",
        },
    }

    messages := mailjet.MessagesV31{Info: msgs}
    res, err := mj.SendMailV31(&messages)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Status: %+v\n", res)
}

                            
                        

Warum das funktioniert

Das Go SDK wrappt die REST-Endpunkte von Mailjet und bietet einen praktischen SendMailV31-Helper, der ein Messages-Array akzeptiert. Mit diesem Ansatz können Sie die volle Leistung der Mailjet-API mit minimalem Code nutzen.

Senden über SMTP in go (Standardbibliothek)

Wenn Sie SMTP bevorzugen oder bereits einen SMTP-MTA verwenden, können Sie das SMTP-Relay von Mailjet mit Ihren API-Anmeldeinformationen nutzen.

                            

                                package main

import (
    "net/smtp"
    "os"
)

func main() {
    host := "in-v3.mailjet.com"
    auth := smtp.PlainAuth("", os.Getenv("MJ_APIKEY_PUBLIC"), os.Getenv("MJ_APIKEY_PRIVATE"), host)

    to := []string{"recipient@example.com"}
    from := "sender@yourdomain.com"
    msg := []byte(
        "To: recipient@example.com\r\n" +
            "From: Go App <sender@yourdomain.com>\r\n" +
            "Subject: SMTP from Go via Mailjet\r\n" +
            "MIME-Version: 1.0\r\n" +
            "Content-Type: text/html; charset=UTF-8\r\n\r\n" +
            "<p>Hello via SMTP</p>",
    )

    // Port 587 (TLS) or 465 (SSL) are common choices
    err := smtp.SendMail(host+":587", auth, from, to, msg)
    if err != nil {
        log.Fatal(err)
    }
}

                            
                        

Hinweise zur SMTP-Konfiguration

  • SMTP-Host: in-v3.mailjet.com
  • Übliche Ports: 587 (TLS) oder 465 (SSL)
  • Hinweis zu Port 25: Kann von Ihrem ISP oder Cloud-Anbieter blockiert werden

Weitere Einzelheiten finden Sie im SMTP-Konfigurationsleitfaden.

Personalisierung mit Vorlagen und Variablen

Entwerfen Sie Ihre E-Mail-Vorlage einmal im Mailjet-Dashboard und nutzen Sie dann eine TemplateID und Variablen aus Ihrem Go-Code für dynamische Inhalte.

                            

                                msgs := []mailjet.InfoMessagesV31{
 {
  From: &mailjet.RecipientV31{Email: os.Getenv("SENDER_EMAIL"), Name: "Go App"},
  To: &mailjet.RecipientsV31{{Email: "recipient@example.com", Name: "Terry"}},
  TemplateID: 123456, // ersetzen durch Ihre Template-ID
  TemplateLanguage: true, // Mailjet-Template-Sprache aktivieren
  Variables: map[string]any{"first_name": "Terry", "plan": "Pro"},
  Subject: "Willkommen, {{var:first_name:\"neues Mitglied\"}}",
 },
}

                            
                        

Vorlagenvariablen-Syntax

  • API-Variablen: Verwenden Sie {{var:first_name:&quot;default_value&quot;}}, um Variablen aus Ihrem API-Anruf einzufügen
  • Kontaktdaten: Verwenden Sie [[data:property:default]] für in Mailjet-Kontakten gespeicherte Daten

Weitere Beispiele für Vorlagen finden Sie in dieser Stack-Overflow-Diskussion.

Anhängen von Dateien und Inline-Bildern

Versenden Sie Anhänge und betten Sie Inline-Bilder in Ihre E-Mails ein. Die Gesamtgröße einer Nachricht ist auf 15 MB begrenzt.

                            

                                // Zuerst lesen und Ihre Dateien base64-kodieren, dann:
msgs := []mailjet.InfoMessagesV31{
 {
  From: &mailjet.RecipientV31{Email: os.Getenv("SENDER_EMAIL")},
  To: &mailjet.RecipientsV31{{Email: "recipient@example.com"}},
  Subject: "Rechnung im Anhang + Inline-Logo",
  HTMLPart: `<p>Vielen Dank für Ihren Kauf!</p><img src="cid:logo1" alt="Firmenlogo"/>`,
  Attachments: &[]mailjet.AttachmentV31{
 {
  ContentType: "application/pdf",
  Filename: "rechnung.pdf",
  Base64Content: &quot;<BASE64_STRING>&quot;, // Ihre base64-kodierte PDF-Datei
 },
 },
  InlinedAttachments: &[]mailjet.InlinedAttachmentV31{
 {
  AttachmentV31: mailjet.AttachmentV31{
  ContentType: "image/png",
  Filename: "logo.png",
  Base64Inhalt: &quot;<BASE64_PNG>&quot;, // Ihr base64-kodiertes Bild
 },
  ContentID: "logo1", // in HTML referenziert als cid:logo1
 },
 },
 },
}
                            
                        

Best Practices für Anhänge

  • Größenbeschränkung: Halten Sie die Gesamtgröße der Nachricht bei maximal 15 MB
  • Massen-E-Mails: Um die Zustellbarkeit zu verbessern, sollten Sie einen Link zu gehosteten Dateien setzen, anstatt große Dateien anzuhängen
  • Inline-Bilder: Verwenden Sie das Feld ContentID, um in Ihrem HTML-Code mit der Syntax cid: auf Bilder zu verweisen

Massenversand (mehrere Nachrichten)

Senden Sie mehrere personalisierte Nachrichten mit einem einzigen API-Aufruf. Jede Nachricht wird unabhängig validiert, sodass erfolgreiche Nachrichten auch dann gesendet werden, wenn eine fehlschlägt.

                            

                                msgs := []mailjet.InfoMessagesV31{
 {
  From: &mailjet.RecipientV31{Email: os.Getenv("SENDER_EMAIL")},
  To: &mailjet.RecipientsV31{{Email: "user1@example.com"}},
  Subject: "Willkommen, Nutzer 1!",
  HTMLPart: "<p>Hello User 1</p>",
 },
 {
  From: &mailjet.RecipientV31{Email: os.Getenv("SENDER_EMAIL")},
  To: &mailjet.RecipientsV31{{Email: "user2@example.com"}},
  Betreff: "Willkommen, Nutzer 2!",
  HTMLPart: "<p>Hello User 2</p>",
 },
}

res, err := mj.SendMailV31(&mailjet.MessagesV31{Info: msgs})
if err != nil {
  log.Fatal(err)
}

// Ergebnisse verarbeiten – jede Nachricht erhält ihren eigenen Status und ihre eigene ID
for i, result := range res.ResultsV31 {
  fmt.Printf("Message %d: Status=%s, MessageID=%d\n", i, result.Status, result.To[0].MessageID)
}

                            
                        

Die Sende-API v3.1 gibt den Status und die IDs der einzelnen Nachrichten zurück, sodass Sie die Ergebnisse leicht mit Ihren ursprünglichen Nachrichten korrelieren können. Verwenden Sie die MessageID, um den Lieferstatus später zu verfolgen.

Verfolgen Sie Zustellung, Öffnungen und Klicks (Webhooks)

Konfigurieren Sie Webhooks, um Echtzeit-Benachrichtigungen über E-Mail-Ereignisse wie Zustellung, Öffnungen, Klicks, Bounces und Abmeldungen zu erhalten.

Einrichten von Webhooks

  1. Registrieren Sie Ihren Webhook-Endpunkt im Mailjet-Dashboard unter „Event Tracking“
  2. Oder verwenden Sie den API-Endpunkt /v3/REST/eventcallbackurl programmatisch

Beispiel eines Webhook-Handlers

                            

                                package main

import (
  "encoding/json"
  "net/http"
  "log"
)

type MailjetEvent struct {
  Event string `json:"event"`
  Time int64 `json:"time"`
  MessageID int64 `json:"MessageID"`
  Email string `json:"email"`
  URL string `json:"url,omitempty"` // für Klick-Ereignisse
  Error string `json:"error,omitempty"` // für Bounce-/Fehlerereignisse
}

func webhookHandler(w http.ResponseWriter, r *http.Request) {
  defer r.Body.Close()

  var events []MailjetEvent
  if err := json.NewDecoder(r.Body).Decode(&events); err != nil {
  http.Error(w, "bad request", http.StatusBadRequest)
  return
 }

  // Ereignisse verarbeiten (überlegen Sie, für die Produktion eine Warteschlange zu verwenden)
  for _, event := range events {
  switch event.Event {
  case "sent":
  log.Printf("Message %d sent to %s", event.MessageID, event.Email)
  case "open":
  log.Printf("Message %d opened by %s", event.MessageID, event.Email)
  case "click":
  log.Printf("Message %d clicked by %s (URL: %s)", event.MessageID, event.Email, event.URL)
  case "bounce":
  log.Printf("Message %d bounced for %s: %s", event.MessageID, event.Email, event.Error)
 }
 }

  // Immer 200 zurückgeben, um den Empfang zu bestätigen
  w.WriteHeader(http.StatusOK)
}

func main() {
  http.HandleFunc("/mj/events", webhookHandler)
  log.Fatal(http.ListenAndServe(":8080", nil))
}

                            
                        

Best Practices für Webhooks

  • Schnelle Rückgabe von HTTP 200 als Empfangsbestätigung
  • Asynchrone Verarbeitung von Ereignissen zur Vermeidung von Zeitüberschreitungen
  • Handhabung von erneuten Versuchen: Mailjet versucht es bei Antworten, die nicht 200 sind, bis zu 24 Stunden lang erneut

Die vollständige Ereignisdokumentation finden Sie im Leitfaden zur Ereignisverfolgungs-API.

Grundlagen der Zustellbarkeit

Behalten Sie die folgenden drei Grundlagen der Zustellbarkeit im Kopf:

1. Domain-Authentifizierung

    Richten Sie SPF- und DKIM-Authentifizierung für Ihre Absenderdomäne ein, um die Posteingangsplatzierung zu verbessern und das Risiko von Spoofing zu verringern:

    • SPF-Eintrag: Ermächtigt Mailjet zum Senden von E-Mails im Namen Ihrer Domain
    • DKIM-Signierung: Fügt kryptografische Signaturen hinzu, um die Authentizität von E-Mails zu verifizieren

    Befolgen Sie unseren vollständigen Leitfaden zur Domain-Authentifizierung für schrittweise Anweisungen zur Einrichtung.

    2. Regionale Konfiguration

      Wenn sich Ihr Mailjet-Konto in der US-Infrastruktur befindet, konfigurieren Sie das SDK so, dass es den US-API-Endpunkt verwendet:

                                  
      
                                      // Für Konten in der US-Region
      mj := mailjet.NewMailjetClient(apiKey, secretKey)
      mj.SetAPIBase("https://api.us.mailjet.com/v3.1/")
      
                                  
                              

      3. SMTP-Konfiguration

        • Standard-Region: in-v3.mailjet.com
        • Empfohlene Ports: 587 (TLS) oder 465 (SSL)

        Hinweise zur Firewall: Testen Sie den Port-Zugang Ihres Netzwerks; viele Anbieter blockieren Port 25

        Häufige Probleme behandeln

        Hier sind die häufigsten Probleme und ihre Behebung.

        Authentifizierungsfehler (401 unautorisiert)

        • Prüfen Sie, ob Ihre API-Schlüssel in den Umgebungsvariablen korrekt gesetzt sind
        • Überprüfen Sie die API-Region: Verwenden Sie api.us.mailjet.com für US-Konten, api.mailjet.com für EU-Konten

        Fehler bei der Inhaltsvalidierung (400 bad request)

        • „At least HTMLPart, TextPart or TemplateID must be provided“ („Mindestens HTMLPart, TextPart oder TemplateID müssen angegeben werden“): Stellen Sie sicher, dass Sie E-Mail-Inhalte einschließen oder eine Vorlagen-ID angegeben haben
        • Pflichtfelder fehlen: Überprüfen Sie, ob Von, An und Betreff richtig angegeben sind

        Fehler bei der Nachrichtengröße (413 payload too large)

        • Überprüfen Sie die Gesamtgröße der Nachricht: Halten Sie Anhänge und Inhalte unter 15 MB Gesamtgröße
        • Erwägen Sie Alternativen: Verwenden Sie für große Dateien gehostete Links anstelle von Anhängen

        Webhook-Probleme

        • Ereignisse werden nicht aufgezeichnet: Stellen Sie sicher, dass Ihr Webhook-Endpunkt den Status HTTP 200 zurückgibt
        • Zeitüberschreitungen bei der Verarbeitung: Die Webhook-Verarbeitung wird asynchron gehandhabt, um eine Blockierung des Wiederholungsmechanismus von Mailjet zu vermeiden

        Häufig gestellte Fragen

        Wie kann ich in Go am schnellsten eine E-Mail versenden?

        Verwenden Sie das offizielle SDK mit SendMailV31, wie im Abschnitt Schnellstart beschrieben. Sobald Ihre API-Schlüssel konfiguriert sind, benötigt es nur einen einzigen Funktionsaufruf.

        Kann ich E-Mails über SMTP statt über die API versenden?

        Ja! Lenken Sie das net/smtp-Paket von Go auf in-v3.mailjet.com, indem Sie Ihren API-Schlüssel und geheimen Schlüssel als Anmeldeinformationen verwenden, und nutzen Sie Port 587 oder 465.

        Wie kann ich E-Mail-Vorlagen personalisieren?

        Legen Sie TemplateID fest, aktivieren Sie TemplateLanguage: true, und geben Sie Ihre Daten im Feld Variables ein. Verwenden Sie die Syntax {{var:name:“default“}} in Ihren Vorlagen.

        Wo kann ich die Zustellungs- und Interaktionsmetriken einsehen?

        Verwenden Sie Webhooks für Echtzeit-Ereignisdaten, oder prüfen Sie das Mailjet-Dashboard und die REST-API-Statistikendpunkte für aggregierte Metriken.

        Die nächsten Schritte

        Jetzt, wo der E-Mail-Versand in Ihrer Go-Anwendung funktioniert, können Sie über folgende Verbesserungen nachdenken:

        1. Sichern Sie Ihre Absender-Reputation: Authentifizieren Sie Ihre Domain mit SPF- und DKIM-Einträgen
        2. Fügen Sie die Ereignisverfolgung hinzu: Implementieren Sie Webhooks, um Analysen und automatisierte Workflows zu unterstützen
        3. Erkunden Sie erweiterte Funktionen: Informieren Sie sich über URLTags und SandboxMode zum Testen in der Send API v3.1-Dokumentation
        4. Entdecken Sie weitere Beispiele: Besuchen Sie das Go-SDK-Repository für weitere Muster und Anwendungsfälle

        Auf dieser Grundlage sind Sie in der Lage, robuste, skalierbare E-Mail-Funktionen in Ihre Go-Anwendungen zu integrieren. Die Kombination aus der zuverlässigen Infrastruktur von Mailjet und der Leistung von Go sorgt für eine leistungsstarke E-Mail-Lösung.