Trier ses e-mails avec un LLM dans n8n, sans lui envoyer les données personnelles

Publié le 13 novembre 2026 Dernière mise à jour le 13 novembre 2026 7 min de lecture

En bref
Ce tutoriel construit un workflow n8n en six nœuds. Il lit un e-mail Gmail, remplace les données personnelles par des marqueurs, demande à un modèle de langage de classer le message et de rédiger une réponse, puis remet les vraies valeurs dans un brouillon. Rien ne part sans votre relecture. Une limite est à connaître : le node repère les noms de personnes par heuristique, et un nom cité une seule fois peut lui échapper. Le glossaire sert à les couvrir.

À qui s'adresse cet article

Aux personnes qui savent ouvrir n8n et ajouter un nœud. Aucun code n'est nécessaire. Le fil rouge est l'e-mail de Claire Fontaine, déjà croisé dans les articles 6 et 9. À la fin, vous aurez un workflow essayé sur un e-mail fictif et vous saurez où il peut mal tourner.

Ce que le workflow fait

Un client écrit à votre entreprise. Son e-mail arrive dans votre boîte Gmail :

Bonjour, je suis Claire Fontaine. Ma facture de 1 200 euros est en double. Merci de me rembourser sur FR76 3000 6000 0112 3456 7890 189. Vous pouvez me répondre à [email protected].

Pour classer ce message et préparer une réponse, le modèle n'a besoin ni du nom, ni de l'IBAN, ni de l'adresse. Le workflow les remplace donc avant l'envoi. Le modèle reçoit ceci :

Bonjour, je suis [TERME_G1]. Ma facture de 1 200 euros est en double. Merci de me rembourser sur [IBAN_HIDDEN]. Vous pouvez me répondre à [EMAIL_HIDDEN].

Quand la réponse revient, le workflow remet le nom à la place de [TERME_G1] et dépose le résultat dans un brouillon Gmail.

Deux mécanismes se partagent le travail. Les données courantes, comme l'adresse e-mail, l'IBAN ou le numéro de sécurité sociale, sont masquées sans retour possible : le brouillon ne les contiendra pas. Les termes que vous choisissez, un nom de client ou de projet par exemple, vont dans un glossaire. Ils sont masqués à l'aller et restaurés au retour.

Avant de commencer

Il faut le node Miravig, validé par n8n. Sur n8n Cloud, il s'ajoute comme n'importe quel autre node. Sur une instance auto-hébergée, il s'installe depuis Settings, Community Nodes, Install, en saisissant n8n-nodes-miravig.[1] La détection est gratuite. Le masquage automatique et le glossaire demandent un abonnement actif, dont la clé se renseigne dans la credential « Miravig License ». Les deux nodes du workflow, Mask et Unmask, se branchent sur cette credential.

Il faut aussi un compte Gmail relié à n8n, l'accès à un modèle de langage et un e-mail de test fictif. Le courrier réel d'un client est à éviter pour les essais.

Le trajet en six nœuds

Gmail Trigger → Miravig (Mask) → Basic LLM Chain → Edit Fields → Miravig (Unmask) → Gmail (Create a draft)
  1. Le Gmail Trigger lit l'e-mail.
  2. Mask remplace les données sensibles par des marqueurs.
  3. La Basic LLM Chain fait travailler le modèle sur le texte masqué.
  4. Edit Fields rétablit une information de contrôle que la chaîne efface.
  5. Unmask remet les vrais termes à la place des marqueurs.
  6. Gmail (Create a draft) écrit le brouillon.

Étape 1. Déclencher sur un e-mail

Le Gmail Trigger démarre le workflow à l'arrivée d'un message. Choisissez l'événement « Message Received ». n8n consulte alors la boîte à intervalle régulier, réglé par « Poll Times ». Par défaut, il prend les messages non lus, dix au plus par passage.[2] Pour vos essais, restreignez les messages concernés avec le filtre « Search » ou avec un libellé « test ». Le modèle ne recevra pas toute votre boîte.

