Produit
Si vous concevez avec Go et que vous avez besoin d’un email fiable pour les inscriptions, les reçus, les réinitialisations de mot de passe ou les alertes, ce guide vous indique la voie la plus rapide.
Vous configurerez un expéditeur, enverrez votre premier message avec le SDK Go de Mailjet et apprendrez des motifs pour les modèles, les pièces jointes, l’envoi en masse, les webhooks et le SMTP.
Il s’agit d’une approche de l’intégration email fondée sur l’exemple et prête pour la production.
En 2009, Google a publié un langage appelé Go, souvent appelé « Golang ». Go a été présenté comme un langage de programmation robuste côté serveur. Depuis lors, il n’a jamais manqué de tenir ses promesses avec des modèles de programmation de bas niveau et de puissantes structures de données.
Ce guide est destiné aux :
Avant de commencer, vous aurez besoin des éléments suivants :
💡 Astuce d’expert : authentifiez votre domaine via SPF/DKIM pour améliorer les taux de distribution dans les boîtes de réception. Voir le guide d’authentification complet pour les détails de configuration et les exemples.
Nous allons vous permettre d’envoyer rapidement des emails en utilisant le SDK officiel Mailjet Go et Send API v3.1.
Tout d’abord, installez le SDK Go de Mailjet :
go get github.com/mailjet/mailjet-apiv3-go/v4
Définissez ensuite vos variables d’environnement :
export MJ_APIKEY_PUBLIC=votre_clé_api
export MJ_APIKEY_PRIVATE=votre_clé_secrète
export SENDER_EMAIL=votre_expéditeur_vérifié@votredomaine.com
Créez un fichier main.go avec le code suivant :
package main
import (
"fmt"
"log"
"os"
"github.com/mailjet/mailjet-apiv3-go/v4"
)
func main() {
mj := mailjet.NewMailjetClient(os.Getenv("MJ_APIKEY_PUBLIC"), os.Getenv("MJ_APIKEY_PRIVATE"))
msgs := []mailjet.InfoMessagesV31{
{
From: &mailjet.RecipientV31{Email: os.Getenv("SENDER_EMAIL"), Name: "Go App"},
To: &mailjet.RecipientsV31{
{Email: "recipient@example.com", Name: "Recipient"},
},
Subject: "Hello from Go + Mailjet",
TextPart: "This is a plain-text fallback.",
HTMLPart: "<h3>Hello from Go + Mailjet</h3><p>It works.</p>",
},
}
messages := mailjet.MessagesV31{Info: msgs}
res, err := mj.SendMailV31(&messages)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Status: %+v\n", res)
}
Le SDK Go intègre les points d’accès REST de Mailjet et fournit une aide pratique SendMailV31 qui accepte un tableau Messages. Cette approche vous permet de bénéficier de toute la puissance de l’API Mailjet avec un minimum de code.
Si vous préférez le SMTP ou si vous utilisez déjà un MTA SMTP, vous pouvez utiliser le relais SMTP de Mailjet avec vos identifiants API.
package main
import (
"net/smtp"
"os"
)
func main() {
host := "in-v3.mailjet.com"
auth := smtp.PlainAuth("", os.Getenv("MJ_APIKEY_PUBLIC"), os.Getenv("MJ_APIKEY_PRIVATE"), host)
to := []string{"recipient@example.com"}
from := "sender@yourdomain.com"
msg := []byte(
"To: recipient@example.com\r\n" +
"From: Go App <sender@yourdomain.com>\r\n" +
"Subject: SMTP from Go via Mailjet\r\n" +
"MIME-Version: 1.0\r\n" +
"Content-Type: text/html; charset=UTF-8\r\n\r\n" +
"<p>Hello via SMTP</p>",
)
// Port 587 (TLS) or 465 (SSL) are common choices
err := smtp.SendMail(host+":587", auth, from, to, msg)
if err != nil {
log.Fatal(err)
}
}
Pour plus de détails, voir le guide de configuration SMTP.
Concevez votre modèle d’email une fois dans le tableau de bord Mailjet, puis transmettez un TemplateID et des variables de votre code Go pour le contenu dynamique.
msgs := []mailjet.InfoMessagesV31{
{
From: &mailjet.RecipientV31{Email: os.Getenv("SENDER_EMAIL"), Name: "Go App"},
To: &mailjet.RecipientsV31{{Email: "destinataire@exemple.com", Name: "Terry"}},
TemplateID : 123456, // remplacer par l'ID de votre modèle
TemplateLanguage: true, // activer le templating language de Mailjet
Variables: map[string]any{"first_name": "Terry", "plan": "Pro"},
Sujet : "Bienvenue, {{var:first_name:\"à vous\"}}",
},
}
Pour plus d’exemples de modèles, voir cette discussion Stack Overflow.
Envoyez des pièces jointes et intégrez des images en ligne dans vos emails. La taille totale des messages est limitée à 15 Mo.
// Lisez et encodez en base64 vos fichiers d'abord, puis :
msgs := []mailjet.InfoMessagesV31{
{
From: &mailjet.RecipientV31{Email: os.Getenv("SENDER_EMAIL")},
To: &mailjet.RecipientsV31{{Email: "destinataire@exemple.com"}},
Subject: "Facture jointe + logo en ligne",
HTMLPart: `<p>Merci pour votre achat !</p><img src="cid:logo1" alt="Logo de l'entreprise">`,
Attachments: &[]mailjet.AttachmentV31{
{
ContentType: "application/pdf",
Filename: "invoice.pdf",
Base64Content: "<BASE64_STRING>", // votre PDF encodé en base64
},
},
InlinedAttachments: &[]mailjet.InlinedAttachmentV31{
{
AttachmentV31: mailjet.AttachmentV31{
ContentType: "image/png",
Filename: "logo.png",
Base64Content: "<BASE64_PNG>", // votre image encodée en base64
},
ContentID: "logo1", // référencé dans HTML comme cid:logo1
},
},
},
}
Envoyez plusieurs messages personnalisés en un seul appel API. Chaque message est validé indépendamment, de sorte que les messages réussis seront envoyés même si l’un d’entre eux échoue.
msgs := []mailjet.InfoMessagesV31{
{
From: &mailjet.RecipientV31{Email: os.Getenv("SENDER_EMAIL")},
To: &mailjet.RecipientsV31{{Email: "user1@example.com"}},
Subject: "Bienvenue, Utilisateur 1 !",
HTMLPart: "<p>Bonjour Utilisateur 1</p>",
},
{
From: &mailjet.RecipientV31{Email: os.Getenv("SENDER_EMAIL")},
To: &mailjet.RecipientsV31{{Email: "user2@example.com"}},
Subject: "Bienvenue, Utilisateur 2 !",
HTMLPart: "<p>Bonjour Utilisateur 2</p>",
},
}
res, err := mj.SendMailV31(&mailjet.MessagesV31{Info: msgs})
if err != nil {
log.Fatal(err)
}
// Traiter les résultats - chaque message reçoit son propre statut et son propre identifiant
for i, result := range res.ResultsV31 {
fmt.Printf("Message %d: Status=%s, MessageID=%d\n", i, result.Status, result.To[0].MessageID)
}
Send API v3.1 renvoie l’état et les identifiants de chaque message, ce qui facilite la corrélation entre les résultats et les messages originaux. Utilisez l’identifiant du message pour suivre l’état de la livraison ultérieurement.
Configurez les webhooks pour recevoir des notifications en temps réel sur les événements liés aux emails tels que la livraison, les ouvertures, les clics, les rebonds et les désabonnements.
package main
import (
"encoding/json"
"net/http"
"log"
)
type MailjetEvent struct {
Event string `json:"event"`
Time int64 `json:"time"`
MessageID int64 `json:"MessageID"`
Email string `json:"email"`
URL string `json:"url,omitempty"` // pour les événements de clics
Error string `json:"error,omitempty"` // pour les événements de rebond/erreur
}
func webhookHandler(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
var events []MailjetEvent
if err := json.NewDecoder(r.Body).Decode(&events); err != nil {
http.Error(w, "bad request", http.StatusBadRequest)
return
}
// Traiter les événements (envisager l'utilisation d'une file d'attente pour la production)
for _, event := range events {
switch event.Event {
case "sent":
log.Printf("Message %d envoyé à %s", event.MessageID, event.Email)
case "open":
log.Printf("Message %d ouvert par %s", event.MessageID, event.Email)
case "click":
log.Printf("Message %d cliqué par %s (URL : %s)", event.MessageID, event.Email, event.URL)
case "bounce":
log.Printf("Message %d rebondi pour %s : %s", event.MessageID, event.Email, event.Error)
}
}
// Retourne toujours 200 pour accuser réception
w.WriteHeader(http.StatusOK)
}
func main() {
http.HandleFunc("/mj/events", webhookHandler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
Pour une documentation complète sur les événements, voir le guide de l’API de suivi des événements.
Voici trois points essentiels à garder à l’esprit en matière de délivrabilité.
Mettez en place l’authentification SPF et DKIM pour votre domaine d’envoi afin d’améliorer le placement dans la boîte de réception et de réduire le risque d’usurpation d’identité :
Suivez le guide complet d’authentification de domaine pour obtenir des instructions de configuration étape par étape.
Si votre compte Mailjet se trouve sur l’infrastructure américaine, configurez le SDK pour qu’il utilise le point de terminaison API américain :
// Pour les comptes de la région US
mj := mailjet.NewMailjetClient(apiKey, secretKey)
mj.SetAPIBase("https://api.us.mailjet.com/v3.1/")
Considérations relatives au pare-feu : testez l’accès aux ports de votre réseau ; de nombreux fournisseurs bloquent le port 25
Voici les problèmes les plus courants et comment les résoudre.
Utilisez le SDK officiel avec SendMailV31 comme indiqué dans la section Démarrage rapide. Il s’agit d’un simple appel de fonction une fois que vos clés API sont configurées.
Oui ! Pointez le paquet net/smtp de Go sur in-v3.mailjet.com en utilisant votre clé API et votre secret comme informations d’identification, avec le port 587 ou 465.
Définissez TemplateID, activez TemplateLanguage: true, et transmettez vos données dans le champ Variables. Utilisez la syntaxe {{var:name: »default »}} dans vos modèles.
Utilisez les webhooks pour obtenir des données d’événements en temps réel, ou consultez le tableau de bord Mailjet et les points d’accès aux statistiques de l’API REST pour obtenir des statistiques agrégées.
Maintenant que l’envoi d’emails fonctionne dans votre application Go, pensez à ces améliorations :
Avec cette base, vous êtes prêt à intégrer des fonctionnalités de messagerie robustes et évolutives dans vos applications Go. La combinaison de l’infrastructure fiable de Mailjet et des performances de Go constitue une solution d’emailing puissante.
Comment personnaliser les modèles d’email ?