Mailinator invented the public inbox — any @mailinator.com address already exists, no signup, free since 2003. That's genuinely great for a quick manual check, and no one does it better. But a test suite waits on OTPs and reset links, and those are secrets in a mailbox anyone can read. Here's the honest breakdown.
Several rows favor Mailinator, and we left them in. The public inbox is a genuinely great invention — for checking what an email looks like right now, nothing beats an address that already exists and needs no signup. Their enterprise tier receives mail at volumes we don't compete with, message injection lets you simulate delivery without sending anything real, and storage-based retention means a paid inbox keeps messages until you decide they're done. If any of those is the job, Mailinator is the right tool.
The rows that favor us are about what a CI suite actually does: create an inbox, trigger a flow, wait for a specific message, assert on its contents. On MailFixture that's one API call, one long-poll, and a typed field — the OTP arrives ranked, links arrive classified, and SPF/DKIM/DMARC verdicts plus a spam score ride along on every message without asking. On Mailinator you poll an inbox endpoint, fetch the message, and parse it yourself. Both work; one of them is your code to maintain.
Pricing shape matters as much as price. Mailinator counts seats (5 on Business) and gates private domains behind $79/mo; we count received messages and nothing else — whoever is debugging the flaky login spec has their own sign-in on every plan, including free. And one row is shared philosophy: neither product sends email. Their DNS records declare every "from Mailinator" address forged; our codebase contains no sending path at all. Receive-only is the right design for this job, and they got there first.
For private-domain suites the shape changes more than the concepts: instead of polling a fixed address and parsing what comes back, the test mints its own inbox and one long-poll returns the extracted OTP or classified link directly:
const mail = new MailFixture(); // reads MAILFIXTURE_API_KEY const inbox = await mail.createInbox({ ttlSeconds: 900 }); await page.fill('#email', inbox.address); await page.click('text=Send code'); const otp = await inbox.waitForOtp({ timeout: 30_000 }); // server-side long-poll await page.fill('#otp', otp);
waitForOtp call.