> Pour un agent : la carte de la documentation d'Escouade Mail est sur https://escouade.io/mail/docs/llms.txt ; chaque page existe en Markdown, à la même adresse suffixée `.md`.

# Désinscription et blocages

> Chaque e-mail porte un lien de désinscription en un clic. Une personne qui se désinscrit, répond « STOP » ou signale un message ne reçoit plus rien de l'espace. Un agent ne peut pas lever ce blocage.

## Comment une personne se désinscrit

- **Par le lien en un clic.** Chaque message sortant porte les en-têtes `List-Unsubscribe` et `List-Unsubscribe-Post` (RFC 8058) : la messagerie du destinataire affiche son propre bouton de désinscription. Le lien est unique par message.
- **Par la page du lien.** Ouvrir le lien affiche une page qui demande confirmation. Un simple chargement de la page ne désinscrit pas : il faut le bouton, ou le clic de la messagerie.
- **Par une réponse.** « STOP », « désinscrivez-moi », « merci de me désabonner », « unsubscribe », « retirez-moi de votre liste », « je souhaite ne plus recevoir vos messages » : dans le texte nouveau d'une réponse, ces demandes valent désinscription. Le texte cité et les réponses automatiques ne comptent pas.
- **Seule une demande courte est reconnue** : une réponse de douze mots au plus, une fois la citation et la signature retirées. Un de ces mots au milieu d'une phrase plus longue n'est pas une demande pour le serveur. Si le correspondant demande l'arrêt dans un message plus long, c'est à l'agent de le bloquer, avec `add_suppression`.

Tant que le correspondant n'a pas écrit dans le fil, le serveur ajoute en pied du message une mention « Pour ne plus recevoir nos messages », suivie du lien. Pour placer le lien vous-même, écrivez `{{unsubscribe_url}}` dans le texte. Dès que le correspondant a écrit, c'est une conversation : plus de pied visible, le lien reste dans les en-têtes.

Le lien d'un envoi de test (`test`) ne désinscrit personne.

## Ce que fait une désinscription

- L'adresse entre dans la liste de blocage de l'espace : plus aucune boîte de l'espace ne lui écrit.
- Les messages qui attendaient de partir vers elle sont annulés.
- Le fil passe au statut `unsubscribed`.
- Tout nouvel envoi vers elle est refusé avec le code `recipient_suppressed`.

## La liste de blocage

| Raison | Origine | Portée | Se lève |
|---|---|---|---|
| `unsubscribe` | Lien en un clic, page de désinscription, réponse « STOP ». | L'espace | Par un administrateur d'Escouade Mail, à la demande écrite de la personne. |
| `complaint` | La personne a signalé un message comme indésirable. | L'espace | Par un administrateur d'Escouade Mail, à la demande écrite de la personne. |
| `hard_bounce` | Adresse morte : un rebond définitif. | Toute la plateforme, quand le serveur de messagerie refuse l'adresse à l'envoi. L'espace, quand c'est un avis de non-remise reçu par la boîte. | Elle reste bloquée. |
| `manual` | Ajout par `add_suppression`. | L'espace | Par `remove_suppression`, avec la permission `approve`. |

Une entrée bloque une adresse, ou un domaine entier.

## `add_suppression`

Ajoute une adresse ou un domaine à la liste de blocage de l'espace : plus rien ne leur sera envoyé, et ce qui attendait de partir vers eux est annulé. À appeler dès qu'un correspondant demande à ne plus être contacté. Permission : `send` ou `approve`.

| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
| `address` | texte | oui | Une adresse (`marie@exemple.com`) ou un domaine entier (`@exemple.com`). |
| `note` | texte | non | La raison, pour le journal. 300 caractères au plus. |

```text
Bloqué julien.roux@exemple.com : plus aucun envoi de l’espace. 1 message(s) en attente annulé(s). Ce blocage ne se lève pas avec cette clé : remove_suppression demande la permission approve, celle de votre humain.
```

Une messagerie publique ne se bloque pas en entier : un domaine comme `gmail.com` est refusé avec le code `public_mail_domain`. Bloquez les adresses une à une.

Un blocage ne se lève qu'avec la permission `approve` (`remove_suppression`). La clé rendue par `sign_up` ne la porte pas : un agent qui bloque une adresse par erreur ne revient pas dessus seul. La réponse le lui dit. Son humain le lève depuis son assistant, branché à `https://mail.escouade.io/mcp`.

## `remove_suppression`

Retire de la liste une entrée ajoutée à la main. Permission : `approve`.

| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
| `address` | texte | oui | L'adresse ou le domaine (`@exemple.com`) à débloquer. |

Une désinscription, une plainte ou une adresse morte ne se lèvent pas par cet outil : l'appel est refusé avec le code `suppression_protected`.

## `list_suppressions`

Liste les adresses et les domaines bloqués pour l'espace, les plus récents d'abord. Permission : `read`.

| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
| `query` | texte | non | Une partie d'adresse ou de domaine. Avec une adresse complète, la réponse dit aussi si elle est une adresse morte commune à la plateforme. |
| `cursor` | texte | non | Le curseur de la page suivante : la valeur `next_cursor` de l'appel précédent. |
| `limit` | entier | non | Le nombre d'éléments rendus, de 1 à 100. 20 par défaut. |

Chaque entrée porte `value`, `kind` (`address` ou `domain`), `reason`, `scope` (`tenant` pour l'espace, `global` pour la plateforme), `source` et `created_at`. `source` dit d'où vient l'entrée : qui l'a ajoutée et sa note, ou la voie de la désinscription. Il vaut `null` pour une adresse morte commune à la plateforme. Dans le texte lisible, chaque ligne donne la raison, la source et la date.

Dans un assistant qui affiche les vues MCP Apps, `list_suppressions` s'accompagne d'une vue : qui ne reçoit plus rien, pourquoi, depuis quand. Voir [Vues](https://escouade.io/mail/docs/vues.md).

## Pour un agent

- Un refus `recipient_suppressed` ne se contourne pas : n'écrivez plus à cette adresse, depuis aucune boîte.
- Un correspondant qui demande, même poliment, à ne plus être contacté se bloque avec `add_suppression`.
- Dans un fil `unsubscribed`, tout envoi est refusé. Un fil `bounced` signale une adresse en échec.
