Secure Email Gateways & Mail Security

Every host in the message, checked before the message moves

A gateway already knows how to authenticate the sender. It knows far less about where the links inside the body actually go. This page is about wiring a batch lookup of DNS-verified, currently-resolving phishing hostnames into the delivery path, re-checking at click time, and going back through mail you already delivered when the list changes overnight.

390,000+DNS-verified phishing hostnames, every one currently resolving
100Domains per batch request, one credit per domain
<50 msTypical lookup latency inside the delivery path
24 hFull rebuild cycle, with an added and removed changelog
Inbound link scanning
Redirect-chain unwrapping
Click-time re-check
Quarantine & release
Retro-hunt on delivered mail
Internal-to-internal mail
Home / Use Cases / Email Security Gateways
Where the check belongs

Authentication tells you who sent it, not where it points

SPF, DKIM and DMARC are excellent at the question they were designed to answer. That question is not the one a credential-harvesting link asks.

What passes every check and still lands

An attacker registers a domain, publishes a clean SPF record, signs outbound mail with DKIM, and sets a DMARC policy that aligns perfectly. The message authenticates because it genuinely was sent by the domain it claims to come from. Nothing in that record set says the domain was created yesterday to imitate a payroll portal.

Content scoring has a matching blind spot. A short, well-written message carrying one link and no attachment gives a spam engine almost nothing to weigh. The lure has been trimmed down precisely because bulk-mail heuristics were trained on the padding that used to be there.

What a verified known-bad list answers

The lookup is deliberately narrow. It takes a hostname and reports whether that exact host has been observed and confirmed as live phishing infrastructure, with a category, a DNS status and the timestamp of the last verification. It makes no judgement about tone, sender reputation or business context.

That narrowness is what makes it safe to run inline. There is no model to tune, no threshold to argue about with a mail administrator, and no seasonal drift in accuracy. Either the host is on the verified list at the moment you ask, or it is not, and gateway policy decides what to do with the answer.

The practical effect of that split shows up in any quarantine review. Pull a week of messages a mail team released after a user complained they were held wrongly, then pull a week of messages that reached a mailbox and later turned into an account-compromise ticket. The two piles barely overlap. The released mail is usually marketing, transactional notifications and correspondence from small senders with imperfect DNS hygiene, held on reputation or authentication grounds. The compromise pile is usually mail that authenticated cleanly and scored low, carrying one link to a host nobody had ever seen before. Tightening authentication policy makes the first pile bigger without touching the second.

A verdict the gateway can explain in one sentence

A host-level known-bad check attacks the second pile directly. When a message is held because login-verify-payroll.example appears on a list of hostnames confirmed to be resolving and confirmed to be phishing, the release conversation with the recipient takes ten seconds. When a message is held because a composite score crossed 5.4, that conversation takes ten minutes and often ends in a policy exception that quietly weakens the gateway for everybody.

One database, one key, three placements

The same lookup is asked three times in a mail path, at three different moments, and each moment answers a question the others cannot. All three are covered in turn below; they differ only in call pattern.

  • In the URL-inspection stage most gateways already run — after MIME parsing, before the delivery decision is written.
  • In the click-time rewrite service, because the list is not the same object it was when the message was accepted hours earlier.
  • In a nightly job that looks backwards over journaled mail, which is where the daily changelog earns its keep.

None of this replaces the rest of the stack

Attachment sandboxing, display-name analysis, impersonation rules and the human process behind a payment-change request all remain necessary, and a message with no link at all is invisible to a URL check by construction. What the lookup provides is a floor under the link surface of inbound mail — the part of the message the user actually interacts with, and the part where a wrong click costs a password rather than an afternoon.

The delivery path

One message, four stages, one batch call

The work is mostly parsing. The lookup itself is a single request that can carry up to a hundred hostnames.

Stage 01

Extract every host

Pull URLs from the HTML part, the plain-text alternative, link attributes, and any markup carried inside an attachment.

