SMTP

Already speak SMTP? Keep your libraries. Point them at Calder and get the same pipeline — queue, retries, events, webhooks — as the REST API.

Status: specified, rolling out. The gateway spec below is final; availability follows the phases in our engineering plan. Test keys will work over SMTP from day one of the rollout.

Settings

SettingValue
Hostsmtp.calder.click
Port587 (STARTTLS)
UsernameProject SMTP username (dashboard → SMTP)
PasswordGenerated secret — shown once, hashed at rest

Nodemailer

mailer.js
import nodemailer from "nodemailer";

const transporter = nodemailer.createTransport({
  host: "smtp.calder.click",
  port: 587,
  secure: false, // STARTTLS — upgraded automatically
  auth: { /* user + pass from env */ },
});

await transporter.sendMail({ /* from, to, subject, html */ });

Python smtplib

send.py
import smtplib
from email.message import EmailMessage

msg = EmailMessage()
msg["From"] = "app@acme.com"
# …To, Subject, set_content…

with smtplib.SMTP("smtp.calder.click", 587) as s:
    s.starttls() # mandatory
    s.login()
    s.send_message(msg)

Rules of the road

  • TLS is mandatory — plaintext authentication is rejected, always.
  • The From address must belong to a verified project identity, or the message is rejected with a 550 and a dashboard explanation.
  • Same events, same webhooks, same usage meter as API sends — one pipeline.
  • Supported subset: STARTTLS, AUTH PLAIN/LOGIN, MAIL/RCPT/DATA, MIME (HTML, text, attachments), CC/BCC/Reply-To, custom headers.