Skip to content

Add Exchange Online / Microsoft 365 SMTP codes from 90-day production data#99

Open
juenology wants to merge 1 commit intoActiveCampaign:mainfrom
juenology:outlook-codes-2025-q1
Open

Add Exchange Online / Microsoft 365 SMTP codes from 90-day production data#99
juenology wants to merge 1 commit intoActiveCampaign:mainfrom
juenology:outlook-codes-2025-q1

Conversation

@juenology
Copy link
Copy Markdown
Contributor

Summary

Adds 18 new SMTP response codes observed in Exchange Online / Microsoft 365 bounce traffic, sourced from 90 days of production sending data (Shopify Courier). All sensitive data has been redacted: sending IPs → x.xx.xx.xx, email addresses → email@example.com, sender domains → example.com, and per-message dynamic tokens (message IDs, timestamps) removed.

This PR covers Exchange Online / Microsoft 365 only (exchangeonline spamFilter). Consumer Outlook.com/Hotmail/Live codes are under the outlook provider and are not changed here.


Changes

data/codes/550.json — 15 new entries to exchangeonline spamFilter

Status RESOLVER/TRANSPORT code Description
5.7.133 RESOLVER.RST.SenderNotAuthenticatedForGroup Sender not in allowed senders list for a Microsoft 365 group
5.7.124 RESOLVER.RST.RestrictedToGroupPermission Distribution list is restricted to members only
5.7.129 RESOLVER.RST.RestrictedToRecipientsPermission Mailbox accepts mail from a restricted recipient list only
5.7.134 RESOLVER.RST.SenderNotAuthenticatedForMailbox Mailbox requires authenticated senders only
5.7.1-3 TRANSPORT.RULES.RejectMessage Mail flow / transport rule rejection (5.7.1 variant; see also 5.7.900)
5.7.520 AS(7555) External email forwarding disabled by admin policy
5.7.520-2 AS(7550) External email forwarding disabled (variant — different AS error code)
5.1.10 RESOLVER.ADR.RecipientNotFound Recipient address does not exist in the organization
5.1.1 RESOLVER.ADR.RecipNotFound Shorter variant of recipient-not-found
5.2.3 RESOLVER.RST.RecipSizeLimit Message exceeds the recipient's size limit
5.7.509 DMARC policy rejection From domain has a DMARC p=reject policy; message failed DMARC
5.7.7 Email policy violation (EOP) Content filter / policy violation (550 variant)
5.7.900 TRANSPORT.RULES.RejectMessage Transport rule rejection using 5.7.900 status code; variants 929 and 999 also observed with identical structure
5.7.54 Non-accepted domain relay Recipient domain is not accepted by the Exchange Online organization
5.7.57 Client not authenticated Relay rejected because the sending client is not authenticated; Exchange Online returns this with a 530 SMTP code in practice — included here since no 530.json exists in the schema
5.7.1-4 RESOLVER.RST.NotAuthorized Generic authorization rejection not covered by a more specific RESOLVER code

data/codes/554.json — new exchangeonline spamFilter section (3 entries)

Exchange Online was not previously represented in 554.json.

Status Code Description
5.2.2 STOREDRV QuotaExceededException Recipient mailbox full / Microsoft Unified Storage quota exceeded
5.7.7 Email policy violation (554 variant) Policy violation returned with 554 code rather than 550
5.3.3 STOREDRV missing AD entry AD Recipient Cache lookup failure during delivery

Notes

  • RESOLVER vs. TRANSPORT namespace: RESOLVER.* codes are NDR-style rejections from Exchange's address resolution layer; TRANSPORT.RULES.* codes are rejections from mail flow rules configured by admins. Both are common in bulk sending.
  • 5.7.520 variants: AS(7555) and AS(7550) both mean "external forwarding disabled" but appear to represent slightly different enforcement paths. Both are included as separate entries since the response strings differ.
  • 5.7.900/929/999: These are effectively aliases for 5.7.1 TRANSPORT.RULES.RejectMessage; all three were observed in production. Only 5.7.900 is explicitly listed; 929 and 999 are noted in the description.
  • 5.7.57 (530): Microsoft's SMTP 530 5.7.57 is functionally a 550-class permanent rejection. Since the repo has no 530.json, it is catalogued here under 550 with the actual SMTP code noted in the description.
  • exchangeonline in 554.json: This spamFilter had no entries in 554.json before this PR. The three new codes were observed at high enough volume in production to warrant inclusion.

Data source

90-day window from Shopify Courier's email failure event stream. Volume observed:

  • 5.7.133 / 5.7.134 / 5.7.520 / 5.1.10 / 5.7.509 — all high-volume (thousands of occurrences)
  • 5.7.7 / 5.7.57 / 5.7.54 — moderate volume
  • 5.3.3 / 5.7.1-4 — lower volume but consistent, distinct from existing entries

@juenology juenology force-pushed the outlook-codes-2025-q1 branch from 7825449 to 8cfada0 Compare April 10, 2026 17:53
… data

New entries in data/codes/550.json (exchangeonline spamFilter):
- 5.7.133 - RESOLVER.RST.SenderNotAuthenticatedForGroup (sender not in allowed senders list for group)
- 5.7.124 - RESOLVER.RST.RestrictedToGroupPermission (DL restricted to members only)
- 5.7.129 - RESOLVER.RST.RestrictedToRecipientsPermission (restricted recipient list)
- 5.7.134 - RESOLVER.RST.SenderNotAuthenticatedForMailbox (mailbox requires authenticated sender)
- 5.7.1-3 - TRANSPORT.RULES.RejectMessage (mail flow / transport rule rejection variant)
- 5.7.520 / 5.7.520-2 - AS(7555) / AS(7550) external email forwarding disabled by admin policy
- 5.1.10 - RESOLVER.ADR.RecipientNotFound (address does not exist in organization)
- 5.1.1  - RESOLVER.ADR.RecipNotFound (shorter variant)
- 5.2.3  - RESOLVER.RST.RecipSizeLimit (message exceeds recipient size limit)
- 5.7.509 - DMARC policy rejection (From domain has DMARC p=reject policy)
- 5.7.7  - Email policy violation (EOP content filter)
- 5.7.900 - TRANSPORT.RULES.RejectMessage (5.7.900 variant; 929/999 variants also exist)
- 5.7.54 - Unable to relay to recipient in non-accepted domain
- 5.7.57 - Client not authenticated to relay (nominally a 530, noted in description)
- 5.7.1-4 - RESOLVER.RST.NotAuthorized (generic authorization rejection)

New entries in data/codes/554.json (new exchangeonline spamFilter section):
- 5.2.2 - STOREDRV QuotaExceededException (mailbox full / Unified Storage full)
- 5.7.7 - Email policy violation detected (554 variant)
- 5.3.3 - STOREDRV missing AD entry in Recipient Cache

All SMTP response strings are from 90-day Shopify production data with sensitive
information redacted: sending IPs → x.xx.xx.xx, email addresses → email@example.com,
sender domains → example.com, and per-message dynamic strings removed.
@juenology juenology force-pushed the outlook-codes-2025-q1 branch from 8cfada0 to f0c4fbe Compare April 10, 2026 17:56
@juenology juenology marked this pull request as ready for review April 10, 2026 18:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant