Aspose.Email  لـ C++

إرسال بريد إلكتروني باستخدام C++

كيفية استخدام C++ و SMTP لإرسال بريد إلكتروني مع مرفق أو iCalendar

  تحميل محاكمة مجانية

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

إذن، إذا كنت قد أكملت جميع الأعمال التحضيرية، حان وقت بدء إرسال الرسائل. يمكنك استخدام مكتبة Aspose.Email للغة C++ لهذا الغرض. إليك أبسط مثال:

auto smtpClient = MakeObject<SmtpClient>(u"smtp.gmail.com", u"login", u"password", SecurityOptions::SSLAuto);
smtpClient->Send(u"login@gmail.com", u"to@gmail.com", u"subject", u"body");

استخدم هذا الخيار إذا رغبت في إرسال بريد نصي بسيط.

إرسال بريد إلكتروني مع مرفقات باستخدام C++

إذا كنت بحاجة إلى إرسال رسالة بريد إلكتروني معقدة باستخدام C++، فإن فئة MailMessage ستكون مفيدة بالتأكيد. على سبيل المثال، لإرسال رسالة مشابهة للسابقة:

auto message = MakeObject<MailMessage>(u"login@gmail.com", u"to@aspose.com", u"subject", u"body");
smtpClient->Send(message);

فئة MailMessage هي أداة رائعة. تتيح لك إرسال الرسائل المخزنة بصيغ EML و MSG (تنسيق رسائل Outlook). يمكنك أيضًا استخدام هذه الصيغة لإرسال مرفقات أو حتى كائنات iCalendar لتحديد أو تأكيد الحضور. تسمح لك MailMessage بضبط قائمة المستلمين، ونسخ Cc و Bcc. يمكنك إرسال بريد إلكتروني مع تنسيق HTML. يمكنك أيضًا وضع علامات مختلفة على الرسالة قبل الإرسال، إضافة بيانات وصفية، تشفيرها، وما إلى ذلك.

لماذا يختار الناس Aspose.Email للغة C++ لإرسال البريد الإلكتروني؟

نعم، Aspose.Email للغة C++ ليست مجرد أداة لإرسال رسائل البريد الإلكتروني. إنها حل شامل يوفر دعمًا كاملاً لمجموعة متنوعة من المهام المتعلقة بإرسال، استقبال، تخزين ومعالجة البريد الإلكتروني. ويمكنك أن تكون متأكدًا أنه أثناء تنفيذ هذه المهام لن تواجه قيود المكتبة. لقد كنا ندرس هذا المجال منذ سنوات عديدة ونواصل توسيع وظائفه.

ربما صادفت مكتبات صغيرة ظهرت مؤخرًا. فهي تحل بسهولة وطبيعية مشكلة بسيطة يواجهها الكثير من المستخدمين. لكن بمجرد أن تبتعد قليلًا، تدرك أنك بالاستمرار في استخدام هذه المكتبة المتواضعة تضطر إلى بناء حلول مؤقتة باستمرار، وبعض الوحدات لتجاوز قيود المكتبة، ومحوّلات لتوفيق مكتبتك الصغيرة مع مكتبة أخرى، وما إلى ذلك. وهكذا، لم تعد حلك الصغير البديع بديعًا كما كان. بل إنك ترسله إلى الخادم حيث يصطدم نفسه بقدمه بانتظام لأن أحدًا لم يختبر هذا المتناثر من الحلول والدمج قبل أن تقوم بذلك. ومهما حاولت، ستصادف في النهاية قيود هذه المكتبة وتحتاج إلى البحث عن شيء جديد. لذلك، عندما يتعلق الأمر بالتعامل مع البريد الإلكتروني، قد ترغب في النظر إلى Aspose.Email للغة C++!

نحن لا نقدم لك مجرد عميل للعمل مع SMTP. أولاً، ليس هذا هو البروتوكول الوحيد لإرسال البريد الإلكتروني باستخدام C++. مع منتجاتنا، يمكنك إرسال رسائل البريد الإلكتروني باستخدام Exchange EWS و Microsoft Graph!

لقد أخبرناك بالفعل عن إمكانيات MailMessage في هذه المقالة. ولكن هذا ليس الأداة الوحيدة لإعداد الرسائل للإرسال. يمكنك:

  • إنشاء رسائل من قالب باستخدام TemplateEngine؛
  • فك حزم الحاويات التي تحتوي على رسائل بفضل دعم صيغ OST و PST و MBOX؛
  • تنزيل الرسائل من صندوق البريد باستخدام دعم بروتوكولات IMAP و POP3 و Exchange EWS و WebDav، بالإضافة إلى Microsoft Graph؛
  • تحويل رسائل البريد الإلكتروني من صيغة إلى أخرى.

يمكنك بسهولة استلام رسالة باستخدام بروتوكول Exchange EWS. ستكون بصيغة MAPI. ولكن يمكنك تحويلها بسهولة إلى صيغة EML، مما يتيح لك إرسالها لاحقًا عبر بروتوكول SMTP. وفي الوقت نفسه، يمكنك تعديل قائمة المستلمين أو مرسل الرسالة في أي وقت.

كيف يعمل إرسال بريد إلكتروني باستخدام C++ و SMTP؟

تكوين SMTP

في اللحظة التي تنشئ فيها كائنًا من فئة SmtpClient، لا يحدث شيء خاص. كل ما تفعله هو تحديد مجموعة الإعدادات التي ستمكنك من الاتصال بخادم SMTP في المستقبل لإرسال الرسائل. كل السحر يحدث عند أول استدعاء لـ send الطريقة. ماذا يحدث في هذه اللحظة؟

