Démarrage rapide

De rien à un message relu par HTTP, en quatre commandes. Sans compte, sans clé, sans SDK.

1. Choisir une adresse

N'importe quel nom, sur l'un de nos domaines publics. Il n'y a rien à appeler ni à enregistrer — l'adresse devient réelle dès qu'un message y est livré.

Gardez-la impossible à deviner si vous préférez que personne ne s'y aventure : sur un domaine public, l'adresse est la seule chose qui sépare la boîte du reste du monde.

shell
$ ADDR="ci-$(openssl rand -hex 4)@grabmail.io"; echo "$ADDR"

2. Lui envoyer quelque chose

Utilisez-la dans le formulaire d'inscription, le flux de réinitialisation de mot de passe, ou ce que vous testez. La livraison prend normalement quelques secondes.

Nos serveurs de messagerie acceptent les messages jusqu'à 5 MB. Tout ce qui dépasse est refusé au moment du SMTP, pour que l'expéditeur soit prévenu immédiatement plutôt que laissé dans l'incertitude.

shell
$ curl -sX POST https://your-app.example/signup --data-urlencode "email=$ADDR"

3. Interroger la boîte

Une requête par seconde est le rythme prévu et n'est jamais limité. Une boîte vide répond 200 avec count: 0 — jamais 404, donc votre boucle n'a pas besoin de traiter ce cas à part.

Cet extrait abandonne au bout d'une minute plutôt que de tourner indéfiniment, ce qu'on veut en CI.

interroger jusqu'à son arrivée
$ for i in $(seq 60); do
  ID=$(curl -sG https://grabmail.io/api/v1/mailbox --data-urlencode "address=$ADDR" | jq -r '.messages[0].id // empty')
  [ -n "$ID" ] && break
  sleep 1
done; echo "$ID"

4. Le lire, puis le jeter

Récupérez le message et extrayez-en ce que vous êtes venu chercher — ici, un code à six chiffres dans la partie texte brut.

La suppression est facultative : tout disparaît de soi-même après 5 jours. Faites-le quand même en CI, et la prochaine exécution part d'une boîte propre.

lire et supprimer
$ curl -sG https://grabmail.io/api/v1/message/$ID --data-urlencode "mailbox=$ADDR" \
  | jq -r .text | grep -oE '[0-9]{6}'

curl -sX DELETE -G https://grabmail.io/api/v1/message/$ID --data-urlencode "mailbox=$ADDR"

L'intégrer dans la CI

Deux habitudes évitent qu'une suite lisant du vrai courrier ne devienne instable :

Une adresse neuve à chaque exécution
Dérivez-la de l'identifiant de build ou d'un suffixe aléatoire. Réutiliser la même adresse d'une exécution à l'autre permet au message d'hier de valider l'assertion d'aujourd'hui.
Une échéance, pas un nombre de tentatives
Interrogez avec un délai d'expiration en temps réel comme ci-dessus. Le nombre de tentatives augmente silencieusement si votre expéditeur ralentit.
Ne vous fiez jamais au délai de livraison
Le courrier n'est pas synchrone. Vérifiez que le message arrive, pas qu'il arrive à une seconde précise.
Utilisez votre propre domaine pour un usage réel
Une boîte de messagerie publique peut être lue par quiconque devine l'adresse. C'est acceptable pour une inscription jetable, mais pas pour un environnement de préproduction contenant des données clients. Un enregistrement MX suffit à corriger cela.

Pour les agents IA : MCP

Un agent ne peut pas lire cette page, décider du point d'accès qu'il veut et rédiger une requête. Il demande à un serveur quels outils existent et les appelle. grabmail exploite un serveur Model Context Protocol exactement pour cela, à https://grabmail.io/mcp — ni clé, ni compte.

Pointez n'importe quel client MCP vers le point d'accès. Claude Desktop, Cursor, Continue et l'Agents SDK d'OpenAI lisent tous cette forme.

Six outils : create_inbox, list_domains, list_messages, read_message, delete_message et wait_for_message.

mcp.json
$ {"mcpServers":{"grabmail":{"url":"https://grabmail.io/mcp"}}}

wait_for_message est celui qui compte. Si un agent veut une boîte jetable, c'est presque toujours à cause d'un code de confirmation qui le sépare de l'étape suivante. Plutôt que de boucler en consommant des jetons, il demande une adresse, soumet le formulaire, puis attend que le courrier arrive :

Attend jusqu'à 25 secondes et renvoie le message complet — expéditeur, objet, corps — ou signale un délai dépassé pour que l'agent puisse simplement rappeler.

Il peut aussi attendre un message particulier : passez subject_contains ou from_contains et tout ce qui arrive d'autre est ignoré.

MCP · wait_for_message
$ curl -sX POST https://grabmail.io/mcp -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"wait_for_message","arguments":{"address":"you@grabmail.io","subject_contains":"code"}}}'

Il existe aussi une spécification OpenAPI 3.1 (YAML) pour les générateurs de code, et llms.txt pour ce qui préfère lire du texte brut.

Suivant

Référence API

Chaque paramètre, chaque code de statut, la forme des erreurs.

Ouvrir la référence →

Limites

Ce qui est plafonné, ce qui ne l'est pas, et ce qui se passe au plafond.

Ouvrir les limites →

Votre propre domaine

Rendez chaque boîte de votre domaine privée, rien que pour vous.

Voir la configuration →