Envoi d'email en Go (Golang) : bibliothèques et exemples de code
L'envoi d'emails est l'une des tâches clés pour toute application web : inscription des utilisateurs, réinitialisation de mot de passe, notifications et newsletters. En langage Go (Golang), il existe à la fois des outils standards pour travailler avec SMTP et des bibliothèques tierces puissantes qui simplifient l'envoi d'emails avec des modèles HTML, des pièces jointes et la prise en charge de différents services de messagerie. Dans cet article, nous allons voir en détail comment envoyer des emails en Go, analyser les bibliothèques populaires et fournir des exemples de code pratiques.
Bibliothèque standard net/smtp
Le paquet net/smtp fait partie de la bibliothèque standard de Go et fournit un ensemble minimal de fonctions pour envoyer des emails via un serveur SMTP. Il convient aux messages texte simples, mais nécessite la création manuelle des en-têtes et du corps du message conformément à la RFC 5322.
Exemple d'envoi d'un email texte simple :
package main
import ( "fmt" "net/smtp")
func main() { // Données de connexion au serveur SMTP smtpHost := "smtp.example.com" smtpPort := "587" from := "sender@example.com" password := "your_password" to := []string{"recipient@example.com"}
// Création du corps du message (obligatoire avec les en-têtes) subject := "Subject: Bonjour depuis Go!" mime := "MIME-version: 1.0;Content-Type: text/plain; charset=\\"UTF-8\\";
" body := "Ceci est un email de test envoyé avec Go." msg := []byte(subject + mime + body)
// Authentification auth := smtp.PlainAuth("", from, password, smtpHost)
// Envoi err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, msg) if err != nil { fmt.Println("Erreur d'envoi :", err) return } fmt.Println("Email envoyé avec succès !")}Limitations de net/smtp :
- Ne prend pas en charge les pièces jointes sans encodage Base64 manuel.
- Nécessite un formatage manuel des en-têtes MIME.
- Peu pratique pour l'envoi d'emails HTML avec images.
Bibliothèque gomail/v2
L'une des bibliothèques tierces les plus populaires pour l'envoi d'emails en Go est gomail (paquet gopkg.in/mail.v2). Elle fournit une API pratique pour travailler avec les emails : prise en charge des pièces jointes, des parties HTML et texte, configuration de la connexion SMTP, ainsi que la possibilité d'envoyer via SSL/TLS.
Installation :
go get gopkg.in/mail.v2Exemple d'envoi d'un email HTML avec pièce jointe :
package main
import ( "fmt" "gopkg.in/mail.v2")
func main() { m := mail.NewMessage() m.SetHeader("From", "sender@example.com") m.SetHeader("To", "recipient@example.com") m.SetHeader("Subject", "Email HTML avec pièce jointe")
// Parties alternatives : texte et HTML m.SetBody("text/plain", "Si vous voyez ce texte, votre client ne prend pas en charge le HTML.") m.AddAlternative("text/html", "<h1>Bonjour !</h1><p>Ceci est la version HTML de l'email.</p>")
// Ajout d'une pièce jointe m.Attach("/path/to/file.pdf")
// Configuration du client SMTP d := mail.NewDialer("smtp.example.com", 587, "sender@example.com", "your_password") d.StartTLSPolicy = mail.MandatoryStartTLS
if err := d.DialAndSend(m); err != nil { fmt.Println("Erreur :", err) return } fmt.Println("Email envoyé !")}Avantages de gomail :
- API simple et intuitive.
- Création automatique des en-têtes MIME.
- Prise en charge des pièces jointes et des images intégrées (CID).
- Fonctionne avec SSL/TLS et StartTLS.
Bibliothèque go-smtp (emersion/go-smtp)
La bibliothèque go-smtp d'emersion est une alternative de plus bas niveau qui offre un contrôle total sur la connexion SMTP. Elle est utile si vous