Pricing
from $1.00 / 1,000 results
Email Security Scanner
DNS-only email posture for any domain: MX, SPF, DMARC, DKIM probes, MTA-STS, BIMI. No email sent. Returns score + actionable tips. Batch-friendly for CRM domains and compliance snapshots.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
a month ago
Last modified
Categories
Share
Email Security Scanner (SPF / DMARC / DKIM / MX)
Passive DNS-only scan of a domainβs email authentication posture: MX targets with provider hints, SPF (v=spf1) parsing, DMARC at _dmarc, DKIM discovery via a bounded list of common selectors, plus MTA-STS and BIMI when published. No email is sent β there is no SMTP verification step.
Outputs a 0β100 email security score with a letter grade, plus human-readable issues and recommendations. Optional DNS fields are omitted from JSON when not present (no null noise β easier to read and harder to mistake for an actor failure).
What it does
Given one or more domains (or URLs β host is extracted; apex domain optional), the actor:
- MX β Resolves MX records, sorted by priority. Adds
inferredProvideronly when the MX hostname matches a known pattern (Google Workspace, Microsoft 365, Cloudflare Email, etc.). - SPF β Finds
v=spf1in apex TXT, returns the raw record and a small parse (terminalallmechanism,redirect, include/mx/a flags, mechanism count). - DMARC β Reads
_dmarc.<domain>TXT forv=DMARC1and returns only tags that exist in the record (policy,rua,pct,sp, β¦). - DKIM β Probes
{selector}._domainkey.<domain>for a bounded set of common selectors. A miss is inconclusive (many providers use custom selectors). If there is no DKIM match and DMARC isrejectwith SPF ending in-allor~all, the hard βno DKIMβ issue is not raised; instead a short informational recommendation explains the selector-list limitation. If any selector matches, no extra DKIM recommendation is added (avoids noise on strong domains like Cloudflare). - MTA-STS / BIMI β Detects
_mta-stsanddefault._bimiTXT when present. - Score β Simple weighted model (MX + SPF strictness + DMARC policy + DKIM presence), capped 0β100 with grades AβF.
Use cases
- Sales / RevOps β Quick βdoes this domain look professionally managed?β signal before outreach
- Security & GRC β Lightweight evidence of SPF/DMARC posture (not a full pen-test)
- Deliverability audits β Baseline check for missing
_dmarc, weak SPF defaults, missing MX - Batch enrichment β Feed domains from CRM or spreadsheets; compare scores in a spreadsheet export
Input
| Field | Type | Default | Description |
|---|---|---|---|
domains | string[] | required | Domains or full URLs (host extracted). |
useApexDomain | boolean | true | Collapse to registrable domain (mail.example.com β example.com). |
maxDomains | integer | 25 | Max domains per run (1β100). |
maxDkimProbes | integer | 25 | How many DKIM selectors to try per domain (5β60). |
dnsTimeoutSeconds | number | 12 | Resolver timeout budget per query type (capped 4β30s). |
Example input
{"domains":["google.com","https://www.cloudflare.com/"],"useApexDomain":true,"maxDomains":25,"maxDkimProbes":25,"dnsTimeoutSeconds":12}
Output
One dataset item per input. Keys appear only when meaningful β e.g. spf.record exists only if SPF is present; bimi.record only if BIMI TXT exists; inferredProvider on an MX row only if a hint matched.
Empty issues / recommendations arrays mean nothing material was flagged for that domain (not an error).
Example shape (illustrative)
{"domain":"cloudflare.com","input":"https://www.cloudflare.com/","mx":[{"priority":5,"host":"mxa-canary.global.inbound.cf-emailsecurity.net","inferredProvider":"Cloudflare Email Routing / Security"}],"spf":{"present":true,"record":"v=spf1 ip4:199.15.212.0/22 ... -all","parsed":{"raw":"v=spf1 ... -all","allMechanism":"-all","mechanismCount":9,"hasInclude":true,"hasMx":false,"hasA":false}},"dmarc":{"lookupName":"_dmarc.cloudflare.com","present":true,"record":"v=DMARC1; p=reject; pct=100; rua=mailto:...","parsed":{"raw":"v=DMARC1; ...","policy":"reject","percentage":"100","aggregateReports":"mailto:..."}},"dkim":{"validSelectors":[{"selector":"mandrill","recordPreview":"v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrLHiExVd55zd/...","queryName":"mandrill._domainkey.cloudflare.com"}],"probedSelectors":["default","google","..."]},"mtaSts":{"present":false},"bimi":{"present":true,"record":"v=BIMI1; l=https://www.cloudflare.com/....svg; a=....pem"},"emailSecurityScore":{"score":100,"grade":"A"},"issues":[],"recommendations":[],"scannedAt":"2026-05-15T12:00:00.000000+00:00"}
Invalid input / errors
If a row cannot be scanned, you get input, error, and scannedAt (and domain when normalization succeeded). No fake null fields for βmissing scan sectionsβ.
What makes this different
| Aspect | This actor | βFull security suiteβ |
|---|---|---|
| Data source | DNS only (fast, cheap) | Often includes SMTP, APIs, crawlers |
| SMTP / send test | No | Sometimes yes |
| DKIM certainty | Probes common selectors; custom selectors may not appear | May require provider API or live mail |
| Output style | Omits absent fields; lists can be empty | Often many nulls |
| Pairing | Complements Tech Stack Detector (same βsignal from domain/URLβ family) | Broader scope, higher cost |
Limitations
- Not SMTP verification β The actor never connects to port 25 or sends mail; it cannot prove inbox deliverability.
- Heuristic score β The 0β100 grade is a practical summary, not a certification or legal/compliance sign-off.
- DKIM coverage β Only a fixed list of common selectors is probed; absence in output does not prove absence of signing infrastructure.
Technology
- DNS:
dnspython(TXT, MX) - Domain normalization:
tldextractfor optional apex collapse - Runtime: Python 3.12 on
apify/actor-python
Local test
cd actors/email-security-scannerpython3 test_local.py google.com cloudflare.com
Deploy
Same workflow as your other actors: from this folder, apify push builds a new Docker image and updates the same Apify actor (no separate βsecond deployβ flow β every push is a new build/version on that actor). Ensure you are logged in (apify login) and the folder is linked to the right actor if you use multiple accounts.
cd actors/email-security-scannerapify push
