Guide d’intégration
Brancher un outil sur LSSD Mail
LSSD Mail est le seul point d’envoi d’e-mails des outils LSSD. Un outil lui remet ses messages en SMTP, sur le réseau Docker interne du serveur. LSSD Mail les envoie depuis contact@lssd.fr par le serveur d’OVH, au nom de l’outil (« LSSD Budget <contact@lssd.fr> »), réessaie en cas de panne et garde un journal pour les administrateurs. L’outil n’a besoin d’aucun identifiant OVH.
En résumé
| Serveur SMTP | lssd-mail-smtp, port 2525, sur le réseau Docker shared-internal |
|---|---|
| Authentification | Obligatoire : identifiant et mot de passe propres à l’outil (AUTH PLAIN ou LOGIN) |
| Chiffrement | Aucun entre l’outil et LSSD Mail : le trafic ne quitte pas le réseau interne. LSSD Mail parle à OVH en TLS. |
| Expéditeur | Toujours Nom du service <contact@lssd.fr>, quel que soit le From envoyé par l’outil |
| Limites | 50 destinataires et 10 Mo par message |
| Journal | Date, service, destinataires, objet et état, conservés 90 jours. Le contenu est supprimé dès l’envoi. |
Étape 1 — Créer le service de l’outil
Un administrateur de LSSD Mail ouvre la page Services et ajoute l’outil :
- Nom d’expéditeur : le nom affiché dans la boîte du destinataire, par exemple
LSSD Budget. - Identifiant SMTP : court, en minuscules, par exemple
budget.
LSSD Mail affiche alors une seule fois la ligne à copier dans le .env de l’outil :
EMAIL_URL=smtp://budget:<mot-de-passe>@lssd-mail-smtp:2525
Mot de passe perdu ou divulgué : « Nouveau mot de passe » sur la même page, puis mettez à jour le
.env de l’outil. L’ancien cesse aussitôt de fonctionner. « Désactiver » coupe l’envoi
sans supprimer l’historique.
Étape 2 — Brancher l’outil sur le réseau interne
Dans le compose.yaml de l’outil, ajoutez le réseau externe shared-internal aux
services qui envoient des e-mails (en général web et worker) :
services:
web:
networks: [default, web, internal]
worker:
networks: [default, internal]
networks:
internal:
external: true
name: shared-internal
Aucun port n’est publié : lssd-mail-smtp n’est joignable que depuis ce réseau.
Étape 3 — Configurer l’envoi dans l’outil
Dans le .env de l’outil (et dans son .env.example, avec une valeur factice) :
# LSSD Mail: SMTP access of this tool, created on mail.lssd.fr (Services) EMAIL_URL=smtp://budget:<mot-de-passe>@lssd-mail-smtp:2525 DEFAULT_FROM_EMAIL=contact@lssd.fr
DEFAULT_FROM_EMAIL sert seulement à garder des en-têtes cohérents : LSSD Mail impose de toute
façon l’expéditeur du service.
Django
Avec django-environ, déjà utilisé par les outils LSSD :
# settings.py
EMAIL_CONFIG = env.email_url("EMAIL_URL", default="consolemail://")
vars().update(EMAIL_CONFIG)
DEFAULT_FROM_EMAIL = env("DEFAULT_FROM_EMAIL", default="contact@lssd.fr")
EMAIL_TIMEOUT = 15
Rien d’autre à changer : send_mail(), EmailMessage et les e-mails de Django passent
par LSSD Mail. Envoyez-les depuis une tâche de fond (django-q2, Celery…) plutôt que pendant la requête.
Next.js et Node.js
Avec Nodemailer, qui accepte directement l’adresse
EMAIL_URL (comme toute nouvelle dépendance, à faire valider) :
// lib/mail.ts — server side only (Route Handler, Server Action)
import nodemailer from "nodemailer";
const transport = nodemailer.createTransport(process.env.EMAIL_URL);
export async function sendMail(to: string, subject: string, text: string, html?: string) {
await transport.sendMail({ from: process.env.DEFAULT_FROM_EMAIL, to, subject, text, html });
}
N’appelez jamais ce code depuis un composant client : le mot de passe ne doit pas quitter le serveur.
Python sans Django
import smtplib
from email.message import EmailMessage
message = EmailMessage()
message["To"] = "lea@example.org"
message["Subject"] = "Votre export est prêt"
message.set_content("Bonjour, votre export est disponible dans LSSD Budget.")
with smtplib.SMTP("lssd-mail-smtp", 2525, timeout=15) as smtp:
smtp.login("budget", password) # from the environment, never in the code
smtp.send_message(message)
En développement
- Lancez LSSD Mail sur votre machine :
docker compose up -ddans le dossiermail/(voir son README). En développement, il n’envoie rien à OVH : tous les messages arrivent dans Mailpit, sur http://localhost:8026. - Connectez-vous à http://localhost:8002 avec un compte de test du compte LSSD, et créez le service de votre outil.
- Votre outil en développement joint le réseau
shared-internalcomme en production, avec la même adresselssd-mail-smtp:2525. Un outil lancé hors de Docker utiliselocalhost:2525.
Ce que LSSD Mail fait de vos messages
- Expéditeur :
FromdevientNom du service <contact@lssd.fr>.Sender,Reply-To,Return-Path,Bccet les signatures DKIM de l’outil sont retirés. Les réponses arrivent donc dans la boîte contact@lssd.fr. - Destinataires : ceux de l’enveloppe SMTP. N’utilisez pas de copie cachée : envoyez un message par personne.
- File d’attente : le message part dans la minute. Si OVH ne répond pas, LSSD Mail réessaie après 1 minute, 5 minutes, 30 minutes, 2 heures et 6 heures, puis le marque en échec. Un refus définitif (adresse inexistante, code 5xx) est marqué en échec tout de suite.
- Limite horaire : au-delà de la limite d’envoi de l’offre OVH, les messages attendent l’heure suivante au lieu d’échouer.
- Confidentialité : le contenu de vos messages n’est jamais affiché aux administrateurs et il est supprimé dès l’envoi. Seuls la date, le service, les destinataires, l’objet et l’état restent dans le journal, 90 jours.
Bonnes pratiques
- Jamais de secret dans l’objet : l’objet est visible dans le journal. Les codes et liens à usage unique vont dans le corps du message.
- Un texte brut, et une version HTML si besoin, en français et au vouvoiement, comme l’interface.
- Pas de pixel de suivi ni de lien de pistage.
- Envoyez depuis une tâche de fond : si LSSD Mail redémarre, la tâche réessaie, et l’utilisateur n’attend pas.
En cas de problème
| Réponse ou symptôme | Cause et solution |
|---|---|
535 à la connexion | Identifiant ou mot de passe faux, ou service désactivé. Vérifiez EMAIL_URL, ou générez un nouveau mot de passe. |
Name or service not known, connexion refusée | Le conteneur de l’outil n’est pas sur le réseau shared-internal (étape 2), ou LSSD Mail ne tourne pas. |
452 Too many recipients | Plus de 50 destinataires : découpez l’envoi. |
552 à l’envoi | Message de plus de 10 Mo : mettez un lien plutôt qu’une pièce jointe. |
| Message « Nouvelle tentative » ou « Échec » dans le journal | La dernière erreur d’OVH est affichée dans le détail du message. |