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

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

Длинный текст в SMS обычно делят на несколько частей, которые телефон собирает в одно сообщение. Чтобы обработать его через SMPP, нужно определить кодировку и способ передачи, посчитать сегменты, передать их в правильном порядке и проверить склейку на телефоне. В этом руководстве разберём, как пройти эти шаги и какие ошибки проверить до запуска рассылки. Такой порядок поможет сверить расчёт на стороне приложения с тем, как сообщение фактически видит получатель.

Почему длинное SMS превращается в несколько частей?

У SMS есть ограничение на объём одного сообщения. Если текст его превышает, отправляющая система делит его на сегменты. К каждому добавляют служебную информацию, по которой телефон понимает, что части относятся к одному сообщению и в каком порядке их соединить.

Число сегментов зависит от текста и его кодировки. Латинские символы и кириллица могут кодироваться по-разному; эмодзи и специальные знаки тоже влияют на расчёт. Поэтому простой подсчёт символов не всегда даёт правильный результат. Сначала приложение должно определить кодировку, затем рассчитать объём каждого сегмента с учётом служебных данных.

Получатель обычно видит склеенный текст, но тарификация и учёт отправки могут идти по сегментам. В SMPP также встречаются два способа передать длинное сообщение: набор конкатенированных частей или длинный текст в поле message_payload. Поддержка зависит от шлюза и настроек подключения, поэтому способ нужно заранее согласовать с провайдером.

Как рассчитать количество частей до отправки?

Не задавайте одно фиксированное число символов для любого текста. Расчёт должен учитывать кодировку, доступную ёмкость сегмента и дополнительные заголовки, если вы используете конкатенацию. Практический алгоритм выглядит так:

  1. Проверьте текст и определите кодировку, которую выберет отправляющая система.
  2. Получите доступную ёмкость одного сегмента для этой кодировки и способа передачи.
  3. Разделите текст на части, оставляя место для служебной информации о склейке.
  4. Сосчитайте сегменты и зафиксируйте результат в журнале отправки.
  5. Сравните расчёт приложения с числом частей, которое принял шлюз.

Формулу можно записать так: число сегментов равно длине закодированного сообщения, делённой на доступную ёмкость одного сегмента с округлением вверх. Для точного расчёта нужны реальные параметры кодировки и передачи, а не только длина строки. Если система учитывает символы до кодирования, проверьте, что она правильно обрабатывает кириллицу, знаки пунктуации и символы за пределами базового набора.

При делении текста не разрывайте слова, если это можно сделать без нарушения лимита. Но не удаляйте пробелы и пунктуацию на границе сегментов: после склейки они должны остаться на своих местах.

Как настроить склейку частей в SMPP?

При передаче отдельными сегментами приложению нужно добавить к ним параметры, по которым получатель соберёт сообщение. Обычно это идентификатор группы, общее число частей и номер текущей части. Точный формат заголовка зависит от реализации SMPP и требований шлюза. Уточните эти параметры в технической спецификации подключения до написания логики отправки.

Если шлюз поддерживает длинное сообщение через message_payload, приложение передаёт текст целиком в соответствующем поле. Не смешивайте этот вариант с передачей сегментов без проверки: сервер может ожидать другой формат или ограничивать применение поля. В документации шлюза зафиксируйте допустимый способ, кодировку и размер передаваемых данных.

Последовательность отправки тоже имеет значение. Записывайте для каждого сообщения общий идентификатор и порядковый номер части, а в итоговом статусе сохраняйте ответ шлюза по каждому сегменту. Размер окна отправки влияет на количество одновременно передаваемых запросов; его настройку отдельно разбирает материал о размере окна submit_sm в SMPP.

Как проверить длинное SMS перед запуском?

Проверьте несколько текстов: короткий, близкий к границе сегмента и заведомо длинный. Добавьте варианты с кириллицей, латиницей, пунктуацией и символами, которые встречаются в реальных уведомлениях. Для каждого теста сравните расчёт сегментов в приложении, ответы SMPP-шлюза и результат на телефоне.

Для теста отправьте сообщение на устройство, которое принимает SMS, и проверьте три вещи: текст собрался в правильном порядке, границы слов сохранились, а в журнале видны статусы всех частей. Если часть не доставилась, не считайте всё сообщение успешным только потому, что шлюз принял остальные сегменты. Логи должны позволять найти конкретный сегмент и связать его с исходным сообщением.

Перед массовой отправкой проверьте также повторную передачу после ошибки соединения: повтор одного сегмента может привести к дубликату или нарушить сборку. Логи и правила повторов можно сверить с рекомендациями по повторной отправке SMS при сбое SMPP-соединения.

Какие ошибки чаще всего мешают склейке?

  • Приложение считает символы до определения кодировки, поэтому число сегментов расходится с фактическим.
  • В каждой части указан неверный номер или общее количество сегментов.
  • Разные части одного сообщения получают разные идентификаторы группы.
  • Шлюз ожидает конкатенированные сегменты, а приложение отправляет длинный текст через message_payload, или наоборот.
  • Система отмечает исходное сообщение доставленным после ответа только по одной части.
  • Повторная отправка создаёт дубли, а журнал не позволяет определить, какой сегмент завершился ошибкой.

Начните с тестового текста на границе сегмента, проверьте кодировку и способ передачи, затем сравните логи SMPP с результатом на телефоне. После этого сохраните расчёт сегментов и статусы каждой части в журнале приложения: так сбой можно будет найти до того, как он затронет всю очередь отправки.