Wegwerpinboxen
Een werkend adres voor wie er geen heeft: geen account, geen key, en dezelfde dag weer weg.
Wat een wegwerpinbox is
Een aanroeper vraagt om een adres op een domein dat deze installatie bezit, houdt het een paar minuten in de gaten, leest wat er binnenkomt en laat het vervolgens vallen. Het bestaat voor de bevestigingscode, voor de vraag "wat verstuurt dit formulier eigenlijk", en voor de aanmelding die je niet wilt koppelen aan het adres dat je over vijf jaar nog gebruikt.
- Hij ontvangt en verder niets. Er is geen verzending: een inbox heeft geen identiteit om onder te versturen, en geen van deze negen aanroepen zet een bericht op de lijn.
- De huur is standaard 60 minuten en kan tot 24 uur worden opgerekt, telkens met een uur.
- Hij houdt 50 berichten, geteld bij binnenkomst. Mail die een volle inbox bereikt wordt weggegooid en niet in de wachtrij gezet, en er een verwijderen levert geen ruimte op voor een volgende.
- Aan het eind van de huur wordt de mail VERWIJDERD, niet verborgen en niet gearchiveerd. De rij blijft er een week langer, zodat het adres niet opnieuw uitgegeven kan worden terwijl een trage afzender er nog naartoe aan het herproberen is.
- Niets ervan raakt een mailbox. Een wegwerpbericht leeft in zijn eigen tabel, en geen enkele query op dit pad kan een echte mailbox bereiken.
Dit zijn dezelfde aanroepen die de gratis tool op deze site doet, dus alles wat de pagina kan, kan jouw code ook. De API is er voor het geval waarin de pagina dat niet is: een testsuite die per run een vers adres wil.
Het adres is niet het credential
Een wegwerpadres wordt in een aanmeldformulier getypt op het moment dat het wordt uitgegeven. Van daaruit reist het mee in een To:-header, door de logs van de afzender, en naar welk CRM er ook aan de andere kant staat. Als het adres kennen genoeg was om de mail te lezen, zou de tool per ontwerp elke inbox lekken die hij uitgaf, en precies aan de partij die de aanroeper op afstand hield.
Daarom geeft het aanmaken van een inbox een tweede waarde terug: een token, 32 willekeurige bytes als oe_inbox_ plus 43 base64url-tekens. Het verschijnt in dat ene antwoord en in geen enkel ander. De rij bewaart er alleen een keyed hash van, dus niets haalt het terug, geen supportverzoek en geen databasedump. Raak je het token kwijt, dan ben je de inbox kwijt, en dat is de juiste uitkomst voor een credential dat iemands mail leest.
# 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"Stuur je een API key met oe_live_ of oe_test_ naar een van deze routes, dan wordt hij geweigerd als invalid_credential_type en niet met een kale 401. Twee soorten credentials delen hier één host en één header, en "niet geautoriseerd" zou je laten raden welke van de jouwe verkeerd was.
De huur, en hem verlengen
Een uur, en niet de tien minuten waar het genre naar vernoemd is. Tien is genoeg voor een bevestigingscode en niet genoeg voor de andere helft waarvoor deze inboxen gebruikt worden: een proefperiode die je de volgende ochtend opnieuw mailt, een formulier dat twee keer is ingevuld omdat de eerste poging verliep. ttlMinutes bij het aanmaken vraagt om iets anders, van 1 tot 1440; een getal daarbuiten wordt met een 422 geweigerd in plaats van stilletjes bijgesteld, want een vervaltijd waar je niet om gevraagd hebt, is er een waar je je planning al op gebaseerd hebt.
POST /temp-mail/inboxes/{id}/extend telt een uur op bij de vervaltijd en niet bij nu, dus vroeg verlengen verspilt de tijd die je nog hebt niet. Het werkt 23 keer, en de dag vanaf het moment waarop de inbox is aangemaakt is van de twee plafonds het hardste: een huur die daar al tot loopt heeft niets meer bij te kopen, hoe weinig verlengingen er ook besteed zijn. extensionsLeft in elk inboxantwoord telt ze allebei mee, zodat een client de knop kan uitgrijzen; bij nul antwoordt de aanroep 409 extension_limit.
Een verlopen inbox stopt met authenticeren op het moment dat hij verloopt: zijn token antwoordt 404 zonder op de opruimronde te wachten. De opruimronde is wat de mail verwijdert en draait op de uurlijkse cron; DELETE /temp-mail/inboxes/{id} is diezelfde verwijdering op aanvraag.
De plafonds
Dit zijn allemaal getelde rijen en geen rate limiter. Er is in deze codebase geen limiter om naar te grijpen, en dat zeggen is nuttiger dan een verdediging suggereren die er niet is. Ze staan daar waar de schade zou zitten: bij het uitgeven en bij de opslag.
| Plafond | Waarde | Wat er gebeurt als je het raakt |
|---|---|---|
| Huur | 60 minuten, verlengbaar tot 24 uur | 409 conflict_error / extension_limit |
| Berichten per inbox | 50 | Verdere mail wordt aan de deur weggegooid. Er wordt geen bounce geschreven, er komt niets in de wachtrij, en een bericht verwijderen geeft de plek niet terug. |
| Uitgegeven inboxen | 6 per uur, 30 per dag, per aanroeper | 429 rate_limit_error / too_many_inboxes |
| Opgeslagen body | 2 MB | truncated: true op het bericht; de rest ervan is weg. |
| Bijlagebytes | 8 MB per stuk | content is null en de metadata blijft bewaard, wat niet hetzelfde is als een leeg bestand. |
Het uitgifteplafond telt tegen een keyed hash van het client-IP, en een vernietigde inbox telt nog steeds mee, dus er een weggooien is geen manier om er een bij te kopen. Achter andermans proxy kan de doorgestuurde header vervalst worden, wat een bekende zwakte van het plafond is en geen gat in het credential: niets hier autoriseert op die waarde.
Wat hier niet is
Nog niet uitgebrachtErachter komen door het te proberen is erger dan het te horen krijgen:
- Geen verzending, in welke vorm dan ook. Een wegwerpinbox heeft geen connectie om onder te versturen, en er een toevoegen zou van een anoniem, niet-geauthenticeerd endpoint een open relay maken.
- Geen hernoeming. Je adres wijzigen betekent een tweede inbox aanmaken: ter plekke hernoemen zou het oude local-part vrijgeven op het moment dat erop geklikt werd, en een bevestiging die al onderweg was, zou dan afgeleverd worden bij wie het daarna kreeg toegewezen.
- Geen regels, filters, doorsturen, webhooks of AI.
spamis een vlag op het bericht en er is niets mee gedaan. Er is niets opgeborgen, en niets hier wordt samengevat of geëmbed. - Geen bounces. Mail naar een gepoold domein die noch een levende wegwerpinbox noch een door de beheerder aangemaakt adres noemt, wordt stilzwijgend weggegooid, en dat met opzet: een openbare adresgenerator trekt woordenboekaanvallen aan, en een afleverrapport schrijven naar welk retourpad de aanval ook claimt, zou van de installatie een backscatterbron maken.
- Geen geconfigureerd domein betekent geen dienst. Als
TEMP_MAIL_DOMAINSleeg is, antwoordtGET /temp-mail/domainsmet een lege lijst en antwoordt het aanmaken van een inbox 503temp_mail_unavailable. Inkomende aflevering op een gepoold domein is nog niet end-to-end waargenomen op een live domein.
Een domein configureren, als jij de installatie beheert
De lijst is configuratie: wat TEMP_MAIL_DOMAINS ook noemt, dat is wat er wordt uitgedeeld. Niets automatiseert de DNS, dus vier van deze vijf stappen zijn een mens bij een registrar.
- Registreer er een domein voor. Gebruik er een dat je vreemden zonder bezwaar laat uitdelen. Elk adres erop deelt zijn reputatie, en daarom verdeelt de kiezer nieuwe inboxen ook willekeurig over de pool in plaats van eerst het eerste domein vol te maken.
- Voeg het in de app toe onder Instellingen → Domeinen. Dat maakt de verzendidentiteit aan en toont de DNS-records die je moet publiceren.
- Publiceer de MX-, SPF-, DKIM- en
_openemail-challenge-TXT-records bij de registrar. De verificatie leest live DNS en wordt door de cron opnieuw gecontroleerd; alleen een geverifieerd domein wordt ooit aangeboden. - Voeg het geverifieerde domein op de server toe aan
TEMP_MAIL_DOMAINS, komma-gescheiden. Zolang het er niet in staat, is het een gewoon domein op de workspace. - Laat catch-all AAN. Dat is wat een wegwerpadres laat bestaan zonder het aan te maken, want mail naar elk willekeurig local part wordt geaccepteerd en teruggelezen vóór de gewone ontvangerlookup, zodat er voor een gepoold domein nooit een adresrij wordt weggeschreven; catch-all aan laten staan zou wegwerpmail in een echte mailbox gaan opbergen.
Gereserveerde local-parts (postmaster, abuse, security en de rest van RFC 2142) kunnen nooit wegwerpadressen zijn en vallen in plaats daarvan door naar de gewone mailbox. Een gepoold domein dat zijn eigen misbruikmeldingen in een zwart gat laat verdwijnen, is een domein dat nergens meer kan afleveren. Een adres dat je zelf op een gepoold domein aanmaakt, zoals legal@ of privacy@, gedraagt zich hetzelfde: mail eraan belandt in jouw mailbox, en niemand kan het als wegwerpadres uitgereikt krijgen.