Contents
SMTP response codes are the primary diagnostic signal for understanding why messages are not being delivered. The 452 and 550 code ranges cover transient and permanent delivery failures respectively. Reading these codes correctly — and configuring PowerMTA to respond appropriately to each — determines whether messages are retried (when recovery is possible) or bounced and suppressed (when the failure is permanent). Misconfigured bounce handling, where permanent failures are retried or transient failures are bounced prematurely, is one of the most damaging configuration errors in production PowerMTA deployments.
4xx vs 5xx: Transient vs Permanent Failures
SMTP defines two categories of failure: 4xx (transient) and 5xx (permanent). A 4xx response means "try again later" — the condition may resolve. A 5xx response means "this message cannot be delivered" — retrying is futile and worsens sender reputation by generating repeated rejected connection attempts.
| Code Range | Category | PowerMTA Behavior | Correct Action |
|---|---|---|---|
| 421-452 | Transient failure | Defer and retry per retry-after | Retry; investigate if persistent >24h |
| 550-559 | Permanent failure | Bounce message; no retry | Suppress recipient; fix configuration if auth-related |
452 Codes: Transient Failure Reference
| Code | Common Meaning | Typical Duration | Response |
|---|---|---|---|
452 4.2.2 | Recipient mailbox full | Hours to days | Retry for 3-5 days; then treat as inactive |
452 4.5.3 | Too many messages per SMTP session | Immediate config issue | Reduce max-msg-per-conn in domain block |
452 4.4.5 | Insufficient system storage (remote) | Hours | Standard retry — not your issue to fix |
452 4.1.1 | Recipient address temporarily rejected | Hours | Standard retry; investigate if pattern persists |
# 452 4.5.3 — too many messages per session # Fix: reduce messages per SMTP connectionmax-msg-per-conn 50 # Default is often 100; Gmail prefers lower retry-after 15m # 452 4.2.2 — mailbox full retry handling # Default PowerMTA behavior: retries these (correct) # After 5 days of 4.2.2 responses, mark address as inactive in your system # These are typically abandoned mailboxes, not temporarily full accounts
550 Codes: Permanent Rejection Reference
| Code | Meaning | Category | PowerMTA Response |
|---|---|---|---|
550 5.1.1 | Invalid recipient address | bad-mailbox | Bounce; suppress immediately |
550 5.1.2 | Recipient domain not found / no MX | bad-domain | Bounce; suppress domain |
550 5.7.1 | Spam content or sender reputation rejection | spam | Bounce; investigate content/reputation |
550 5.7.26 | DMARC authentication failure | policy | Fix DKIM/SPF alignment; do not retry until resolved |
550 5.7.606 | Microsoft banned IP | administrative | Submit delisting request |
550 5.2.2 | Recipient mailbox over quota (permanent status) | quota | Bounce; typically abandoned account |
# PowerMTA bounce-handling for 550 codes (should be configured in default-bounce-handling) default-bounce-handling bad-mailbox=block # 5.1.1 — suppress immediately default-bounce-handling bad-domain=block # 5.1.2 — suppress domain default-bounce-handling spam=block # 5.7.1 — suppress; investigate default-bounce-handling policy=block # 5.7.x — suppress until auth fixed default-bounce-handling administrative=block # Blocked IPs/domains # NEVER configure retry for 5xx responses # Retrying permanent failures burns IP reputation and wastes queue resources
ISP-Specific 5xx Bounce Patterns
# Gmail permanent rejections "550 5.7.1" → Content rejection or sender reputation "550 5.7.26" → DMARC failure (most common Gmail 550) "550 5.2.1" → User has disabled their account # Microsoft permanent rejections "550 5.7.1" → IP blocked "550 5.7.606" → IP on banned list "550 5.7.510" → Access denied "550 5.7.1 DMARC" → DMARC policy violation # Yahoo permanent rejections "550 5.7.1 [BL23]" → IP on Yahoo blocklist "550 5.7.0 From address..." → From address policy violation "554 delivery error" → Generic permanent rejection # Common across all ISPs "550 5.1.1 user unknown" → Invalid address "550 5.1.2 bad destination" → Domain issue
Accounting Log Analysis for Bounce Codes
# Hard bounce rate by ISP (5xx codes)
awk -F, 'NR>1 && $1=="b" {
split($6, a, "@")
domain = a[2]
if ($9 ~ /^5/) hard[domain]++
if ($9 ~ /^4/) soft[domain]++
} END {
for(d in hard) print hard[d], "hard;", soft[d]+0, "soft;", d
}' /var/log/pmta/accounting-YYYYMMDD.csv | sort -rn | head -15
# Top permanent rejection codes
awk -F, 'NR>1 && $1=="b" {codes[substr($10,1,15)]++} END {
for(c in codes) print codes[c], c
}' /var/log/pmta/accounting-YYYYMMDD.csv | sort -rn | head -15
Frequently Asked Questions
Operating PowerMTA at production volume?
We manage PowerMTA environments for high-volume senders — configuration, IP warming schedule, daily reputation monitoring, and operational response. Fully managed. No self-service.

