SMTP-Relay
Das SMTP-Relay lässt Software, die nur SMTP spricht (CMS, Auth-Anbieter, Frameworks, Legacy-Apps), über SpacePost senden. Nachrichten durchlaufen dieselbe Pipeline wie bei der API: Domain-Prüfungen, Sperrliste, Kontingente, Tracking, Webhooks.
| Einstellung | Wert |
|---|---|
| Host | smtp.spacepost.dev |
| Port | 25976 |
| Sicherheit | STARTTLS, vor der Authentifizierung erforderlich |
| Benutzername | spacepost (der Alias resend wird für Migrationen ebenfalls akzeptiert) |
| Passwort | Dein API-Schlüssel (sp_live_...) |
Verbinde dich ohne TLS und wechsle mit STARTTLS auf eine verschlüsselte Verbindung, bevor du dich anmeldest; das Zertifikat ist für smtp.spacepost.dev gültig. Implizites TLS (Port 465) wird noch nicht angeboten, wähle in den meisten Clients also “STARTTLS” oder “TLS”, nicht “SSL”.
Die From-Adresse muss zu einer verifizierten Domain gehören. Ein sending_access-Schlüssel genügt; ein auf eine Domain beschränkter Schlüssel kann nur von seiner Domain senden.
Steuerheader
Abschnitt betitelt „Steuerheader“Füge diese Header zu deiner Nachricht hinzu, um Funktionen zu nutzen, für die SMTP kein Feld hat. Sie werden von SpacePost ausgewertet und nicht an den Empfänger zugestellt.
| Header | Beispiel | Wirkung |
|---|---|---|
X-SpacePost-Tags |
category=welcome, user_id=u_1042 |
Fügt Tags hinzu. Durch Kommas getrennte name=value-Paare; dieselben Zeichenregeln wie bei der API. |
X-SpacePost-Scheduled-At |
2026-11-01T09:00:00Z oder in 1 hour |
Plant die E-Mail (bis zu 30 Tage). |
Andere X-*-Header, List-Unsubscribe, List-Unsubscribe-Post, In-Reply-To und References werden als eigene Header weitergegeben.
Beispiele
Abschnitt betitelt „Beispiele“import nodemailer from "nodemailer";
const transport = nodemailer.createTransport({ host: "smtp.spacepost.dev", port: 25976, secure: false, // STARTTLS: the connection is upgraded to TLS before login requireTLS: true, auth: { user: "spacepost", pass: process.env.SPACEPOST_API_KEY },});
await transport.sendMail({ from: "Acme <hello@acme.com>", to: "user@example.com", subject: "Hello over SMTP", html: "<p>It works.</p>", headers: { "X-SpacePost-Tags": "category=welcome", "X-SpacePost-Scheduled-At": "in 10 minutes" },});import os, smtplibfrom email.message import EmailMessage
msg = EmailMessage()msg["From"] = "Acme <hello@acme.com>"msg["To"] = "user@example.com"msg["Subject"] = "Hello over SMTP"msg["X-SpacePost-Tags"] = "category=welcome"msg.set_content("It works.")msg.add_alternative("<p>It works.</p>", subtype="html")
with smtplib.SMTP("smtp.spacepost.dev", 25976) as s: s.starttls() s.login("spacepost", os.environ["SPACEPOST_API_KEY"]) s.send_message(msg)swaks --server smtp.spacepost.dev --port 25976 --tls \ --auth-user spacepost --auth-password "$SPACEPOST_API_KEY" \ --from hello@acme.com --to delivered@test.spacepost.dev \ --header "Subject: Hello" --header "X-SpacePost-Tags: category=test" --body "It works."Wie Nachrichten abgebildet werden
Abschnitt betitelt „Wie Nachrichten abgebildet werden“To,CcundReply-Tostammen aus den Headern. Envelope-Empfänger (RCPT TO), die nicht inTooderCcstehen, werden zu Bcc.- HTML- und Textteile bleiben erhalten. Anhänge, einschließlich Inline-Bildern (
Content-ID), werden unterstützt. - Eine Nachricht ohne Betreff erhält den Betreff
(no subject). - Jeder Empfänger zählt auf dein Kontingent, wie bei der API.
Limits und Fehlercodes
Abschnitt betitelt „Limits und Fehlercodes“| Limit | Wert |
|---|---|
| Nachrichtengröße | 40 MB, Antwort 552 |
| Authentifizierungsfehler | 10 fehlgeschlagene Versuche pro IP in 10 Minuten, danach Sperre |
SMTP-Antworten bilden die API-Fehler ab:
| Situation | Antwort |
|---|---|
| Tages- oder Monatskontingent überschritten | 452 (vorübergehend: deine Software versucht es später erneut) |
| Rate Limit erreicht | 421 |
From-Domain nicht verifiziert |
553 |
| Eingeschränkter Schlüssel, pausiertes Team, Validierungsfehler, Inhalt blockiert | 550 |
| Vorübergehendes Problem auf unserer Seite | 451 |