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) viauserJwt.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