Introduction à Gomail

Gomail est un package simple et efficace pour envoyer des e-mails en Golang. Il a été largement testé et documenté.

Gomail ne peut envoyer des e-mails qu'en utilisant des serveurs SMTP. Cependant, l'API est flexible et peut facilement implémenter des méthodes telles que l'utilisation de Postfix local, d'API, etc., pour envoyer des e-mails.

Il utilise gopkg.in pour le contrôle de version, il n'y aura donc pas de modifications incompatibles dans chaque version.

Il nécessite l'utilisation de Go 1.2 ou d'une version ultérieure. En Go 1.5, les dépendances externes ne seront pas utilisées.

Fonctionnalités de Gomail

Gomail prend en charge les fonctionnalités suivantes :

  • Pièces jointes
  • Images intégrées
  • Modèles HTML et texte
  • Encodage automatique des caractères spéciaux
  • SSL et TLS
  • Envoi de plusieurs e-mails en utilisant la même connexion SMTP

Installation

go get gopkg.in/gomail.v2

Exemple

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

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

// Envoyer un e-mail à Bob, Cora et Dan.
if err := d.DialAndSend(m); err != nil {
    panic(err)
}

Exemple (Démon)

Un démon qui écoute un canal et envoie tous les messages reçus.

ch := make(chan *gomail.Message)

go func() {
    d := gomail.NewDialer("smtp.example.com", 587, "utilisateur", "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)
            }
        // Fermer la connexion au serveur SMTP si aucun e-mail n'a été envoyé dans les 30 dernières secondes.
        case <-time.After(30 * time.Second):
            if open {
                if err := s.Close(); err != nil {
                    panic(err)
                }
                open = false
            }
        }
    }
}()

// Envoyer des e-mails en utilisant ce canal dans votre programme.

// Fermer le canal pour arrêter le démon de messagerie.
close(ch)

Exemple (Abonnement par e-mail)

Envoyer efficacement des abonnements par e-mail personnalisés à un groupe de destinataires.

// Liste des destinataires.
var list []struct {
    Name    string
    Address string
}

d := gomail.NewDialer("smtp.example.com", 587, "utilisateur", "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", "Bulletin d'information #1")
    m.SetBody("text/html", fmt.Sprintf("Bonjour %s !", r.Name))

    if err := gomail.Send(s, m); err != nil {
        log.Printf("Impossible d'envoyer un e-mail à %q : %v", r.Address, err)
    }
    m.Reset()
}

Exemple (Pas d'authentification)

Envoyer des e-mails en utilisant un serveur SMTP local.

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

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

Example (Pas de SMTP)

Envoyer des e-mails en utilisant une API ou postfix.

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

s := gomail.SendFunc(func(from string, to []string, msg io.WriterTo) error {
    // Implémentez votre fonction d'envoi d'e-mail en appelant une API ou en exécutant postfix, etc.
    fmt.Println("De :", from)
    fmt.Println("À :", to)
    return nil
})

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

FAQ

x509: certificat signé par une autorité inconnue

Si vous rencontrez cette erreur, cela signifie que le client exécutant Gomail considère que le certificat utilisé par le serveur SMTP est invalide. Pour contourner cela, vous pouvez contourner la validation de la chaîne de certificats et du nom d'hôte du serveur en utilisant SetTLSConfig :

package main

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

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

    // Utilisez d pour envoyer des e-mails.
}

Cependant, veuillez noter que ceci est peu sécurisé et ne doit pas être utilisé dans un environnement de production.