Intégration de Brevo avec un webhook en Golang Link to heading

Introduction Link to heading

Dans mon entreprise, nous utilisons Brevo pour l’envois d’email (transactionnel, marketing, etc). Brevo propose d’envoyer des notifications vers un webhook. pour aider notre responsable de la communication à suivre les envois, les desinscriptions, etc, j’ai décidé de créer un webhook en Golang pour envoyer des notifications vers notre chat d’entreprise (rocketchat).

Prérequis Link to heading

  • Avoir un compte Brevo
  • Avoir un chat qui a une API (RocketChat, Discord, etc)
  • Avoir un serveur pour héberger le webhook (ou utiliser un service comme CleverCloud ou Koyeb)
  • Connaitre les bases de Golang

Les webhooks sur Brevo Link to heading

Creation du Webhook Link to heading

Nous avons besoin d’etre notifier lorsqu’un utilisateur se désinscrit de nos emails. Pour cela, nous allons créer un webhook qui sera appelé à chaque désinscription.

  1. Connectez-vous à votre compte Brevo
  2. Allez dans Contacts > Paramètres > Webhooks
  3. Ajoutez un nouveau webhook en cliquant sur le bouton Ajouter un nouveau Webhook
  4. Replire le formulaire avec les informations suivantes:
    • URL de description: http://api.domain.com/brevo/webhook
    • Quand le message est :
      • Se désinscrire
    • Description: Webhook pour les désinscriptions
  5. Cliquez sur Ajouter

Exemple de payload Link to heading

 1{
 2  "id": 123456,
 3  "camp_id": 123,
 4  "email": "demo@example.com",
 5  "campaign name": "Demo Campaign",
 6  "date_sent": "2023-12-08 08:31:02",
 7  "date_event": "2024-01-29 13:19:39",
 8  "tag": "",
 9  "event": "unsubscribe",
10  "ts": 1707662668,
11  "list_id": [96,88],
12  "ts_event": 1707662668,
13  "ts_sent": 1707662668
14}

Création du Webhook en Golang Link to heading

Installation de Golang Link to heading

Pour installer Golang, vous pouvez suivre les instructions sur le site officiel.

Création du projet Link to heading

1
2
3
mkdir brevo-webhook
cd brevo-webhook
go mod init brevo-webhook

Do not forget to use go mod tidy after writing the main.go or importing any new package to update the go.mod file.

Decouverte du main.go Link to heading

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package main

import (
	"backend_access/api"
	"fmt"
	"log"
	"os"
	"strings"

	"github.com/gofiber/fiber/v2"
	"github.com/gofiber/fiber/v2/middleware/cors"

	"github.com/gofiber/fiber/v2/middleware/recover"
	"github.com/joho/godotenv"
)

func init() {
	log.SetFlags(log.LstdFlags | log.Lshortfile)
	log.SetPrefix("backend_access: ")
	log.SetOutput(os.Stderr)

	// read .env file if present using godotenv
	err := godotenv.Load()
	if err != nil {
		log.Fatalf("Error loading .env file")
	}
}

func main() {
	app := fiber.New()

	app.Use(cors.New(cors.Config{}))

	app.Use(recover.New())

	app.Use(func(c *fiber.Ctx) error {
		userAgent := c.Get("User-Agent")
		ip := c.IP()
		if ip == "" {
			ip = c.Get("X-Forwarded-For")
		}
		ip = fmt.Sprintf("IP: %s", ip)
		ipLengh := len(ip)
		userAgent = fmt.Sprintf("User-Agent: %s", userAgent)
		userAgentLenght := len(userAgent)
		var hBar string
		var vBarEmpty string
		if ipLengh > userAgentLenght {
			hBar = strings.Repeat("=", ipLengh)
			vbarLengh := ipLengh - userAgentLenght
			vBarEmpty = strings.Repeat(" ", vbarLengh)

			log.Printf(`
[%s]
|%s|            
|%s%s| 
[%s]
		`, hBar, ip, userAgent, vBarEmpty, hBar)

		} else {
			hBar = strings.Repeat("=", userAgentLenght)
			vbarLengh := userAgentLenght - ipLengh
			vBarEmpty = strings.Repeat(" ", vbarLengh)

			log.Printf(`
[%s]
|%s%s|            
|%s| 
[%s]
		`, hBar, ip, vBarEmpty, userAgent, hBar)
		}

		return c.Next()
	})

	api.Brevo(app)

	log.Panicln(app.Listen(":1337"))

}