Stage 02

Unwrap the chain

Follow shorteners and redirectors to the destination, keeping every intermediate hostname as its own candidate.

Stage 03

Deduplicate and batch

Collapse to distinct hostnames, drop anything already cached, and post the remainder in blocks of a hundred.

Stage 04

Apply the verdict

Quarantine, strip, rewrite or tag, and write the matched host into a message header for later review.

Where coverage is lost

The link surface is wider than the anchor tags

Links live in a href attributes, but they also live in image-map regions, in background and source attributes a preview pane will fetch, in the plain-text alternative some clients render instead of the HTML, and inside attachments — a PDF with an embedded action URL, an HTML file posing as an invoice, a calendar invitation carrying a join link. Attachment-borne links matter more than their volume suggests, because a user who has already opened a file is past the point where they were being careful. Extract from everything you can parse, and treat the plain-text part as a first-class source rather than a fallback.

Where the check is won or lost

A campaign almost never puts its final host in the message

It puts a shortener, or a marketing-platform click tracker, or an open redirect on a legitimate site, and the destination sits three hops away. A gateway that checks only the host written in the message checks the shortener and learns nothing. Unwrap the chain and check every hostname you touch on the way, because intermediate hops are frequently attacker-controlled staging domains that already appear on the verified list even when the final landing page is a fresh registration nobody has seen yet.

Where the cost is decided

Stage three is arithmetic, and the collapse is dramatic

The lookup is keyed on hostname, so forty links to the same newsletter domain in one message are one lookup rather than forty. Across a whole mail stream the same senders, tracking domains and content-delivery hosts recur all day, so tens of thousands of messages typically resolve to a few thousand distinct hosts before any caching is applied. Batch those in blocks of a hundred against POST /api/v1/batch, which charges one credit per domain in the request, and the per-message cost stops being a line item worth arguing over.

Where mail teams disagree

Stage four is policy rather than engineering

A verified phishing host in the visible body is a strong enough signal to hold the message outright in most environments. A verified host reached only after three redirects, inside a message that otherwise authenticates, might be better handled by stripping that link and delivering the rest, so the recipient still gets the invoice they were waiting for. Whichever you choose, write the matched hostname and the stage that caught it into a header. That header is what makes the quarantine queue reviewable and the retro-hunt described further down actually possible.

Click-time protection

The list at delivery is not the list at click

URL rewriting exists because hours pass between accepting a message and a user clicking it, and the infrastructure behind the link moves inside that window.

Rewriting is straightforward mechanically. The gateway replaces each link in the body with a URL pointing at its own click service, carrying an opaque token that maps back to the original destination. When the recipient clicks, the request lands on the click service first, which resolves the token, re-evaluates the destination, and either issues a redirect or renders a block page. Every mail-security product offering time-of-click protection is doing some version of this, and the entire value of it sits in what happens during that re-evaluation.

Same link, same message, two different answers

A message is accepted at 09:14. At that moment the link points at a host absent from every verified list, because it was registered forty minutes earlier and has served nothing yet. The recipient is in meetings and opens the message at 16:40. Somewhere in between, the host started serving a cloned single-sign-on page, was observed, was confirmed to be resolving, and entered the daily rebuild. A check performed at delivery says clean. A check performed at 16:40 against the same-day database says phishing — and only the second answer helps the person about to type a password.

This is why the click-time lookup should hit the live API rather than a snapshot the click service loaded at startup. Use GET /api/v1/check?domain=host&apikey=key for the single destination, honour the cache you already keep for the day, and accept the one credit for hosts you have not seen. The response carries last_checked and dns_status alongside the verdict, which lets the click service distinguish a host confirmed live an hour ago from one whose verification is older — useful when you want a hard block for the first and an interstitial warning for the second.

Rewriting has costs worth naming out loud

