Docs

SMTP

Already sending through SMTP? Point your existing Nodemailer, Postfix, or mail library config at smtp.irisend.com instead of rewriting it for the REST API.

Runs through the exact same validation, quota, domain-verification, and suppression handling as POST /emails — nothing sent over SMTP bypasses those guardrails. One email per DATA transaction; every RCPT TO address not already in the message's To/Cc headers is delivered as bcc — except when the message has no To header at all (regardless of Cc), in which case those addresses become to instead, since to is required. Any X-* message header is passed through unchanged, and a plain Idempotency-Key message header works the same way as the REST API's header of the same name.

  • Host: smtp.irisend.com
  • Ports: 587 (STARTTLS, required before authenticating) or 465 (implicit TLS). 2587/2465 are the same two listeners, for networks that block the standard mail ports.
  • AUTH: PLAIN or LOGIN only — no plaintext AUTH without TLS first.
  • Username: irisend (resend also works, for a drop-in migration)
  • Password: any API key — full_access and sending_access both work
  • Max message size: 40MB, including attachments.
NodemailerJavaScript
import nodemailer from "nodemailer";

const transport = nodemailer.createTransport({
  host: "smtp.irisend.com",
  port: 587, // or 465 for implicit TLS — both work the same way
  secure: false, // true only for port 465
  auth: {
    user: "irisend", // or "resend", for a drop-in migration
    pass: "ir_8fK3mQ1z_9pR2vT6yB4wL0nC7xE1sH5dJ", // your Irisend API key
  },
});

await transport.sendMail({
  from: "[email protected]",
  to: "[email protected]",
  subject: "Your receipt",
  html: "<p>Thanks for your order.</p>",
  text: "Thanks for your order.",
  headers: { "X-Entity-Ref-ID": "order_8841", "Idempotency-Key": "order-8841-receipt" },
});