Envoi d'email en Go (Golang) : aperçu complet des bibliothèques et outils
Dans le développement web moderne, l'envoi d'emails reste l'une des tâches clés pour les notifications, les inscriptions, la réinitialisation de mots de passe et les newsletters. Le langage Go (Golang) propose plusieurs méthodes efficaces pour l'intégration avec les serveurs SMTP. Dans cet article, nous analyserons la bibliothèque standard net/smtp, la bibliothèque tierce populaire gomail et la bibliothèque avancée go-smtp. Vous apprendrez à envoyer des emails texte simples et HTML, à ajouter des pièces jointes et à configurer une connexion sécurisée.
1. Bibliothèque standard net/smtp
Le paquet net/smtp est intégré à Go et ne nécessite aucune installation supplémentaire. Il fournit des fonctions de base pour se connecter à un serveur SMTP, s'authentifier et envoyer des messages. Cependant, pour répondre aux exigences modernes (HTML, pièces jointes, SSL/TLS), vous devrez écrire plus de code.
Exemple simple d'envoi d'un email texte
package main
import ( "fmt" "net/smtp")
func main() { // Paramètres du serveur SMTP (exemple pour Gmail) smtpHost := "smtp.gmail.com" smtpPort := "587" from := "your_email@gmail.com" password := "your_app_password" to := []string{"recipient@example.com"}
// Sujet et corps du message (format le plus simple) subject := "Subject: Message de test depuis Go" body := "Bonjour ! Ce message a été envoyé avec net/smtp." msg := []byte(subject + "" + 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 !")}Important : Pour Gmail, vous devez utiliser un mot de passe d'application (pas le mot de passe principal) et autoriser l'accès aux applications moins sécurisées. Pour d'autres services (Yandex, Mail.ru), les paramètres peuvent différer.
Envoi d'un email HTML via net/smtp
Pour envoyer un email HTML, vous devez spécifier explicitement l'en-tête Content-Type :
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"}
// Construction des en-têtes MIME headers := make(map[string]string) headers["From"] = from headers["To"] = "recipient@example.com" headers["Subject"] = "Email HTML depuis Go" headers["MIME-Version"] = "1.0" headers["Content-Type"] = "text/html; charset=\\"UTF-8\\""
// Assemblage du message message := "" for k, v := range headers { message += fmt.Sprintf("%s: %s\\r", k, v) } message += "\\r" + "<h1>Bonjour !</h1><p>Ceci est un email <b>HTML</b>.</p>"
auth := smtp.PlainAuth("", from, password, smtpHost) err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, []byte(message)) if err != nil { fmt.Println("Erreur :", err) }}L'inconvénient de net/smtp est l'absence de support pour les pièces jointes et les structures de message multipart complexes. Pour de telles tâches, il est préférable d'utiliser des bibliothèques spécialisées.
2. Bibliothèque gomail
Gomail est l'une des bibliothèques tierces les plus populaires pour l'envoi d'emails en Go. Elle offre une API pratique, le support du HTML, des pièces jointes, de l'incorporation d'images, de SSL/TLS et d'en-têtes personnalisables.
Installation
go get gopkg.in/mail.v2Exemple d'envoi d'un email HTML avec pièce jointe
package main
import ( "crypto/tls" "fmt" gomail "gopkg.in/mail.v2")
func main() { m := gomail.NewMessage(