Skip to content

Emailing

Les trois plateformes utilisent Brevo (ex-Sendinblue) comme fournisseur d'emails en production/staging, avec un fallback Mailcatcher en local. Les templates sont hébergés sur Brevo et récupérés dynamiquement à l'envoi.

Plateforme Architecture Volume Logging
article1-connect Microservice RabbitMQ 3 types
dema1n Event-driven (EventEmitter) 50+ événements Table log-mail
inspire-v2 Appels directs 4 types

article1-connect

Service dédié : back/apps/emails/. Découplé du reste de l'API via RabbitMQ — l'API publie un message, le microservice emails le consomme et envoie.

Emails envoyés

Pattern RabbitMQ Déclencheur
send/email/password/forgotten Mot de passe oublié (auth.service.ts)
send/email/user/email/request Demande de changement d'email — envoyé à l'ancienne ET la nouvelle adresse (user.service.ts)
send/email/user/email/confirm Confirmation après changement d'email

Templates Brevo

ID Usage
400 Réinitialisation de mot de passe
1849 Confirmation email (nouvelle adresse)
1850 Notification changement email (ancienne adresse)
1852 Confirmation changement email réussi

dema1n

Service principal : back/src/binomes/services/mail.service.ts. Les emails sont déclenchés par des événements NestJS (@OnEvent()) dans notification.service.ts.

Deux modes d'envoi coexistent : - Templates Brevo : si le MessageTemplate a un brevoTemplateId, envoyé via l'API Brevo - Templates locaux : HTML stocké en base (MessageTemplate), envoyé via nodemailer

Routing SMTP par domaine

Certains domaines destinataires sont routés vers un second serveur SMTP (MAIL2_). La sélection se fait sur le domaine de l'adresse email du destinataire via MAIL2_DOMAINS.

Emails envoyés (principaux)

Événement Destinataire Template
jeune.inscrit Jeune jeune-majeur-inscrit / jeune-mineur-inscrit
jeune.activate / jeune.validate Jeune Activation, validation compte
jeune.relance.* Jeune Relances J+3, J+7, J+15, J+30, J+60
benevole.inscrit Bénévole benevole-inscrit
benevole.activate / benevole.validate Bénévole Activation, validation compte
benevole.relance-formation.* Bénévole Relances formation (7 niveaux)
binome.premer Jeune + Bénévole binome-premer (premier appariement)
binome.annule.* Jeune + Bénévole Annulation binôme (3 variantes)
binome.mvls-premer Jeune + Bénévole Premier appariement MVLS
user.ask-delete Utilisateur Demande de suppression compte

Liste complète dans back/src/binomes/events/.

Logging

Chaque envoi est tracé dans la table log-mail via LogMail entity — avec références vers jeune, bénévole, binôme, ou user selon le contexte.

Config par environnement

Staging Dema1n : double SMTP. Les emails dont le domaine destinataire est dans MAIL2_DOMAINS (article-1.eu, damienrave.fr, improba.fr) partent via Brevo SMTP ; tous les autres partent via Mailpit (intercepteur interne).

MAIL2_HOST: smtp-relay.brevo.com
MAIL2_DOMAINS: article-1.eu,damienrave.fr,improba.fr
MAIL_HOST: mailpit.shared.svc.cluster.local   # intercepte tout le reste

inspire-v2

Service : api/src/emails/services/emails.service.ts. Les emails sont appelés directement depuis les services métier (pas d'event bus).

Le transport est sélectionné via MAIL_TRANSPORT : "brevo" (défaut prod) ou "smtp".

Emails envoyés

Méthode Déclencheur Template Brevo
sendActivationEmail() Création de compte 526
sendWelcomeEmail() Après activation du compte 521
sendChatRelanceEmail() Inactivité chat (cron) Dynamique (passé en paramètre)
Reset mot de passe SendGrid (voir ci-dessous)

Le reset de mot de passe passe par SendGrid (@sendgrid/mail) via userJwt.service.ts, indépendamment du transport configuré.

Config par environnement

Demo : Mailpit comme intercepteur — aucun email ne sort vers l'extérieur.

MAIL_HOST: mailpit.shared.svc.cluster.local