Pretending otherwise makes for a bad deployment, and mail teams who have run a rewrite service for a few years will recognise every item on this list.

  • It breaks link previews in some mail clients.
  • It makes every URL in the message look like your gateway, which trains recipients not to inspect URLs at all — a genuine long-term loss.
  • It creates a dependency in which an outage in the click service breaks links inside mail delivered weeks ago.
  • It does nothing for a user who copies the visible link text instead of clicking it.
Mitigations exist for each. Preserve the original host somewhere in the rewritten path so it stays visible, keep the click service on infrastructure independent of the scanning path, and set a rewrite expiry so ancient mail degrades to a direct redirect rather than a broken page.

Follow the chain again at click time, not just at delivery

The unwrapping work from stage two pays a second dividend here. If the click service re-follows the chain rather than trusting the destination it recorded at delivery, it catches the case where a benign-looking intermediate was repointed after the message was accepted. Open redirects on legitimate domains are used for exactly this: the host in the message never changes and never becomes suspicious, but the parameter it forwards to is swapped once the campaign is ready.

Keep the key on the server side

The API key is passed as a query parameter or in the POST body and must be used only from server-side code — the gateway, the milter, the click service. It never belongs in a browser extension, a mail-client add-in, or any JavaScript that reaches a recipient. If a rewrite interstitial needs a verdict, have the click service fetch it and render the result, rather than letting the page call the API itself.

Control comparison

What each control in the mail path actually answers

Three mechanisms often described as overlapping in fact answer three different questions, and only one of them is about the destination.

Question the gateway needs answered SPF / DKIM / DMARC Content & reputation scoring DNS-verified host lookup
Did this domain really send the message? Exactly what it is for Inferred, not proven Out of scope
Is the destination of the link hostile? Never evaluated Only by reputation proxy The single question asked
Does it work on a domain registered this week? The attacker publishes valid records Age is a weak signal alone Once observed and DNS-verified
Does it survive a compromised internal mailbox? Internal mail authenticates perfectly Trusted sender, low score The link is checked regardless of sender
Can the verdict be explained in one line? Alignment failed A composite score, rarely legible This exact host is confirmed phishing
Does it flag domains that have already gone dark? Not applicable Stale entries persist in feeds Non-resolving entries are dropped
Does it catch a message with no link at all? Only if the sender is spoofed Its strongest ground Nothing to look up

Read the last row before the others. A payment-redirection request written in plain prose, with no URL and no attachment, is invisible to a host lookup and always will be. That is the case for keeping impersonation rules, display-name analysis and a finance process that verifies bank-detail changes out of band. The table is not an argument that one column replaces another; it is an argument that the middle column has been asked to cover the second row for years and has never been good at it.

The dropped-domain row changes daily operations more than it sounds like it should

Feeds that accumulate indicators without ever retiring them generate quarantine hits on hosts that stopped resolving months ago — the campaign is over, the registration has lapsed, the link in the message goes nowhere — and every one of those still costs an analyst a review. A list that verifies DNS on each rebuild and drops whatever no longer resolves keeps the queue populated with things that are actually live, which is the difference between a queue a team works and a queue a team learns to ignore.

Cost at mail volume

The arithmetic that decides whether this runs inline

Credits are consumed per hostname, not per message — which is why deduplication and caching are the whole cost story.

1Credit per domain, whether single or inside a batch
100Maximum domains in one batch request
12Months before purchased credits expire
$0.0008Lowest per-lookup rate, on the largest package

Work an example. A gateway accepts 40,000 inbound messages on a normal weekday, and each message averages five distinct hostnames after parsing — 200,000 host references. Deduplicating within the message drops that sharply; deduplicating across the whole stream drops it much further, because the same newsletter platforms, tracking domains and content hosts appear in message after message. In practice a stream of that size resolves to a few thousand genuinely distinct hostnames a day. Call it 6,000. That is 60 batch requests and 6,000 credits, or roughly 180,000 credits a month.

Now apply a cache

