> ## Documentation Index
> Fetch the complete documentation index at: https://docs.oximail.ch/llms.txt
> Use this file to discover all available pages before exploring further.

# Politique de pièces jointes

> Ce que la box vérifie dans les pièces jointes du courrier entrant et sortant avant de répondre 250 : les exécutables d'après leurs octets, une liste d'extensions, les macros, le contenu des archives et des conteneurs Office. Modes observe et enforce, règle par règle ; ce qu'elle ne vérifie pas.

Avant de répondre `250` à un message, la box lit chaque pièce jointe et applique une politique sur les types de fichiers (ADR-155). C'est une politique, pas un antivirus : aucun moteur de signatures, aucune base d'empreintes, et le jugement n'ouvre aucune connexion.

La page publique [/postmaster?p=AttachmentPolicy](https://oximail.ch/postmaster?p=AttachmentPolicy) est ce que lit un expéditeur dont le message a été refusé.

## Où elle s'applique

| Porte | Ce qui se passe |
| - | - |
| Port 25, MX de secours, soumission (587/465) | Le message est refusé par `550 5.7.1 attachment policy: <règle> [<nom>] queue=<id>` quand une règle en `enforce` s'applique. Rien n'est stocké et cette box ne génère aucun rebond. |
| Téléversement (`/jmap/upload`, `/jmap/upload-tenant`) | Les octets sont jugés une fois, sans nom, et le verdict est gardé avec le blob. Un téléversement n'est jamais refusé. |
| Envoi depuis un client JMAP (`Email/set` create) | Les pièces jointes sont jugées sur leurs octets et leurs noms. Un refus est une erreur `invalidProperties` : `invalid arguments: attachments: attachment policy: <règle> [<nom>]`. |
| Message de chat (création et modification) | Les noms sont jugés avec le verdict gardé au téléversement. |
| `Email/import`, `APPEND` IMAP | Le message appartient déjà à l'utilisateur : une ligne de journal et le compteur, jamais un refus. |
| Le Drive | Ne refuse rien, puisqu'il est monté comme lecteur réseau. Un fichier dont les octets sont un exécutable est enregistré et servi en `application/octet-stream`, quel que soit son nom. |

## Les règles

| Règle | Ce qui la déclenche |
| - | - |
| `executable-type` | Les octets sont un exécutable ou une image disque, quel que soit le nom du fichier (PE, ELF, Mach-O, raccourcis, CHM, CAB, installeurs Windows, ISO/UDF, VHD/VHDX/DMG/VMDK, OneNote, paquets d'applications). Ce plancher n'est pas une liste et ne se retire pas. |
| `listed-extension` | Un nom que déclare la partie se termine par une extension de la liste. |
| `double-extension` | Une extension de la liste se cache dans un nom : `facture.pdf.exe`. |
| `macro` | Un document Office déclare des macros : un projet VBA dans un paquet OOXML, un stockage VBA dans un `.doc` ou un `.xls`. |
| `archive-content` | Un fichier contenu dans un conteneur tombe sous les règles ci-dessus : zip (lu par son répertoire central, rien n'est décompressé), tar, gzip, un objet empaqueté dans un document Office, une pièce jointe d'un `.msg` Outlook, une pièce jointe d'un `winmail.dat`. |
| `encrypted-archive` | Une archive est protégée par mot de passe. |
| `name-changed` | Un nom changerait à l'enregistrement sous Windows (NUL, caractère de contrôle ou de direction, chemin, points ou espaces en fin). |
| `not-inspectable` | Une archive que la box ne sait pas ouvrir (7z, RAR), une archive dans une archive, une archive en plusieurs volumes, un conteneur dont la structure est cassée. |
| `budget`, `depth`, `mime-unverifiable` | La structure n'a pas pu être lue dans les bornes : 512 parties par message, 10 000 entrées d'archive par message, un répertoire zip de 1 Mio, un `[Content_Types].xml` de 64 Kio. |

Chaque nom que déclare une partie est jugé, pas seulement celui qu'affiche un client de messagerie.

## Configuration

```toml theme={null}
[attachment_policy]
mode = "observe"                  # off | observe | enforce, pour toutes les règles
refuse_encrypted_archives = true  # false coupe la règle encrypted-archive
extensions_add = []               # extensions ajoutées à la liste (minuscules, sans point)
extensions_remove = []            # extensions retirées de la liste, par exemple "7z"

[attachment_policy.rules]         # un mode par règle, par son nom
executable-type = "enforce"
```

Une nouvelle box démarre en **`observe`** : un message qu'une règle refuserait est livré, et une ligne de journal plus le compteur `oximail_attachment_verdicts_total{reason, door, action="would_refuse"}` l'enregistrent. Armez les règles une à une quand les compteurs montrent ce qu'elles touchent : les exécutables d'abord, les archives et les macros ensuite, les conteneurs illisibles et les anomalies MIME en dernier. Un nom de règle inconnu ou une entrée de liste non canonique refuse le démarrage.

Un locataire peut surcharger `attachment_policy.mode` et `attachment_policy.refuse_encrypted_archives` avec `oximail config set-override`. Un message adressé à plusieurs locataires suit le plus strict d'entre eux. Il n'y a pas d'exception par expéditeur.

## Vérifier

* `oximail doctor` (contrôle `attachment_policy`) donne le mode, les modes par règle, la version de la liste et son SHA-256, et les surcharges de locataire. Un MX de secours doit porter la même liste que son primaire : comparez les deux SHA-256.
* `oximail attachment check --file <chemin> [--name <nom>]` ou `--eml <chemin>` reproduit le verdict de la box sur un fichier ou sur un message qu'un expéditeur a transféré, sans serveur et sans réseau. Code de sortie 0 : rien trouvé ; 2 : quelque chose que la politique refuse (`--json` dit si la box l'applique ou l'observe seulement) ; 3 : l'entrée n'a pas pu être lue.

## Ce qu'elle ne vérifie pas

* Le logiciel malveillant en tant que tel : un document qui porte un exploit sans macro, et tout ce qui porte un lien ou un code QR (PDF, HTML, SVG, documents Office).
* Le courrier chiffré de bout en bout (S/MIME, OpenPGP), livré sans vérification.
* Un second niveau d'archive, et le contenu d'un 7z : les deux sont `not-inspectable`.

Les postes de travail gardent leur propre protection. La trace d'un refus contient le SHA-256, la taille et le type de la partie, jamais son contenu ni le nom brut.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.