Your mailer already speaks the protocol.
Standard SMTP on seven ports, or a small HTTP API. Keep the library you have; keep the providers you have.
Mailway is deliberately SDK-free: it speaks standard SMTP on seven ports (587, 25, 2525, 2587, 588, 465, 2465 — TLS on every one), so Nodemailer, Laravel, Rails, smtplib, or anything else that ships mail today connects by changing host, port, and credentials (the quickstart).
A development sandbox at smtp.mailway.dev captures mail without delivering it — same credentials, different hostname — and the HTTP API covers stacks where SMTP feels like archaeology. The protocol behaviour, port matrix, and relay fidelity rules are documented in the SMTP reference.
No SDK.
That's a feature.
It's standard SMTP — Nodemailer, smtplib, Laravel's mailer, ActionMailer and net/smtp already speak it fluently. Nothing to install today, nothing to rip out later. Prefer HTTP? The REST API comes with bearer auth, idempotency keys, and batch send.
- Change one config block. Ship. That was the migration.
- TLS on every connection — STARTTLS and implicit TLS.
- Staging that can't email your customers — point it at
smtp.mailway.devand everything is captured, nothing is delivered until you explicitly release it.
GCP blocks port 25 outright. DigitalOcean blocks 25, 465and 587 outbound. The alternate ports mean your app sends from wherever it happens to run.
This is the whole
integration
Your app speaks the SMTP it already knows and gets250 OKthe moment Mailway takes the message. Provider selection, failover, delivery logging — all of it happens after the handoff, and every byte of this session ends up in the log. Yes, including the awkward parts.
Standard ESMTP. Every client, library, and framework already knows how to talk to it.
Your app sends exactly what it sends today. AUTH, MAIL FROM, DATA — nothing proprietary.
After 250 OK your app is done. Failover and logging are invisible to the sender — and fully visible to you.
Or just POST it
The same pipeline — failover, timeline, archive — behind one JSON endpoint, for stacks where SMTP feels like archaeology. Send with afetch(), get back the same mail ID you'll see in the dashboard, the public viewer, and the webhooks.
mw_test_… drives the sandbox, mw_live_… is production. No guessing which environment you just emailed.
Put an Idempotency-Key on the request and retry as hard as you like — a repeated key returns the original send instead of a duplicate.
Up to 100 messages per request, answered with a 207 and a per-message status — you know exactly which ones made it.
Hit the monthly quota and the 429 comes with a Retry-After header and a machine-readable error code. Not vibes.
live on api.mailway.net · sandbox on api.mailway.dev
Every port. Every cloud.
GCP blocks port 25. DigitalOcean blocks 25, 465 and 587 outbound. Corporate firewalls do whatever they want. Mailway listens on all 7 SMTP ports, so your app connects from wherever it runs — no ticket to the network team required.
The alternate ports (2525, 2587, 2465, 588) are the escape hatch when the standard ones are blocked. TLS on every single one.
Your mailer config has
one line to change
Mailway is in private beta — we onboard teams one at a time. Leave your email and we'll send your invite when it's your turn.