Boîtes jetables
Une adresse fonctionnelle pour qui n'en a pas : sans compte, sans clé, et disparue le jour même.
Ce qu'est une boîte jetable
Un appelant demande une adresse sur un domaine que cette installation possède, la surveille quelques minutes, lit ce qui arrive et l'abandonne. Elle existe pour le code de confirmation, pour la question « qu'est-ce que ce formulaire envoie réellement » et pour l'inscription que vous ne voulez pas rattacher à l'adresse que vous utiliserez encore dans cinq ans.
- Elle reçoit, et rien d'autre. Il n'y a pas d'envoi : une boîte de réception n'a pas d'identité pour envoyer, et aucun de ces neuf appels ne met un message sur le réseau.
- Le bail est de 60 minutes par défaut et peut être poussé à 24 heures, une heure à la fois.
- Elle contient 50 messages, comptés à l'arrivée. Le courrier atteignant une boîte pleine est rejeté plutôt que mis en file, et en supprimer un ne libère pas de place pour un autre.
- À la fin du bail, le courrier est SUPPRIMÉ, ni masqué ni archivé. La ligne lui survit d'une semaine afin que l'adresse ne puisse pas être réattribuée pendant qu'un expéditeur lent y réessaie encore.
- Rien de tout cela ne touche une boîte aux lettres. Un message jetable vit dans sa propre table, et aucune requête de ce chemin ne peut en atteindre une vraie.
Ce sont les mêmes appels que ceux que fait l'outil gratuit de ce site : tout ce que la page peut faire, votre code le peut. L'API est là pour le cas où la page ne l'est pas : une suite de tests qui veut une adresse neuve à chaque exécution.
L'adresse n'est pas l'identifiant
Une adresse jetable est saisie dans un formulaire d'inscription à l'instant même où elle est émise. De là elle voyage dans un en-tête To:, à travers les journaux de l'expéditeur, jusque dans le CRM qui se trouve à l'autre bout. Si connaître l'adresse suffisait à lire le courrier, l'outil divulguerait par conception chaque boîte qu'il émet, et précisément à la partie que l'appelant tenait à distance.
La création d'une boîte renvoie donc une seconde valeur : un token, 32 octets aléatoires sous la forme oe_inbox_ suivi de 43 caractères base64url. Il apparaît sur cette réponse-là et sur aucune autre. La ligne ne conserve qu'un hachage à clé, si bien que rien ne le récupère, ni une demande d'assistance ni un dump de base de données. Perdez le token et vous avez perdu la boîte, ce qui est le bon résultat pour un identifiant qui lit le courrier de quelqu'un.
# 1. Mint one. This is the only response that carries a token.curl -s -X POST "$OE/temp-mail/inboxes" -H "Content-Type: application/json" -d '{}' # 2. Keep it, and read with it.export INBOX="Authorization: Bearer oe_inbox_kQ8v…"curl -s "$OE/temp-mail/inboxes/tinb_9c2f…/messages" -H "$INBOX"Envoyez une clé API oe_live_ ou oe_test_ à l'une de ces routes et elle est refusée avec invalid_credential_type plutôt qu'avec un 401 sec. Deux types d'identifiants partagent ici un même hôte et un même en-tête, et « non autorisé » vous laisserait deviner lequel des vôtres était erroné.
Le bail, et sa prolongation
Une heure, plutôt que les dix minutes qui donnent son nom au genre. Dix suffisent pour un code de confirmation et pas pour l'autre moitié des usages : un essai qui vous réécrit le lendemain matin, un formulaire rempli deux fois parce que la première tentative a expiré. ttlMinutes à la création demande autre chose, de 1 à 1440 ; un nombre en dehors est refusé par un 422 plutôt qu'ajusté en silence, parce qu'une expiration que vous n'avez pas demandée est une expiration autour de laquelle vous vous êtes déjà organisé.
POST /temp-mail/inboxes/{id}/extend ajoute une heure à l'expiration, pas à maintenant : prolonger tôt ne gaspille donc pas le temps qu'il vous reste. Cela fonctionne 23 fois, et la journée comptée depuis la création de la boîte est le plus dur des deux plafonds : un bail qui l'atteint déjà n'a plus rien à acheter, si peu de prolongations qu'il ait dépensées. extensionsLeft, sur chaque réponse de boîte, compte les deux, de sorte qu'un client peut griser le bouton ; à zéro, l'appel répond 409 extension_limit.
Une boîte expirée cesse d'authentifier à l'instant où elle expire : son token répond 404 sans attendre le balayage. C'est le balayage qui supprime le courrier, et il s'exécute sur le cron horaire ; DELETE /temp-mail/inboxes/{id} est la même suppression à la demande.
Les plafonds
Tous ces plafonds sont des lignes comptées et non un limiteur de débit. Il n'y a aucun limiteur à invoquer dans cette base de code, et le dire est plus utile que de laisser croire à une défense inexistante. Ils sont placés là où seraient les dégâts : la création de boîtes, et le stockage.
| Plafond | Valeur | Ce qui se passe une fois atteint |
|---|---|---|
| Bail | 60 minutes, prolongeable jusqu'à 24 heures | 409 conflict_error / extension_limit |
| Messages par boîte | 50 | Le courrier supplémentaire est rejeté dès la porte. Aucun rebond n'est écrit, rien n'est mis en file, et supprimer un message ne rend pas la place. |
| Boîtes créées | 6 par heure, 30 par jour, par appelant | 429 rate_limit_error / too_many_inboxes |
| Corps stocké | 2 Mo | truncated: true sur le message ; le reste est perdu. |
| Octets de pièce jointe | 8 Mo chacune | content est null et les métadonnées sont conservées, ce qui n'est pas la même chose qu'un fichier vide. |
Le plafond de création compte sur un hachage à clé de l'IP du client, et une boîte détruite compte toujours : en jeter une n'est donc pas un moyen d'en obtenir une autre. Derrière le proxy de quelqu'un d'autre, l'en-tête transféré peut être falsifié, ce qui est une faiblesse connue du plafond et non un trou dans l'identifiant : rien ici n'autorise sur cette valeur.
Ce qui n'est pas là
Pas encore disponibleLe découvrir en essayant est pire que se l'entendre dire :
- Aucun envoi, sous aucune forme. Une boîte jetable n'a pas de connexion pour envoyer, et en ajouter une ferait d'un endpoint anonyme et non authentifié un relais ouvert.
- Pas de renommage. Changer d'adresse signifie créer une seconde boîte : renommer sur place libérerait l'ancienne partie locale à l'instant du clic, et une confirmation déjà en route serait alors livrée à qui l'aurait reçue ensuite.
- Ni règles, ni filtres, ni transfert, ni webhooks, ni IA.
spamest un drapeau sur le message et rien n'a agi dessus. Rien n'a été classé, et rien ici n'est résumé ni transformé en embeddings. - Pas de rebonds. Le courrier adressé à un domaine du pool qui ne nomme ni une boîte jetable active ni une adresse créée par l'opérateur est rejeté en silence, volontairement : un générateur d'adresses public attire les attaques par dictionnaire, et écrire un rapport de livraison vers le chemin de retour que l'attaque prétend ferait de l'installation une source de backscatter.
- Pas de domaine configuré, pas de service. Lorsque
TEMP_MAIL_DOMAINSest vide,GET /temp-mail/domainsrépond par une liste vide et la création d'une boîte répond 503temp_mail_unavailable. La livraison entrante vers un domaine du pool n'a pas été observée de bout en bout sur un domaine réel.
Configurer un domaine, si vous administrez l'installation
La liste est de la configuration : ce que nomme TEMP_MAIL_DOMAINS est ce qui est distribué. Rien n'automatise le DNS, si bien que quatre de ces cinq étapes se passent chez un humain devant un registrar.
- Enregistrez un domaine pour cela. Prenez-en un que vous acceptez de laisser distribuer à des inconnus. Chaque adresse dessus partage sa réputation, ce qui explique aussi que le sélecteur répartisse les nouvelles boîtes au hasard dans le pool au lieu de remplir le premier domaine.
- Ajoutez-le dans l'application sous Réglages → Domaines. Cela crée l'identité d'envoi et affiche les enregistrements DNS à publier.
- Publiez les enregistrements MX, SPF, DKIM et le TXT
_openemail-challengechez le registrar. La vérification lit le DNS en direct et est recontrôlée par le cron ; seul un domaine vérifié est proposé. - Ajoutez le domaine vérifié à
TEMP_MAIL_DOMAINSsur le serveur, séparés par des virgules. Tant qu'il n'y figure pas, c'est un domaine ordinaire de l'espace de travail. - Laissez le catch-all ACTIVÉ. C'est lui qui fait exister une adresse jetable sans la créer, parce que le courrier destiné à n'importe quelle partie locale est accepté et relu avant la recherche ordinaire du destinataire, si bien qu'aucune ligne d'adresse n'est jamais écrite pour un domaine du pool ; laisser le catch-all activé commencerait à classer du courrier jetable dans une vraie boîte.
Les parties locales réservées (postmaster, abuse, security et le reste de RFC 2142) ne peuvent jamais être jetables et retombent sur la boîte ordinaire. Un domaine du pool qui engloutit ses propres signalements d'abus est un domaine qui cesse de pouvoir délivrer où que ce soit. Une adresse que vous créez vous-même sur un domaine du pool, comme legal@ ou privacy@, se comporte de la même façon : le courrier qui lui est destiné arrive dans votre boîte, et personne ne peut se la voir attribuer comme adresse jetable.