Einführung in Gomail

Gomail ist ein einfaches und effizientes Paket zum Senden von E-Mails in Golang. Es wurde gründlich getestet und dokumentiert.

Gomail kann nur E-Mails über SMTP-Server senden. Die API ist jedoch flexibel und kann problemlos Methoden wie die Verwendung von lokalem Postfix, APIs usw. zur E-Mail-Sendung implementieren.

Es verwendet gopkg.in für die Versionskontrolle, sodass innerhalb jeder Version keine inkompatiblen Änderungen vorgenommen werden.

Es erfordert die Verwendung von Go 1.2 oder einer neueren Version. Bei Go 1.5 werden keine externen Abhängigkeiten verwendet.

Funktionen von Gomail

Gomail unterstützt die folgenden Funktionen:

  • Anhänge
  • Inline-Bilder
  • HTML- und Textvorlagen
  • Automatische Codierung von Sonderzeichen
  • SSL und TLS
  • Senden mehrerer E-Mails über dieselbe SMTP-Verbindung

Installation

go get gopkg.in/gomail.v2

Beispiel

m := gomail.NewMessage()
m.SetHeader("From", "[email protected]")
m.SetHeader("To", "[email protected]", "[email protected]")
m.SetAddressHeader("Cc", "[email protected]", "Dan")
m.SetHeader("Subject", "Hallo!")
m.SetBody("text/html", "Hallo <b>Bob</b> und <i>Cora</i>!")
m.Attach("/home/Alex/lolcat.jpg")

d := gomail.NewDialer("smtp.example.com", 587, "Benutzer", "123456")

// Senden Sie eine E-Mail an Bob, Cora und Dan.
if err := d.DialAndSend(m); err != nil {
    panic(err)
}

Beispiel (Daemon)

Ein Daemon, der einem Kanal zuhört und alle empfangenen Nachrichten sendet.

ch := make(chan *gomail.Message)

go func() {
    d := gomail.NewDialer("smtp.example.com", 587, "Benutzer", "123456")

    var s gomail.SendCloser
    var err error
    open := false
    for {
        select {
        case m, ok := <-ch:
            if !ok {
                return
            }
            if !open {
                if s, err = d.Dial(); err != nil {
                    panic(err)
                }
                open = true
            }
            if err := gomail.Send(s, m); err != nil {
                log.Print(err)
            }
        // Schließen Sie die Verbindung zum SMTP-Server, wenn in den letzten 30 Sekunden keine E-Mail gesendet wurde.
        case <-time.After(30 * time.Second):
            if open {
                if err := s.Close(); err != nil {
                    panic(err)
                }
                open = false
            }
        }
    }
}()

// Senden Sie E-Mails über diesen Kanal in Ihrem Programm.

// Schließen Sie den Kanal, um den E-Mail-Daemon zu stoppen.
close(ch)

Beispiel (E-Mail-Abonnement)

Senden Sie effektiv angepasste E-Mail-Abonnements an eine Gruppe von Empfängern.

// Liste der Empfänger.
var list []struct {
    Name    string
    Address string
}

d := gomail.NewDialer("smtp.example.com", 587, "Benutzer", "123456")
s, err := d.Dial()
if err != nil {
    panic(err)
}

m := gomail.NewMessage()
for _, r := range list {
    m.SetHeader("From", "[email protected]")
    m.SetAddressHeader("To", r.Address, r.Name)
    m.SetHeader("Subject", "Newsletter #1")
    m.SetBody("text/html", fmt.Sprintf("Hallo %s!", r.Name))

    if err := gomail.Send(s, m); err != nil {
        log.Printf("Konnte keine E-Mail an %q senden: %v", r.Address, err)
    }
    m.Reset()
}

Beispiel (Keine Authentifizierung)

Senden Sie E-Mails über einen lokalen SMTP-Server.

m := gomail.NewMessage()
m.SetHeader("From", "[email protected]")
m.SetHeader("To", "[email protected]")
m.SetHeader("Subject", "Hallo!")
m.SetBody("text/plain", "Hallo!")

d := gomail.Dialer{Host: "localhost", Port: 587}
if err := d.DialAndSend(m); err != nil {
    panic(err)
}

Beispiel (Kein SMTP)

Senden von E-Mails mit der API oder postfix.

m := gomail.NewMessage()
m.SetHeader("From", "[email protected]")
m.SetHeader("To", "[email protected]")
m.SetHeader("Subject", "Hallo!")
m.SetBody("text/plain", "Hallo!")

s := gomail.SendFunc(func(from string, to []string, msg io.WriterTo) error {
    // Implementieren Sie Ihre E-Mail-Sendefunktion, indem Sie eine API aufrufen oder postfix ausführen, usw.
    fmt.Println("Von:", from)
    fmt.Println("An:", to)
    return nil
})

if err := gomail.Send(s, m); err != nil {
    panic(err)
}

FAQ

x509: Zertifikat von unbekannter Autorität signiert

Wenn Sie auf diesen Fehler stoßen, bedeutet dies, dass der Client, der Gomail ausführt, das vom SMTP-Server verwendete Zertifikat für ungültig hält. Als Workaround können Sie die Validierung der Zertifikatkette und des Hostnamens des Servers umgehen, indem Sie SetTLSConfig verwenden:

package main

import (
	"crypto/tls"
	
	"gopkg.in/gomail.v2"
)

func main() {
	d := gomail.NewDialer("smtp.example.com", 587, "benutzer", "123456")
	d.TLSConfig = &tls.Config{InsecureSkipVerify: true}

    // Verwenden Sie d, um E-Mails zu senden.
}

Bitte beachten Sie jedoch, dass dies unsicher ist und nicht in einer Produktionsumgebung verwendet werden sollte.