إرسال SMS باستخدام Kotlin مع مكتبة smslib4k
في تطوير الويب الحديث، يظل دمج إشعارات SMS مهمة مطلوبة: المصادقة الثنائية، إشعارات حالة الطلب، التذكيرات. بالنسبة للغة Kotlin، توجد مكتبة ملائمة smslib4k توفر واجهة موحدة للعمل مع مزودي SMS المشهورين عبر REST API.
المكتبة مكتوبة بلغة Kotlin النقية باستخدام coroutines (kotlinx.coroutines) وتدعم الإرسال غير المتزامن للرسائل. تقوم بتجريد الاختلافات بين مزودي الخدمة (Twilio، Vonage، SMS-Center، SMS-Ray وغيرها)، مما يسمح للمطور بالتركيز على منطق الأعمال.
التثبيت والربط
لاستخدام 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-Center (مزود روسي مشهور):
import io.github.smslib4k.core.SmsClientimport 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 مفردة
تدعم المكتبة كلاً من الإرسال المتزامن وغير المتزامن. يُوصى باستخدام coroutines:
import kotlinx.coroutines.runBlockingimport 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("معرف الرسالة: ${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}")}تقوم المكتبة تلقائياً بمعالجة حدود المزود على عدد الطلبات في الثانية، باستخدام محدد معدل مدمج.
إعداد المعلمات الإضافية
يدعم العديد من مزودي الخدمة خيارات متقدمة: اسم المرسل (alpha-name)، علامة المعاملات، وقت حياة الرسالة. في smslib4k، يتم ذلك من خلال الباني:
val message = SmsMessageBuilder() .to("+79161234567") .text("رمز التحقق الخاص بك: 1234") .sender("MyApp") // alpha-name (إذا كان مسموحاً به من قبل المزود) .ttl(300) // وقت الحياة بالثواني .isTransactional(true) // توصيل ذو أولوية .build()
client.send(message)معالجة الأخطاء
تقوم المكتبة بإلقاء استثناءات عند وجود مشاكل في الشبكة أو بيانات اعتماد غير صحيحة. يُوصى بتغليف الاستدعاءات في try-catch:
t