في الواقع، كل شيء يعتمد على الإعدادات التي حددتها. لننظر إلى عدة خيارات. لنفترض أنك حددت اسم المضيف للخادم ولكنك لم تحدد المنفذ ونوع التشفير. في هذه الحالة، ستبدأ آلية الاختيار التلقائي للإعدادات. تتكون هذه الآلية من محاولات متتالية للاتصال بخادم SMTP باستخدام المنافذ القياسية وخوارزميات التشفير المقابلة. أولاً، تُجرى محاولة للاتصال بالخادم عبر قناة مشفرة. إذا فشلت، تحاول الآلية إنشاء اتصال غير مشفر. إذا كنت لا تريد استخدام النسخة غير المشفّرة من البروتوكول، فحدّد الـ SecurityOptions.SSL_AUTO الإعداد. يتيح لك هذا الإعداد أيضًا اختيار إعدادات الخادم، لكنه يتحقق فقط من القنوات المشفرة.

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

وبالمناسبة، يجدر الإشارة إلى أن SmtpClient الخاص بنا (مثل جميع عملاء المكتبة الآخرين) يمكنه الاتصال بخادم SMTP عبر بروكسي. يمكنك أيضًا تحديد إعدادات خادم البروكسي أثناء التهيئة.

تفويض عميل SMTP

يدعم SmtpClient أكثر من مجرد طرق اتصال مختلفة. كما يدعم أساليب تفويض مختلفة. على سبيل المثال، يمكنك استخدام آلية OAuth. لتحقيق ذلك، نوفر لك عدة أدوات في آن واحد.

أولًا، هو TokenProvider. هذه هي الفئة التي تحتوي على جميع البيانات الضرورية لتخزين وتجديد رمز OAuth. في هذه الحالة، يجب عليك إجراء تفويض OAuth بنفسك وحفظ جميع المعلومات اللازمة التي تم الحصول عليها من خادم OAuth. يلعب RefreshToken دورًا رئيسيًا هنا. إنه رمز إضافي يصدره خادم التفويض جنبًا إلى جنب مع AccessToken. الفرق بينهما أن AccessToken عادةً ما يكون صالحًا لفترة زمنية محددة فقط، بينما يكون RefreshToken صالحًا لفترة أطول بكثير أو حتى إلى ما لا نهاية (حتى يقوم المستخدم بإلغائه). بفضل RefreshToken، يمكن لفئة TokenProvider دائمًا تجديد AccessToken إذا لم يعد صالحًا.

خيار آخر هو واجهة ITokenProvider. في هذه الحالة، يمكنك ليس فقط تنفيذ آلية OAuth بنفسك ولكن أيضًا تمريرها إلى SmtpClient حتى يستخدمها هو نفسه عند الحاجة.

جدير بالذكر أن آلية OAuth ليست ضرورية دائمًا. أحيانًا يكون من الأسهل تسجيل الدخول باستخدام اسم المستخدم وكلمة المرور. لهذا لا تحتاج إلى إعادة تكوين حساب بريدك الإلكتروني، أو إلغاء التوثيق الثنائي، وما إلى ذلك. هناك حل أكثر أمانًا - وهو كلمة مرور منفصلة للتطبيق. للاستفادة من هذه الميزة، ينبغي مراجعة إعدادات حساب البريد الإلكتروني الخاص بك. من المحتمل أن تُولَّد كلمة المرور للتطبيق تلقائيًا عند إعدادها في حسابك. لا تنس حفظها في مكان ما. كما نوصي بتقليل أذونات التطبيق قدر الإمكان أثناء التكوين. بالطبع، إذا حصل المهاجم على هذه الكلمة، لن يتمكن من الاستيلاء على حسابك، لكنه لا يزال قادرًا على القيام بأشياء غير سارة. ولا يمكنك فعل شيء حيال ذلك، لأن كلمة المرور هي الوحيدة التي تحمي بياناتك من المتسللين. بشكل عام، الأداة مريحة جدًا، لكنها تقلل من أمان حسابك، استخدمها على مسؤوليتك.

إرسال بريد إلكتروني عبر SMTP باستخدام C++

إذًا، تم إنشاء الاتصال بالخادم، وتمت عملية التفويض بنجاح. حان وقت إرسال الرسائل. للإرسال، يتم استخدام كائن من فئة MailMessage. من الناحية التقنية، يمكنك تمرير جميع البيانات المطلوبة إلى طريقة الإرسال مباشرة. لكن في الواقع، ستُجمع هذه البيانات داخل كائن MailMessage. بعد ذلك، بفضل قدرة فئة MailMessage على التسلسل إلى صيغة EML، نحصل على تدفق البيانات اللازم الذي يمكن إرساله إلى خادم SMTP الخاص بنا. وبالتالي، نعطي الخادم أمرًا بإرسال الرسالة وننقل جميع محتويات الرسالة إليه على شكل بيانات نصية. إذا تم نقل بيانات ثنائية في الرسالة، مثل الملفات المرفقة، تُشفَّر هذه البيانات بصيغة Base64، وتوضح بيانات التعريف للرسالة أن المستلم سيحتاج إلى فك تشفيرها. يمكن لخادم SMTP التحقق من صحة الرسالة المستلمة (مثل التحقق من حقل FROM مع حساب المرسل على الخادم)، وكذلك إضافة بيانات تعريف للرسالة حسب تقديره. ثم يرسل الخادم البريد إلى المستلمين، الذين يحصل عليهم أيضًا من بيانات تعريف البريد.