Warum ein Mail-Provider die falsche Form für QA ist
Jede Art, einer Testsuite E-Mail-Adressen zu geben, wurde schon versucht, und jede leckt an einer anderen Stelle:
| Ansatz | Was er kostet | Wo er bricht |
|---|---|---|
Ein geteiltes Postfach (qa@company.com) | Nichts einzurichten. | Jeder Test liest die Mail jedes anderen Tests. Der erste Poll eines neuen Laufs findet den Code des letzten Laufs. Parallele Läufe sind unmöglich. |
Plus-Adressierung (qa+run42@company.com) | Nichts einzurichten, wenn der Provider es unterstützt. | Es ist immer noch ein Postfach: ein Kontingent, ein IMAP-Login, geteilt vom ganzen Team, und ein Anmeldeformular, das das Tag entfernt oder das + ablehnt. |
| Ein Postfach pro Tester vom Provider | Je einen Platz, und ein Ticket, um ihn anzulegen. | Niemand stellt ein Postfach pro Testlauf bereit. Tester verwenden ihres wieder, und das Problem des geteilten Postfachs kehrt zurück, eine Person nach der anderen. |
| Eine Catch-all-Domain, hierher ausgerichtet | Ein DNS-Eintrag, einmal. | Das Postfach ist öffentlich für jeden, der die Adresse kennt, und Mail bleibt 5 Tage. Beides ist unproblematisch für einen Code, der elf Sekunden lang zählt; keins von beidem ist unproblematisch für echte Kunden-Mail. |
Die vierte Zeile ist diese Anleitung. Es ist derselbe Mechanismus, auf dem die öffentlichen Wegwerf-Domains laufen — ein Server, der jede Adresse auf einer Domain akzeptiert statt einer Liste von Postfächern —, angewendet auf einen Namen, den außer Ihnen niemand verwendet.
Der eine DNS-Eintrag
Fügen Sie bei Ihrem DNS-Provider einen einzelnen MX-Eintrag am Apex einer Domain hinzu, die Ihnen gehört. Kein weiterer Eintrag hier, kein TXT zum Nachweis von irgendetwas, kein Konto auf dieser Website:
MX-Eintrag für die Domain10 smtp.grabmail.io
- Veröffentlichen Sie den MX. Priorität 10, zeigend auf
smtp.grabmail.io. Löschen Sie jeden anderen MX auf der Domain — Mail kann nur an einen Ort zugestellt werden, und ein übrig gebliebener Eintrag schickt einen Teil davon woandershin. - Warten Sie auf DNS. Meist Minuten; gelegentlich die TTL des Eintrags, der vorher da war.
dig MX qa-example.comzeigt, wann es übernommen wurde. - Schicken Sie eine Nachricht an eine beliebige Adresse darauf. Die erste Zustellung ist es, was die Domain verbindet: Der Server schlägt in diesem Moment den MX nach, sieht sich selbst, und nimmt an. Von da an ist jede Adresse auf der Domain ein Postfach.
Ein Namensschema, das sagt, wer das Postfach angelegt hat
Da jede Adresse gültig ist, kann der lokale Teil frei Informationen tragen — und um zwei Uhr morgens, mit einem fehlgeschlagenen Lauf und einem offenen Postfach, werden Sie das auch wollen. Drei Teile, durch Bindestriche verbunden, in dieser Reihenfolge:
| Teil | Beispiel | Was es Ihnen bringt |
|---|---|---|
| Was es angelegt hat | signup, reset, e2e, alice | Ein Blick sagt, zu welchem Ablauf oder welcher Person das Postfach gehört. |
| Welcher Lauf | 1234567890 (die CI-Lauf-ID), ein Branch-Name, ein Datum | Jedes Postfach aus einem Pipeline-Lauf teilt sich ein Token, nach dem Sie suchen können. |
| Zufall | 3f9a1c2e | Acht Zeichen davon. Das ist der Teil, der dafür sorgt, dass zwei Tests, zwei Shards oder zwei Wiederholungen sich nie ein Postfach teilen. |
| Nie: irgendetwas Echtes | ein Kundenname, eine echte Nutzer-ID, eine Ticketnummer, die einen Kunden benennt | Das Postfach ist öffentlich für jeden, der die Adresse kennt. Nichts in der Adresse sollte es wert sein, gewusst zu werden. |
// one helper, every runner: who made it, which run, and eight random characters
export const testAddress = (who: string, run = process.env.GITHUB_RUN_ID ?? 'local') =>
`${who}-${run}-${crypto.randomUUID().slice(0, 8)}@qa-example.com`;
testAddress('signup'); // signup-1234567890-3f9a1c2e@qa-example.comJede Adresse lesen, dieselben drei Aufrufe
An der API ändert sich für die eigene Domain nichts. Derselbe Listing-Aufruf, derselbe Nachrichten-Aufruf, dasselbe Löschen — kein Schlüssel in der öffentlichen Stufe, und die Domain in der Adresse ist das Einzige, was sich unterscheidet:
$ curl -sG https://grabmail.io/api/v1/mailbox --data-urlencode "address=signup-1234567890-3f9a1c2e@qa-example.com"Das heißt, jeder Helfer auf dieser Website funktioniert unverändert, nachdem eine Konstante bearbeitet wurde: die Playwright-Fixture, der Cypress-Task, die Python- und Node-Module. Drei Dinge sind es wert, gewusst zu werden, über die die öffentlichen Domains einen nicht nachdenken lassen:
- Ein
404bedeutet, dass der MX noch nicht da ist - Die Auflistung antwortet mit
404für eine Domain, die hier nicht gehostet wird. Bei der eigenen Domain ist das ein DNS-Problem — der Eintrag hat sich noch nicht verbreitet, oder zeigt woandershin — kein API-Problem. Zuerstdig MX. - Der Alias funktioniert auch auf Ihrer Domain
- Jedes Postfach, auf jeder Domain, hat eine zweite Adresse auf einer separaten Domain, die dorthin zustellt und es nicht lesen kann. Geben Sie diese einer Website, wenn sie das Postfach lieber nicht öffnen können soll; pollen Sie Ihre eigene Adresse.
- Eine ausgelastete Adresse wird paginiert
- Eine Catch-all-Adresse, die Bounces oder einen Tag voller Benachrichtigungen sammelt, kann mehr als eine Seite von 200 enthalten. Übergeben Sie
nextalsbeforezurück, bis esnullist.
Eine Testdomain nutzbar halten
Eine eigene Domain steht auf keiner Sperrliste für Wegwerf-Mail, und das ist oft überhaupt der Grund, eine zu verwenden: Die getestete Anwendung lehnt grabmail.io und jede andere öffentliche Domain ab, genau wie sie es soll. Vier Gewohnheiten halten das so:
- Verwenden Sie eine dedizierte Domain —
qa-example.com, keine Subdomain der Produktion und nicht die Domain, an die Kunden schreiben. Der Dienst akzeptiert nur registrierbare Domains (example.com, niemail.example.com), und eine Testdomain sollte keine andere Aufgabe haben. - Veröffentlichen Sie sie nicht. Die Listen entstehen aus dem, was auf öffentlichen Temp-Mail-Websites und in geteilten Adress-Dumps auftaucht. Eine Domain, die nur je in Ihrer eigenen Testsuite auftaucht, hat keinen Weg auf sie.
- Sichern Sie sie mit SPF und DMARC. Eine Domain, die nur empfängt, ohne SPF, ist eine Domain, von der aus jeder Mail fälschen kann; zwei Einträge schließen das, und kosten nichts.
- Richten Sie keine echte Mail darauf aus. In dem Moment, in dem ein Staging-System Kundenbenachrichtigungen an eine Catch-all-Adresse schickt, hält ein öffentliches Postfach Kundendaten. Testdomains tragen Testmail.
Wenn die Anwendung jede Catch-all-Domain ablehnt — manche Betrugsprüfungen tun das, indem sie testen, ob eine zufällige Adresse auf der Domain akzeptiert wird —, gibt es einen kostenpflichtigen Pool aus gewöhnlich aussehenden .com-Domains, die von den Listen ferngehalten werden, beschrieben auf der Preisseite. Warum Anmeldeformulare Wegwerf-E-Mail blockieren erklärt, was jede Art von Prüfung sieht.
Für ein Team: eine Domain, viele Tester, viele Pipelines
Eine Catch-all-Domain bedient alle, weil der lokale Teil das Einzige ist, das sich unterscheiden muss, und der ist kostenlos. Was ein Team braucht, ist Einigkeit über das Namensschema oben und drei kleine Konventionen:
- Ein Präfix pro Pipeline und pro Person
e2e-,nightly-,alice-. Ein Job-Log nach dem Präfix zu durchsuchen findet jedes Postfach, das er angelegt hat; nach dem eines Kollegen zu suchen findet den Bug, den er sich gerade ansieht.- Nichts wird je geteilt
- Es gibt kein „Team-Postfach“ auf der Domain und keine Fixture, die eine feste Adresse ausgibt. Wenn zwei Personen dasselbe Postfach brauchen, schickt eine von ihnen der anderen die Adresse.
- Die Ratenlimits gelten pro Client
- Ein Lesevorgang pro Sekunde und Adresse, 1200 Anfragen pro Minute und Client — ein CI-Runner ist ein Client, ein Laptop ein anderer. Ein Team von zehn, das gleichzeitig Suiten laufen lässt, sind zehn Clients, nicht einer.
Die geltenden Grenzen
Die eigene Domain bekommt denselben Dienst wie die öffentlichen, mit denselben Obergrenzen. Keine davon ist einstellbar, und keine ist ein Problem für eine Testsuite:
| Grenze | Wert | Was das für QA bedeutet |
|---|---|---|
| Aufbewahrung | 5 Tage pro Nachricht | Jeder Lauf erzeugt seine eigene Mail; nichts wird je aus einer vorherigen Woche abgerufen. Die genauen Regeln. |
| Anhänge | 5 MB pro Nachricht | Genug für ein Rechnungs-PDF oder einen CSV-Export; eine größere Nachricht wird bei SMTP abgelehnt, der Absender wird also informiert. |
| Lesevorgänge | 1 pro Sekunde und Adresse, 1200 pro Minute und Client | Zwanzig Postfächer, einmal pro Sekunde gepollt, von einem Runner aus. Darüber hinaus 429 mit Retry-After. |
| Privatsphäre | Keine — wer eine Adresse kennt, kann sie lesen | Zufällige lokale Teile, eine unveröffentlichte Domain, und keine echte Kunden-Mail. |
| Versand | Keiner | Die Domain empfängt nur. Ihre Anwendung versendet über ihren eigenen Provider, wie in der Produktion. |
Bevor Sie es für fertig erklären
- Eine dedizierte, registrierbare Domain, mit einem MX-Eintrag:
10 smtp.grabmail.io, und keinem weiteren MX. - Eine Nachricht an eine beliebige Adresse darauf geschickt und über die API zurückgelesen.
- SPF und DMARC veröffentlicht, sodass niemand als die Domain versenden kann.
- Ein Namens-Helfer — wer, welcher Lauf, acht zufällige Zeichen — von jeder Suite verwendet.
- Die Domain in der Umgebungskonfiguration gehalten, nie im Code, in Screenshots oder Tickets.
- Nichts, was echte Kunden-Mail verschickt, darauf ausgerichtet.
Von hier aus sind die Suiten die bereits geschriebenen: Playwright mit der Domain in seiner Fixture, die runner-unabhängige Disziplin, und der GitHub-Actions-Workflow mit der Domain in einer Variable.
Fragen
Kann ich eine Subdomain verwenden, wie test.company.com?
Nein — der Dienst akzeptiert nur registrierbare Domains (company.com, oder company.co.uk), weil, wer eine Domain kontrolliert, jeden Namen darunter kontrolliert, und zwei Parteien dürfen nicht überlappende Hälften eines Namensraums halten können. Registrieren Sie eine günstige dedizierte Domain zum Testen; das ist ohnehin die bessere Praxis.
Wie lange dauert es, bis der MX-Eintrag funktioniert?
Sobald DNS ihn ausliefert, meist Minuten. Gab es einen vorherigen MX, gilt dessen TTL. Die Domain wird durch die erste Nachricht verbunden, die danach ankommt — sonst muss nichts weiter passieren, und dig MX sagt Ihnen, wann der Eintrag live ist.
Kostet das etwas?
Nein. Eine Domain zu verbinden, jede Adresse darauf und die API sind kostenlos, ohne Konto. Das einzige Kostenpflichtige auf dieser Website ist ein Pool von Domains, der von den Wegwerf-Mail-Sperrlisten ferngehalten wird, für alle, die keine eigene Domain verwenden können.
Kann jemand anderes Mail auf meiner Domain lesen?
Wer eine Adresse kennt, kann das, genau wie auf den öffentlichen Domains. Was die eigene Domain ändert, ist die Erratbarkeit: Ihre Adressen liegen auf einem Namen, den sonst niemand verwendet. Zufällige lokale Teile und eine unveröffentlichte Domain machen das Erraten unpraktikabel; sie machen das Postfach nicht privat, und nichts hier tut das.
Was passiert mit Mail, die an die Domain geschickt wurde, bevor ich sie verbunden habe?
Hier kommt nichts an, bis der MX hierher zeigt. Mail, die verschickt wurde, während der alte Eintrag aktiv war, ging an den alten Server oder wurde zurückgewiesen; Mail, die nach der DNS-Umstellung verschickt wurde, kommt an und verbindet die Domain.
Wie trenne ich die Domain wieder?
Entfernen Sie den MX-Eintrag. Neue Mail kommt sofort nicht mehr an; was bereits in den Postfächern liegt, läuft von selbst innerhalb von 5 Tagen ab. Danach wird nichts mehr über die Domain gespeichert.
Die Anwendung lehnt auch meine Testdomain ab. Was jetzt?
Manche Betrugsprüfungen lehnen jede Domain ab, die eine zufällige Adresse akzeptiert — eine Catch-all-Probe —, statt eine Liste zu prüfen. Dafür braucht es eine Domain, die sich wie ein gewöhnlicher Postfach-Provider verhält, und genau das liefert der kostenpflichtige Pool; warum Anmeldeformulare Wegwerf-E-Mail blockieren erklärt, welcher Prüfung Sie gegenüberstehen.


