DefenderDeep dive

Anti-spam message headers in Microsoft 365: SFV, CAT, SCL, BCL and compauth values

Every documented value in X-Forefront-Antispam-Report, X-Microsoft-Antispam and Authentication-Results, with what it means, the usual cause and where to act.

When a message lands in Junk, in quarantine or in an Inbox it should never have reached, Microsoft 365 records why in three message headers. This quick reference covers every value Microsoft documents for X-Forefront-Antispam-Report, X-Microsoft-Antispam and Authentication-Results: the meaning (from Microsoft's reference), the usual cause and where to act.

Codes in this quick reference

  • CAT:AMP: the anti-malware policy acted on the messageMessage header (X-Forefront-Antispam-Report)
  • CAT:BIMP: brand impersonation (Defender for Office 365)Message header (X-Forefront-Antispam-Report)
  • CAT:DIMP: domain impersonation (Defender for Office 365)Message header (X-Forefront-Antispam-Report)
  • CAT:FTBP: blocked by the anti-malware common attachments filterMessage header (X-Forefront-Antispam-Report)
  • CAT:GIMP: mailbox intelligence impersonation (Defender for Office 365)Message header (X-Forefront-Antispam-Report)
  • CAT:INTOS: intra-organization phishingMessage header (X-Forefront-Antispam-Report)
  • CAT:MALW: malwareMessage header (X-Forefront-Antispam-Report)
  • CAT:OSPM: outbound spam sent by a user in your organizationMessage header (X-Forefront-Antispam-Report)

+ 51 more codes in the tables below.

How this guide is organized: How to read these codes → X-Forefront-Antispam-Report → SCL and BCL → Authentication-Results → How to verify a fixFlow diagram of the article's sections in reading order: 1. How to read these codes. 2. X-Forefront-Antispam-Report (4 parts: CAT: which policy acted; SFV: how spam filtering reached the verdict; SFTY, SRV and X-CustomSpam; Connection and origin fields). 3. SCL and BCL. 4. Authentication-Results. 5. How to verify a fix. Toolbox: File › Properties, CAT:AMP, CAT:BIMP, CAT:BULK, CAT:DIMP.1How to readthese codes2X-Forefront-A…3SCL and BCL4Authenticatio…5How to verify afixCAT: which policy actedSFV: how spam filteringreached the verdictSFTY, SRV andX-CustomSpamConnection and originfieldsTOOLBOXFile › PropertiesCAT:AMPCAT:BIMPCAT:BULKCAT:DIMPHow this guide is organized: How to read these codes → X-Forefront-Antispam-Report → SCL and BCL → Authentication-Results → How to verify a fixFlow diagram of the article's sections in reading order: 1. How to read these codes. 2. X-Forefront-Antispam-Report (4 parts: CAT: which policy acted; SFV: how spam filtering reached the verdict; SFTY, SRV and X-CustomSpam; Connection and origin fields). 3. SCL and BCL. 4. Authentication-Results. 5. How to verify a fix. Toolbox: File › Properties, CAT:AMP, CAT:BIMP, CAT:BULK, CAT:DIMP.1How to read these codes2X-Forefront-Antispam-ReportCAT: which policy actedSFV: how spam filtering reached the verdictSFTY, SRV and X-CustomSpamConnection and origin fields3SCL and BCL4Authentication-Results5How to verify a fixTOOLBOXFile › PropertiesCAT:AMPCAT:BIMPCAT:BULKCAT:DIMP
At a glance: how this guide is organized · 4 steps · 5 key settings and tools

How to read these codes#

In which order to read the anti-spam message headersStep 1: Open the full message header. Paste it into Message Header Analyzer to split it into readable fields. Step 2: Start with CAT, SFV and DIR. Which policy acted, how spam filtering reached its verdict, and the direction. Step 3: Don't judge the verdict by SCL. In cloud organizations SCL doesn't decide the verdict or the action. Step 4: Read compauth and its reason code. It combines SPF, DKIM, DMARC and other signals to judge the From domain. Step 5: Skip fields that aren't listed. They're for Microsoft's own diagnostics. Step 6: Check a new message after a fix. Headers are stamped at delivery, so old messages never change.1Open the full messageheaderPaste it into Message HeaderAnalyzer to split it into readablefields.2Start with CAT, SFV and DIRWhich policy acted, how spamfiltering reached its verdict, and thedirection.3Don't judge the verdict bySCLIn cloud organizations SCL doesn'tdecide the verdict or the action.4Read compauth and itsreason codeIt combines SPF, DKIM, DMARC andother signals to judge the Fromdomain.5Skip fields that aren't listedThey're for Microsoft's owndiagnostics.6Check a new message after afixHeaders are stamped at delivery, soold messages never change.In which order to read the anti-spam message headersStep 1: Open the full message header. Paste it into Message Header Analyzer to split it into readable fields. Step 2: Start with CAT, SFV and DIR. Which policy acted, how spam filtering reached its verdict, and the direction. Step 3: Don't judge the verdict by SCL. In cloud organizations SCL doesn't decide the verdict or the action. Step 4: Read compauth and its reason code. It combines SPF, DKIM, DMARC and other signals to judge the From domain. Step 5: Skip fields that aren't listed. They're for Microsoft's own diagnostics. Step 6: Check a new message after a fix. Headers are stamped at delivery, so old messages never change.1Open the full message headerPaste it into Message Header Analyzer to split it intoreadable fields.2Start with CAT, SFV and DIRWhich policy acted, how spam filtering reached itsverdict, and the direction.3Don't judge the verdict by SCLIn cloud organizations SCL doesn't decide the verdict orthe action.4Read compauth and its reason codeIt combines SPF, DKIM, DMARC and other signals tojudge the From domain.5Skip fields that aren't listedThey're for Microsoft's own diagnostics.6Check a new message after a fixHeaders are stamped at delivery, so old messages neverchange.
Figure 1 · Process In which order to read the anti-spam message headers. Read the fields in this order: the verdict fields first, then compauth. Leave SCL and unlisted fields aside when you judge the verdict.

Exchange Online Protection and Microsoft Defender for Office 365 stamp these headers on inbound messages. In classic Outlook, open the message and select File › Properties (the Internet headers box); in Outlook on the web and the new Outlook, select More actions (…) › View › View message details. Microsoft's Message Header Analyzer makes the result readable. Each header holds field:value pairs separated by semicolons:

Text
X-Forefront-Antispam-Report: CIP:203.0.113.25;CTRY:NL;LANG:en;SCL:5;SRV:;IPV:NLI;SFV:SPM;H:mail.fabrikam.com;PTR:mail.fabrikam.com;CAT:SPM;DIR:INB;
X-Microsoft-Antispam: BCL:0;
Authentication-Results: spf=softfail (sender IP is 203.0.113.25) smtp.mailfrom=fabrikam.com; dkim=none (message not signed) header.d=none;dmarc=fail action=none header.from=fabrikam.com;compauth=fail reason=001
  • Read CAT, SFV and DIR first. CAT names the policy that acted (when several protections flag a message, the highest-priority policy wins), SFV says how spam filtering decided or why it skipped the message, and DIR gives the direction.
  • Don't judge by SCL. In cloud organizations it doesn't decide the verdict or the action; it mainly serves on-premises Exchange and hybrid delivery.
  • Then read compauth. Composite authentication combines SPF, DKIM, DMARC and other signals to decide whether the From domain is genuine; the reason code explains why.
  • Fields not listed here are for Microsoft's own diagnostics.

Note: For the most common verdicts (spam, phishing, spoofing and bulk), Legitimate email landing in Junk walks through the fixes.

X-Forefront-Antispam-Report: the verdict#

CAT: which policy acted#

CodeMeaningUsual causeFirst check
CAT:AMPAnti-malwareMalware in the message or an attachmentReview the email entity page before any release
CAT:BIMPBrand impersonation*Sender imitates a well-known brandTreat as phishing
CAT:BULKBulkBCL at or above the policy thresholdRead BCL (below)
CAT:DIMPDomain impersonation*Domain imitates a protected domainAnti-phishing policy: protected and trusted domains
CAT:FTBPAnti-malware common attachments filterBlocked file typeFile types in the anti-malware policy
CAT:GIMPMailbox intelligence impersonation*Sender imitates a frequent contactMailbox intelligence settings in the anti-phishing policy
CAT:HPHSH, CAT:HPHISHHigh confidence phishingStrong phishing signalsDon't allow it; submit only if you're sure it's clean
CAT:HSPMHigh confidence spamStrong spam signalsSubmit false positives to Microsoft
CAT:INTOSIntra-organization phishingPhishing sent from inside your organizationCheck the sending account for compromise
CAT:MALWMalwareMalicious contentReview before any release
CAT:OSPMOutbound spamOne of your users sent spamRestricted entities and the outbound spam policy
CAT:PHSHPhishingSender, link or content signalsSubmit false positives; never allow a whole domain
CAT:SAPSafe Attachments*Detonation found malwareCheck the verdict before any release
CAT:SPMSpamSpam filtering verdictRead SFV
CAT:SPOOFSpoofingThe From domain didn't authenticateRead compauth; check the spoof intelligence insight
CAT:UIMPUser impersonation*Sender imitates a protected userProtected users in the anti-phishing policy

* Defender for Office 365 only.

SFV: how spam filtering reached the verdict#

CodeMeaningUsual causeFirst check
SFV:BLKSkipped; blocked by the user's Blocked Senders listThe user blocked the senderThe user's junk email settings
SFV:NSPMMarked as not spam and deliveredClean mailReport it to Microsoft if it's junk
SFV:SFESkipped; allowed by the user's Safe Senders listThe user trusted the senderCheck the list if phishing got through
SFV:SKASkipped: sender on an anti-spam policy's allowed senders or domainsAdmin allow entryIt skips filtering for everyone in the policy
SFV:SKBSpam: sender on an anti-spam policy's blocked senders or domainsAdmin block entryRemove it if it's wrong
SFV:SKISkipped: source IP on the connection filter's IP Allow ListAdmin IP allow entryReview the connection filter policy
SFV:SKNSpam filtering bypassed by a mail flow ruleA rule that sets SCL -1Narrow or remove the rule
SFV:SKQReleased from quarantine to the recipientsAdmin or user releaseConfirm the release was intended
SFV:SKSMarked as spam before filtering by a rule that set the SCL, or by on-premises Exchange (hybrid); stamped only if honoredRule or hybrid verdictMail flow rules and on-premises spam settings
SFV:SPMMarked as spam by spam filteringContent or reputationSubmit to Microsoft if it's legitimate

SFTY, SRV and X-CustomSpam#

CodeMeaningUsual causeFirst check
SFTY:9.19Phishing: domain impersonation (safety tip added if enabled)Domain imitates a protected domainAnti-phishing domain settings
SFTY:9.20Phishing: user impersonation (safety tip added if enabled)Sender imitates one of your users or a protected userAnti-phishing protected users
SFTY:9.25First contact safety tipCan indicate a suspicious messageIs the sender really new to the recipient?
SRV:BULKBulk, based on spam filtering and the BCL thresholdMarkAsSpamBulkMail is On by defaultRead BCL
X-CustomSpam:An Advanced Spam Filter (ASF) setting matched; the value names itASF option turned onASF stamps after mail flow rules run, so rules can't act on it

Connection and origin fields#

CodeMeaningUsual causeFirst check
CIP:Connecting IP addressThe last hop into Microsoft 365Your own gateway? Configure Enhanced Filtering for Connectors
CTRY:Country/region of the connecting IPCan differ from the original sender'sIs it where the sender should be?
DIR:INB, DIR:OUT, DIR:INTInbound, outbound or internalHow the message enteredRead it with CAT
H:HELO/EHLO string of the connecting serverSending server settingCompare with PTR
IPV:CALSpam filtering skipped: source IP is on the IP Allow ListAdmin IP allow entryReview the connection filter policy
IPV:NLIIP not found on any IP reputation listNormal for most sendersNone
LANG:Language of the messageDetected from the contentMatters if you filter by language
PTR:Reverse DNS of the source IPPublished by the IP ownerCompare with H: and the From domain
ARC (AAR, AMS, AS)Authenticated Received Chain; AS carries cv= (none, pass or fail)An intermediary handled the messageKnown forwarder failing? Consider a trusted ARC sealer

SCL and BCL: the two scales#

SCL (X-Forefront-Antispam-Report, -1 to 9) mostly matters in the cloud for mail flow rules that request a bypass (-1), spam (5 or 6) or high confidence spam (9). BCL (X-Microsoft-Antispam) rates complaints about a bulk sender.

CodeMeaningUsual causeFirst check
SCL:-1Spam filtering bypass requestedMail flow ruleFind the rule; a bypass can also show as 0 or 1
SCL:0, SCL:1Evaluated, not spamClean mailNone
SCL:5, SCL:6Spam on the legacy scale (5 or higher generally means bad)Verdict or ruleRead CAT; in hybrid, on-premises Junk thresholds act on SCL
SCL:9High confidence spam on the legacy scaleVerdict or ruleRead CAT
BCL:0Not from a bulk senderNormal mailNone
BCL:1 to 3Bulk sender, few complaintsWanted newslettersNone
BCL:4 to 7Bulk sender, mixed complaintsMarketing mailThreshold: 7 by default, 6 Standard, 5 Strict
BCL:8, BCL:9Bulk sender, many complaintsUnwanted bulkJunk Email, or quarantine under Strict

Check the bulk senders insight in the Defender portal before you change a threshold.

Authentication-Results: SPF, DKIM, DMARC and compauth#

SPF, DKIM and DMARC results#

CodeMeaningUsual causeFirst check
spf=failHard fail: source isn't in SPF (-all)Unlisted service, or your gateway in frontSender fixes SPF; CIP is your gateway? Enhanced Filtering
spf=softfailSoft fail (~all)As aboveAs above
spf=neutralNot listed, no instruction (?all)Incomplete recordSender fixes it
spf=noneNo SPF record, or no resultSPF not set upSender publishes SPF
spf=temperrorTemporary error, such as DNSTransientUsually clears
spf=permerrorPermanent errorBad syntax or more than 10 DNS lookupsSender simplifies the record
dkim=fail (body hash did not verify)Body changed after signingFooter, disclaimer or gatewayModify in Microsoft 365, or trust the hop as an ARC sealer
dkim=fail (no key for signature)Public key missing from DNSKey not publishedSender publishes it
dkim=noneNot signedDKIM not set upSender signs with the From domain
dmarc=fail action=orejectFailed; the sender publishes p=rejectNo aligned passDelivered anyway? Check the anti-phishing DMARC setting and allows
dmarc=fail action=quarantineFailed; the sender publishes p=quarantineNo aligned passSender fixes alignment
action=pct.quarantine, action=pct.rejectPolicy with pct below 100, applied to part of failing mailDMARC rolloutMessage trace shows where it went
dmarc=bestguesspassNo DMARC record, but it would have passedNo DMARCSender publishes DMARC
dmarc=noneNo DMARC TXT recordNo DMARCSender publishes DMARC
action=permerror, action=temperrorDMARC evaluation errorBad record or DNSSender validates the _dmarc record

compauth reason codes#

CodeMeaningUsual causeFirst check
000Explicit fail: DMARC fail with p=quarantine or p=rejectNo alignmentSender fixes alignment
001Implicit fail: no records, or weak ones (~all, ?all, p=none)Weak authenticationSender strengthens it
002Your organization prohibits this sender/domain pair from spoofingAdmin blockSpoofed sender entries in the Tenant Allow/Block List
010DMARC fail (reject or quarantine) for one of your accepted domainsSelf-to-self spoofing, or your own unauthenticated appAuthenticate or block the source
100Pass: SPF or DKIM passed and alignsHealthyNone
101Pass: DKIM-signed by the From domainHealthyNone
102Pass: SPF passed, MAIL FROM aligns with FromHealthyNone
103, 104Pass: From domain aligns with the source IP's PTRPTR fallbackSender adds SPF/DKIM
108Pass: DKIM broken by body changes on earlier legitimate hopsFor example, your on-premises serversNone
109Pass: no DMARC record, but would passNo DMARCNone
111Pass: DMARC error, but the SPF or DKIM domain alignsFaulty DMARC recordSender fixes it
112Pass: DNS timeout prevented retrieving the DMARC recordTransient DNSNone unless it repeats
115Pass: sent from a Microsoft 365 organization where the From domain is acceptedMicrosoft 365 to Microsoft 365None
116Pass: the From domain's MX aligns with the connecting IP's PTRPTR fallbackSender adds SPF/DKIM
130Pass: a trusted ARC sealer overrode the DMARC failureForwardingNone if expected
201, 202Soft pass (compauth=softpass) on PTR alignmentWeak authenticationSender adds SPF/DKIM
3xxNot checked (compauth=none)Not evaluatedNone
4xxBypassed (compauth=none)A bypass appliedFind out why
501, 502DMARC not enforced: valid NDRA bounceNone
601Implicit fail: the sending domain is one of your accepted domainsIntra-org spoofingAuthenticate or block the source
701 to 704Implicit pass: DMARC not enforced, history of legitimate mail from that infrastructureKnown sender, weak authenticationSender fixes authentication
905Bypassed: DMARC not enforced due to complex routingOn-premises Exchange or another service receives firstEnhanced Filtering for Connectors

How to verify a fix#

  1. Send a new message after the change; headers are stamped at delivery, so old messages never change.
  2. Compare headers: CAT and SFV should show the intended path (say, SFV:NSPM instead of SFV:SPM); after an authentication fix, compauth should pass (1xx or 7xx).
  3. In the Defender portal, the email entity page (from Explorer or Real-time detections) should show a matching delivery location and detection technology; message trace confirms delivery.
  4. Check the policy side in Exchange Online PowerShell:
PowerShell
Get-AntiPhishPolicy | Format-List Name, HonorDmarcPolicy, DmarcQuarantineAction, DmarcRejectAction
Get-ArcConfig | Format-List ArcTrustedSealers
Get-MailboxJunkEmailConfiguration -Identity user@contoso.com |
    Format-List TrustedSendersAndDomains, BlockedSendersAndDomains
Get-TransportRule | Where-Object { $_.SetSCL -eq -1 } | Format-Table Name, State, Priority

Related guides: SPF, DKIM and DMARC setup and Enhanced Filtering for Connectors.

References#

Written and checked against current Microsoft Learn documentation. Test changes with a pilot group before rolling them out to everyone, and if an admin center path has moved since, search for the setting name instead.

Spotted a mistake, or did this fix work differently for you? Email me or message me on LinkedIn — corrections are credited in the article.

Written by

Omer Eltayeb

Intune Subject Matter Expert in Cairo, Egypt, former Microsoft Cloud Solutions Architect, Microsoft Certified Trainer and Microsoft Innovative Educator Expert (2024–26) and Microsoft Elevate Educator Expert (2026–27). I share practical, step-by-step guides, study plans, scripts and toolkits for Microsoft Intune, Configuration Manager, Microsoft Entra ID, Microsoft Defender, Exchange and Microsoft 365 with the community.

Microsoft Certified Trainer (MCT) 2026Microsoft Innovative Educator Expert 2025–2026Microsoft Elevate Educator Expert 2026–2027ISC2 Certified Information Systems Security Professional (CISSP)Microsoft 365 Certified: Enterprise Administrator Expert (MS-102)