Microsoft Filtering Internals (EOP / Defender for Office 365)
Reading X-Forefront-Antispam-Report and X-Microsoft-Antispam headers, SCL and BCL scales with per-level actions, compauth reason codes, how EOP/MDO layers filter, and Tenant Allow/Block List mechanics from the sender's perspective.
Reference11 min read
Who it is for ESP operators, Senders
Applies to senders on any platform
ContentsOn this page — 8 sections
When your mail to a business that uses Microsoft 365 lands in Junk or quarantine, the message headers tell you why. Below is how Exchange Online Protection (EOP) filters inbound mail for business tenants, and how a sender or consultant reads its verdict.
This is a different system from the filtering of consumer Outlook.com mailboxes (descended from SmartScreen, and visible in SNDS), which Microsoft Sender Requirements covers. The two systems share reputation inputs, though, and B2B senders depend on EOP verdicts.
To diagnose a message, get a copy of it as delivered (or as junked or quarantined) from a Microsoft 365 recipient, and extract the full headers. Read three headers in order: Authentication-Results (did authentication pass?), X-Forefront-Antispam-Report (what was the verdict, and why?) and X-Microsoft-Antispam (BCL). Microsoft's own parser is the Message Header Analyzer at https://mha.azurewebsites.net/.
How the layers stack
- Connection filtering at the edge of the service, based on IP address. Most spam is caught here. The inputs are Microsoft's blocked senders list (see Microsoft Escalation Channels), the tenant's IP Allow and Block lists, and IP reputation. Entries in a tenant's IP block list drop mail at the edge.
- Anti-spam policies (content filtering) classify each message as bulk, spam, high confidence spam, phishing, or high confidence phishing, and stamp SCL and BCL values. There are three tiers of policy: the default policy, custom policies created by administrators, and the Standard and Strict preset security policies. The presets have progressively more aggressive defaults, and for the recipients they include, preset settings override custom policy settings.
- Anti-phishing, spoof intelligence and composite authentication: Microsoft's implicit authentication layer (
compauth), which judges the From domain even when no DMARC record exists. - Add-ons in Defender for Office 365 (MDO): impersonation protection (for users, for domains, and through mailbox intelligence), Safe Links and Safe Attachments. They exist only in tenants with MDO licenses, and they produce the
CATvalues marked as MDO only below.
Policy changes take up to 1 hour to apply. When several detections fire, the policies apply in order of precedence and the verdict with the highest priority wins.
X-Forefront-Antispam-Report header
The header is a list of field:value pairs separated by semicolons, for example ...CTRY:;LANG:hr;SCL:1;SRV:;IPV:NLI;SFV:NSPM;PTR:;SFTY:;.... Fields that Microsoft does not document are internal diagnostics. The documented fields are:
| Field | Meaning |
|---|---|
ARC |
ARC evaluation: AAR (recorded Authentication-Results), AMS (message signature), AS (header signature with cv= chain validation: none, pass or fail) |
CAT |
Threat category applied (see table below) |
CIP:[IP] |
Connecting IP address, which you can use in the tenant's IP Allow and Block lists |
CTRY |
Source country or region, from the connecting IP address (may differ from the originating IP address) |
DIR |
Direction: INB inbound, OUT outbound, INT internal |
H:[helostring] |
HELO or EHLO string of the connecting server |
IPV:CAL |
Spam filtering skipped, because the source IP address was on the tenant's IP Allow List |
IPV:NLI |
IP address not found on any IP reputation list |
LANG |
Country code of the message language (for example, ru_RU) |
PTR:[ReverseDNS] |
PTR (reverse DNS) record of the source IP address |
SCL |
Spam confidence level (scale below) |
SFTY |
Marker for a phishing safety tip: 9.19 domain impersonation, 9.20 user impersonation, 9.25 first-contact safety tip |
SFV |
Spam filtering verdict (table below) |
SRV:BULK |
Identified as bulk by the BCL threshold. With MarkAsSpamBulkMail on (the default), bulk mail is marked as spam at SCL 6 |
X-CustomSpam:[ASFOption] |
Matched an Advanced Spam Filter (ASF) setting (content heuristics such as embed tags, JavaScript in HTML, or an empty message). The field is added after mail flow rules run, so rules cannot act on it |
CAT (category) values
| Value | Meaning | Value | Meaning |
|---|---|---|---|
AMP |
Anti-malware | INTOS |
Intra-org phishing |
BIMP |
Brand impersonation (MDO) | MALW |
Malware |
BULK |
Bulk | OSPM |
Outbound spam |
DIMP |
Domain impersonation (MDO) | PHSH |
Phishing |
FTBP |
Anti-malware common-attachments filter | SAP |
Safe Attachments (MDO) |
GIMP |
Mailbox-intelligence impersonation (MDO) | SPM |
Spam |
HPHSH or HPHISH |
High confidence phishing | SPOOF |
Spoofing |
HSPM |
High confidence spam | UIMP |
User impersonation (MDO) |
SFV (spam filtering verdict) values
| Value | Meaning |
|---|---|
SFV:NSPM |
Marked as not spam; delivered normally |
SFV:SPM |
Marked as spam by content filtering |
SFV:BLK |
Blocked: the sender is on the recipient user's Blocked Senders list (filtering skipped) |
SFV:SFE |
Allowed: the sender is on the recipient user's Safe Senders list (filtering skipped) |
SFV:SKA |
Filtering skipped: the sender or domain is on the allowed list of the anti-spam policy; delivered to the Inbox |
SFV:SKB |
Marked as spam: the sender or domain is on the blocked list of the anti-spam policy |
SFV:SKN |
Marked as not spam before filtering (for example, a mail flow rule set SCL -1 or a bypass) |
SFV:SKS |
Marked as spam before filtering (for example, a mail flow rule set SCL 5–9) |
SFV:SKQ |
Released from quarantine to the intended recipients |
How a consultant reads these: SKA, SFE and SKN mean the recipient side has allowlisted you. That is fragile, because placement depends on an override, not on reputation. SKB and BLK mean the recipient side has blocked you explicitly. No amount of reputation work on the sender side fixes that; the recipient organization must remove the entry.
SCL: Spam Confidence Level
The SCL is stamped as an X-header on every inbound message. Filtering never stamps the values 2, 3 or 4. SCL 7 is typically set not by spam filtering itself, but by analyst grading, DMARC failures or mail flow rules.
| SCL | Definition | Default action |
|---|---|---|
| -1 | Filtering skipped (safe sender or recipient, or IP Allow List) | Inbox |
| 0, 1 | Not spam | Inbox |
| 5, 6 | Spam | Default and custom policies, and Standard preset: Junk folder. Strict preset: quarantine |
| 7, 8, 9 | High confidence spam | Default and custom policies: Junk folder. Standard and Strict presets: quarantine |
BCL: Bulk Complaint Level
The BCL is stamped in the X-Microsoft-Antispam header (for example, X-Microsoft-Antispam: BCL:5;). Microsoft assigns it, based on complaint behavior, to mail from recognized bulk senders ("gray mail"), whether the sources are internal to Microsoft or external. This is the header that matters most to ESPs, because it is in effect Microsoft's published complaint reputation score for each sender.
| BCL | Meaning |
|---|---|
| 0 | Not from a bulk sender |
| 1–3 | Bulk sender generating few complaints |
| 4–7 | Bulk sender generating a mixed number of complaints |
| 8–9 | Bulk sender generating a high number of complaints |
Thresholds and actions (a message is treated as Bulk when its BCL meets or exceeds the threshold):
| Policy | BCL threshold | Action at or above the threshold |
|---|---|---|
| Default and new custom anti-spam policies | 7 | Junk Email folder |
| Standard preset security policy | 6 | Junk Email folder |
| Strict preset security policy | 5 | Quarantine |
What this means for a sender: mail at BCL ≤ 3 reaches the Inbox everywhere. BCL 4 is sent to Junk by tenants with the Strict preset (the recommended minimum for opting in to the Promotions folder feature is 5). BCL 5–6 is sent to Junk or quarantined by tenants using preset policies. BCL ≥ 7 is sent to Junk by default in every tenant. Recipient administrators can tune the threshold, and can see the bulk volume of each sender in the "bulk senders insight" in the Defender portal.
Promotions folder (preview, 2026): tenants can choose to deliver bulk mail that is below the BCL threshold (even bulk mail at BCL 0) to a Promotions folder instead of the Inbox. They do this with a mail flow rule that stamps X-MS-Exchange-Organization-BulkStamping: 1, plus the "Bulk moves enabled" setting in the anti-spam policy. Microsoft 365 learns from users moving messages into and out of the folder. Mail still reaches the Inbox if the sender is on the user's Safe Senders list. For senders, this means that even bulk mail with no complaints may stop landing in Microsoft 365 Inboxes because of how it is classified, much as Gmail's tabs work.
Authentication-Results and composite authentication
Microsoft stamps the standard spf=, dkim= and dmarc= results (see Authentication-Results Header), plus fields specific to Microsoft:
- The
dmarc=values include the nonstandardbestguesspass: no DMARC record exists, but the message would have passed if one did. action=on DMARC:oreject(rejected under the policy);pct.quarantineorpct.reject(failed DMARC but was delivered, becausepct< 100 randomly exempted it);permerror;temperror.compauthis composite authentication: Microsoft's combined verdict from SPF, DKIM, DMARC and signals in the message, evaluated against the From (5322.From) domain. Acompauth=failresult does not guarantee the message goes to Junk if the other signals are clean.reasonis a three-digit code that explains the compauth result:
| Code | Meaning |
|---|---|
| 000 | Failed explicit authentication: DMARC fail with p=quarantine or p=reject |
| 001 | Failed implicit authentication: no authentication records, or weak ones (SPF ~all or ?all, DMARC p=none) |
| 002 | The organization's policy explicitly prohibits this pair of sender and domain from spoofing |
| 010 | DMARC fail with reject or quarantine, and the sending domain is one of the organization's own accepted domains (spoofing within the organization) |
| 1xx (100–130) | Passed: 100 SPF or DKIM passed with alignment. 101 DKIM by the From domain. 102 MAIL FROM and From aligned, and SPF pass. 103 or 104 PTR aligns with the From domain. 108 DKIM fail attributed to a legitimate earlier hop. 109 no DMARC record, but it would pass. 111 DMARC temperror or permerror, but SPF or DKIM aligned. 112 DNS timeout on the DMARC lookup. 115 sent from an M365 organization where From is an accepted domain. 116 the MX of the From domain aligns with the PTR of the connecting IP address. 130 a trusted ARC sealer overrode the DMARC failure |
| 2xx (201, 202) | Soft pass on alignment of PTR or subnet (compauth=softpass) |
| 3xx, 4xx, 9xx | Not checked, or bypassed (compauth=none) |
| 501, 502 | DMARC not enforced: a valid NDR with an established contact, or a valid NDR for the organization's own mail |
| 6xx (601) | Failed implicit authentication; 601 means spoofing of an accepted domain within the organization |
| 7xx (701–704) | DMARC not enforced, because the organization has a history of legitimate mail from this infrastructure |
| 905 | DMARC not enforced, because of complex routing (an on-premises or third-party hop before M365) |
Reason 001 is the code ESP consultants see most often. It means the sender had no authentication, or weak authentication, and Microsoft sent the message to Junk on suspicion from implicit authentication. The fix is aligned SPF and DKIM, plus a DMARC record. This is the same remediation as for the Outlook.com May 2025 mandate.
Tenant Allow/Block List (TABL): what recipient tenants control
The TABL is a list of overrides for each tenant, at https://security.microsoft.com/tenantAllowBlockList. It applies during mail flow and at the time of a click. The types of entry are: domains and email addresses (matched on the From (5322.From) address, not on MAIL FROM), spoofed senders, URLs, files, IP addresses and Teams domains. Block entries take precedence over allow entries. Entries take effect within ~5 minutes.
What a block does:
| Blocked entity | Effect |
|---|---|
| Domain or email address | The message is treated as high confidence phishing and quarantined (not merely treated as spam). The tenant's own users also cannot send to it (550 5.7.703 ... blocked by your organization using Tenant Allow Block List) |
| URL or file | The message is quarantined as high confidence phishing or as malware, respectively |
| IP address | Dropped at the edge of the service |
| Spoofed sender | Manual override of an allow from spoof intelligence |
Expiry of block entries: for domains and addresses, files and URLs, entries expire after 30 days by default (this can be set to 90 days or to never). Entries for spoofed senders, IP addresses and Teams never expire.
How allow entries work, and why "just get them to allowlist us" has limits:
- Administrators cannot directly create allow entries for verdicts of malware or high confidence phishing. For those, the message, URL or file must be submitted to Microsoft through the Submissions page (
https://security.microsoft.com/reportsubmission) and confirmed clean; only then can an allow entry be created. Messages identified as malware or high confidence phishing are always filtered, whatever the allow entries say. - Direct allow entries for domains and addresses, and for URLs, can override only these verdicts: bulk, spam, high confidence spam, and phishing that is not high confidence.
- Allow entries for domains and addresses, files and URLs are kept for 45 days after the filtering system last judges the entity clean, and are then removed automatically (or an administrator sets them to expire ≤30 days after creation). Allow entries for spoofed senders never expire. Microsoft may automatically remove allow entries it considers unnecessary, and sends an alert when it does.
- An allowed sender still goes through the rest of the stack. The message must also pass authentication, URL and file checks, because an allow entry skips only the filters tied to the allowed entity.
- URL allows created through a submission automatically cover variations and sub-paths of the reported URL.
What this means for a sender: if your mail is judged high confidence phishing at a customer's tenant, the recipient's administrator cannot simply allowlist you. The usual causes are a URL or domain blocked in their TABL, or detection of spoofing or impersonation. The path goes through a submission to Microsoft by the administrator. Ask the recipient's administrator to submit the message as a false positive; Microsoft's review may create the allow entry.
FAQ material relevant to external senders
Microsoft's anti-spam FAQ documents these causes when legitimate mail is sent to Junk at Microsoft 365, and their fixes:
| Cause | Fix |
|---|---|
| Authentication failure (SPF, DKIM or DMARC, leading to compauth fail) | Correct SPF, DKIM and DMARC for the sending domain |
| Sender reputation (history of the IP address or domain, blocklists, low volume) | Check third-party blocklists and a valid PTR record, and review SNDS |
| Content triggers (too many links, URL shorteners, form tags, embedded scripts, image-only messages) | Review the content; the recipient may have ASF options turned on |
| BCL met the tenant's threshold | Not spam, but a bulk classification; reduce complaints, or the recipient tunes the threshold or safe senders |
| Recipient overrides (mail flow rule, block list in a policy, user's Blocked Senders) | Only the recipient can remove them |
| An intermediate filtering service hides the true source IP address | The recipient turns on Enhanced Filtering for Connectors ("skip listing") |
Microsoft's own list of outbound best practices for reaching Microsoft 365:
- The sending domain resolves in DNS. (With no A or MX record, mail is routed through Microsoft's high-risk pool, whatever its content.)
- The source IP address has a PTR record.
- HELO or EHLO and MAIL FROM are consistent and based on a domain, and HELO matches the PTR record.
- SPF is correct.
- Mail is DKIM-signed with relaxed canonicalization, because strict header canonicalization can break when mail passes through the service.
- WHOIS records are accurate.
- Bounces use the format of RFC 3464.
- Addresses that return an NDR as nonexistent are removed.
- SNDS is monitored.
Outbound throttling inside the service matters when a compromised customer sends through Microsoft. A user who sends >50% spam within a time window is blocked from sending, and outbound spam is routed through the high-risk delivery pool (separate IP addresses) to protect the normal pool.
Related articles
- Microsoft Sender Requirements, on consumer Outlook.com policies, error codes and the 2025 authentication mandate
- Microsoft Escalation Channels
- Microsoft SNDS & JMRP
- Authentication-Results Header, the RFC 8601 baseline that Microsoft extends
Check your own record
The free check reads what your domain publishes in DNS.
In this topic
- Gmail Email Sender Guidelines
- Gmail SMTP Errors and Troubleshooting
- Yahoo Sender Requirements & Best Practices
- Yahoo Complaint Feedback Loop (CFL)