Как обработать длинные SMS в SMPP: сегментация и склейка

Длинный текст в SMS обычно делят на несколько частей, которые телефон собирает в одно сообщение. Чтобы обработать его через SMPP, нужно определить кодировку и способ передачи, посчитать сегменты, передать их в правильном порядке и проверить склейку на телефоне. В этом руководстве разберём, как пройти эти шаги и какие ошибки проверить до запуска рассылки. Такой порядок поможет сверить расчёт на стороне приложения с тем, как сообщение фактически видит получатель.
Почему длинное SMS превращается в несколько частей?
У SMS есть ограничение на объём одного сообщения. Если текст его превышает, отправляющая система делит его на сегменты. К каждому добавляют служебную информацию, по которой телефон понимает, что части относятся к одному сообщению и в каком порядке их соединить.
Число сегментов зависит от текста и его кодировки. Латинские символы и кириллица могут кодироваться по-разному; эмодзи и специальные знаки тоже влияют на расчёт. Поэтому простой подсчёт символов не всегда даёт правильный результат. Сначала приложение должно определить кодировку, затем рассчитать объём каждого сегмента с учётом служебных данных.
Получатель обычно видит склеенный текст, но тарификация и учёт отправки могут идти по сегментам. В SMPP также встречаются два способа передать длинное сообщение: набор конкатенированных частей или длинный текст в поле message_payload. Поддержка зависит от шлюза и настроек подключения, поэтому способ нужно заранее согласовать с провайдером.
Как рассчитать количество частей до отправки?
Не задавайте одно фиксированное число символов для любого текста. Расчёт должен учитывать кодировку, доступную ёмкость сегмента и дополнительные заголовки, если вы используете конкатенацию. Практический алгоритм выглядит так:
- Проверьте текст и определите кодировку, которую выберет отправляющая система.
- Получите доступную ёмкость одного сегмента для этой кодировки и способа передачи.
- Разделите текст на части, оставляя место для служебной информации о склейке.
- Сосчитайте сегменты и зафиксируйте результат в журнале отправки.
- Сравните расчёт приложения с числом частей, которое принял шлюз.
Формулу можно записать так: число сегментов равно длине закодированного сообщения, делённой на доступную ёмкость одного сегмента с округлением вверх. Для точного расчёта нужны реальные параметры кодировки и передачи, а не только длина строки. Если система учитывает символы до кодирования, проверьте, что она правильно обрабатывает кириллицу, знаки пунктуации и символы за пределами базового набора.
При делении текста не разрывайте слова, если это можно сделать без нарушения лимита. Но не удаляйте пробелы и пунктуацию на границе сегментов: после склейки они должны остаться на своих местах.
Как настроить склейку частей в SMPP?
При передаче отдельными сегментами приложению нужно добавить к ним параметры, по которым получатель соберёт сообщение. Обычно это идентификатор группы, общее число частей и номер текущей части. Точный формат заголовка зависит от реализации SMPP и требований шлюза. Уточните эти параметры в технической спецификации подключения до написания логики отправки.
Если шлюз поддерживает длинное сообщение через message_payload, приложение передаёт текст целиком в соответствующем поле. Не смешивайте этот вариант с передачей сегментов без проверки: сервер может ожидать другой формат или ограничивать применение поля. В документации шлюза зафиксируйте допустимый способ, кодировку и размер передаваемых данных.
Последовательность отправки тоже имеет значение. Записывайте для каждого сообщения общий идентификатор и порядковый номер части, а в итоговом статусе сохраняйте ответ шлюза по каждому сегменту. Размер окна отправки влияет на количество одновременно передаваемых запросов; его настройку отдельно разбирает материал о размере окна submit_sm в SMPP.
Как проверить длинное SMS перед запуском?
Проверьте несколько текстов: короткий, близкий к границе сегмента и заведомо длинный. Добавьте варианты с кириллицей, латиницей, пунктуацией и символами, которые встречаются в реальных уведомлениях. Для каждого теста сравните расчёт сегментов в приложении, ответы SMPP-шлюза и результат на телефоне.
Для теста отправьте сообщение на устройство, которое принимает SMS, и проверьте три вещи: текст собрался в правильном порядке, границы слов сохранились, а в журнале видны статусы всех частей. Если часть не доставилась, не считайте всё сообщение успешным только потому, что шлюз принял остальные сегменты. Логи должны позволять найти конкретный сегмент и связать его с исходным сообщением.
Перед массовой отправкой проверьте также повторную передачу после ошибки соединения: повтор одного сегмента может привести к дубликату или нарушить сборку. Логи и правила повторов можно сверить с рекомендациями по повторной отправке SMS при сбое SMPP-соединения.
Какие ошибки чаще всего мешают склейке?
- Приложение считает символы до определения кодировки, поэтому число сегментов расходится с фактическим.
- В каждой части указан неверный номер или общее количество сегментов.
- Разные части одного сообщения получают разные идентификаторы группы.
- Шлюз ожидает конкатенированные сегменты, а приложение отправляет длинный текст через
message_payload, или наоборот. - Система отмечает исходное сообщение доставленным после ответа только по одной части.
- Повторная отправка создаёт дубли, а журнал не позволяет определить, какой сегмент завершился ошибкой.
Начните с тестового текста на границе сегмента, проверьте кодировку и способ передачи, затем сравните логи SMPP с результатом на телефоне. После этого сохраните расчёт сегментов и статусы каждой части в журнале приложения: так сбой можно будет найти до того, как он затронет всю очередь отправки.


