Produit

Envoi d’emails Golang : envoyez des emails transactionnels avec Go en quelques minutes

Nous avons publié un nouveau wrapper Golang qui facilitera plus que jamais la gestion des contacts et le traitement des emails.
octobre 3, 2025

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.

À qui s’adresse ce guide ?

Ce guide est destiné aux :

  • Développeurs et ingénieurs DevOps qui veulent une solution simple et durable d’envoi d’emails dans Go
  • Équipes qui se soucient de la délivrabilité, des statistiques et de l’évolutivité sans la complexité de la gestion SMTP

Prérequis

Avant de commencer, vous aurez besoin des éléments suivants :

  • Un compte Mailjet avec les clés API et secrètes
  • Un email/domaine d’expéditeur validé (SPF et DKIM recommandés pour un placement optimal dans la boîte de réception)
  • Go 1.20+ (le SDK prend en charge Go 1.13+) et accès aux variables d’environnement

💡 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.

Démarrage rapide : envoyez votre premier email Go (API v3.1)

Nous allons vous permettre d’envoyer rapidement des emails en utilisant le SDK officiel Mailjet Go et Send API v3.1.

1. Installez les dépendances et définissez les clés API

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
                            
                        

2. Créez votre premier programme d’emailing

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)
}

                            
                        

Pourquoi cela fonctionne-t-il ?

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.

Envoi via SMTP en Go (bibliothèque standard)

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)
    }
}

                            
                        

Notes sur la configuration SMTP

  • Hôte SMTP : in-v3.mailjet.com
  • Ports communs : 587 (TLS) ou 465 (SSL)
  • Considérations relatives au port 25 : peut être bloqué par votre fournisseur d’accès à Internet ou votre fournisseur cloud

Pour plus de détails, voir le guide de configuration SMTP.

Personnaliser avec des modèles et des variables

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\"}}",
 },
}

                            
                        

Syntaxe des variables de modèle

  • Variables API : utilisez {{var:first_name:&quot;default_value&quot;}} pour insérer des variables à partir de votre appel API
  • Données de contact : utilisez [[data:property:default]] pour les données stockées dans les contacts Mailjet

Pour plus d’exemples de modèles, voir cette discussion Stack Overflow.

Joindre des fichiers et des images en ligne

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: &quot;<BASE64_STRING>&quot;, // votre PDF encodé en base64
 },
 },
  InlinedAttachments: &[]mailjet.InlinedAttachmentV31{
 {
  AttachmentV31: mailjet.AttachmentV31{
  ContentType: "image/png",
  Filename: "logo.png",
  Base64Content: &quot;<BASE64_PNG>&quot;, // votre image encodée en base64
 },
  ContentID: "logo1", // référencé dans HTML comme cid:logo1
 },
 },
 },
}
                            
                        

Bonnes pratiques en matière de pièces jointes

  • Limite de taille : la taille totale du message doit rester ≤ 15 Mo
  • Email en masse : pour une meilleure délivrabilité, pensez à créer des liens vers des fichiers hébergés plutôt que de joindre des fichiers volumineux
  • Images en ligne : utilisez le champ ContentID pour référencer les images dans votre HTML avec la syntaxe cid:

Envoi en masse (plusieurs messages)

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.

Suivi des livraisons, des ouvertures et des clics (webhooks)

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.

Mise en place de webhooks

  1. Enregistrez votre point de terminaison webhook dans le tableau de bord Mailjet sous « Tracking des événements »
  2. Vous pouvez également utiliser le point de terminaison de l’API /v3/REST/eventcallbackurl de manière programmatique

Exemple de gestionnaire de webhook

                            

                                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))
}

                            
                        

Bonnes pratiques en matière de webhook

  • Renvoyer HTTP 200 rapidement pour accuser réception
  • Traiter les événements de manière asynchrone pour éviter les dépassements de délai
  • Gérer les nouvelles tentatives : Mailjet retente les réponses non-200 pendant une période pouvant aller jusqu’à 24 heures

Pour une documentation complète sur les événements, voir le guide de l’API de suivi des événements.

L’essentiel de la délivrabilité

Voici trois points essentiels à garder à l’esprit en matière de délivrabilité.

1. Authentification du domaine

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é :

  • Enregistrement SPF : autorise Mailjet à envoyer des emails au nom de votre domaine
  • Signature DKIM : ajoute des signatures cryptographiques pour vérifier l’authenticité des emails

Suivez le guide complet d’authentification de domaine pour obtenir des instructions de configuration étape par étape.

2. Configuration régionale

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/")

                            
                        

3. Configuration SMTP

  • Région par défaut : in-v3.mailjet.com
  • Ports recommandés : 587 (TLS) ou 465 (SSL)

Considérations relatives au pare-feu : testez l’accès aux ports de votre réseau ; de nombreux fournisseurs bloquent le port 25

Dépannage des problèmes courants

Voici les problèmes les plus courants et comment les résoudre.

Erreurs d’authentification (401 non autorisé)

  • Vérifiez que vos clés d’API sont correctement définies dans les variables d’environnement
  • Vérifiez la région de l’API : utilisez api.us.mailjet.com pour les comptes américains, api.mailjet.com pour les comptes européens

Erreurs de validation du contenu (400 bad request)

  • « At least HTMLPart, TextPart or TemplateID must be provided » : veillez à inclure le contenu de l’email ou à spécifier un ID de modèle
  • Champs obligatoires manquants : vérifiez que les champs From, To et Subject sont correctement définis

Erreurs de taille du message (413 payload too large)

  • Vérifiez la taille totale du message : maintenez les pièces jointes et le contenu en dessous de 15 Mo au total
  • Envisagez d’autres solutions : pour les fichiers volumineux, utilisez des liens hébergés plutôt que des pièces jointes

Problèmes liés aux webhooks

  • Les événements ne sont pas capturés : assurez-vous que le point d’arrivée de votre webhook renvoie le statut HTTP 200
  • Délais de traitement : traitez les webhooks de manière asynchrone pour éviter de bloquer le mécanisme de relance de Mailjet

Foire aux questions

Quel est le moyen le plus rapide d’envoyer un email dans Go ?

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.

Puis-je envoyer des emails en utilisant le protocole SMTP au lieu de l’API ?

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.

Comment personnaliser les modèles d’email ?

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.

Où puis-je consulter les statistiques relatives à la livraison et à l’engagement ?

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.

Prochaines étapes

Maintenant que l’envoi d’emails fonctionne dans votre application Go, pensez à ces améliorations :

  1. Sécurisez votre réputation d’expéditeur : authentifiez votre domaine avec les enregistrements SPF et DKIM
  2. Ajoutez le suivi des événements : mettez en place des webhooks pour alimenter les statistiques et les flux de travail automatisés
  3. Explorez les fonctionnalités avancées : découvrez les URLTags et le SandboxMode pour les tests dans la documentation de Send API v3.1
  4. Parcourez d’autres exemples : visitez le référentiel du SDK Go pour découvrir d’autres modèles et cas d’utilisation

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.