groundmail

Features

SMTP relay for apps that only speak SMTP

Auth providers, CMSes and older apps expect a host, a port and a password. Point them at smtp.groundmail.dev and their mail is sent from our own mail servers and IP space, the same as the API.

Connection

Four settings and you are sending

Verify your sending domain, create an SMTP credential, and paste these into any SMTP client.

  • Port 587 with STARTTLS
  • Username is always groundmail
  • Credentials from the dashboard or POST /smtp-credentials
  • From must use a verified domain on your account

SMTP settings

Host:     smtp.groundmail.dev
Port:     587 (STARTTLS)
Username: groundmail
Password: gmsmtp_…   # an SMTP credential

# From must use a domain you verified in Groundmail
From:     noreply@yourdomain.com

Same platform

A different transport, not a different product

SMTP is another way into the same account. Nothing about your safety rules changes.

Drop-in config

Works with Supabase custom SMTP, Clerk, WordPress, nodemailer and anything else that can send SMTP. No SDK and no code changes.

One set of rules

Verified domains, plan limits, suppressions and webhooks behave exactly as they do for the REST API. Bounces from SMTP sends land on the same suppression list.

Send-only credentials

SMTP credentials can send mail and nothing else. Management stays behind API keys. Revoke a credential any time without touching DNS.

API features in headers

Tags, idempotency keys and scheduled sends map from X-Groundmail-* headers, so SMTP clients are not stuck with plain MIME.

Examples

Create a credential, then send

Create an SMTP credential

curl -X POST https://api.groundmail.dev/smtp-credentials \
  -H "Authorization: Bearer $GROUNDMAIL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Supabase production"}'

nodemailer over SMTP

import nodemailer from "nodemailer";

const transport = nodemailer.createTransport({
  host: "smtp.groundmail.dev",
  port: 587,
  secure: false, // upgrades with STARTTLS
  auth: {
    user: "groundmail",
    pass: process.env.GROUNDMAIL_SMTP_PASSWORD,
  },
});

await transport.sendMail({
  from: "noreply@yourdomain.com",
  to: "user@example.com",
  subject: "Reset your password",
  html: "<p>Click the link to reset.</p>",
  headers: {
    "X-Groundmail-Tag": "flow=password-reset",
    "X-Groundmail-Idempotency-Key": "reset-4821",
  },
});

FAQ

Common questions

Is the SMTP password my API key?

No. It is a separate SMTP credential that starts with gmsmtp_. It can only send mail, so it is safe to hand to an auth provider or CMS. It is shown once when you create it.

Do SMTP sends get the same treatment as API sends?

Yes. The relay uses the same account, verified domains, plan limits, suppressions and webhooks as POST /emails. SMTP mail leaves from the same pool, dedicated IPs or dedicated server as the rest of your traffic.

Can I use tags, idempotency or scheduling over SMTP?

Yes. Set X-Groundmail-Tag, X-Groundmail-Idempotency-Key or X-Groundmail-Scheduled-At on the message and the relay maps them to the matching API fields.

How do I rotate a credential?

Create a new credential, update your client, then revoke the old one in the dashboard or with DELETE /smtp-credentials/{id}. Your domains stay verified.

Put your transactional email on solid ground.

Start free on our transactional pool. Move to dedicated IPs or a dedicated server when you need the isolation. Same API either way.