إرسال البريد الإلكتروني بلغة C++: نظرة عامة على المكتبات وأمثلة عملية
يُعد إرسال رسائل البريد الإلكتروني إحدى المهام الأساسية للعديد من التطبيقات: بدءًا من أنظمة المراقبة والإشعارات وصولاً إلى عملاء البريد الإلكتروني المتكاملين. لا تحتوي لغة C++ على دعم مدمج لبروتوكول SMTP، ولكن توجد مكتبات خارجية قوية تسمح بدمج إرسال البريد الإلكتروني بسهولة. في هذه المقالة، سنستعرض الأدوات الأكثر شيوعًا، وكيفية تثبيتها، وسنقدم أمثلة عملية للكود.
الطرق الرئيسية لإرسال البريد الإلكتروني بلغة C++
توجد ثلاث طرق رئيسية لإرسال الرسائل بلغة C++:
- استخدام libcurl — المكتبة الأكثر شيوعًا ومرونة. تدعم SMTP و SMTP-SSL و SMTP-STARTTLS.
- استخدام VMime — مكتبة متخصصة للعمل مع رسائل MIME والتشفير والمرفقات.
- العمل المباشر مع المقابس (Sockets) — نهج منخفض المستوى يتطلب تنفيذ بروتوكول SMTP يدويًا.
في هذا الدليل، سنركز على libcurl باعتبارها الحل الأكثر شمولاً واستخدامًا على نطاق واسع.
تثبيت libcurl
للعمل مع SMTP عبر libcurl، ستحتاج إلى تثبيت المكتبة نفسها وملفات الرأس الخاصة بها. أمثلة لأنظمة التشغيل المختلفة:
# Ubuntu / Debiansudo apt-get install libcurl4-openssl-dev
# CentOS / Fedorasudo yum install libcurl-devel
# macOS (عبر Homebrew)brew install curl
# Windows (عبر vcpkg)vcpkg install curlتأكد من أن بناء curl الخاص بك يتضمن دعم بروتوكولات SMTP و SSL. يمكنك التحقق من ذلك باستخدام الأمر:
curl --version | grep -i smtpمثال بسيط: إرسال رسالة نصية
لنلقِ نظرة على مثال أساسي لإرسال بريد إلكتروني عبر خادم SMTP الخاص بـ Gmail باستخدام libcurl. لإرسال ناجح، ستحتاج إلى كلمة مرور التطبيق (App Password) لحساب Gmail.
#include <stdio.h>#include <string.h>#include <curl/curl.h>
// هيكل لنقل بيانات الرسالةstruct upload_status { int lines_read; const char **payload_text;};
// دالة رد الاتصال لقراءة نص الرسالةstatic size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp) { struct upload_status *upload_ctx = (struct upload_status *)userp; const char *data;
if (upload_ctx->lines_read < 5) { data = upload_ctx->payload_text[upload_ctx->lines_read]; if (data) { size_t len = strlen(data); memcpy(ptr, data, len); upload_ctx->lines_read++; return len; } } return 0;}
int main(void) { CURL *curl; CURLcode res = CURLE_OK; struct curl_slist *recipients = NULL; struct upload_status upload_ctx;
// نص الرسالة (كل سطر هو عنصر منفصل) const char *payload_text[] = { "From: اسمك <youremail@gmail.com>\\r", "To: المستلم <recipient@example.com>\\r", "Subject: مرحبًا من C++!\\r", "\\r", // سطر فارغ — فاصل بين الرؤوس والنص "هذه رسالة اختبارية تم إرسالها باستخدام libcurl بلغة C++.\\r", NULL };
upload_ctx.lines_read = 0; upload_ctx.payload_text = payload_text;
curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init();
if (curl) { // إعداد خادم SMTP لـ Gmail curl_easy_setopt(curl, CURLOPT_URL, "smtp://smtp.gmail.com:587"); curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL); curl_easy_setopt(curl, CURLOPT_USERNAME, "youremail@gmail.com"); curl_easy_setopt(curl, CURLOPT_PASSWORD, "كلمة_مرور_التطبيق_الخاصة_بك");
// تحديد المرسل والمستلم curl_easy_setopt(curl, CURLOPT_MAIL_FROM, "<youremail@gmail.com>"); recipients = curl_slist_append(recipients, "<recipie