MailSlurp is a full email platform: sending and receiving, SMTP and IMAP access, permanent mailboxes, phone numbers in two countries. If your suite creates an inbox, waits for an OTP or a link, and asserts — you're pricing a platform to do a fixture's job. Here's the honest breakdown.
Several rows up there favor MailSlurp, and we left them in. It is genuinely the bigger product: sending as well as receiving, SMTP and IMAP endpoints your existing mail client code can talk to, permanent mailboxes, virus scanning, phone numbers in the UK as well as the US — with SMS sending and toll-free variants we don't offer. If your suite needs to reply to a message, drive a real SMTP client, or keep a mailbox alive for months, we are disqualified by design, not by omission.
The rows that favor us are about pricing shape as much as price. Inbox-per-test is the pattern that makes email tests reliable — and under metered inbox-creation pricing, that pattern has a marginal cost your CI bill grows with. On MailFixture, inboxes are free to create on every plan (within the active caps), because disposable inboxes are the product, not an add-on. Same with people: whoever is debugging the flaky login spec at 6pm has their own sign-in, on every plan, because we count messages, not seats.
And the last two rows are one philosophy seen from two sides. We never send mail — no reply, no forward, no SMTP client anywhere in the codebase — so our IPs can't land on a sending blocklist and no bug of ours can ever send email with your domain on it. And your test mail deletes itself on a schedule (3–30 days by plan) instead of accruing as metered storage, because a fixture's job is to exist for the duration of the test, then get out of the way.
For receiving suites the concepts map one-to-one: an inbox is an inbox, and your waitForLatestEmail + parse becomes a single long-poll that returns the OTP or classified link directly. Same test, fewer moving parts:
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, keep your assertions. If your suite uses MailSlurp's sending features, we're not a replacement at all — MailFixture cannot send email, by design.