DSN / bounces
DSN (Delivery Status Notification, RFC 3461, RFC 3464) — стандартный формат уведомлений о статусе доставки почты: «доставлено», «отклонено», «отложено». Основной инструмент диагностики почтовых проблем. То что в народе называют bounces.
Виды DSN
| Тип | Что |
|---|---|
| Delivered | Успешно доставлено (просят через ORCPT) |
| Delayed | Временная проблема, ещё пытаемся (обычно 4 часа простоя) |
| Failed (bounce) | Окончательный отказ |
| Relayed | Передано в non-DSN систему |
| Expanded | Mailing-list развернул адрес |
Формат
DSN — обычное письмо (Content-Type: multipart/report) с тремя частями:
- Human-readable текстовое объяснение.
- Machine-readable —
message/delivery-status: структурированные поля. - Original message (или заголовки): что не доставилось.
Пример bounce
From: MAILER-DAEMON@mail.example.com
To: alice@example.com
Subject: Delivery Status Notification (Failure)
Content-Type: multipart/report; report-type=delivery-status;
boundary="=_bounce_boundary"
--=_bounce_boundary
Content-Type: text/plain; charset=utf-8
Your message could not be delivered to bob@invalid.com.
The recipient's mailbox does not exist.
--=_bounce_boundary
Content-Type: message/delivery-status
Reporting-MTA: dns; mail.example.com
X-Postfix-Queue-ID: A1B2C3D4
Arrival-Date: Wed, 15 Jul 2026 22:00:00 +0500
Final-Recipient: rfc822; bob@invalid.com
Original-Recipient: rfc822; bob@invalid.com
Action: failed
Status: 5.1.1
Diagnostic-Code: smtp; 550 5.1.1 <bob@invalid.com>: Recipient address rejected: User unknown
--=_bounce_boundary
Content-Type: message/rfc822
[оригинальное письмо целиком или заголовки]
--=_bounce_boundary--
Enhanced Mail System Status Codes
Формат class.subject.detail (RFC 3463).
Class (первая цифра)
| Class | Значение |
|---|---|
| 2.X.X | Success |
| 4.X.X | Persistent Transient — временная проблема, попробуй позже |
| 5.X.X | Permanent Failure — не получится никогда |
Subject (вторая цифра)
| X.0.X | Other/Undefined |
|---|---|
| X.1.X | Addressing problems |
| X.2.X | Mailbox problems |
| X.3.X | System problems |
| X.4.X | Network / routing |
| X.5.X | Mail delivery protocol |
| X.6.X | Content / media |
| X.7.X | Security / policy |
Частые коды
| Код | Значение |
|---|---|
| 2.0.0 | Success |
| 4.2.2 | Mailbox full (retry позже) |
| 4.4.7 | Timeout / message expired in queue |
| 4.7.0 | Temporary security policy failure (greylist) |
| 5.1.1 | Bad destination mailbox — no such user |
| 5.1.2 | Bad destination system — no such domain |
| 5.2.1 | Mailbox disabled |
| 5.2.2 | Mailbox full (permanent) |
| 5.4.1 | No answer from host |
| 5.4.4 | Unable to route |
| 5.7.1 | Delivery not authorized (blocked by policy) |
| 5.7.26 | Message not accepted by SPF/DKIM/DMARC |
| 5.7.27 | Sender-address rejected |
Hard bounce vs Soft bounce
- Hard bounce — 5.X.X, окончательный. Адрес не существует, никогда не заработает. Мейл-лист должен удалить адрес.
- Soft bounce — 4.X.X, временный. Ящик полон, сервер лежит. Попробовать через N часов.
Backscatter
Классическая ошибка старых серверов: сервер принимает все письма, а bounce'ит потом когда обнаружит что получателя не существует. Проблема: envelope-from может быть подделан (спам), и bounce полетит к невиновному человеку → «backscatter».
Правильно: отклонять неизвестных получателей сразу при SMTP-сессии (recipient validation) — 550 сразу, а не bounce потом.
Bounce management
При массовых рассылках нужно обрабатывать bounces:
- Envelope-from = VERP (Variable Envelope Return Path):
bounce+alice=example.com@yourlist.com. Bounce придёт по этому адресу — сразу знаешь чей. - Парсишь DSN, извлекаешь Status-код.
- Hard bounce → unsubscribe адрес.
- Soft bounce → счётчик, после N раз → unsubscribe.
SendGrid / Mailgun / Postmark
ESP (Email Service Providers) вешают это на себя: показывают статистику bounces, автоматически удаляют hard-bounce адреса из списков.
NDR vs DSN
NDR (Non-Delivery Report) — Microsoft-термин для DSN. Тот же самый формат по сути. Иногда чуть иначе оформлен в Exchange/Outlook.