Отправка SMS на Kotlin: API библиотеки smslib4k

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Отправка SMS на Kotlin с помощью библиотеки smslib4k

В современной веб-разработке интеграция SMS-уведомлений остаётся востребованной задачей: двухфакторная аутентификация, оповещения о статусе заказа, напоминания. Для языка Kotlin существует удобная библиотека smslib4k, которая предоставляет единый интерфейс для работы с популярными SMS-провайдерами через REST API.

Библиотека написана на чистом Kotlin с использованием корутин (kotlinx.coroutines) и поддерживает асинхронную отправку сообщений. Она абстрагирует различия между провайдерами (Twilio, Vonage, SMS-Центр, СМС-Рай и др.), позволяя разработчику сосредоточиться на бизнес-логике.

Установка и подключение

Для использования smslib4k добавьте зависимость в build.gradle.kts:

repositories {
    mavenCentral()
}

dependencies {
    implementation("io.github.smslib4k:smslib4k-core:2.1.0")
    // Для конкретного провайдера, например Twilio:
    implementation("io.github.smslib4k:smslib4k-twilio:2.1.0")
}

После синхронизации Gradle библиотека готова к использованию.

Базовая инициализация клиента

Каждый провайдер требует свои учётные данные. Рассмотрим настройку для сервиса SMS-Центр (популярный российский провайдер):

import io.github.smslib4k.core.SmsClient
import io.github.smslib4k.providers.smscenter.SmsCenterProvider

fun main() {
    val client = SmsClient(
        provider = SmsCenterProvider(
            login = "your_login",
            password = "your_password"
        )
    )
    println("SMS клиент инициализирован")
}

Для Twilio конструкция будет аналогичной, но потребуются accountSid и authToken.

Отправка одиночного SMS

Библиотека поддерживает как синхронную, так и асинхронную отправку. Рекомендуется использовать корутины:

import kotlinx.coroutines.runBlocking
import io.github.smslib4k.core.model.SmsMessage

fun main() = runBlocking {
    val client = createClient() // функция из предыдущего примера

    val message = SmsMessage(
        to = "+79161234567",
        text = "Привет! Это тестовое сообщение из Kotlin."
    )

    val result = client.send(message)
    println("Статус: ${result.status}")
    println("ID сообщения: ${result.messageId}")
}

Метод send возвращает объект SmsResult, содержащий статус (SUCCESS, FAILED, PENDING) и уникальный идентификатор от провайдера.

Массовая рассылка

Для отправки одного текста на несколько номеров используйте sendBatch:

val recipients = listOf(
    "+79161234567",
    "+79261234568",
    "+79361234569"
)

val batchResult = client.sendBatch(
    to = recipients,
    text = "Акция! Скидка 20% на все товары до конца недели."
)

batchResult.forEach { (phone, result) ->
    println("$phone: ${result.status}")
}

Библиотека автоматически обрабатывает лимиты провайдера на количество запросов в секунду, используя встроенный rate-limiter.

Настройка дополнительных параметров

Многие провайдеры поддерживают расширенные опции: имя отправителя (альфа-имя), флаг транзакционности, время жизни сообщения. В smslib4k это реализовано через билдер:

val message = SmsMessageBuilder()
    .to("+79161234567")
    .text("Ваш код подтверждения: 1234")
    .sender("MyApp")          // альфа-имя (если разрешено провайдером)
    .ttl(300)                 // время жизни в секундах
    .isTransactional(true)    // приоритетная доставка
    .build()

client.send(message)

Обработка ошибок

Библиотека выбрасывает исключения при проблемах с сетью или неверных учётных данных. Рекомендуется оборачивать вызовы в try-catch:

try {
    val result = client.send(message)
    if (result.status == SmsStatus.FAILED) {
        println("Ошибка: ${result.errorMessage}")
    }
} catch (e: SmsException) {
    println("Критическая ошибка: ${e.message}")
} catch (e: Exception) {
    println("Неизвестная ошибка: ${e.localizedMessage}")
}

Асинхронная отправка с callback

Для неблокирующей отправки используйте корутину

Рекомендаций