-
cPanel Catch-All Checklist: Verify MX Before You Enable
A cPanel default address set to catch all unrouted mail looks like a one-click fix for typo’d addresses, but it only works if inbound mail actually lands on the cPanel server. Before you enable anything, run an MX lookup on the domain. If the MX record points to a third-party filter, a remote mail gateway, or a Microsoft 365 tenant, the catch-all never sees the message, and nobody gets a bounce warning you about it.
The myth worth killing first: that a catch-all mailbox is a universal safety net you can switch on and forget. In cPanel it is a per-domain default address that accepts mail for unknown local recipients, and its behavior depends entirely on where the MX record sends traffic. A domain with MX pointed at the cPanel host accepts and routes as expected. A domain with MX pointed elsewhere accepts nothing at the cPanel layer, no matter how the default address is configured. The same logic explains why Microsoft 365 lacks a native catch-all setting and why Exchange administrators lean on an internal relay mail flow rule instead: the receiving platform, not the mailbox, decides what happens to mail for unknown recipients.
This checklist walks the order that matters. Verify MX with dig or an MX lookup tool, confirm the domain’s mail exchanger is local rather than remote, then enable the default address and test with a deliberately bad address. The sections that follow cover the exact cPanel steps, the failure modes that make a catch-all silently drop mail, and how the cPanel approach compares with a Microsoft 365 catch-all mailbox built on an internal relay domain. Get the MX check right and the rest is a five-minute job. Skip it and you will spend an afternoon debugging a catch-all that was never in the delivery path.
A cPanel catch-all is not a mailbox. It is a fallback rule attached to a domain’s default address. When the local mail server accepts a message for an address that does not exist in the domain’s account list, forwarders, or aliases, it hands the message to the default address instead of bouncing it. That single behavior is why the feature is popular with small businesses that keep receiving mail for old staff names, typo’d addresses, and role accounts like info@ that were never created.
The rule only fires after delivery. Mail must first reach the cPanel server, and the MX record is what decides that. If a domain’s MX points to a third-party filter, a hosted email provider, or a registrar’s forwarding service, the cPanel box never sees the envelope and the default address stays silent. The catch-all looks enabled in the panel and does nothing. This is the most common reason admins report that a catch-all «stopped working» when nothing in cPanel changed.
Here is the path a message takes, in order:
Step 3 is the fork in the road. A remote mail exchanger that is not the cPanel server may accept the message and drop it, accept it and forward it to a mailbox that also does not exist, or reject it outright. Any of those outcomes bypasses the catch-all entirely. The cPanel default address has no visibility into what happens upstream.
The practical consequence: a catch-all is a local delivery feature, not a domain-wide safety net. It protects only the mail stream that terminates on the cPanel host. Confirm the MX chain points there before touching the default address setting, and treat any third-party MX entry as a reason to fix routing first. The pre-flight check in the next section covers exactly how to verify that with dig and a live SMTP test.
Enabling the default address takes about thirty seconds in cPanel. Verifying that mail for the domain actually arrives at that server takes ten minutes, and skipping it is the single most common reason a catch-all appears broken. Run the checks below before you touch the Default Address tool.
1. Confirm which server holds the MX record. On Windows, run nslookup -type=mx example.com. On macOS or Linux, run dig example.com MX +short. Read the hostnames, not just the priorities. If the answer is mail.example.com and that hostname resolves to the cPanel server’s IP, the catch-all will see every message addressed to the domain. If the answer is a filtering service such as a hosted gateway or a spam vendor, the cPanel server never receives the unknown-recipient mail, and the default address stays silent no matter how it is configured.
2. Check the IP, not the name. Resolve each MX hostname with dig mail.example.com A +short and compare the result against the server IP shown in cPanel under General Information. A hostname that looks local but resolves to an external filter is the classic trap. Also watch for a stale MX entry left over from a previous host: a priority 10 record pointing at the old provider will capture traffic even after the new record is added.
3. Inspect priorities for split routing. Multiple MX records with different priorities mean mail flows to the lowest number first and only falls through to the next record if the first is unreachable. A setup with priority 10 at a third-party filter and priority 20 at the cPanel server will deliver everything to the filter, and the catch-all will only catch mail during a filter outage. That behavior looks intermittent and is frequently misdiagnosed as a cPanel bug.
4. Test delivery from outside the network. Send a message to a made-up address at the domain, for example nobody-9182@example.com, from an external account such as Gmail. Before enabling the catch-all, that message should bounce with a «user unknown» reply generated by the server that holds the MX. Read the bounce headers. If the rejection comes from the filtering provider, the catch-all in cPanel cannot help. If it comes from the cPanel server’s Exim, you are clear to proceed.
5. Account for propagation and caching. Recent MX changes can take up to 24 to 48 hours to propagate, and resolvers may serve cached answers for the length of the record’s TTL. Query a public resolver directly, for example dig @1.1.1.1 example.com MX +short, to see what the wider internet currently believes. Enabling a catch-all against an MX record that is still mid-change produces results that shift by the hour.
Only after all five checks pass does the Default Address setting have a chance to do its job. catch-all in Exchange Online covers this in more depth. If any check fails, fix DNS first. The catch-all configuration itself is rarely the problem.
You have confirmed the MX records point at the cPanel server. Now the order of operations matters: cPanel will happily let you create a default address on a domain whose mail never reaches it, and the UI gives no warning. Work through this checklist top to bottom.
Only after steps 6 and 7 pass should you point real traffic at the domain. A catch-all that accepts mail and drops it is worse than no catch-all, because senders get a success response and never learn the message vanished.
A catch-all that stops working is almost never a cPanel bug. In practice, the cause is one of three things: the MX record does not point at the cPanel server, the domain is set to remote mail exchanger in cPanel, or a second routing rule grabs the message before the default address ever sees it. Work through the failure modes below in order, because each one makes the later checks meaningless.
Misconfigured MX priority. A domain can have several MX records with different preferences, and mail servers deliver to the lowest number first. If an old MX entry with priority 5 still points to a third-party filter while the cPanel server sits at priority 10, every message goes to the filter, and the catch-all never fires. Run dig MX yourdomain.com +short or check the Email Deliverability page in cPanel, then compare the result against the hostname shown in the cPanel zone editor. A stale record left over from a previous provider is the single most common culprit.
Remote versus local mail exchanger. cPanel has a per-domain toggle that decides whether the server accepts mail for the domain at all. When the domain is set to remote, cPanel announces that it does not handle mail for it, and local delivery, including the default address, is bypassed. Look at the domain’s mail settings in WHM or cPanel and switch it to local if the box is meant to receive mail. Then re-test with an address that does not exist, such as nobody-here@yourdomain.com, and read the full headers of the bounce. An «unknown user» message generated by the cPanel server itself means local delivery is working and the catch-all rule is the problem; a rejection from an outside host means mail never arrived.
Email routing conflicts. The default address competes with forwarders, aliases, and per-address filters, and the specific rule always wins. If a forwarder exists for a name that an outside sender happens to use, the catch-all will not catch it. Audit the forwarders list for wildcard-like entries and remove duplicates. Also check the mail log: run exim -bt nobody-here@yourdomain.com from the shell as root, and the router chain printed will show exactly which rule handles the message. If the output ends in a local delivery to the default address, routing is fine and the issue lies in mailbox storage or quotas.
One comparison is worth keeping in mind: on an authoritative accepted domain, Microsoft 365 rejects unknown recipients at the edge through Directory-Based Edge Blocking, so a bounce arrives fast and clearly. On cPanel, a broken catch-all often fails silently because the message is accepted somewhere upstream and dropped. Silence is the symptom to chase, not the error.
cPanel gives you a catch-all with a dropdown and a save button. Microsoft 365 does not ship one at all, and the workaround administrators use has real costs. If you are moving a domain between the two platforms, or running both, it helps to see exactly where the mechanics diverge.
| Aspect | cPanel default address | Microsoft 365 / Exchange Online |
|---|---|---|
| Native catch-all | Yes, per domain | No native setting |
| Mechanism | Default address catches unmatched local recipients | Internal relay accepted domain plus a mail flow rule |
| Who can configure it | Any cPanel user with email rights | Exchange administrator role |
| Unknown-recipient handling | Delivered to the default address | Rejected at the edge unless relay is enabled |
| Recommended by vendor | Supported feature | Microsoft documentation advises against internal relay when all recipients are in Microsoft 365 |
The Microsoft 365 catch-all mailbox story starts with a gap: Microsoft 365 lacks a native catch-all setting. Authoritative accepted domains enable Directory-Based Edge Blocking, which rejects mail for unknown recipients at the edge before it ever reaches a mailbox. That is good anti-spam behavior, and it is exactly why a catch-all cannot simply be switched on. To loosen it, an administrator changes the accepted domain to an internal relay domain. Internal relay relays mail for unknown recipients onward instead of bouncing it, but it expects a connector to an on-premises mail server. With no server on the other end, you need a mail flow rule to catch what relay releases. The rule redirects unknown-recipient mail to one mailbox.
That is the whole Exchange Online catch-all trick, and it has three costs worth naming. First, the target mailbox takes every misspelling, every dictionary attack, and every spam message aimed at a guessed address, so budget storage and filtering accordingly. Second, the rule has to be scoped carefully: a badly written condition can redirect legitimate mail, and a rule that redirects rather than forwards keeps the original recipient visible but still funnels volume. Third, anyone editing it needs the Exchange administrator role, which is a heavier permission than a cPanel user clicking into Email > Default Address.
There is a cleaner middle path on Microsoft’s side. A shared mailbox with aliases preserves an authoritative domain, keeps DBEB rejecting junk at the edge, and covers the addresses you actually know about. It does not catch invented recipients, but it avoids the internal relay mail flow rule entirely. Use the Office 365 catch-all email workaround only when losing mail to unknown addresses is genuinely worse than the spam load, and document the rule so the next administrator knows why the domain is set to internal relay.
Practical rule of thumb: on cPanel, verify MX and enable the default address. On Microsoft 365, prefer shared mailbox aliases, and treat the internal relay plus mail flow rule combination as a deliberate trade-off rather than a default.
The practical next step is to write down your MX target before you touch the default address setting. Run dig MX yourdomain.com +short or check the Email Deliverability page in cPanel, and confirm the hostname that answers matches the server where you plan to create the catch-all. If the answer is a third-party filter, a gateway, or a Microsoft 365 tenant, the cPanel default address will collect nothing, no matter how many times you toggle it. Fix the MX first, wait for the TTL to expire (often 3600 seconds, sometimes 300), then enable the catch-all and send a test message to a random address such as nobody-here-9x@yourdomain.com from an outside account. Check the target mailbox for delivery and read the headers to see which server accepted it.
Keep the same discipline when the domain lives in two places. If you run a Microsoft 365 catch-all mailbox or an Exchange Online catch-all workaround through an internal relay mail flow rule, the cPanel side must not also answer as the public mail exchanger, or mail will bounce between systems. Pick one inbound path per domain: either MX points to the cPanel server and the default address handles unknown recipients, or MX points to Microsoft and an internal relay domain plus a mail flow rule redirects unknown-recipient mail to a shared mailbox. Document the choice in your runbook, review it whenever DNS changes, and retest with a fresh unknown address after every MX edit. That single test message is the cheapest proof you will ever get that the catch-all is actually doing its job.