API für Testautomatisierung
Automatisierte Tests scheitern oft an derselben Stelle: Die Anwendung verschickt eine Bestätigungsmail, und der Testlauf kommt nicht an sie heran. Diese Schnittstelle löst das in drei Aufrufen — Postfach anlegen, warten, Nachricht lesen.
Du brauchst dafür einen Zugriffsschlüssel. Den bekommst du gleich hier, kostenlos und ohne Konto: E-Mail-Adresse eintragen, Schlüssel abholen, fertig.
Zugriffsschlüssel holen
Kostenlos und sofort. Wir brauchen nur eine E-Mail-Adresse — für den Fall, dass wir dich wegen Missbrauchs erreichen müssen, und damit klar ist, wem ein Schlüssel gehört.
Schnellstart
Drei Aufrufe, mehr braucht es nicht. Der Schlüssel gehört in jeden davon.
# Der Schluessel gehoert in jeden Aufruf.
export GETSEND_KEY="gs_..."
# 1. Postfach anlegen
curl -s -X POST https://www.getsend.xyz/api/v1/inboxes \
-H "Authorization: Bearer $GETSEND_KEY"
# {
# "address": "a7k2m9x4p1q8w3z6@getsend.xyz",
# "messages_url": "https://www.getsend.xyz/api/v1/inboxes/a7k2m9x4p1q8w3z6/messages"
# }
# 2. Postfach abfragen
curl -s -H "Authorization: Bearer $GETSEND_KEY" \
https://www.getsend.xyz/api/v1/inboxes/a7k2m9x4p1q8w3z6/messages
# 3. Nachricht mit Inhalt lesen
curl -s -H "Authorization: Bearer $GETSEND_KEY" \
https://www.getsend.xyz/api/v1/inboxes/a7k2m9x4p1q8w3z6/messages/193Endpunkte
| Methode | Pfad | OK |
|---|---|---|
POST | /api/v1/inboxes | 201 |
GET | /api/v1/inboxes | 200 |
GET | /api/v1/inboxes/{adresse}/messages | 200 |
GET | /api/v1/inboxes/{adresse}/messages/{id} | 200 |
DELETE | /api/v1/inboxes/{adresse}/messages/{id} | 200 |
In Testwerkzeugen
Cypress
// cypress/support/getsend.js
const API = 'https://www.getsend.xyz/api/v1'
const KEY = Cypress.env('GETSEND_KEY') // nie im Quelltext ablegen
const kopf = { Authorization: `Bearer ${KEY}` }
Cypress.Commands.add('neuesPostfach', () =>
cy.request({ method: 'POST', url: `${API}/inboxes`, headers: kopf }).its('body'))
// Wartet, bis eine Nachricht da ist -- Mail braucht ein paar Sekunden.
Cypress.Commands.add('warteAufMail', (box, versuche = 20) => {
const lokal = box.address.split('@')[0]
const holen = (rest) =>
cy.request({ url: `${API}/inboxes/${lokal}/messages`, headers: kopf })
.then((r) => {
if (r.body.count > 0) return r.body.messages[0]
if (rest <= 1) throw new Error('Keine Mail eingetroffen')
return cy.wait(3000).then(() => holen(rest - 1))
})
return holen(versuche)
})
// Im Test:
it('bestaetigt die Registrierung', () => {
cy.neuesPostfach().then((box) => {
cy.visit('/registrierung')
cy.get('#email').type(box.address)
cy.get('form').submit()
cy.warteAufMail(box).then((m) => {
const lokal = box.address.split('@')[0]
cy.request({ url: `${API}/inboxes/${lokal}/messages/${m.id}`, headers: kopf })
.then((r) => {
const link = r.body.text.match(/https?:\/\/\S+/)[0]
cy.visit(link)
cy.contains('Konto bestaetigt')
})
})
})
})Python / Selenium
# Selenium, pytest oder jedes andere Werkzeug -- die Schnittstelle
# ist ein gewoehnlicher HTTP-Aufruf.
import os, re, time, requests
API = "https://www.getsend.xyz/api/v1"
KOPF = {"Authorization": "Bearer " + os.environ["GETSEND_KEY"]}
def neues_postfach():
return requests.post(f"{API}/inboxes", headers=KOPF, timeout=10).json()
def warte_auf_mail(box, versuche=20, pause=3):
lokal = box["address"].split("@")[0]
for _ in range(versuche):
r = requests.get(f"{API}/inboxes/{lokal}/messages", headers=KOPF, timeout=10).json()
if r["count"]:
mid = r["messages"][0]["id"]
return requests.get(f"{API}/inboxes/{lokal}/messages/{mid}",
headers=KOPF, timeout=10).json()
time.sleep(pause)
raise AssertionError("Keine Mail eingetroffen")
box = neues_postfach()
driver.find_element(By.ID, "email").send_keys(box["address"])
driver.find_element(By.CSS_SELECTOR, "form").submit()
mail = warte_auf_mail(box)
link = re.search(r"https?://\S+", mail["text"]).group(0)
driver.get(link)Grenzen
Nachrichten werden nach sieben Tagen gelöscht. Je Schlüssel sind 60 neue Postfächer und 3000 Abrufe pro Stunde erlaubt; darüber antwortet die Schnittstelle mit 429 und einem Retry-After.
Der Dienst nimmt Post nur für getsend.xyz an. Eigene Domains gibt es nicht.
Das ist ein kleiner Dienst auf einem einzelnen Server. Für einen Testlauf in der Entwicklung reicht das; als Baustein einer Produktionsanwendung ist er nicht gedacht, und eine Verfügbarkeit sagen wir nicht zu.
Was der Schlüssel leistet — und was nicht
Ein Postfach, das du über die Schnittstelle anlegst, gehört deinem Schlüssel. Ein anderer Schlüssel kommt nicht heran, auch wenn er die Adresse kennt.
Für die Weboberfläche gilt das nicht: getSend zeigt dort seit jeher jedes Postfach, dessen Adresse man eintippt. Wer deine Adresse kennt, sieht die Nachrichten also trotzdem im Browser. Deshalb sind die erzeugten Adressen 16 Zeichen lang und praktisch nicht zu erraten — und deshalb gehört in diese Postfächer nichts Vertrauliches.
Behandle den Schlüssel wie ein Passwort. Er gehört in eine Umgebungsvariable, nicht in den Quelltext und nicht in ein öffentliches Repository.