SMTP
Send through eusend over SMTP instead of the HTTP API — a drop-in transport for anything that already speaks SMTP, from WordPress and Supabase to Django, Laravel, and Rails.
Send through eusend over SMTP instead of the HTTP API — a drop-in transport for anything that already speaks SMTP: WordPress, Supabase Auth, Django, Laravel, Rails, Ghost, 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 | Implicit TLS (SMTPS) — the connection is encrypted from the first byte. STARTTLS (587) and plain SMTP (25) are 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.
Integration guides
Step-by-step setup for the most common platforms. Every one uses the same host, port, username, and password above — only the location of the settings screen differs.
WordPress
WP Mail SMTP / FluentSMTP
Supabase Auth
Custom SMTP for auth emails
Django
EMAIL_BACKEND settings
Laravel
config/mail.php + .env
Ruby on Rails
Action Mailer delivery
Nodemailer
Node.js transport
Ghost
Transactional mail config
PHP (PHPMailer)
Plain PHP sending
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 535 carrying the reason in its text. 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.
Quick check — swaks (CLI)
Before wiring SMTP into an application, confirm your key and sender domain work with a one-line send from the terminal:
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.'Limits and behavior
| Parameter | Type | Description |
|---|---|---|
Recipients | max 50 each | Up to 50 addresses each across To, Cc, and Bcc. |
Message size | max 15 MB | The whole message on the wire, MIME encoding included. Larger messages are rejected with a 552. |
Attachments | max 20, 10 MB | Up to 20 attachments, 10 MB combined once decoded — the same limits as the API. Over either one, the message is rejected with a 552 rather than delivered without the files. |
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 or sender rejected | Wrong username or invalid key — the username must be the literal "eusend" and the API key goes in the password field. An unverified From domain also lands here, so read the response text before assuming the credentials are wrong. |
550 | rejected | The message itself was refused — every recipient is on your suppression list, or the content failed validation. |
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. |