Produkt
Golang-E-Mail-Versand: Transaktions-E-Mails mit Go in wenigen Minuten versenden
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:"default_value"}}, 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: "<BASE64_STRING>", // Ihre base64-kodierte PDF-Datei
},
},
InlinedAttachments: &[]mailjet.InlinedAttachmentV31{
{
AttachmentV31: mailjet.AttachmentV31{
ContentType: "image/png",
Filename: "logo.png",
Base64Inhalt: "<BASE64_PNG>", // 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
- Registrieren Sie Ihren Webhook-Endpunkt im Mailjet-Dashboard unter „Event Tracking“
- 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:
- Sichern Sie Ihre Absender-Reputation: Authentifizieren Sie Ihre Domain mit SPF- und DKIM-Einträgen
- Fügen Sie die Ereignisverfolgung hinzu: Implementieren Sie Webhooks, um Analysen und automatisierte Workflows zu unterstützen
- Erkunden Sie erweiterte Funktionen: Informieren Sie sich über URLTags und SandboxMode zum Testen in der Send API v3.1-Dokumentation
- 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.