← RFC Reference

RFC 8620 : JMAP — Protocole d'application méta JSON

Voie de normalisation Protocoles d'accès aux courriels Published March 2026
ELI5: IMAP a été conçu dans les années 1990 quand les clients communiquaient avec les serveurs via des sockets TCP bruts avec un protocole texte personnalisé. JMAP est la même idée — accéder à votre boîte aux lettres, gérer les dossiers, synchroniser les modifications — mais en utilisant les outils que chaque développeur connaît déjà : JSON sur HTTPS. C'est une API de type REST pour le courrier électronique. Pas de gestion de socket, pas d'analyse de réponses texte bizarre, pas de négociation d'extension. Juste POST une requête JSON, obtenez une réponse JSON.

Pourquoi cela existe

IMAP fonctionne, mais il porte des décennies de complexité :

JMAP résout tous ces problèmes. Il est sans état (chaque requête est autonome), utilise HTTPS (fonctionne à travers tous les serveurs proxy et pare-feu), utilise JSON (chaque langage a un analyseur), et définit les notifications push comme une fonctionnalité de première classe via EventSource ou Web Push.

Comment cela fonctionne

Découverte de service

Un client découvre le point de terminaison JMAP via un URI bien connu :

GET https://example.com/.well-known/jmap
{
  "capabilities": {
    "urn:ietf:params:jmap:core": { ... },
    "urn:ietf:params:jmap:mail": { ... }
  },
  "apiUrl": "https://jmap.example.com/api/",
  "uploadUrl": "https://jmap.example.com/upload/{accountId}/",
  "downloadUrl": "https://jmap.example.com/download/{accountId}/{blobId}/{name}",
  "eventSourceUrl": "https://jmap.example.com/events/"
}

Effectuer des appels API

Toutes les opérations JMAP sont envoyées en tant que POST unique à l'URL de l'API. Le corps de la requête contient un tableau d'appels de méthode, et la réponse contient les résultats correspondants :

POST https://jmap.example.com/api/
{
  "using": ["urn:ietf:params:jmap:core", "urn:ietf:params:jmap:mail"],
  "methodCalls": [
    ["Mailbox/get", { "accountId": "u1234", "ids": null }, "a"]
  ]
}

{
  "methodResponses": [
    ["Mailbox/get", {
      "accountId": "u1234",
      "state": "m42",
      "list": [
        { "id": "mb1", "name": "Inbox", "totalEmails": 142 },
        { "id": "mb2", "name": "Sent", "totalEmails": 87 },
        { "id": "mb3", "name": "Archive", "totalEmails": 4210 }
      ]
    }, "a"]
  ]
}

Traitement par lots et références arrière

Plusieurs appels de méthode peuvent être traités par lots dans une seule requête. Les références arrière permettent à un appel d'utiliser les résultats d'un appel précédent :

"methodCalls": [
  ["Email/query", {
    "accountId": "u1234",
    "filter": { "inMailbox": "mb1", "after": "2025-03-01T00:00:00Z" },
    "sort": [{ "property": "receivedAt", "isAscending": false }],
    "limit": 10
  }, "q"],
  ["Email/get", {
    "accountId": "u1234",
    "#ids": { "resultOf": "q", "name": "Email/query", "path": "/ids" },
    "properties": ["from", "subject", "receivedAt", "preview"]
  }, "g"]
]

Cela recherche la boîte de réception et récupère les 10 premiers résultats en un seul aller-retour HTTP — quelque chose qui nécessiterait plusieurs commandes IMAP.

Détails techniques clés

Chaînes d'état et synchronisation

Chaque réponse JMAP /get inclut une chaîne state. Pour synchroniser les modifications, le client appelle /changes avec le dernier état connu :

["Email/changes", { "accountId": "u1234", "sinceState": "e789" }, "c"]

["Email/changes", {
  "oldState": "e789",
  "newState": "e801",
  "created": ["em500", "em501"],
  "updated": ["em480"],
  "destroyed": ["em312"]
}, "c"]

Le client récupère ensuite uniquement les éléments créés/mis à jour. Ceci est plus efficace que CONDSTORE IMAP car il fonctionne sur toutes les boîtes aux lettres simultanément et ne nécessite pas une connexion persistante.

Notifications push

JMAP définit deux mécanismes push :

Le modèle Foo/get, Foo/set, Foo/query

JMAP utilise un modèle de méthode uniforme pour chaque type de données :

Méthode Objectif
Foo/get Récupérer des objets par ID
Foo/changes Obtenir les ID des objets modifiés depuis un état
Foo/set Créer, mettre à jour ou détruire des objets
Foo/query Rechercher/filtrer et trier, renvoyant les ID correspondants
Foo/queryChanges Mises à jour incrémentielles d'un résultat de requête précédent

Pour le courrier électronique, Foo est Email, Mailbox, Thread, EmailSubmission, etc. Cette cohérence signifie qu'une fois que vous comprenez un type de données, vous les comprenez tous.

Erreurs courantes

Impact sur la délivrabilité

Related RFCs