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
| Parameter | Type | Description |
|---|---|---|
Hostrequired | smtp.eusend.dev | The SMTP submission server. |
Portrequired | 465 or 2465 | Implicit 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. |
Securityrequired | SSL / TLS | Implicit TLS on 465. Not STARTTLS. Choose "SSL" or "TLS" if your client asks. |
Usernamerequired | eusend | Always the literal string "eusend" — not your email address and not your key. |
Passwordrequired | eu_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
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 <[email protected]>', // must be a verified domain
to: '[email protected]',
subject: 'Your order has shipped',
html: '<p>Order #1234 is on its way.</p>',
})Example — swaks (CLI)
swaks \
--server smtp.eusend.dev:465 --tlsc \
--auth-user eusend --auth-password eu_live_xxxxxxxxxxxx \
--from [email protected] \
--to [email protected] \
--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:
Host: smtp.eusend.dev
Port: 465
Username: eusend
Password: <an eusend API key>
Sender email: [email protected] (must be a verified domain)
Sender name: Your AppSet 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
| Parameter | Type | Description |
|---|---|---|
Recipients | max 50 each | Up to 50 addresses each across To, Cc, and Bcc. |
Message size | max 25 MB | Larger messages are rejected with a 552. |
Sending limits | shared | The same rate limit, monthly plan limit, and progressive daily sending ceiling as the HTTP API apply to SMTP submissions. |
Tracking & events | identical | Opens, clicks, bounces, complaints, and suppression all apply — an SMTP send appears in your dashboard and analytics like any other email. |
Troubleshooting
| Parameter | Type | Description |
|---|---|---|
535 | auth failed | Wrong username or invalid key. The username must be the literal "eusend"; the API key goes in the password field. |
550 | rejected | The From domain is not verified, or the recipient is on your suppression list. |
452 | rate limited | A rate limit or your daily sending ceiling was hit. Retry later. |
421 | temporary | Temporary server error or too many simultaneous connections — retry with backoff. |