Relais SMTP
Le relais SMTP permet aux logiciels qui ne parlent que SMTP (CMS, fournisseurs d’authentification, frameworks, applications héritées) d’envoyer via SpacePost. Les messages passent par le même pipeline que l’API : contrôles de domaine, liste de suppression, quotas, suivi, webhooks.
| Paramètre | Valeur |
|---|---|
| Hôte | smtp.spacepost.dev |
| Port | 25976 |
| Sécurité | STARTTLS, obligatoire avant l’authentification |
| Nom d’utilisateur | spacepost (l’alias resend est aussi accepté, pour les migrations) |
| Mot de passe | Votre clé API (sp_live_...) |
Connectez-vous sans TLS et passez en STARTTLS avant de vous authentifier ; le certificat est valide pour smtp.spacepost.dev. Le TLS implicite (port 465) n’est pas encore proposé : dans la plupart des clients, choisissez « STARTTLS » ou « TLS », pas « SSL ».
L’adresse From doit appartenir à un domaine vérifié. Une clé sending_access suffit ; une clé restreinte à un domaine ne peut envoyer que depuis ce domaine.
En-têtes de contrôle
Section intitulée « En-têtes de contrôle »Ajoutez ces en-têtes à votre message pour utiliser des fonctionnalités pour lesquelles SMTP n’a pas de champ. Ils sont consommés par SpacePost et ne sont pas transmis au destinataire.
| En-tête | Exemple | Effet |
|---|---|---|
X-SpacePost-Tags |
category=welcome, user_id=u_1042 |
Ajoute des tags. Paires name=value séparées par des virgules ; mêmes règles de caractères que l’API. |
X-SpacePost-Scheduled-At |
2026-11-01T09:00:00Z ou in 1 hour |
Planifie l’e-mail (jusqu’à 30 jours). |
Les autres en-têtes X-*, List-Unsubscribe, List-Unsubscribe-Post, In-Reply-To et References sont transmis comme en-têtes personnalisés.
Exemples
Section intitulée « Exemples »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."Comment les messages sont convertis
Section intitulée « Comment les messages sont convertis »To,CcetReply-Toproviennent des en-têtes. Les destinataires de l’enveloppe (RCPT TO) qui ne figurent ni dansToni dansCcdeviennent Bcc.- Les parties HTML et texte sont conservées. Les pièces jointes, y compris les images en ligne (
Content-ID), sont prises en charge. - Un message sans objet reçoit l’objet
(no subject). - Chaque destinataire compte dans votre quota, comme avec l’API.
Limites et codes d’erreur
Section intitulée « Limites et codes d’erreur »| Limite | Valeur |
|---|---|
| Taille du message | 40 Mo, réponse 552 |
| Échecs d’authentification | 10 tentatives échouées par IP en 10 minutes, puis blocage |
Les réponses SMTP correspondent aux erreurs de l’API :
| Situation | Réponse |
|---|---|
| Quota quotidien ou mensuel dépassé | 452 (temporaire : votre logiciel réessaiera plus tard) |
| Limite de débit atteinte | 421 |
Domaine From non vérifié |
553 |
| Clé restreinte, équipe en pause, erreurs de validation, contenu bloqué | 550 |
| Problème temporaire de notre côté | 451 |