E-Mail-Versand mit Go (Golang): vollständiger Überblick über Bibliotheken und Werkzeuge
Im modernen Web-Development bleibt der Versand von E-Mails eine der Kernaufgaben für Benachrichtigungen, Registrierungen, Passwort-Wiederherstellungen und Newsletter. Die Sprache Go (Golang) bietet mehrere effiziente Möglichkeiten zur Integration mit SMTP-Servern. In diesem Artikel analysieren wir die Standardbibliothek net/smtp, die beliebte Drittanbieter-Bibliothek gomail und die erweiterte go-smtp. Sie erfahren, wie Sie einfache Text- und HTML-E-Mails senden, Anhänge hinzufügen und eine sichere Verbindung konfigurieren.
1. Die Standardbibliothek net/smtp
Das Paket net/smtp ist in Go integriert und erfordert keine zusätzliche Installation. Es bietet grundlegende Funktionen zum Verbinden mit einem SMTP-Server, zur Authentifizierung und zum Senden von Nachrichten. Für moderne Anforderungen (HTML, Anhänge, SSL/TLS) ist jedoch mehr Code erforderlich.
Einfaches Beispiel zum Senden einer Text-E-Mail
package main
import ( "fmt" "net/smtp")
func main() { // SMTP-Server-Einstellungen (Beispiel für Gmail) smtpHost := "smtp.gmail.com" smtpPort := "587" from := "your_email@gmail.com" password := "your_app_password" to := []string{"recipient@example.com"}
// Betreff und Nachrichtentext (einfachstes Format) subject := "Subject: Testnachricht aus Go" body := "Hallo! Diese Nachricht wurde mit net/smtp gesendet." msg := []byte(subject + "" + body)
// Authentifizierung auth := smtp.PlainAuth("", from, password, smtpHost)
// Senden err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, msg) if err != nil { fmt.Println("Fehler beim Senden:", err) return } fmt.Println("E-Mail erfolgreich gesendet!")}Wichtig: Für Gmail muss ein App-Passwort (nicht das Hauptpasswort) verwendet und der Zugriff für weniger sichere Apps erlaubt werden. Für andere Dienste (Yandex, Mail.ru) können die Parameter abweichen.
Senden einer HTML-E-Mail mit net/smtp
Um eine HTML-E-Mail zu senden, muss der Header Content-Type explizit angegeben werden:
package main
import ( "fmt" "net/smtp")
func main() { smtpHost := "smtp.gmail.com" smtpPort := "587" from := "your_email@gmail.com" password := "your_app_password" to := []string{"recipient@example.com"}
// MIME-Header erstellen headers := make(map[string]string) headers["From"] = from headers["To"] = "recipient@example.com" headers["Subject"] = "HTML-E-Mail aus Go" headers["MIME-Version"] = "1.0" headers["Content-Type"] = "text/html; charset=\\"UTF-8\\""
// Nachricht zusammenstellen message := "" for k, v := range headers { message += fmt.Sprintf("%s: %s\\r", k, v) } message += "\\r" + "<h1>Hallo!</h1><p>Dies ist eine <b>HTML</b>-E-Mail.</p>"
auth := smtp.PlainAuth("", from, password, smtpHost) err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, []byte(message)) if err != nil { fmt.Println("Fehler:", err) }}Der Nachteil von net/smtp ist das Fehlen von Unterstützung für Anhänge und komplexe mehrteilige Nachrichtenstrukturen. Für solche Aufgaben sind spezialisierte Bibliotheken besser geeignet.
2. Die Bibliothek gomail
Gomail ist eine der beliebtesten Drittanbieter-Bibliotheken für den E-Mail-Versand mit Go. Sie bietet eine benutzerfreundliche API, Unterstützung für HTML, Anhänge, das Einbetten von Bildern, SSL/TLS und konfigurierbare Header.
Installation
go get gopkg.in/mail.v2Beispiel zum Senden einer HTML-E-Mail mit Anhang
package main
import ( "crypto/tls" "fmt" gomail "gopkg.in/mail.v2")
func main() { m := gomail.NewMessage( Auch in der Bibliothek
Überwachung von Kotlin-Anwendungen: Ktor Metrics und Micrometer
WireMock Java: Vollständige Anleitung mit Beispielen
Arbeiten mit Bildern in Rust: resize und crop mit der Bibliothek image
Kotest für Kotlin: Das komplette Tutorial mit Praxisbeispielen
Arbeiten mit Bildern in Rust: Überblick über die Bibliotheken image, fast_image_resize und andere