ما هو هذا النظام؟
هذا النظام يسمح لك بإرسال رسائل بريد إلكتروني (إيميلات) لعدد كبير من الأشخاص في نفس الوقت. تخيل أنك تريد إرسال نفس الرسالة لـ 1000 شخص - بدلاً من إرسالها واحدة واحدة، هذا النظام يرسلها لك تلقائياً!
النظام يتكون من 3 أجزاء رئيسية:
Supabase
هذا هو "المخزن" الذي يحفظ طابور الرسائل. فكر فيه مثل مستودع يحفظ الرسائل قبل إرسالها.
SMTP
هذا هو "ساعي البريد" الذي يوصل الرسائل. تحتاج خادم بريد (مثل بريد شركتك أو Gmail) لإرسال الرسائل فعلياً.
الواجهة
هذه الصفحة التي تراها الآن - مكان كتابة الرسائل وإضافة العناوين والتحكم في الإرسال.
إعداد Supabase (الخطوة الأولى)
Supabase هي خدمة مجانية تعمل كقاعدة بيانات على الإنترنت. سنستخدمها لحفظ طابور الرسائل ومعالجتها. اتبع هذه الخطوات بدقة:
إنشاء حساب في Supabase
افتح موقع supabase.com واضغط على زر "Start your project" أو "Sign Up".
يمكنك التسجيل باستخدام حساب GitHub الخاص بك (الأسهل) أو بالبريد الإلكتروني وكلمة مرور.
إنشاء مشروع جديد
بعد تسجيل الدخول:
- اضغط على "New Project" (مشروع جديد)
- اختر اسماً للمشروع (مثلاً:
email-system) - أنشئ كلمة مرور قوية لقاعدة البيانات (احفظها في مكان آمن)
- اختر المنطقة الأقرب لك جغرافياً (مثل: Central EU لأوروبا)
- اختر الخطة المجانية "Free"
- اضغط "Create new project"
انتظر دقيقة أو دقيقتين حتى يتم إنشاء المشروع.
الحصول على بيانات الاتصال (URL و Anon Key)
هذه أهم خطوة! ستحتاج قيمتين من Supabase:
- من القائمة العلوية داخل المشروع، ستجد زر (Connect).
- ثم اضغط على "API Keys" من القائمة المنبثقة
- ستجد "Project URL" - هذا هو رابط Supabase URL
شكله يكون:https://xxxxxxxx.supabase.co - في القائمة "Project API keys"، انسخ المفتاح المكتوب عليه "anon public" - هذا هو Anon Key
شكله يكون:eyJhbGciOiJIUzI1NiIs...(نص طويل)
إنشاء جدول قاعدة البيانات (Migration)
الآن نحتاج إنشاء "جدول" في قاعدة البيانات ليحفظ فيه النظام طابور الرسائل. فكر في الجدول مثل جدول Excel لكن على الإنترنت.
فتح محرر SQL
في لوحة تحكم Supabase:
- من القائمة الجانبية اليسرى، اضغط على أيقونة "SQL Editor" (شكلها مثل قاعدة بيانات مع قلم)
- ستفتح لك صفحة بيضاء لكتابة أوامر SQL
نسخ ولصق كود إنشاء الجدول
انسخ الكود التالي بالكامل والصقه في محرر SQL ثم اضغط "Run" (تشغيل):
/*
# Create email queue system
1. New Tables
- `email_queue`
- `id` (uuid, primary key) - unique identifier for each batch
- `job_id` (text, not null) - groups batches belonging to the same send operation
- `client_token` (text, not null) - identifies the client/browser session
- `recipients` (text[], not null) - email addresses for this batch
- `subject` (text, not null) - email subject line
- `body` (text) - plain text email body
- `html` (text) - HTML email body
- `send_type` (text, default 'bcc') - 'bcc' or 'to' sending mode
- `smtp_config` (jsonb, not null) - SMTP connection settings, cleared after processing
- `status` (text, default 'pending') - pending, processing, completed, failed, cancelled
- `error_message` (text) - error details if batch failed
- `batch_index` (int, default 0) - order of this batch within the job
- `total_batches` (int, default 1) - total number of batches in the job
- `created_at` (timestamptz) - when the batch was created
- `updated_at` (timestamptz) - last update time
- `processed_at` (timestamptz) - when processing completed
2. Security
- Enable RLS on `email_queue` table
- No anon/authenticated policies: all access goes through Edge Functions using service_role_key
- SMTP credentials are stored temporarily and cleared after processing
3. Indexes
- Index on (job_id, client_token) for fast job lookups
- Index on (status, created_at) for queue processing order
4. Important Notes
- SMTP config is stored as JSONB and cleared (set to '{}') after each batch is processed
- The table is fully locked down via RLS with no policies, ensuring only service_role can access
- This protects sensitive SMTP credentials from being read via the anon key
*/
CREATE TABLE IF NOT EXISTS email_queue (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
job_id text NOT NULL,
client_token text NOT NULL,
recipients text[] NOT NULL DEFAULT '{}',
subject text NOT NULL,
body text,
html text,
send_type text NOT NULL DEFAULT 'bcc',
smtp_config jsonb NOT NULL DEFAULT '{}',
status text NOT NULL DEFAULT 'pending',
error_message text,
batch_index int NOT NULL DEFAULT 0,
total_batches int NOT NULL DEFAULT 1,
created_at timestamptz DEFAULT now(),
updated_at timestamptz DEFAULT now(),
processed_at timestamptz
);
ALTER TABLE email_queue ENABLE ROW LEVEL SECURITY;
CREATE INDEX IF NOT EXISTS idx_email_queue_job_client
ON email_queue (job_id, client_token);
CREATE INDEX IF NOT EXISTS idx_email_queue_status_created
ON email_queue (status, created_at);
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name = 'email_queue' AND column_name = 'personalize'
) THEN
ALTER TABLE email_queue ADD COLUMN personalize jsonb DEFAULT '{}';
END IF;
END $$;
التأكد من نجاح العملية
بعد الضغط على Run، يجب أن ترى رسالة "Success" باللون الأخضر. هذا يعني أن الجدول تم إنشاؤه بنجاح!
إضافة Edge Functions (الوظائف)
الـ Edge Functions هي "برامج صغيرة" تعمل على خوادم Supabase. نحتاج اثنتين: واحدة لإرسال البريد مباشرة، والثانية لإدارة طابور الإرسال.
طريقة الإضافة عبر Supabase CLI
من القائمة الجانبية، اختر قسم Edge Functions.
ضمن خيار Via Editor، اضغط على زر Open Editor.
email-queue
بسبب طول الكود، يرجى نسخه من الرابط المرفق قم باستبدال الكود الموجود بالكامل بالكود الجديد (فوق الاسم):
https://email-system.hamiz.net/email-queue.txt
الخطوة التالية: إضافة كود إضافي
من القائمة الجانبية، اختر قسم Edge Functions.
ضمن خيار Deploy a new function، اضغط على زر Via Editor.
send-email
بسبب طول الكود، يرجى نسخه من الرابط المرفق قم باستبدال الكود الموجود بالكامل بالكود الجديد (فوق الاسم):
https://email-system.hamiz.net/send-email.txt
التحقق من النشر
في لوحة تحكم Supabase:
- اذهب إلى "Edge Functions" من القائمة الجانبية
- يجب أن ترى وظيفتين: send-email و email-queue
- ستظهر لك الروابط كما هو موضح أعلاه، .
https://xxxxxxx.supabase.co/functions/v1/email-queue
https://xxxxxxx.supabase.co/functions/v1/send-email
إعدادات Supabase في النظام
بعد إنشاء حساب Supabase وإضافة الجدول والوظائف، ارجع للنظام الرئيسي وأدخل بياناتك:
فتح لوحة إعدادات Supabase
في الصفحة الرئيسية للنظام، ستجد في الأعلى لوحة "إعدادات Supabase". اضغط عليها لفتحها.
إدخال رابط Supabase URL
في خانة "رابط Supabase (URL)"، الصق الرابط الذي نسخته من Supabase.
مثال: https://abcdefgh.supabase.co
إدخال مفتاح Anon Key
في خانة "مفتاح Anon Key"، الصق المفتاح العام الذي نسخته.
المفتاح يبدأ عادة بـ eyJhbGciOiJIUzI1NiIs...
حفظ الإعدادات
اضغط على زر "حفظ الإعدادات". ستلاحظ أن:
- الشارة تتحول إلى "مهيأ" باللون الأخضر
- الروابط التلقائية تظهر (رابط إرسال البريد ورابط الطابور)
إعدادات SMTP (خادم البريد)
SMTP هو البروتوكول المستخدم لإرسال البريد الإلكتروني. تحتاج بيانات خادم البريد الخاص بك لإرسال الرسائل.
من أين أحصل على بيانات SMTP؟
بريد cPanel (الأكثر شيوعاً)
- Host: mail.yourdomain.com
- Port: 465 أو 587
- User: your@yourdomain.com
- Pass: كلمة مرور البريد
Gmail
- Host: smtp.gmail.com
- Port: 465
- User: your@gmail.com
- Pass: كلمة مرور التطبيق*
Outlook / Hotmail
- Host: smtp.office365.com
- Port: 587
- User: your@outlook.com
- Pass: كلمة مرور الحساب
فتح لوحة إعدادات SMTP
تحت لوحة Supabase، ستجد لوحة "إعدادات SMTP". اضغط عليها لفتحها.
ملء الحقول
- خادم SMTP (Host): عنوان خادم البريد (مثل:
mail.example.com) - المنفذ (Port): عادة
465(اتصال آمن SSL) أو587(TLS) - اسم المستخدم: بريدك الإلكتروني الكامل
- كلمة المرور: كلمة مرور البريد
- اسم المرسل: الاسم الذي سيظهر للمستلم (مثل: "شركة حميز")
- بريد المرسل: البريد الذي سيظهر كمرسل
حفظ واختبار
- اضغط "حفظ الإعدادات" لحفظها
- اضغط "اختبار الاتصال" للتأكد من صحة البيانات
- إذا ظهرت رسالة نجاح، فالإعدادات صحيحة!
هام جداً لمستخدمي Gmail
لا تستخدم كلمة مرور حساب Google العادية. يجب إنشاء "كلمة مرور التطبيقات":
- اذهب إلى إعدادات حساب Google ثم الأمان (Security).
- تأكد من تفعيل التحقق بخطوتين (2-Step Verification).
- رابط مباشر: https://myaccount.google.com/apppasswords
- ابحث عن خيار "كلمات مرور التطبيقات" (App Passwords) وأنشئ واحدة جديدة باسم "SMTP".
- انسخ الرمز المكون من 16 حرفاً واستخدمه في حقل "كلمة المرور" أدناه.
ملء بيانات Gmail SMTP
قم بتعبئة الحقول بالبيانات التالية بدقة:
- Host (الخادم):
smtp.gmail.com - Port (المنفذ):
465(SSL) - Email (اسم المستخدم): بريدك الكامل (example@gmail.com)
- Password (كلمة المرور): ضع "كلمة مرور التطبيقات" (الـ 16 حرفاً) وليس كلمة مرورك العادية.
- اسم المرسل: اسم متجرك أو التطبيق.
- بريد المرسل: نفس بريدك الإلكتروني المستخدم أعلاه.
إدارة قائمة البريد الإلكتروني
إضافة العناوين يدوياً
اكتب عناوين البريد في مربع النص الكبير، كل عنوان في سطر جديد. مثلاً:
ahmed@example.com
sara@example.com
omar@example.com
استيراد من Excel
اضغط زر "استيراد من Excel" واختر ملف Excel أو CSV يحتوي على عناوين البريد. النظام سيستخرج العناوين تلقائياً.
حذف المكررات
اضغط "حذف المكررات" لإزالة العناوين المتكررة تلقائياً. مثلاً إذا كان ahmed@example.com مكتوباً مرتين، سيبقى مرة واحدة فقط.
عدد الإيميلات في كل دفعة
حدد كم عنوان يتم إرساله في كل مرة. مثلاً إذا وضعت 50، سيتم إرسال الرسالة لـ 50 شخص في كل دفعة.
كتابة الرسائل
إضافة رسالة جديدة
اضغط زر "إضافة رسالة جديدة" لإضافة صندوق رسالة. يمكنك إضافة عدة رسائل مختلفة.
كتابة الموضوع والمحتوى
- العنوان (الموضوع): عنوان الرسالة الذي سيظهر في صندوق البريد
- محتوى الرسالة: يمكنك كتابة نص عادي أو HTML لتصميم رسالة جميلة
تحديد الرسائل للإرسال
كل رسالة لها مربع تحديد (Checkbox). حدد الرسائل التي تريد إرسالها. يمكنك:
- "تحديد الكل" - لتحديد جميع الرسائل دفعة واحدة
- "إلغاء تحديد الكل" - لإلغاء تحديد جميع الرسائل
- البحث في الرسائل - للبحث عن رسالة معينة بعنوانها
طريقة الإرسال: BCC مقابل To
BCC (مخفي) - الافتراضي
المستلمون لا يرون عناوين بعضهم البعض. هذا هو الخيار الأفضل للرسائل الجماعية لأنه يحمي خصوصية المستلمين.
To (ظاهر)
جميع المستلمين يرون عناوين بعضهم. استخدمه فقط إذا كنت تريد أن يعرف المستلمون من هم الآخرون.
طرق الإرسال
إرسال عبر SMTP
الطريقة المباشرة - يرسل كل دفعة مباشرة عبر خادم SMTP. مناسب للأعداد الصغيرة والمتوسطة. إذا أغلقت الصفحة يتوقف الإرسال.
إرسال عبر الطابور
الطريقة الذكية - يحفظ الرسائل في قاعدة البيانات ويرسلها تدريجياً. يمكنك إيقافه مؤقتاً واستئنافه. مناسب للأعداد الكبيرة.
إرسال عبر mailto
يفتح برنامج البريد الافتراضي في جهازك (مثل Outlook أو gmail) مع تعبئة البيانات تلقائياً. مفيد للإرسال اليدوي.
أزرار إدارية
- حذف المرسل: يزيل العناوين التي تم إرسال الرسائل إليها بنجاح من القائمة
- إعادة من البداية: يعيد تعيين حالة جميع العناوين لتبدأ الإرسال من جديد
- تراجع: يتراجع عن آخر عملية قمت بها
نظام الطابور (Queue System)
نظام الطابور يعمل بهذه الطريقة:
تقسيم إلى دفعات
عند الضغط على "إرسال عبر الطابور"، يتم تقسيم جميع العناوين إلى دفعات حسب العدد المحدد (مثلاً: 50 عنوان في كل دفعة).
حفظ في قاعدة البيانات
كل دفعة تُحفظ في جدول email_queue في Supabase مع حالة "pending" (في الانتظار).
معالجة تدريجية
النظام يأخذ دفعة واحدة في كل مرة، يرسلها، ثم ينتظر (حسب التأخير المحدد) قبل الدفعة التالية.
التحكم أثناء الإرسال
- إيقاف مؤقت: يوقف الإرسال مؤقتاً (يمكن استئنافه لاحقاً)
- استئناف: يكمل الإرسال من حيث توقف
- إلغاء: يلغي جميع الدفعات المتبقية نهائياً
نظام القوالب
القوالب تسمح لك بحفظ رسائلك وإعداداتك لاستخدامها مرة أخرى لاحقاً بدون إعادة كتابتها.
حفظ القالب
اكتب اسماً للقالب ثم اضغط "حفظ". سيتم حفظ جميع الرسائل والعناوين والإعدادات الحالية.
تحميل القالب
اختر قالباً محفوظاً من القائمة المنسدلة وسيتم تعبئة جميع الحقول تلقائياً.
تصدير القوالب
اضغط "تصدير" لتحميل ملف JSON يحتوي على جميع قوالبك. مفيد للنسخ الاحتياطي أو المشاركة.
استيراد القوالب
اضغط "استيراد" واختر ملف JSON يحتوي على قوالب لاستعادتها.
التصدير
توليد روابط الإرسال
ينشئ روابط mailto: جاهزة يمكن مشاركتها أو فتحها مباشرة في برنامج البريد.
تحميل ملف نصي
يحمّل ملف نصي يحتوي على جميع بيانات الإرسال.
تصدير إيميلات جاهزة
يقسم العناوين إلى مجموعات (حسب العدد المحدد) ويعرضها جاهزة للنسخ والاستخدام.
سجل الإرسال
يحفظ تاريخ جميع عمليات الإرسال مع التفاصيل (التاريخ، العدد، الحالة). يمكنك مسحه في أي وقت.
وظائف أخرى
الوضع الداكن / الفاتح
اضغط على أيقونة القمر في الزاوية السفلية لتبديل بين المظهر الداكن والفاتح.
العودة للأعلى
اضغط على السهم في الزاوية السفلية للعودة لأعلى الصفحة بسرعة.
شريط الإحصائيات
في أسفل الصفحة تجد إحصائيات مباشرة: العدد الكلي للعناوين، المرسلة، المتبقية، وعدد الرسائل المحددة، مع شريط تقدم مرئي.
الحفظ التلقائي
النظام يحفظ بياناتك تلقائياً أثناء العمل. إذا أغلقت المتصفح وفتحته مرة أخرى، ستجد بياناتك كما هي.
القائمة الجانبية
اضغط على أيقونة الخطوط الثلاثة في أعلى الصفحة لفتح قائمة جانبية تحتوي على روابط مفيدة وأدوات إضافية.
معاينة HTML
عند كتابة رسالة بتنسيق HTML، يمكنك معاينتها قبل الإرسال لترى كيف ستظهر للمستلم.