How do internal vs external MTAs treat the same error code?

Still have a question, spotted an error, or have a better explanation or a source we should cite?

You send an email, it bounces, and your ESP dashboard tells you "Hard bounce – user not found." But if you ran your own mail server and checked the logs, you'd see the full raw response from the receiving server: something like 550 5.1.1 The email account that you tried to reach does not exist. Same error. Very different picture.

That gap is the core difference between how internal and external MTAs handle error codes.

What an internal MTA actually gives you

An internal MTA (think Postfix, Exim, or a self-hosted mail relay) logs the full SMTP conversation. When a message is rejected, you see the complete server response verbatim, the timestamp, the retry attempts, and exactly which step in the delivery process failed. Nothing is filtered for readability. You get the raw transcript.

That level of detail is genuinely useful for debugging. If a message is rejected with a 5.7.1 policy violation, you can see whether the receiving server cited an SPF failure, a DKIM mismatch, a blocklist hit, or an internal content policy. Each of those requires a completely different fix, and the raw log tells you which one it is.

The trade-off is that you're responsible for reading it, storing it, and building your own suppression logic around it. That's real operational overhead.

What an external MTA (ESP) gives you instead

When you send through an ESP like Postmark, Twilio SendGrid, or Mailgun, the MTA they operate receives that same raw SMTP response. But before it reaches your dashboard, it goes through their classification layer. That layer maps raw codes into human-readable categories like "hard bounce," "soft bounce," "spam complaint," or "policy block."

The goal is to make bounce data actionable without requiring you to parse SMTP code syntax. And for most senders, it works fine. A hard bounce is a hard bounce. Suppress it and move on.

But that abstraction has a cost. Two completely different rejection reasons can land in the same bucket. A reputation-based 550 block ("we don't accept mail from your IP") and an address-not-found 550 ("this inbox doesn't exist") can both show up as "hard bounce" in a dashboard. They look identical. They require totally different responses. (The first means you have a reputation problem. The second means you have a list hygiene problem.)

When the abstraction actually matters

Most of the time, it doesn't. If a recipient's address is invalid, it doesn't matter whether you see the raw 550 or the summarized label. Either way you suppress the address.

It matters when you're troubleshooting something that's going wrong at scale. Say your open rates have dropped and you're seeing a spike in "hard bounces" from a specific domain. The raw response would tell you whether that domain is rejecting on reputation, policy, or authentication failure. The dashboard category won't. You'd need to either request raw bounce data from your ESP via their API, check if they surface the original SMTP response anywhere in the event log, or run a test message through your own SMTP tool to capture what the receiving server actually says.

Some ESPs are better about this than others. Postmark and Mailgun both expose the raw SMTP response through their bounce webhook payloads, which is worth checking if you need that level of visibility. Others summarize and move on. Knowing which category your ESP falls into before you need to debug something is genuinely useful.

The practical takeaway

If you're on an ESP and hitting a wall with bounce diagnosis, start with the bounce webhook or API export, not just the dashboard view. The raw data is usually there. It's just not front and center. And if you're choosing between ESPs, it's worth asking upfront how much of the original SMTP response they expose. More raw data means easier troubleshooting down the road.

If you're dealing with a bounce spike right now and can't figure out what's causing it, our SOS hotline is free. We'll help you read what you're actually looking at.

Contributors

Who worked on this answer

Every name links to their profile. Every company links to their site. Real people, real accountability.

Ask an AI · tailored to your setup

Paste your ESP name, the bounce categories you're seeing, and how many of each. The AI will help you figure out what's really happening.

I send through an ESP and only see abstracted bounce categories in the dashboard. Based on my setup below, tell me: (1) what raw SMTP data I can likely still access through the API or webhooks, (2) what the abstracted categories might be hiding, and (3) what specific bounce patterns I should investigate further.

Edit the yellow boxes, then send to the AI of your choice.