n8n auto-hébergé · Discord · SMTP
Support d’une communauté en ligne : tri et routage automatiques
Chaque demande devait être lue, triée puis transmise à la main. Elle traverse maintenant un système.
Projet personnel
Les demandes arrivent par e-mail et par formulaire ; chacune est analysée, classée, envoyée dans le bon salon Discord, et l’expéditeur reçoit un accusé de réception.
01 · Avant
Comment cela se passait
- Chaque message lu par une personne avant d’être compris.
- Transfert manuel à la bonne personne, réponse à l’expéditeur à la main.
- Deux canaux d’entrée à surveiller séparément.
02 · Problème
Le problème et ses contraintes
Les demandes de support d’une communauté en ligne arrivaient par e-mail et par formulaire, en texte libre. Quelqu’un devait lire chaque message, comprendre de quoi il s’agissait, le transmettre à la bonne personne et répondre à l’expéditeur.
- Texte libre : aucun format imposé à l’expéditeur.
- Deux canaux d’entrée (e-mail et formulaire) pour un seul traitement.
- L’équipe travaille dans Discord : c’est là que les demandes doivent arriver.
- Serveur auto-hébergé : identifiants et mises à jour sous contrôle.
- Aucune demande ne doit se perdre, même mal formée.
03 · Rôle
Ce qui a été conçu et construit ici
- Conception et construction du workflow n8n de bout en bout : les deux déclencheurs (webhook du formulaire, boîte e-mail), l’extraction par expressions régulières, le schéma JSON commun, les règles de classification, la publication Discord et l’accusé de réception SMTP.
- Installation et exploitation du serveur n8n auto-hébergé : identifiants dans son gestionnaire, mises à jour.
- Ce qui vient d’ailleurs : n8n lui-même (outil d’orchestration), Discord et le serveur SMTP (services existants). Aucune bibliothèque ni contribution externe n’a été écrite pour ce projet.
04 · Architecture
La chaîne, étape par étape
- RéceptionWebhook · e-mail
- AnalyseRegex
- NormalisationJSON
- ClassificationLogique conditionnelle
- RoutageWebhook Discord
- Accusé de réceptionSMTP
01 · Webhook · e-mail
Réception
Deux déclencheurs n8n : un webhook pour le formulaire, la boîte e-mail pour les messages. Les deux produisent le même objet d’entrée.
De : joueur.exemple@exemple.org Objet : Impossible de me connecter Bonjour, depuis hier je n’arrive plus à me connecter à mon compte (pseudo : Orion_42). Merci.02 · Regex
Analyse
Des expressions régulières extraient les champs utiles du texte libre : pseudo, sujet, mots-clés. Un champ absent ne bloque rien : il est marqué comme manquant.
{ "canal": "email", "expediteur": "joueur.exemple@exemple.org", "pseudo": "Orion_42", "sujet": "Impossible de me connecter", "motsCles": ["connecter", "compte"] }03 · JSON
Normalisation
Les deux canaux sont ramenés au même schéma JSON. C’est ce schéma, et lui seul, que les étapes suivantes connaissent.
{ "id": "TCK-0193", "source": "email", "pseudo": "Orion_42", "texte": "depuis hier je n’arrive plus à me connecter…", "recuLe": "2026-10-02T09:14:03Z" }04 · Logique conditionnelle
Classification
Des règles écrites décident de la catégorie et de la priorité. Une demande qu’aucune règle ne reconnaît part dans « À trier », jamais à la poubelle.
{ "id": "TCK-0193", "categorie": "compte", "priorite": "normale", "regle": "motsCles ∋ connecter | mot de passe" }05 · Webhook Discord
Routage
Chaque catégorie correspond à un salon. Le message est publié par un webhook Discord dédié, qui ne peut rien faire d’autre que publier.
POST → salon #support-comptes { "titre": "TCK-0193 · compte", "auteur": "Orion_42", "resume": "Connexion impossible depuis hier" }06 · SMTP
Accusé de réception
L’expéditeur reçoit aussitôt un accusé de réception avec son numéro de ticket : il sait que sa demande est prise en compte.
À : joueur.exemple@exemple.org Objet : [TCK-0193] Demande bien reçue Bonjour, votre demande a été transmise à l’équipe. Référence : TCK-0193.
05 · Automatisation
Ce qui se fait seul
- Tri et routage sans intervention manuelle.
- Accusé de réception immédiat avec numéro de ticket.
- Historique d’exécution consultable pour chaque demande.
Un schéma unique
Le formulaire et l’e-mail sont convertis vers le même objet JSON dès l’entrée. Le reste du workflow ignore d’où vient la demande.
Des règles lisibles
La classification repose sur des conditions explicites, faciles à relire et à faire évoluer, plutôt que sur une boîte noire.
Une voie de secours
Ce qui n’est reconnu par aucune règle est routé vers une catégorie « À trier » : rien ne disparaît en silence.
Des sorties découplées
Discord et SMTP sont deux branches indépendantes : si l’une échoue, l’autre continue, et l’échec est visible dans l’historique d’exécution.
06 · Choix techniques
Pourquoi ces choix, et pas d’autres
n8n auto-hébergé plutôt qu’un service en ligne
Les données et les identifiants restent sur une machine maîtrisée. Contrepartie assumée : les mises à jour de sécurité sont à suivre soi-même.
Des règles explicites plutôt qu’un modèle de langage
Les messages étaient assez réguliers pour des règles lisibles et testables. Un modèle n’aurait de sens que si les demandes devenaient trop variées, avec une validation humaine sur les cas incertains.
Des webhooks Discord plutôt qu’un bot
Un webhook ne peut que publier dans un salon : moindre privilège, et rien à maintenir côté Discord.
Un schéma JSON unique dès l’entrée
Les étapes suivantes ignorent le canal d’origine : ajouter un troisième canal ne touche qu’une étape.
07 · IA
La place de l’IA
Aucune IA dans ce projet : des règles explicites suffisaient à classer les demandes, et elles restent lisibles et vérifiables. Un modèle de langage n’aurait de sens que si les messages devenaient trop variés pour des règles, avec une validation humaine sur les cas incertains.
08 · Sécurité
Ce qui protège le système
- Identifiants (boîte e-mail, SMTP, webhooks) rangés dans le gestionnaire d’identifiants de n8n, jamais dans les nœuds.
- Webhooks Discord : par nature, ils ne peuvent que publier dans un salon.
- Texte reçu traité comme une donnée : extrait par expressions régulières, jamais exécuté.
- Serveur n8n auto-hébergé : les données restent sur une machine maîtrisée.
Ce que nous ajouterions pour une mise en production chez un client
- Secret obligatoire sur le webhook du formulaire, et limite de débit.
- Alerte quand une exécution échoue ou qu’une demande reste « À trier ».
- Sauvegarde chiffrée de la base n8n et de sa clé de chiffrement.
- Mises à jour de sécurité de n8n suivies et appliquées rapidement.
09 · Fiabilité
Quand quelque chose échoue
- File « À trier » pour toute demande non reconnue : rien ne se perd.
- Branches Discord et SMTP indépendantes : l’échec de l’une n’arrête pas l’autre.
- Historique d’exécution n8n consultable pour chaque demande.
Limites connues
- Règles écrites pour des messages réguliers : un message inhabituel finit dans la file « À trier » et attend une personne.
- Un seul serveur, sans redondance ni alerte en cas d’arrêt (voir ce que nous ajouterions).
- Pas de tests automatisés sur le workflow : pour un client, nous ajouterions un jeu de messages de référence rejoué après chaque modification.
- Aucune mesure de volume ni de délai.
10 · Résultat
Le résultat
- Chaque demande est triée et transmise au bon salon sans que personne ait à la lire d’abord.
- L’expéditeur sait immédiatement que sa demande est prise en compte.
- Les demandes non reconnues restent visibles dans une file dédiée.
n8nWebhooksRegexJSONDiscordSMTP
Projet réalisé. Les messages, pseudonymes et numéros affichés ici sont des exemples synthétiques. Aucun chiffre de gain n’est publié tant qu’il n’a pas été mesuré.
11 · Documentation
Ce qui documente ce projet
- Le schéma de la chaîne et les charges JSON de chaque étape sont ceux affichés ci-dessus, sur données synthétiques.
- L’export du workflow n8n (JSON) peut être partagé sur demande, sans ses identifiants.
- Aucun délai de traitement ni volume n’est publié : rien n’a été mesuré sur ce projet, et nous ne publierons un chiffre que mesuré.