كيفية إرسال رسائل SMS من C#.Net

لإرسال رسائل SMS من C#.Net لديك عدة خيارات. يمكنك استخدام مكتبة C# SMS API من Ozeki، أو يمكنك استخدام طلبات HTTP. لإرسال رسالة نصية في C#.Net يعتمد الخيار الأفضل على نوع مشروع C# الذي تستخدمه. إذا كنت تكتب كودًا لخدمة طلبات الويب، مثل C# في صفحة ASP، فيجب عليك اختيار طلبات HTTP. إذا كنت تقوم بإنشاء تطبيق سطح مكتب، أو خدمة ويندوز، أو تطبيق جوال لأندرويد أو آيفون، فمن الأفضل استخدام مكتبة C# SMS API. يركز هذا الدليل (الشكل 1) على إرسال الرسائل القصيرة فقط. إذا كنت بحاجة إلى القيام بكل من الإرسال والاستقبال، يمكنك البدء بقراءة دليل أفضل C# SMS API في 2025 أولاً.

كيفية إرسال SMS من C#.Net
الشكل 1 - كيفية إرسال SMS من C#.Net

تحميل مكتبة C# SMS API (كود مصدري مجاني)

يمكن تنزيل مثال عملي كامل لمكتبة C# SMS API من الرابط التالي. هذا الكود متاح مجانًا، ويمكنك تعديله وإعادة توزيعه بحرية.

تحميل: OzekiConsole.zip (51 كيلوبايت)

كيف يمكنني إرسال رسائل SMS من تطبيق C# لسطح المكتب

إرسال رسالة نصية من تطبيق سطح المكتب (أو تطبيق وحدة التحكم أو خدمة ويندوز) له متطلبات مختلفة عن إرسال رسالة SMS من موقع ويب. تطبيق سطح المكتب يعمل لفترة طويلة (عدة دقائق، أيام أو حتى أسابيع). في هذه الحالة، من المفيد الحفاظ على اتصال دائم ببوابة الرسائل القصيرة. استخدام طلبات ويب لمرة واحدة ليس خيارًا جيدًا لهذه التطبيقات. أكبر فائدة من الحفاظ على اتصال دائم هو أنك تحصل على معلومات حول أحداث تسليم الرسائل، مثل تقارير الإرسال وتقارير التسليم وفشل تسليم الرسائل القصيرة.

لإرسال رسائل SMS من تطبيق C# لسطح المكتب، استخدم المثال المقدم أولاً (كما يمكنك رؤيته في الشكل 2):

  1. اتصل ببوابة Ozeki للرسائل القصيرة باستخدام اسم المستخدم وكلمة المرور ozx التي قمت بإنشائها في واجهة مستخدم بوابة الرسائل القصيرة. للاتصال استخدم الأمر "connect hostname:port username password".
  2. أرسل رسالتك النصية. يمكن القيام بذلك عن طريق كتابة "send phonenumber message text" إذا كنت تستخدم تطبيق وحدة التحكم للإرسال.
  3. انتظر تقارير إرسال الرسائل وتقارير تسليمها. قد تلاحظ أن هذه التقارير مطبوعة على الشاشة، وهي تحتوي على نفس معرف الرسالة الذي تم إرجاعه عند إرسال الرسالة.

مثال لتطبيق وحدة التحكم مكتوب بلغة C#.Net. الكود المصدري لهذا التطبيق متاح على صفحة C# SMS API مع كود مصدري.

أمثلة على C# SMS API
الشكل 2 - كيفية إرسال رسالة SMS من C# SMS API

يوضح المثال أعلاه الخطوات المطلوبة. يمكنك أن ترى أنه يتم أولاً إنشاء اتصال دائم ببوابة الرسائل القصيرة، وبعد ذلك يتم إرسال الرسالة. أخيرًا، ترى تقرير قبول الرسالة وتقرير إرسالها.

لإرسال رسائل SMS من C#، استخدم الكود المصدري التالي:

  • Client = new OzxClient();
  • Client.AutoReconnect = true;
  • Client.Connect("127.0.0.1", 9518, "testuser", "testpassword");
  • Client.Connect("127.0.0.1", 9518, "testuser", "testpassword");
  • Client.Send(new OzxMessage() {ToAddress="+36111111",Text="هذا هو النص المراد إرساله من C#"});

عندما تقوم بتعيين خاصية Client.Autoconnect إلى true، فإنها تضمن أن العميل سيعيد الاتصال ببوابة الرسائل القصيرة حتى إذا فقد الاتصال الشبكي مؤقتًا أو تم إعادة تشغيل بوابة الرسائل القصيرة.