Hold every verdict for the rest of the calendar day and the figure above is already the deduplicated one. Hold clean verdicts for a rolling week and the daily draw collapses to genuinely new hosts. The cache is not an optimisation you add later; it is the difference between a Growth package lasting a fortnight and a Business package lasting most of a year.

Against the published packages that sizes easily. Professional is Professional at $249/month for 100,000 lookups; Business is Business at $499/month for 250,000 lookups; Enterprise is Enterprise at $999/month for 750,000 lookups. A well-cached gateway at the volume above sits comfortably inside Business for a year, and a multi-tenant provider running the same pipeline across many customer domains — where the cache hit rate is higher still, because tenants share most of the internet — will find Enterprise or larger the right shape. lookups reset monthly and no subscription is attached to the API itself, so an unusually noisy month does not reset anything.

Two things spend credits faster than expected

Both are worth designing around before the first invoice rather than after it, and both are ordinary engineering rather than anything to do with the list.

  • Unbounded redirect unwrapping. A chain that loops, or a tracker that mints a fresh subdomain per recipient, multiplies distinct hosts without adding information. Cap the hops, and treat wildcard subdomains under a host you have already resolved as one candidate rather than thousands.
  • Two caches instead of one. Running the click-time and delivery-time checks against separate caches doubles the draw for no benefit. One cache, read by both the scanning path and the click service, keeps the arithmetic honest.
After the compromise

Internal mail is the hardest mail your gateway sees

Once one mailbox is taken, the attacker is operating inside every trust relationship the gateway was built on.

The sequence is familiar to anyone who has run an incident. A single user authenticates on a cloned sign-in page. The attacker takes the session, adds a mail rule filing replies into an obscure folder, reads enough of the mailbox to learn who this person emails and how they write, and then sends. The mail they send is internal. It originates from the real account, on the real platform, and it authenticates because it genuinely is that user. Sender reputation is perfect. Display-name analysis has nothing to flag. Every control watching the perimeter is watching the wrong door.

What survives the takeover is the link

The attacker still needs somewhere to send the next recipient — a document-share lure, a supposedly shared file, a payment portal — and that somewhere is infrastructure they control. If the internal mail path runs the same extraction and the same lookup as the inbound path, a hostname already on the verified list is caught on an internal message exactly as it would have been on an external one. It is the one control in the stack whose accuracy does not depend on the sender being untrusted.

Routing internal mail through the scanner is deliberate work

Internal mail often bypasses the gateway entirely for latency reasons. On a hosted platform, fixing that means a rule routing internal traffic through the scanning connector, or an API-based scanner that reads messages after they land and can soft-delete from mailboxes. On a self-hosted setup it means the milter runs on the internal submission path as well as the inbound one. The extraction and batching logic is identical either way, so the incremental engineering is small even where the mail-flow change is politically awkward.

Quarantine and release need a matching adjustment

A held internal message is far more likely to be genuine business mail than a held external one, so the release path has to be fast and the reviewer needs to see why it was held without opening the message. This is where the header written at stage four earns its place: the queue shows the matched hostname, the stage that caught it and the verification timestamp. Make release a two-part action — deliver the message, and record the hostname as reviewed — otherwise the same host generates the same review every time it appears in a thread.

An internal catch is an incident signal, not a filtering event

When the sender is one of your own accounts, the right response is not merely to hold the message; it is to check that mailbox for hostile rules, revoke its sessions, and look at what else it sent in the preceding hours. Teams who already run this playbook will recognise the overlap with incident response and with the alerting they push into SIEM integration — the mail verdict is the trigger, not the conclusion.

Written policy

An inbound link-handling rule you can hand to a mail team

Most gateways can enforce all of this. What is usually missing is a written statement of what the gateway is supposed to do, so the settings drift.