Désactivez ensuite l'option « Simplify ». Activée, elle ne renvoie que les identifiants, les libellés et les en-têtes, sans le corps du message.[2][5] Désactivée, le texte brut de l'e-mail se trouve dans le champ text. Le champ html en porte la version HTML, et from et subject donnent l'expéditeur et l'objet. Le node Mask lit text par défaut, ce qui convient ici sans réglage.

Étape 2. Masquer avec Miravig

Ajoutez un node Miravig, choisissez l'opération Mask et branchez la credential « Miravig License ». Le champ « Text to Analyze » désigne le texte à examiner. Sa valeur par défaut est {{ $json.text }}, ce qui convient au Gmail Trigger réglé à l'étape 1.

Gardez les réglages suivants :

Dans « Business Glossary (JSON) », listez les termes à masquer, un objet par terme. Pour Claire Fontaine :

[{"term": "Claire Fontaine"}]

Le node renvoie le texte masqué dans miravigOutputText et un rapport dans miravig, avec les détections, leur catégorie et leur niveau de confiance. Le texte d'origine reste dans le champ text. Premier piège : tout ce qui suit doit lire miravigOutputText. Une expression qui viserait text enverrait le message en clair au modèle.

Étape 3. Demander au modèle

Ajoutez une Basic LLM Chain et reliez-lui le modèle de chat de votre fournisseur. Réglez « Prompt » sur « Define below » et placez le texte masqué entre deux balises :[3]

<email>{{ $json.miravigOutputText }}</email>

Les balises séparent la consigne du contenu. Un e-mail vient d'un tiers, qui peut y glisser des instructions à l'adresse du modèle. La séparation réduit ce risque sans l'éliminer (contrôle 12 de la liste de contrôle). Ajoutez ensuite dans « Chat Messages » un message de type « System » qui contient la consigne :

Vous recevez un e-mail client entre les balises email. Classez-le dans une
catégorie (facturation, livraison ou autre), résumez-le en une phrase, puis
rédigez un brouillon de réponse courte et polie. Les éléments entre crochets,
comme [TERME_G1], sont des marqueurs. Recopiez-les tels quels.

Étape 4. Rétablir l'empreinte

Mask calcule une empreinte du glossaire, une sorte de signature, et la place dans le champ miravig. Unmask la recontrôle pour vérifier que les deux glossaires sont identiques. Or la Basic LLM Chain ne garde que la réponse du modèle. Dans le cas standard, sans parseur de sortie, l'item qui en sort ne contient que le champ text.[6] L'empreinte disparaît donc en route.

Placez un nœud Edit Fields juste après la chaîne et créez un champ miravig avec cette expression :

{{ $('Miravig (Mask)').item.json.miravig }}

Le nom entre parenthèses doit être celui de votre node Mask. Sans ce nœud, Unmask prévient que l'empreinte manque et restaure les termes malgré tout, mais la comparaison des deux glossaires n'a plus lieu.

Étape 5. Remettre les vrais termes

Ajoutez un second node Miravig avec l'opération Unmask. « Text to Unmask » reçoit la réponse du modèle, soit {{ $json.text }} après la chaîne. Laissez « Unmask? » activé et « On Unmask Failure » sur « Stop Workflow (Recommended) ». Collez dans « Business Glossary (JSON) » exactement le même glossaire que dans Mask. Les deux nodes ne communiquent pas entre eux, par choix : votre glossaire reste sur votre instance.[1]

Le texte restauré sort dans le champ miravigUnmaskedText. La sortie du node sert aussi de contrôle. Dans la démonstration de Miravig, elle affiche applied: true, total: 1, resolved: 1 et un checksum au statut « match », ce qui confirme que les deux glossaires sont identiques. Le statut « mismatch » signale une différence. Il n'arrête pas le workflow : l'avertissement apparaît dans miravig.warning.

