Skip to content

Email Deliverability

Everything under Email → Authentication is about one domain: does example.com publish the right SPF, DKIM and DMARC records. Email deliverability asks the other half of the question, and it is about the whole machine: when this server opens a connection to Gmail or Microsoft 365, does it get accepted?

Those are different failures. A domain can have flawless SPF and still have every message refused, because the address the mail physically left from is on a blocklist, or has no reverse DNS, or the server introduced itself with a name that belongs to the hosting provider rather than to you.

The page lives at Email → Email deliverability and is available on every edition. It is administrator-only: everything on it is server-wide, and none of it is something an individual hosting account could act on.

You do not have to remember to look. Whenever a check needs attention, the menu entry carries a badge with how many — amber while something is only going to cost you delivery, red once something already is. With the menu collapsed to its icon rail the badge becomes a dot on the icon, in the same two colours. No badge means every check passed the last time they were run.

The Email deliverability page: a red summary banner reading "2 problems are costing you delivery", above a list of check cards. A failed HELO check says the server announces itself as vps-1a0b77bc.vps.ovh.net rather than server.example.com and offers a Fix button; a failed blocklist check names a Spamhaus CSS listing for the IPv6 address and links to the delisting form; an amber reverse-DNS check notes that only the provider can change it and offers no button; a dashed grey card reports that SPF could not be checked for 2 of 6 domains; and a green card confirms outbound mail prefers IPv4. Beneath them, the sending address 203.0.113.25 carries one pill per blocklist, each spelling out its verdict: two green ones reading "Spamhaus Zen · clean" and "SpamCop · clean", and a dashed grey one reading "UCEPROTECT · no answer".

Each one reports ok, a warning, a failure, or unknown.

The name your server gives when it starts an SMTP conversation. CorePanel compares it with your panel domain — the one name that, by construction, resolves to this server.

Fresh servers usually fail this. The installer seeds the name from the operating system’s hostname, which on a VPS image is something like vps-1a0b77bc.vps.ovh.net or almalinux-2gb-nyc1-01. Receiving servers weigh that name against the reverse DNS of the sending address and against the domain you are sending for, and a mismatch costs reputation on every message.

Fix sets it to your panel domain and reloads Postfix.

The name the sending IP address resolves back to.

  • No PTR at all is a failure. Several large providers reject on it before looking at anything else.
  • A PTR that does not match your HELO is a warning. It costs reputation rather than the delivery.

CorePanel cannot repair this one, and says so: the PTR of an IP address is set by whoever owns the address — your hosting provider — from their control panel, never from the server itself. Set it to the same name as the HELO.

CorePanel queries Spamhaus Zen, SpamCop and UCEPROTECT Level 1 for each address your server sends from, and names the sub-list when it finds one. That matters because the work differs completely:

Spamhaus sub-listWhat it meansWho fixes it
PBLThe provider declares this address should not send mail directlyYour provider, or relay through a smarthost
CSSLow-reputation or snowshoe sending was seen from this addressYou — then request delisting
SBLA spam source is or was operating on this addressYou — find and stop it first
XBLThe address looks compromised or is running an open proxyYou — it usually means a hacked site or mailbox

When an address is listed, the check links straight to that list’s delisting form.

This is the one thing worth reading carefully. Blocklists refuse to answer queries that arrive through a public resolver — Google’s 8.8.8.8, Cloudflare’s 1.1.1.1, Quad9 — and they refuse once a resolver goes over its daily budget. Spamhaus signals that with an answer that looks, to careless software, exactly like a listing.

CorePanel reports it as unknown and tells you why. It never renders as a pass, because “we could not check” and “your address is fine” would send you in opposite directions. If you see it, point the server at its own resolver and check again.

Results are cached for an hour for the same reason — a page that queried on every refresh would burn through the budget and end up unable to check anything.

Which of IPv4 and IPv6 your server tries first — and the setting most likely to be quietly costing you mail.

Postfix’s own default is any, which does not mean “whichever works”. It means picking at random, per destination, whenever that destination publishes both an A and an AAAA record. Microsoft 365, Google Workspace and most hosted filters publish both. So on a default configuration, roughly half of your mail to those recipients leaves over IPv6.

That is a problem because of how providers hand out addresses. Your IPv4 address is yours: you control its PTR, and your SPF records authorise it. Your IPv6 address comes out of a block the provider assigns wholesale, often with no reverse DNS, no reputation of its own, and — unless you published an AAAA record or an ip6: mechanism — not authorised by your SPF either. It is a coin flip between delivery and a 550.

CorePanel installs with smtp_address_preference = ipv4, so new servers do not have this problem, and servers installed before this existed pick it up when they update. IPv6 is still used as a fallback when no IPv4 address of a destination accepts a connection, so nothing becomes unreachable. Use Fix to apply it, or the CLI to go back to any.

A roll-up across every mail-capable domain on the server — how many publish each record — so you can see at a glance whether the gap is one domain or all of them. Per-domain editing stays where it was, under Email Authentication.

The SPF check has one extra rule worth knowing: if outbound mail may still leave over IPv6 and your SPF records do not authorise that address, it warns even when every domain has a valid record. That combination — a perfectly good SPF that does not cover the address the message actually came from — is invisible from the per-domain page.

The DKIM check reports the signer before the records: if Rspamd is not answering, nothing is being signed no matter how many domains publish a key.

Terminal window
corepanel mail deliverability # run the checks (cached for an hour)
corepanel mail deliverability --refresh # re-run everything, blocklists included
corepanel mail deliverability repair-helo # set the HELO to the panel domain
corepanel mail deliverability prefer ipv4 # or: prefer any

The terminal output uses [ ok ], [warn], [FAIL] and [ ? ]. As on the page, [ ? ] means the check could not be made — not that it passed.

A message to a Microsoft 365 recipient bounces with:

550 5.7.1 Service unavailable, Client host [2001:41d0:305:2100::1:3d3a]
blocked using Spamhaus.

Read it in order. The address in brackets is IPv6, so the message left over IPv6 — meaning the address preference was any and the coin came up tails. That address is on Spamhaus. The server’s IPv4 address is clean and would have delivered.

Two things to do, in this order:

  1. Prefer IPv4. This fixes the delivery immediately and permanently. It is the outbound_preference check.
  2. Request delisting for the IPv6 address, from the link in the reputation check. Note that Spamhaus lists IPv6 by /64, so if the neighbourhood is dirty it may come back — which no longer matters once mail does not leave that way.

While you are there, the same page will very likely show a HELO still set to the provider’s generic hostname, and a PTR to match. Fixing both is worth doing: they are what the next receiving server judges you on.