Inbound Link Handling — Working Rule Outline
Ten clauses, adapted per organisation and per gateway product
1
Scope. This rule applies to all SMTP traffic accepted by [gateway] for [domain], to internal submissions between [domain] mailboxes, and to any message re-injected after quarantine release.
2
Extraction. The scanner extracts hostnames from the HTML part, the plain-text alternative, link-bearing attributes and parseable attachments. A message from which no hostname can be extracted passes to the remaining controls unchanged.
3
Chain resolution. Shorteners and redirectors are followed to a maximum of [5] hops. Every hostname encountered on the path, intermediates included, is treated as a separate candidate for lookup.
4
Lookup. Distinct candidates absent from the shared cache are submitted to POST /api/v1/batch in blocks of no more than 100. One credit is consumed per domain submitted.
5
Caching. Verdicts are cached for [24 hours] for confirmed hosts and [7 days] for clean hosts. The cache is shared by the delivery scanner and the click service, and is invalidated when a database rebuild is detected.
6
Action on a confirmed host. A message carrying a confirmed phishing hostname in the visible body is quarantined. A confirmed host reached only through a redirect chain has that link stripped, and the message is delivered with a warning banner.
7
Evidence header. Every scanned message receives a header recording the scan outcome, the matched hostname where applicable, the stage that matched it, and the verification timestamp returned by the lookup.
8
Failure behaviour. If the lookup cannot complete within [2 seconds] the message is delivered with a header marking the scan as skipped, and is added to the re-scan queue in clause 9. Mail is never held on a lookup failure.
9
Retrospective re-scan. Each day, hostnames in the changelog's added list are matched against evidence headers for mail delivered in the preceding [30 days]. Any match raises an incident ticket naming every recipient.
10
Review and release. Quarantined mail is reviewed within [4 business hours]. A release records the reviewer, the reason and the hostname, and no release creates a standing exemption for the sending domain.
Why write it down. Gateway settings get edited under pressure, usually during an outage or after a loud complaint about a held message. A rule outline gives the person making that edit a statement of intent to edit against, and gives the next administrator a reason for a setting that would otherwise look arbitrary.
Looking backwards

Journaling, the daily changelog, and mail you already delivered

The most valuable thing about a list rebuilt every twenty-four hours is the diff, and the diff is only useful if you kept a record of what you let through.

POST /api/v1/batch

Delivery-path scanning

Up to 100 hostnames per request, one lookup each. The workhorse call for the inbound and internal scanning paths.

GET /api/v1/check?domain=

Click-time re-check

A single hostname answered against the current database. Used by the click service when a rewritten link is followed.

Daily CSV feed + changelog

Retro-hunt and offline work

The full database as CSV on a separate subscription, plus the daily added and removed lists that drive the backwards search.

Retro-hunting works because of a simple asymmetry: a host unknown at 09:14 is frequently known by the following morning's rebuild. If you journal delivered mail, or if you simply retained the evidence headers described in the rule outline, you can answer the question that matters after the fact — did anybody receive a message pointing at a host we now know is phishing? The job is unglamorous. Pull the day's added list from the changelog, match it against the hostnames recorded for the last thirty days of delivered mail, and produce a list of recipients. It runs in minutes and it finds things nothing else in the stack will.

What you do with a hit depends on how much of the platform you can reach

Either way the incident starts from a specific hostname and a specific recipient list rather than a vague alert, which is exactly what makes it actionable.

  • Where purge exists — on a hosted platform with a purge capability, a match can trigger a soft delete from the affected mailboxes before the recipient is even at their desk.
  • Where purge does not exist — the output is a notification and an account review: check whether the recipient clicked, check the sign-in logs for that account around the delivery time, and force a credential reset if there is any doubt.

Use the CSV feed for the backwards job, not the API

Matching thirty days of journaled hostnames one lookup at a time would be enormous and pointless; loading the day's added list locally and doing a set intersection costs nothing per record. The feed is a separate subscription from API credits precisely because the two workloads differ — one is per-decision and latency-sensitive, the other is bulk and offline. That same feed also suits DNS resolvers, firewall block lists and the offline analysis described on the daily feed page.

