Отправка 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
Для неблокирующей отправки используйте корутину