Most Cloud Providers Block Outbound Port 25 — And It Breaks Email Verification
Email verification has a physical dependency most people never think about, and it is the reason a great many verification tools quietly cannot do the thing they are sold to do.
To confirm that a specific mailbox exists, you have to talk to the mail server that holds it. You open a TCP connection, say hello, name a sender, name the recipient, and read the number the server replies with. That conversation happens on port 25, and it happens outbound from wherever your code runs.
Most cloud providers block outbound port 25 by default.
Why the block exists
Port 25 is server-to-server mail transfer. It requires no authentication by design, because the receiving server does not know you and has no account for you — that is the whole point of the protocol.
Which also makes an open port 25 on a cheap, disposable virtual machine the perfect spam cannon. A provider that leaves it open at scale watches its IP ranges get blocklisted, and blocklisted ranges are a support nightmare that affects every innocent customer sharing them. Blocking outbound 25 by default is the cheapest way out of that problem.
Ports 587 and 465 are a different thing entirely. They are for submission — handing a message to a mail provider you have credentials with, which then relays it on your behalf. Those stay open, because they are authenticated and therefore attributable. This is why your transactional email through an API or an SMTP relay keeps working perfectly on a host where verification does not.
What we measured
We ran the same verification engine on four different networks while migrating it. These are direct measurements, each from the machine in question, not figures copied from provider documentation.
| Where it ran | Outbound port 25 | How we know | Measured |
|---|---|---|---|
| Local machine, residential ISP | Open | gmail-smtp-in.l.google.com answered 220 mx.google.com ESMTP in 0.20s |
11 Sep 2026 |
| Railway | Blocked | The service's own health endpoint reported smtp_egress: false |
Aug 2026 |
| DigitalOcean droplet | Blocked | Tested over SSH from the droplet itself. Both 25 and 587 filtered outbound | 7–8 Sep 2026 |
| Contabo Cloud VPS | Open | Google's MX answered with a 220 banner; engine reports smtp_egress: true |
9–11 Sep 2026 |
Two things stand out.
The DigitalOcean result blocked 587 as well as 25. That is more aggressive than the usual policy and worth knowing, because it means some hosts will break your outbound application email too, not only mail transfer.
The failure is silent. A blocked port 25 does not return "connection refused". It hangs, and eventually times out. From inside the application that looks identical to a slow or unreachable mail server — which is exactly why this problem gets misdiagnosed as flaky recipient servers for weeks.
A caveat on reading that table: these were true for our accounts, in our regions, on those dates. Port 25 policy varies by provider, by account age, sometimes by region, and providers change it. Several will unblock on request once you explain a legitimate use case. Do not take our table as current policy — take the method and run it yourself.
Test your own host in thirty seconds
Run this on the server, not on your laptop. Your laptop is almost certainly fine, which is what makes this easy to miss during development.
python3 -c "import socket,time;t=time.time();s=socket.create_connection(('gmail-smtp-in.l.google.com',25),8);print(s.recv(200).decode().strip());print(f'{time.time()-t:.2f}s')"
A 220 greeting in under a second or two means the port is open:
220 mx.google.com ESMTP af79cd13be357-939f48b812fsi182478985a.246 - gsmtp
0.20s
A hang ending in TimeoutError after your timeout expires means it is filtered. Test a second mail server before concluding anything — one unreachable host proves nothing:
python3 -c "import socket;s=socket.create_connection(('outlook-com.olc.protection.outlook.com',25),8);print(s.recv(200))"
Why this matters if you are buying a verifier, not building one
Here is the part that affects you as a customer rather than an operator.
On a host with port 25 blocked, a verification engine still works — partially. Syntax checks are local. MX lookups are DNS, which is not blocked. So the tool can still tell you the domain exists and has mail servers.
What it cannot do is confirm the mailbox. Every address at every working domain becomes unconfirmed, because the one question that would resolve it cannot be asked.
That leaves a vendor with two choices, and the choice tells you everything:
- Report it honestly as risky or unverified, and accept that the product looks weak.
- Report it as valid, because the domain checked out and most addresses at working domains are real anyway.
The second option produces a much better-looking accuracy statistic and hands the bounces to the customer. It is also indistinguishable from a working verifier until you actually send.
You can test any vendor for this in about a minute. Invent an address at a real domain — something like qx7zzt-not-real-9f3@gmail.com — and verify it. Gmail knows that mailbox does not exist and will say so on port 25, so a tool that can reach port 25 returns invalid. A tool that cannot returns valid, or occasionally a vague "accept-all", because all it actually checked was that gmail.com has mail servers.
Run it on ours if you like: the free email checker needs no account. That exact address returns invalid — Mailbox not found. Run it on whatever you are paying for now and see what comes back.
The second constraint nobody mentions: rate limits
Getting port 25 open is the first problem. It is not the last one, and the second one is worse because it arrives without warning.
Hosts that permit outbound port 25 still cap how much traffic they will carry over it. Those caps are much lower than you would guess. We received a volume warning from our provider within hours of the port working — triggered by a single enrichment run of fewer than fifty addresses at eight concurrent threads, plus a handful of manual test queries.
Fewer than fifty addresses. The warning said that at that pace we would hit the limit and have port 25 blocked until the following day.
We responded by cutting concurrency hard and adding a process-wide token budget in front of every probe, so list verification, the email finder and enrichment all draw from one allowance no matter how many threads each runs. Putting the limiter in a caller rather than at the probe would simply have let the next caller spend the budget again.
The strategic consequence is worth stating plainly, because it applies to every vendor in this category and none of them advertise it:
Provider SMTP limits, not code and not margins, are the real ceiling on "unlimited" email verification.
Any tool promising unlimited verification is sized against its host's port 25 allowance, whether or not it tells you. When you see that word, the useful question is not whether the vendor means it — it is what happens on the day someone uploads 50,000 addresses. The honest answer involves a queue and a disclosed rate, which is why our pricing page publishes the throughput rather than only the word.
If you are building this
Four things, in the order they will bite you.
Test port 25 from the target host before you commit to it. Not from your laptop. Not from the documentation. Ten seconds of socket.create_connection saves a migration.
Treat an unreachable mailbox as unconfirmed, never as valid. This is the whole ethical content of a verifier. If the probe did not reach a conclusion, say so. See why a verifier's "risky" category is the honest part.
Expose the port's status in your health check. We report smtp_egress as a boolean from the service root, so a host that silently degrades is detectable in one request instead of being inferred from weeks of oddly uniform results.
Set reverse DNS, SPF and your HELO name to agree. With the port open and identity mismatched, you swap a hard failure for a subtle one: servers greylist you, probes come back inconclusive, and results that should be definitive land in the risky bucket instead.
The short version
- Mailbox verification requires outbound port 25. There is no alternative port.
- Most cloud providers block it by default, and the block is silent — it times out rather than refusing.
- We measured it blocked on Railway and on DigitalOcean, which also blocked 587, and open on Contabo. Policies differ and change; test yours.
- A verifier on a blocked host cannot tell a real mailbox from an invented one. Some report the difference honestly. Some do not.
- Even with the port open, provider rate limits are the actual ceiling on verification volume — ours warned us after fewer than fifty addresses.
Common questions
Why do cloud providers block outbound port 25?
Because port 25 is server-to-server mail transfer, and an open one on a cheap, disposable VM is the ideal tool for sending spam. Blocking it by default is the least-effort way for a provider to keep its IP ranges off blocklists. Ports 587 and 465 are for authenticated submission to your own mail provider and are usually left open, which is why sending email through an API or SMTP relay keeps working while direct mail transfer does not.
How do I check if outbound port 25 is blocked on my server?
Open a TCP connection to a public mail server on port 25 and see whether you get a 220 greeting. From the server in question, run: python3 -c "import socket;s=socket.create_connection(('gmail-smtp-in.l.google.com',25),8);print(s.recv(200))". A 220 banner within a second or two means the port is open. A hang that ends in a timeout means it is filtered — note that a silent timeout, not a refusal, is the usual signature of a provider-level block.
Can email verification work without port 25?
Not properly. Syntax checks and MX lookups work fine over DNS, so a verifier on a blocked host can still tell you a domain exists. What it cannot do is ask the recipient's mail server whether a specific mailbox exists, because that conversation happens on port 25. Every address on a working domain becomes unconfirmed — which an honest tool reports as risky and a dishonest one reports as valid.
Does using port 587 instead of 25 fix it?
No. Port 587 is for submitting mail to a server you have credentials for. Mailbox verification means connecting to the recipient's mail server, where you have no account and no right to authenticate, and that transfer always happens on port 25. There is no alternative port for the check.
Which hosting providers allow outbound port 25?
It changes, and it often depends on account age and region rather than the brand, so the only reliable answer is the one you measure yourself before committing. In our own testing, Contabo allowed it, while DigitalOcean and Railway blocked it. Providers also frequently unblock on request once you explain the use case, so a block is not always permanent.
Is a rate limit a problem even when port 25 is open?
Yes, and it is the constraint people discover second. Hosts that permit port 25 still cap how much traffic they will carry on it, and those caps are lower than you would expect — we received a volume warning within hours of the port working, triggered by a single run of fewer than fifty addresses. Provider SMTP limits, not code or margins, are the real ceiling on any claim of unlimited verification.
Verify unlimited addresses for $29.99/month
Real SMTP mailbox checks. No credits, no per-email fees.
Get Started