لاستقبال تقارير تسليم الرسائل في C#، تحتاج إلى الاشتراك في الأحداث:

  • Client.OnMessageAcceptedForDelivery += Client_OnMessageAcceptedForDelivery;
  • Client.OnMessageNotAcceptedForDelivery += Client_OnMessageNotAcceptedForDelivery;
  • Client.OnMessageSubmitSuccess += Client_OnMessageSubmitSuccess;
  • Client.OnMessageSubmitFailed += Client_OnMessageSubmitFailed;
  • Client.OnMessageDeliverySuccess += Client_OnMessageDeliverySuccess;
  • Client.OnMessageDeliveryFailed += Client_OnMessageDeliveryFailed;

سيتم تشغيل هذه الأحداث عندما ترسل بوابة الرسائل القصيرة التقارير المناسبة عبر الاتصال الدائم الذي أنشأناه باستخدام الأمر connect. هذه هي أكبر فائدة من استخدام اتصال دائم. تحصل على إشعارات فورية حول هذه الأحداث المتعلقة بتسليم الرسائل القصيرة. من الصعب الحصول على مثل هذه الإشعارات إذا كنت تستخدم واجهة برمجة تطبيقات HTTP للرسائل القصيرة. من ناحية أخرى، هذه المعلومات ضرورية لأي عمل، ويجب عليك معالجتها لبناء برنامج رسائل قصيرة جيد.

ما هي أنواع تقارير تسليم الرسائل النصية التي يوفرها واجهة برمجة تطبيقات الرسائل النصية في #C؟

توفر واجهة برمجة تطبيقات الرسائل النصية في #C خمسة أنواع من تقارير التسليم. يتم تقديمها كأحداث في #C. وهي حدث قبول الرسالة النصية، حدث عدم قبول الرسالة النصية، حدث إرسال الرسالة النصية بنجاح، حدث فشل إرسال الرسالة النصية، حدث تسليم الرسالة النصية بنجاح، حدث فشل تسليم الرسالة النصية.

حدث قبول الرسالة النصية: يتم رفع حدث قبول الرسالة النصية عندما يقبل بوابة أوزيكي للرسائل النصية الرسالة للتسليم ويضعها في صندوق الصادر لحساب المستخدم.

حدث عدم قبول الرسالة النصية: يتم رفع حدث عدم قبول الرسالة النصية إذا لم تقبل بوابة أوزيكي للرسائل النصية الرسالة للتسليم. يمكن أن يحدث هذا على سبيل المثال إذا نفدت رصيد الرسائل النصية للمستخدم، أو إذا كان القرص ممتلئًا أو حدث خطأ آخر في بوابة الرسائل النصية.

حدث إرسال الرسالة النصية بنجاح: يتم تشغيل حدث إرسال الرسالة النصية بنجاح عند تسليم الرسالة إلى شبكة الهاتف المحمول بنجاح. تقوم شبكة الهاتف المحمول بإرجاع تقرير إرسال الرسالة النصية، ويتم توجيه هذا التقرير إلى عميل واجهة برمجة تطبيقات الرسائل النصية في #C من خلال الاتصال المؤسس. يتم رفع حدث إرسال الرسالة النصية بنجاح على سبيل المثال عندما يتم إرسال الرسالة بواسطة عميل SMPP الذي يتصل بالنظام بشبكة الهاتف المحمول عبر الإنترنت. إذا قمت بإرسال رسائل نصية عبر بوابة رسائل نصية للأندرويد، يحدث هذا الحدث عندما يتم إرسال الرسالة النصية بواسطة مودم الرسائل النصية المدمج في هاتف الأندرويد. إذا قمت بإرسال رسائل نصية عبر تجمع مودم GSM المتصل بخادمك بكابل بيانات، يتم تشغيل الحدث عندما يعيد المودم رمز الإرسال الناجح المكون من 1 بايت إلى أمر AT+CMGS للمودم.