Here is the shape of the two calls a gateway makes: the batch request during delivery, and the single check from the click service.

Gateway integration — batch scan and click-time check
# Delivery path: every distinct host extracted from one batch of messages
curl -s -X POST https://phishingdetectionapi.com/api/v1/batch \
 -H "Content-Type: application/json" \
 -d '{"apikey":"YOUR_KEY",
 "domains":["mail.tracking-partner.example",
 "sso-account-verify.example",
 "cdn.newsletter-platform.example"]}'

# Click service: one host, answered against today's database
curl -s "https://phishingdetectionapi.com/api/v1/check\
?domain=sso-account-verify.example&apikey=YOUR_KEY"

# Response shape returned for each domain
{
 "domain": "sso-account-verify.example",
 "is_phishing": true,
 "category": "phishing",
 "dns_status": "active",
 "last_checked": "2026-07-27T04:18:00Z",
 "confidence": "high",
 "database_size": 390000
}

Fail open on the delivery path, and mean it

Clause 8 says so deliberately. Mail that stops moving because a lookup timed out is an outage your users feel within minutes, and a gateway that holds mail on infrastructure failure will be switched off by an administrator at two in the morning. Deliver, mark the header, and let the re-scan queue pick the message up. That behaviour also means the check can be introduced into a live mail path without a maintenance window, which matters when the alternative is never introducing it at all.

If the gateway feeds a broader detection programme, the verdicts are worth exporting rather than discarding. A hostname appearing repeatedly across many recipients is a campaign, and knowing which department it reached first is genuinely useful to the people running security awareness programmes. Teams already correlating indicators across controls will want the same verdicts alongside their threat intelligence pipeline, and organisations operating their own resolvers usually pair mail scanning with DNS filtering so a host blocked in mail is also unreachable from the browser. Where the same organisation also ships an agent to laptops, the verdicts belong in endpoint protection as well, since that is the layer that still applies when the device is off the corporate network.

Questions from mail teams

What administrators ask before this goes near the delivery path

The objections below come up in roughly this order, and every one of them is reasonable.

How much latency does this add per message?

The lookup itself is typically under 50 milliseconds, and a batch call covering up to a hundred hostnames costs about the same as a single one — it is one round trip regardless of how many domains it carries. For a message whose hosts are already in the shared cache, the added time is a local memory read.

In practice the parsing dominates. Extracting URLs from a large HTML part and following redirect chains takes longer than the API call does, which is why the hop cap in clause 3 exists. Set a hard timeout on the whole scan stage, fail open when it is exceeded, and the delivery path stays predictable even when a remote redirector is slow to answer.
We already run a commercial URL reputation service. Why add another list?

Because the two answer differently shaped questions. A reputation service scores a host on a spectrum, blending age, hosting, category and observed behaviour, tuned to a threshold you generally cannot inspect. A verified known-bad list answers one binary question about one hostname and tells you when it last confirmed the answer.

  • Running both means a host that scores mid-range but is confirmed live phishing gets blocked rather than passed.
  • When two independent controls disagree, the one naming a specific hostname and a verification timestamp is the one a reviewer can act on.
  • It is also the one that produces a defensible answer when a sender calls to ask why their mail was held.
What about a host registered minutes before the message arrived?

It will not be on the list, and no honest description of this control claims otherwise. A hostname registered forty minutes ago that has not yet been observed serving anything cannot be in any verified database, because verification requires observation. A delivery-time lookup against a brand-new host returns clean, and returning clean is the correct behaviour.

That is precisely why the click-time re-check and the daily retro-hunt exist, and why both are described at length above rather than as footnotes. The gap between registration and detection is real; the design response is to ask the question more than once — at delivery, at click, and again the next morning against the changelog.
Does this work for mail hosted on a cloud platform rather than our own gateway?

Yes, though the integration point moves. Instead of a milter or content filter in the SMTP path, you either route mail through a connector that performs the scan before delivery, or you run an API-based scanner that reads messages as they land and acts on them afterwards. The second pattern delivers first and remediates within seconds, which is weaker than blocking but far easier to deploy.

