Proxy Mail QA

Test that unsubscribing actually stops the email

An unsubscribe that doesn't stick turns into spam reports, and Gmail and Yahoo now expect one-click unsubscribe from bulk senders. Check the headers and link on every marketing email, unsubscribe like a person would, and Proxy Mail QA flags any marketing that still arrives, however late.

Updated

Two ways to unsubscribe

What Proxy Mail QA checks on every marketing email

Check Fails or warns when
list_unsubscribe There’s no List-Unsubscribe header (it fails), or it has only an email address or a plain http one (it warns)
one_click_unsubscribe No List-Unsubscribe-Post header with an https address, or the email’s DKIM signature doesn’t cover both List-Unsubscribe headers, so an inbox’s button can’t unsubscribe in one step (a warning)
unsubscribe_link The email itself has no unsubscribe or email-preferences link
after_unsubscribe It came after the address unsubscribed from its sender

The inbox shows both kinds of unsubscribe link for each email, with Open link and Copy.

Test it

  1. Sign up and opt in with a new address, then trigger a marketing email such as a newsletter.
  2. Check the email: the checks above show in the inbox.
  3. Unsubscribe with the link, in your own browser.
  4. Choose Mark as unsubscribed on that email, with a grace period if marketing already queued may still come (an hour, a day). The inbox says it’s watching for marketing from that sender, with Stop watching.
  5. Trigger more email: another newsletter should never come, while a receipt or a password reset should.

Any marketing email after that shows a warning in the inbox and on the Accounts page, with Open email, and Reports lists it.

In a test

unsubscribe.spec.ts
const link = await qa.waitForLink(address, { type: 'unsubscribe', since: signedUp });
await page.goto(link);
await page.getByRole('button', { name: 'Unsubscribe' }).click();
await qa.markUnsubscribed(address, { service: 'acme.com' });

// Trigger the next campaign, then: no marketing for 10 minutes, receipts allowed.
await qa.expectNoEmail(address, { since: new Date(), category: 'marketing', timeout: 600 });

type: 'list_unsubscribe' returns the header’s one-click address instead: POST List-Unsubscribe=One-Click to it, as an inbox’s button does. Later, in another test or after the next real campaign, checkUnsubscribe(address) lists any marketing that came after. Agents use wait_for_link with kind unsubscribe, mark_unsubscribed and check_unsubscribe, and the test_unsubscribe prompt walks through it.

Try it on your next sign-up test

Free plan, no credit card. Create an address and watch the code or link arrive.

Create a free accountOpen the app

Questions

Do I need to switch anything on?

Yes, for now. Marketing and offer emails is in Labs: switch it on in the app under Account settings → Labs. It applies to your API keys and agents too; until then their marketing tools answer with an error that says so.

Does Proxy Mail QA click the unsubscribe link?

No, never. It shows the link with Open link and Copy and gives tests and agents the link, so the unsubscribe happens the way a person's would. Marking the address as unsubscribed only starts the watch.

How long does the watch last?

As long as the address does. Any marketing email from that sender after the time you marked counts, a minute or three weeks later, until you stop watching or mark the address as subscribed again.

Will receipts be flagged too?

No. Every email is typed as sign-in, transactional or marketing, and only marketing breaks the watch. Receipts, password resets and security notices should keep arriving after an unsubscribe.

How quickly must marketing stop?

It depends on where the person lives: 10 business days in the US and Canada, 5 in Australia, and promptly in the EU and UK. Give the account a country and the deadline is checked too. See marketing rules by country.

Built your app with an AI tool? Pick yours