حدث فشل إرسال الرسالة النصية: يحدث حدث فشل إرسال الرسالة النصية إذا تعذر إرسال الرسالة النصية لأي سبب إلى شبكة الهاتف المحمول بواسطة بوابة أوزيكي للرسائل النصية. على سبيل المثال إذا كان رابط الإنترنت المستخدم من قبل اتصال عميل SMPP بشبكة الهاتف المحمول غير متصل أو إذا قام خادم SMPP بإرجاع رسالة خطأ SMPP عند إرسال الرسالة النصية. إذا قمت بإرسال رسائلك النصية عبر بوابة رسائل نصية للأندرويد، وانتهى رصيد خطة الهاتف المحمول للأندرويد، أو لم يكن الهاتف مسجلًا في شبكة الهاتف المحمول، فستتلقى أيضًا هذا الحدث. قد يكون أيضًا ممكنًا أن جدول توجيه الرسائل النصية غير مهيئ بشكل صحيح. يمكن أن يحدث خطأ إرسال الرسالة النصية أيضًا إذا كنت تستخدم مودم GSM لتسليم الرسائل النصية وتم فصل كابل البيانات بين المودم والكمبيوتر أو تعطله. في جميع هذه الحالات ستحصل على رسالة خطأ في وسائط الحدث المرفقة بهذا الحدث لتعطيك فكرة عن سبب فشل إرسال الرسالة النصية.

حدث تسليم الرسالة النصية بنجاح: يتم استدعاء حدث تسليم الرسالة النصية بنجاح عند تسليم الرسالة النصية بنجاح إلى جهاز المستلم. في هذه الحالة، يتم إرجاع تقرير تسليم الرسالة النصية بواسطة شبكة الهاتف المحمول إلى بوابة الرسائل النصية. يحتوي تقرير تسليم الرسالة النصية على الطابع الزمني للتسليم ورمز الحالة الناجح للتسليم. تقوم بوابة الرسائل النصية بإعادة توجيه هذه المعلومات إلى واجهة برمجة تطبيقات الرسائل النصية في #C. عندما تتلقى حدث تقرير تسليم رسالة نصية في #C، يمكنك التأكد من أن رسالتك النصية قد تم استلامها من قبل المستلم.

حدث فشل تسليم الرسالة النصية: يمكن التعامل مع تقرير تسليم الرسالة النصية في #C باستخدام حدث فشل تسليم الرسالة النصية إذا كان تقرير التسليم يحتوي على رمز حالة تسليم غير ناجح. يمكن أن يحدث هذا على سبيل المثال إذا كان الهاتف المحمول الذي أرسلت إليه الرسالة النصية غير مفعّل أبدًا. يحدث هذا الحدث نادرًا، لأن معظم شبكات الهاتف المحمول لا تعيد تقارير تسليم سلبية.

إرسال رسائل SMS من واجهة برمجة تطبيقات C# SMS (كود مصدر مجاني للاستخدام)

لإرسال رسائل SMS من C# استخدم الكود المصدري التالي. يمكن تعديل هذا الكود المصدري بحرية وإعادة توزيعه. لاحظ أنه يمكنك أيضًا تعديل وإعادة توزيع مصدر مكتبة واجهة برمجة تطبيقات C# SMS في مشروع Ozeki.Libs.Ozx بحرية.

using System;
using OZX;

namespace OzekiConsoleClient
{
    class Program
    {
        static OzxClient Client;

        static void Main(string[] args)
        {
         	Client = new OzxClient();
            Client.AutoReconnect = true;

            Client.OnMessageAcceptedForDelivery += Client_OnMessageAcceptedForDelivery;
            Client.OnMessageNotAcceptedForDelivery += Client_OnMessageNotAcceptedForDelivery;
            Client.OnMessageSubmitSuccess += Client_OnMessageSubmitSuccess;
            Client.OnMessageSubmitFailed += Client_OnMessageSubmitFailed;
            Client.OnMessageDeliverySuccess += Client_OnMessageDeliverySuccess;
            Client.OnMessageDeliveryFailed += Client_OnMessageDeliveryFailed;
            Client.OnMessageViewed += Client_OnMessageViewed;
            Client.OnConnected += Client_OnConnected;
            Client.OnDisconnected += Client_OnDisconnected;
        
            Client.Connect("127.0.0.1",9580,"testuser","testpass");
        }

        static void Client_OnConnected(object sender, EventArgs e)
        {
            Console.WriteLine("تم الاتصال بنجاح.");
            
            var msg = new OzxMessage();
            msg.ToAddress = recipient;
            msg.Text = message;

            Console.WriteLine("جارٍ إرسال الرسالة. المعرف: "+msg.ID);
            Client.Send(msg);
        }

        static void Client_OnDisconnected(object sender, OzxArgs< string > e)
        {
            Console.WriteLine("تم إغلاق الاتصال. السبب: " + e.Item.ToString());
        }

        static void Client_OnMessageAcceptedForDelivery(object sender, OzxArgs< string > e)
        {
            Console.WriteLine("تم قبول الرسالة للتسليم. المعرف: " + e.Item.ToString());
        }