The scanning logic does not change between the two. Extraction, chain resolution, deduplication and the batch call are identical; only the trigger and the available actions differ. Most teams that start with the post-delivery pattern move to the inline one once they have a month of data showing what it would have caught.
How do we keep credit consumption predictable across a multi-tenant platform?

Share one cache across tenants for the lookup itself, and account per tenant separately. Tenants overwhelmingly see the same internet — the same newsletter platforms, the same cloud hosts, the same trackers — so a shared cache gives a hit rate no single-tenant deployment can match. What each tenant then costs you is the count of hostnames genuinely new when their mail arrived.

For sizing: the packages run from Growth at $99/month for 25,000 lookups to Enterprise at $999/month for 750,000 lookups, with lookups reset monthly and no subscription attached. A provider running a shared cache usually finds the per-tenant marginal cost small enough to fold into an existing security bundle rather than meter it. The pricing page lists every package.
What happens when the API is unreachable during a delivery spike?

The message is delivered, the header records that the scan was skipped, and the message enters the re-scan queue. This is a deliberate design choice rather than a limitation: any control placed inline in a mail path has to degrade toward delivery, because held mail is an outage and users escalate outages fast.

The re-scan queue then closes the gap. Because those messages carry a header marking them unscanned, the same nightly job that runs the changelog match can re-extract their hostnames and check them, producing the same recipient list and the same remediation path as a retro-hunt hit.
Will this generate false positives on legitimate marketing infrastructure?

The list contains hostnames confirmed as phishing infrastructure and verified as currently resolving, so a large marketing platform's sending or tracking domains are not the sort of thing that lands on it. The more realistic edge case is a legitimate host that was compromised and used to serve a phishing page — in which case the block is correct while the page is live, and the entry leaves the database once the host stops resolving that way.

  • Where a genuine dispute arises, the evidence header gives the reviewer the exact hostname, the matching stage and the verification timestamp.
  • Release the message and record the decision so the same host does not generate the same review twice.
  • Keep the exemption scoped to that hostname rather than to the sending domain, so a later campaign from the same sender is still caught.
Honest limits

What a host lookup will never do for your mail path

The value of this control comes from being narrow. Being clear about the edges is what keeps it trusted.

A message with no link at all

Wire-transfer fraud, vendor bank-detail changes, gift-card requests and most of what gets filed under business email compromise are conversations, not URLs. They are defeated by out-of-band verification and a finance process that does not treat email as an instruction channel. If a supplier emails new bank details and somebody pays them, no URL database was ever going to be part of that story.

A lure hosted on a large legitimate platform

When the bait is a document on a mainstream file-sharing service, or a page on a general-purpose hosting subdomain, the hostname is shared with an enormous amount of legitimate traffic and blocking it is not an option. This is a real and growing gap, and the honest answer is that the unit of decision — the hostname — is the wrong unit for that case. Page-level analysis and attachment sandboxing are the controls that address it.

The window between registration and observation

Everything above about click-time re-checking and the daily changelog is an attempt to shrink that window, not to pretend it does not exist. A campaign that registers, sends and burns its infrastructure inside a couple of hours can complete entirely within the gap, and the retro-hunt will find it the next morning — useful for remediation, useless for prevention.

What it does do, cleanly and without argument

It removes the large population of hostnames already caught and still live, and that population is not small: the database holds more than 390,000 DNS-verified active phishing domains at any moment, rebuilt every twenty-four hours so dead infrastructure is dropped rather than accumulated. Every one of those hosts is a link that will not resolve into a login form in one of your users' browsers. That is a floor, not a ceiling, and a mail team that describes it that way internally will get more out of it than one that oversells it.

Put the link check where the message decision is made

Batch every extracted hostname during delivery, re-check at click time, and let the daily changelog tell you what you delivered before anyone knew better.