Sortie du node Unmask dans la démonstration de Miravig (exemple Sarah Mitchell, glossaire « Project Meridian ») : le texte restauré dans miravigUnmaskedText et un checksum au statut « match ». Les jetons [EMAIL_HIDDEN] et [IBAN_HIDDEN] restent en place, comme prévu.

Étape 6. Créer un brouillon, pas un envoi

Le dernier nœud est un Gmail avec la ressource « Draft » et l'opération « Create ». Renseignez « Subject » pour l'objet, « Email Type » sur « Text » et « Message » avec {{ $json.miravigUnmaskedText }}. L'option « To Email » désigne le destinataire, et « Thread ID » rattache le brouillon au fil d'origine.[4]

Un brouillon laisse une personne relire avant l'envoi. L'opération « Reply » du même nœud enverrait la réponse sans relecture.

Votre premier essai

Lancez le workflow sur l'e-mail de Claire Fontaine, puis contrôlez trois points :

  1. L'entrée de la chaîne contient [TERME_G1], [IBAN_HIDDEN] et [EMAIL_HIDDEN], et ni le nom, ni l'IBAN, ni l'adresse.
  2. La sortie d'Unmask affiche checksum au statut « match ».
  3. Le brouillon s'adresse à Claire Fontaine et ne contient ni l'IBAN ni l'adresse e-mail.

Les pièges à éviter

Une licence absente ou invalide. Sans licence active dans les deux nodes, le glossaire n'est pas appliqué. Dans l'essai ci-dessus, « Claire Fontaine » partirait en clair vers le modèle.

Un glossaire différent dans Mask et dans Unmask. Le statut du checksum le révèle sans bloquer l'exécution. Lisez-le pendant les essais.

Les noms de personnes ne sont pas tous repérés. Le node les cherche par heuristique. Un nom précédé d'un titre (M., Dr., Monsieur) est toujours masqué. Un nom de deux mots cité une seule fois ne l'est que si un mot comme « client », « avocat » ou « bailleur » se trouve à proximité. Dans la démonstration de Miravig, « Sarah Mitchell » reste lisible alors que l'adresse e-mail et l'IBAN sont masqués. Pour Claire Fontaine, une seule mention sans mot voisin, le glossaire est nécessaire.

Le texte d'origine voyage avec le texte masqué. Les exécutions n8n le conservent. Sur une instance auto-hébergée, l'historique est gardé 14 jours par défaut (contrôle 5 de la liste de contrôle). Essayez avec des données fictives.

Un brouillon envoyé sans relecture. Le modèle a pu suivre une consigne cachée dans le message reçu.

Ce qui reste ouvert

Une piste reste à explorer. Un tri de boîte réelle reçoit des expéditeurs que le glossaire ignore. D'après le code du node, le champ « Business Glossary » accepte le mode Expression et l'évalue pour chaque e-mail. On pourrait donc le construire à partir du nom de l'expéditeur, disponible dans le champ from du Gmail Trigger. Cette piste n'a pas été essayée sur une instance. Côté Unmask, les champs de l'e-mail ne figurent plus dans l'item après la chaîne, et l'expression devrait viser le Gmail Trigger.

Ce tutoriel ne couvre que Gmail. Enfin, un texte masqué avec un glossaire reste une donnée pseudonymisée, non anonymisée. L'article 9 détaille ce que cela implique.

Questions fréquentes

Faut-il un abonnement pour suivre ce tutoriel ?

Oui, pour le masquage automatique et le glossaire. La détection seule reste gratuite.[1]

Le workflow envoie-t-il les réponses tout seul ?

Non. Il crée un brouillon que vous relisez.

Pour aller plus loin

Sources

[1] Miravig, mode d'emploi du node n8n

[2] n8n, Gmail Trigger

[3] n8n, Basic LLM Chain

[4] n8n, Gmail, opérations Draft

[5] n8n, paquet n8n-nodes-base, code du Gmail Trigger et du nœud Gmail (version 2.15.1)

[6] n8n, paquet @n8n/n8n-nodes-langchain, code de la Basic LLM Chain (version 2.47.5)