TLS & cipher control
Offer only the protocols and ciphers you choose — force TLSv1.0
and a weak cipher to reproduce a handshake failure.
Open source · Apache 2.0 · Java 21
MTA Server · SMTP Client · Tester
One jar, three tools for people who take email seriously: a socket-level SMTP client that reproduces any sender's misbehaviour, a deliberately breakable debug MTA, and a test engine whose assertions see the whole pipeline — not just SMTP codes.
Most libraries hide the socket. Robin hands it to you — dial in the exact TLS, chunking, timing and protocol quirks of any real-world sender and reproduce interop bugs on demand.
Explore the client ServerScript failure scenarios per domain, inject chaos into any processor, and mail in diagnostic bots — or run it for real with Dovecot, durable queues, DoS protection and metrics.
Explore the server TesterJSON test cases that run as JUnit in your CI. They don't just read SMTP replies — they grep your logs, log into IMAP, call your APIs and inspect MIME.
Explore the testerThe client
Robin's SMTP client is controllable right down to the TCP writes. That's what lets it impersonate the precise misbehaviour of a real ESP and turn a flaky, unreproducible interop bug into a deterministic test.
Offer only the protocols and ciphers you choose — force TLSv1.0
and a weak cipher to reproduce a handshake failure.
Set the BDAT chunk size and split it across uneven TCP writes — exactly how different providers frame the wire.
Cut the connection after N bytes, or right before or after the final
<CRLF>.<CRLF> — mid-DATA disconnects on tap.
Add write delays every N bytes to emulate a slowloris or a struggling upstream.
AUTH-before-STARTTLS, combined LOGIN on one line, auth retries — replay the vulnerable behaviours clients really ship.
Forge client identity with XCLIENT and inject arbitrary MAIL/RCPT parameters for proxy and filter testing.
The server
Outside your configured scenarios, everything is accepted. That candour is the point: an MTA you can see straight into, bend to any failure mode, and still run for real.
Return custom responses per domain and per verb — 501 at EHLO,
554 at DATA, per-recipient regex replies.
Force the AV, spam, storage or Dovecot processor to fail on a single message — clean fault injection without breaking real services.
Mail one in and get a reply: a full SMTP session trace, or a deliverability & security report — SPF/DKIM/DMARC, MTA-STS, TLS, DNSBL, and more.
Connection and rate limits, progressive tarpitting, slowloris guards — all on by default, all counted in Prometheus.
MapDB, Redis, MariaDB or PostgreSQL backends with geometric retry back-off.
Micrometer to Prometheus & Graphite, plus Prometheus remote-write push to VictoriaMetrics, Mimir or Thanos.
Virus and spam scanning with separate reject and discard thresholds, symbol extraction and optional DKIM signing.
Per-verb HTTP callbacks that can override the SMTP response — greylist, reject or accept from your own service.
The tester
A test case is a JSON file. It runs as a JUnit test, from the CLI, or over HTTP — so it drops straight into CI/CD. And it asserts on far more than the SMTP reply.
The magic system threads data through a whole test — capture a UID from a log line and assert on it in the next envelope. Build MIME on the fly, including generated PDFs, with auto Message-ID and Date.
{
"mail": "{$mail}",
"rcpt": ["{$rcpt}"],
"assertions": {
"protocol": [
["MAIL", "250 "],
["RCPT", "250 "],
["DATA", "250 Received"]
],
"external": [
{ "type": "imap", "folder": "INBOX",
"wait": 5, "retry": 6,
"match": { "message-id": "{$MSGID}" },
"delete": true },
{ "type": "logs",
"grep": [["Custody=true", "Storage=check"]],
"refuse": ["NullPointerException"] }
]
}
}
In production, Robin runs as synthetic monitoring across 25+ environments every three hours — submitting mail, reading it back over IMAP, asserting the full transcript and delivery, and alerting Slack the moment anything drifts.
The full suite pairs Robin with everything a real mail server needs. One command, and you're running a complete, inspectable stack — no black boxes.
SMTP server + Service & Client APIs
IMAP / POP3 + LMTP delivery
Webmail front-end
Virus scanning
Spam & phishing detection
Shared auth, queue & data
# Robin + Dovecot + Roundcube + ClamAV + Rspamd + Postgres $ docker compose -f .suite/docker-compose.yaml up -d
Robin is built to come apart. Every piece is a standalone, Apache-2.0 Java library you can drop into your own tools.
Open source under Apache 2.0. Star it, fork it, file an issue, or send a merge request — contributions of any kind are welcome.