eusend

SMTP

Send through eusend over SMTP instead of the HTTP API — a drop-in transport for anything that already speaks SMTP.

Send through eusend over SMTP instead of the HTTP API — a drop-in transport for anything that already speaks SMTP: Supabase Auth, Django, Rails, WordPress, and most off-the-shelf software. Messages submitted over SMTP run through the exact same pipeline as the API, so DKIM signing, open and click tracking, suppression, and your sending limits all apply identically.

Connection settings

ParameterTypeDescription
Hostrequiredsmtp.eusend.devThe SMTP submission server.
Portrequired465 or 2465Implicit TLS (SMTPS) — the connection is encrypted from the first byte. Use 465; 2465 is an alternate for networks that block 465. STARTTLS (587) is not supported.
SecurityrequiredSSL / TLSImplicit TLS on 465. Not STARTTLS. Choose "SSL" or "TLS" if your client asks.
UsernamerequiredeusendAlways the literal string "eusend" — not your email address and not your key.
Passwordrequiredeu_live_… / eu_test_…Any of your eusend API keys. The key goes in the password field.

The username is always the literal word eusend; your API key goes in the password field. Putting the key in the username is the most common cause of a 535 authentication failure.

The sender address

The message From address must use a domain you have verified in eusend — the same rule as the API. Mail from an unverified domain is rejected at submission with a 550. The local part (before the @) can be anything. See Domain Setup to add and verify a domain.

Test and live keys

A key prefixed eu_test_ is accepted and tracked but never delivered — ideal while you wire up an integration. Swap in an eu_live_ key to send for real.

Example — Nodemailer

node
import nodemailer from 'nodemailer'

const transport = nodemailer.createTransport({
  host: 'smtp.eusend.dev',
  port: 465,
  secure: true,            // implicit TLS
  auth: {
    user: 'eusend',        // always the literal string "eusend"
    pass: process.env.EUSEND_API_KEY,
  },
})

await transport.sendMail({
  from: 'Acme <hello@yourdomain.com>',   // must be a verified domain
  to: 'alice@example.com',
  subject: 'Your order has shipped',
  html: '<p>Order #1234 is on its way.</p>',
})

Example — swaks (CLI)

shell
swaks \
  --server smtp.eusend.dev:465 --tlsc \
  --auth-user eusend --auth-password eu_live_xxxxxxxxxxxx \
  --from hello@yourdomain.com \
  --to alice@example.com \
  --header 'Subject: SMTP test' \
  --body 'Hello from eusend over SMTP.'

Using eusend for Supabase Auth

In your Supabase project, open Authentication → Emails → SMTP Settings, enable custom SMTP, and enter:

supabase smtp settings
Host:          smtp.eusend.dev
Port:          465
Username:      eusend
Password:      <an eusend API key>
Sender email:  no-reply@yourdomain.com   (must be a verified domain)
Sender name:   Your App

Set the sender address to an address on a domain you have verified in eusend, then use Supabase's "Send test email" button — it exercises the whole path. A 550 back means the sender domain isn't verified; a 535 means the username or key is wrong.

Limits and behavior

ParameterTypeDescription
Recipientsmax 50 eachUp to 50 addresses each across To, Cc, and Bcc.
Message sizemax 25 MBLarger messages are rejected with a 552.
Sending limitssharedThe same rate limit, monthly plan limit, and progressive daily sending ceiling as the HTTP API apply to SMTP submissions.
Tracking & eventsidenticalOpens, clicks, bounces, complaints, and suppression all apply — an SMTP send appears in your dashboard and analytics like any other email.

Troubleshooting

ParameterTypeDescription
535auth failedWrong username or invalid key. The username must be the literal "eusend"; the API key goes in the password field.
550rejectedThe From domain is not verified, or the recipient is on your suppression list.
452rate limitedA rate limit or your daily sending ceiling was hit. Retry later.
421temporaryTemporary server error or too many simultaneous connections — retry with backoff.