# Формат отчётов о доставке SMPP (DLR)

> Отчёт о доставке (DLR) — это deliver_sm, чей esm_class помечает его как отчёт. short_message несёт текст фиксированного формата — id, sub, dlvrd, submit date, done date, stat, err, Text — определённый в Приложении B спецификации SMPP v3.4. Поле stat (DELIVRD, EXPIRED, UNDELIV, REJECTD…) — это конечный статус сообщения.

- Канонический URL: https://www.broadnet.me/ru/reference/smpp-delivery-receipts-dlr
- Язык: ru
- Последнее обновление: 2026-07-18
- Издатель: BroadNet (https://www.broadnet.me)

Формат текста отчёта о доставке из Приложения B внутри deliver_sm: id, sub, dlvrd, submit date, done date, stat, err и Text — плюс ключевые слова stat и их номера message_state.

## Текст отчёта из Приложения B

Когда SMSC сообщает о судьбе сообщения, он отправляет deliver_sm с установленным битом отчёта в esm_class (0x04) и помещает структурированную текстовую строку в short_message. Формат определён в Приложении B спецификации v3.4. Каждое поле — это ключ, за которым следует значение; поле id связывает отчёт с message_id из вашего submit_sm_resp.

*Отчёт о доставленном сообщении (содержимое short_message)*

```text
id:0a1b2c3d4e sub:001 dlvrd:001 submit date:2607181432 done date:2607181433 stat:DELIVRD err:000 Text:Your code is 4
```

## Поле за полем

Отчёт компактен, но каждое поле важно для сверки. Даты используют формат YYMMDDhhmm. sub и dlvrd подсчитывают отправленные и доставленные сегменты. stat — это семисимвольное конечное состояние. err — это код ошибки, специфичный для сети/SMSC (000 при успехе). Text — это первые 20 символов исходного сообщения.

*Поля отчёта о доставке (Приложение B)*

| Поле | Значение |
|---|---|
| id | SMSC message_id от исходного submit_sm |
| sub | Количество отправленных коротких сообщений (сегментов) |
| dlvrd | Количество доставленных коротких сообщений |
| Дата отправки | Время отправки сообщения (YYMMDDhhmm) |
| Дата завершения | Когда сообщение достигло итогового состояния (YYMMDDhhmm) |
| stat | Итоговое состояние сообщения — ключевое слово из 7 символов (см. ниже) |
| err | Код ошибки сети/SMSC (000 = нет) |
| Текст | Первые 20 символов исходного сообщения |

## Ключевые слова stat и номера message_state

Ключевое слово stat — это человекочитаемый конечный статус; TLV message_state (0x0427) несёт ту же информацию числом. Считайте DELIVRD единственным однозначным успехом; EXPIRED, UNDELIV, REJECTD, DELETED и UNKNOWN — конечные сбои. ACCEPTD и ENROUTE не являются окончательными и не должны закрывать сообщение.

*Ключевые слова stat ↔ message_state*

| stat | message_state | Окончательно? | Значение |
|---|---|---|---|
| ENROUTE | 1 | No | В пути |
| DELIVRD | 2 | Да | Доставлено на мобильный телефон |
| EXPIRED | 3 | Да | Срок действия истек |
| DELETED | 4 | Да | Сообщение удалено |
| UNDELIV | 5 | Да | Не доставлено |
| ACCEPTD | 6 | No | Принято / прочитано вручную |
| UNKNOWN | 7 | Да | Состояние неизвестно |
| REJECTD | 8 | Да | Отклонено сетью |

## Безопасный разбор

Разбирайте отчёт из short_message в deliver_sm, но корреляцию выполняйте по TLV receipted_message_id (0x001E), а не только по тексту id, и нормализуйте шестнадцатеричный и десятичный форматы идентификатора. Отличайте промежуточные отчёты (бит промежуточного уведомления в esm_class) от конечных состояний и сопоставляйте код err с нормализованной таксономией — абонент отсутствует, аппарат занят, заблокировано как спам, неверный номер — поскольку исходные значения err различаются по маршрутам. Всегда отвечайте deliver_sm_resp.

## Частые вопросы

### Что означает stat:DELIVRD?

DELIVRD — это конечный статус, означающий, что сообщение достигло аппарата получателя. Он соответствует message_state 2 и является единственным значением stat, однозначно представляющим успех.

### Где в PDU находится текст отчёта о доставке?

В поле short_message того deliver_sm, чей esm_class имеет установленный бит отчёта о доставке (0x04). Текст следует формату Приложения B: id, sub, dlvrd, submit date, done date, stat, err, Text.

### Что такое поле err в DLR?

err — это код ошибки, специфичный для сети или SMSC, дающий причину недоставки (000 означает отсутствие ошибки). Поскольку значения различаются по маршрутам, сопоставляйте их с нормализованной внутренней таксономией для согласованной отчётности о качестве.

### Почему id в моём DLR не совпадает с message_id из submit_sm_resp?

Обычно это несоответствие формата: некоторые SMSC возвращают message_id в шестнадцатеричном виде в submit_sm_resp, но в десятичном в отчёте (или наоборот). Нормализуйте оба к одному представлению перед сравнением и предпочитайте TLV receipted_message_id.

### Все ли отчёты о доставке являются конечными?

Нет. ENROUTE и ACCEPTD — промежуточные состояния, а некоторые сети отправляют промежуточные уведомления. Закрывайте сообщение только по конечному stat, такому как DELIVRD, EXPIRED, UNDELIV, REJECTD, DELETED или UNKNOWN.

## Источники

- [SMPP v3.4 specification — Appendix B (delivery receipt)](https://smpp.org/SMPP_v3_4_Issue1_2.pdf)
- [3GPP TS 23.040 — SMS status report](https://www.3gpp.org/dynareport/23040.htm)

## См. также

- [Декодер DLR (бесплатный инструмент)](https://www.broadnet.me/ru/tools/dlr-decoder)
- [SMPP deliver_sm и сообщения MO](https://www.broadnet.me/ru/reference/smpp-deliver-sm)
- [Опциональные параметры TLV в SMPP](https://www.broadnet.me/ru/reference/smpp-tlv-parameters)
- [Чек-лист интеграции SMPP (руководство)](https://www.broadnet.me/ru/guides/smpp-integration-checklist)
- [Продукт SMS API](https://www.broadnet.me/ru/products/sms-api)