        static void Client_OnMessageNotAcceptedForDelivery(object sender, OzxArgs< string, string > e)
        {
            Console.WriteLine("تم رفض الرسالة. المعرف: " + e.Item1.ToString()+" السبب: "+e.Item2);
        }

        static void Client_OnMessageSubmitSuccess(object sender, OzxArgs< string, DateTime > e)
        {
            Console.WriteLine("تم إرسال الرسالة. المعرف: "+e.Item1+" التاريخ: "+e.Item2);
        }

        static void Client_OnMessageSubmitFailed(object sender, OzxArgs< string, DateTime, string > e)
        {
            Console.WriteLine("فشل إرسال الرسالة. المعرف: " + e.Item1 + " التاريخ: " + e.Item2+" السبب: "+e.Item3);
        }

        static void Client_OnMessageDeliverySuccess(object sender, OzxArgs< string, DateTime > e)
        {
            Console.WriteLine("تم تسليم الرسالة. المعرف: " + e.Item1 + " التاريخ: " + e.Item2);
        }

        static void Client_OnMessageDeliveryFailed(object sender, OzxArgs< string, DateTime, string > e)
        {
            Console.WriteLine("فشل تسليم الرسالة. المعرف: " + e.Item1 + " التاريخ: " + e.Item2 + " السبب: " + e.Item3);
        }

        static void Client_OnMessageViewed(object sender, OzxArgs< string, DateTime > e)
        {
            Console.WriteLine("تمت قراءة الرسالة. المعرف: " + e.Item1 + " التاريخ: " + e.Item2);
        }
    }
}

كيفية اختبار إرسال الرسائل القصيرة باستخدام C#

لاختبار إرسال الرسائل القصيرة في واجهة برمجة تطبيقات C# SMS لديك خياران: يمكنك استخدام اتصال اختبار الرسائل القصيرة المدمج أو يمكنك إعداد بوابتين للرسائل القصيرة للحصول على بيئة اختبار أكثر واقعية. إذا قمت بإعداد بوابتين للرسائل القصيرة، فستحتاج أولاً إلى تكوين بوابة الرسائل القصيرة الأولى كـ محاكي SMPP. ستوفر بوابة الرسائل القصيرة هذه خدمة خادم SMPP إلى بوابة الرسائل القصيرة الثانية. ستعمل بنفس الطريقة التي يعمل بها مركز خدمة الرسائل القصيرة (SMSC) لشبكة مشغل الهاتف المحمول. ستقوم بوابة الرسائل القصيرة الثانية بالاتصال بالأولى باستخدام اتصال عميل SMPP، و ستوفر خدمة واجهة برمجة تطبيقات C# SMS لتطبيق الرسائل القصيرة الخاص بك في C#.

الأسئلة الشائعة

هل يتم استرداد تقرير التسليم (onMessageDeliveryFailed) لكل محاولة فاشلة أم يتم استرداده فقط عند الوصول إلى الحد الأقصى لعدد المحاولات؟

تبقى الرسالة في حالة انتظار حتى يتم استنفاد الحد الأقصى لعدد محاولات التسليم.

هل من الممكن تخزين تقارير تسليم الرسائل الواردة في SQL؟

لتلقي تقارير التسليم لرسائلك القصيرة، انتقل إلى قائمة "تحرير" وحدد "تفضيلات الخادم." داخل علامة التبويب "متقدم"، حدد موقع خانة الاختيار المُسماة "نسخ تقارير التسليم للمستخدمين" وتأكد من تحديدها. إذا قمت بتكوين SQL إلى بوابة الرسائل القصيرة، فسيتم تخزين تقارير التسليم الواردة تلقائيًا داخل قاعدة البيانات كرسائل واردة قياسية. إليك كيف تنعكس تحديثات حالة التسليم:

  • جدول ozekimessageout وتحديثات الحالة: بشرط أن ترسل الرسائل من جدول "ozekimessageout"، فإن حقل "الحالة" يتتبع تلقائيًا حالة تسليم كل رسالة. يتم تحديث هذا الحقل ديناميكيًا ليعكس النتائج التالية:
  • deliveredtonetwork: تم إرسال الرسالة بنجاح إلى الشبكة.
  • deliveredtohandset: تم تسليم الرسالة إلى هاتف المستلم.
  • deliveryerror: حدث خطأ أثناء التسليم.
توفر هذه الوظيفة طريقة ملائمة لمراقبة حالة التسليم داخل قاعدة البيانات نفسها.

More information