MailOven
Login Sign up
Built for QA, staging, and CI

Private catch-all inboxes for testing real app emails.

Test signup, password reset, invite, and notification flows without shared inboxes or public disposable tools. Claim a test subdomain and every email to anything@acme.mailoven.com lands in a private team inbox you can inspect in the UI or assert on from your test suite.

Start free Try the live playground

Test email flows in three steps

01

Claim one test subdomain

Pick a slug and your team gets yourcompany.mailoven.com. No mailboxes to create, no DNS work, no setup per address.

02

Use a fresh address per flow

Send your app to reset-run-42@yourcompany.mailoven.com or any other address. Every message is captured instantly.

03

Inspect or assert

Open the email in the shared inbox for manual QA, or poll via REST API / JS client from Playwright, Cypress, Jest, or Vitest.

Assert on a password-reset email

password-reset.spec.ts
import { test, expect } from "@playwright/test";
import { MailOvenClient } from "@mailoven/client";

const mailoven = new MailOvenClient({
  apiKey: process.env.MAILOVEN_API_KEY,
  slug: "acme",
});

test("password reset sends a link", async ({ page }) => {
  const inbox = "reset-" + Date.now();

  await page.goto("/forgot-password");
  await page.fill("[name=email]", mailoven.getEmailAddress(inbox));
  await page.click("button[type=submit]");

  const email = await mailoven.waitForEmail({
    to: inbox,
    filter: { subject: "Reset your password" },
  });

  expect(email.bodyText).toContain("reset");
});

Use a unique inbox per test run, then assert on the subject, body, links, or recipients.

Built for testing workflows

๐Ÿงช

Fresh address per test

Use a unique inbox like run-123@acme.mailoven.com without creating mailboxes ahead of time.

๐Ÿ‘ฅ

Shared inbox for QA

Manual testers and developers can inspect the same emails in one private team inbox.

๐Ÿ“ฆ

API + JavaScript client

Poll for emails from Playwright, Cypress, Jest, Vitest, or plain HTTP.

View docs →
๐Ÿ”’

Private by default

Your subdomain belongs to your org only. No public inbox browsing or shared throwaway addresses.

๐Ÿงน

Built-in cleanup

Delete inboxes in tests or let retention purge old staging mail automatically.

๐Ÿ””

Hooks for automation

Use API polling or webhooks to react when a new email lands.

Also included: sender allowlists plus TLS, DKIM, SPF, and DMARC results on each email.

Free while in beta

Beta

$0 / month

Free during beta for teams testing real app emails. No credit card required.

  • Unlimited addresses on your catch-all subdomain
  • Shared inbox and team invitations
  • REST API & JavaScript client
  • Configurable retention and cleanup
Get started

Drop into the tools you already use

Playwright, Cypress, Jest, Vitest, Cucumber, or plain HTTP from any stack.

๐ŸŽญ Playwright ๐ŸŒฒ Cypress ๐Ÿƒ Jest โšก Vitest ๐Ÿฅ’ Cucumber + more

Test your first email flow in minutes

Create a private test subdomain, trigger your app, and assert on the message.