كيف بنيت Rusty Inbox: عميل بريد سريع ومفتوح المصدر بلغة Rust و Qt 6

Rusty Inbox عميل بريد إلكتروني مجاني ومفتوح المصدر لسطح المكتب على لينكس وويندوز وماك. محرّك البريد مكتوب بلغة Rust والواجهة بـ Qt 6 / QML، لذلك تُفتح النافذة في جزء من الثانية ويبقى استهلاك الذاكرة منخفضاً. يعمل مع أي حساب IMAP/SMTP — Gmail (بكلمة مرور التطبيقات)، و Fastmail، و iCloud، و Yahoo، واستضافات cPanel — ويرتّب الوارد إلى أشخاص وإشعارات ونشرات، وكل إجراء متاح من لوحة المفاتيح. الكود على GitHub برخصة MIT أو Apache 2.0، وللتطبيق صفحة خاصة هنا: Rusty Inbox.
بنيته لأنني أقضي يومي في البريد على سطح مكتب لينكس، وكل عميل بريد جرّبته كان واحداً من اثنين: سريع لكنه بسيط جداً، أو أنيق لكنه تطبيق ويب يأتي داخل نسخته الخاصة من متصفح. أردت الأناقة بدون المتصفح. هذا المقال قصة البناء: المعمارية، والقرارات التي أبقته سريعاً، وما تطلّبه نشر كود واحد على ثلاثة أنظمة تشغيل.
ماذا يفعل Rusty Inbox؟
- الصندوق الذكي. رسائل الأشخاص أولاً، والإشعارات والنشرات ودعوات التقويم في مجموعات خاصة يمكنك طيّها.
- صناديق موحّدة لكل الحسابات، مع المُرسَل والمسودات والمنجَز لكل حساب.
- التراجع عن الإرسال والجدولة. تنتظر الرسائل في صندوق صادر محلي، والرسالة التي تفشل تُعاد محاولتها تلقائياً وتبقى ضمن المجدوَلة.
- مسودات متزامنة مع مجلد المسودات لدى مزوّد البريد، وقوالب، وتوقيع لكل حساب.
- إنجاز وتأجيل وتثبيت وإجراءات جماعية (تحديد الكل أو نطاق)، مع التراجع عن كل إجراء.
- لوحة المفاتيح أولاً:
J/Kللتنقّل،Eللإنجاز،Sللتأجيل،R/A/Fللرد والرد على الكل والتحويل،Cلرسالة جديدة،Ctrl+Enterللإرسال. - أصلي على سطح المكتب: أيقونة في شريط النظام بنقطة للرسائل غير المقروءة، وإشعارات، وروابط
mailto:، ونسخة واحدة تعمل، وتغيير السمة مباشرةً — على Omarchy تتبع الألوان والخط أمرomarchy theme set. - استيراد من Thunderbird بنقرة: الحسابات والخوادم وكلمات المرور المحفوظة.
- محلي وخاص: تخزين SQLite على جهازك، بلا تتبّع ولا خوادم وسيطة.
الصندوق الذكي في Rusty Inbox: الأشخاص أولاً والإشعارات والنشرات في مجموعات
كيف بُني Rusty Inbox؟
Rusty Inbox طبقتان لا تنتظر إحداهما الأخرى. المحرّك rusty-inbox-core مكتبة Rust خالصة بلا أي كود واجهة: مزامنة IMAP عبر async-imap فوق rustls، والإرسال عبر lettre، وتحليل الرسائل عبر mail-parser، وتخزين SQLite عبر rusqlite. تطبيق سطح المكتب مبني بـ Qt 6 / QML ومتصل بـ Rust عبر cxx-qt، ويقف بينهما كائن QObject واحد هو الجسر.
| الطبقة | ماذا تفعل | التقنية |
|---|---|---|
| الواجهة | الوارد والقراءة والكتابة والإعدادات | Qt Quick / QML |
| الجسر | JSON للداخل وإشارات Qt للخارج | cxx-qt |
| المحرّك | المزامنة والإرسال والمسودات والبحث والاستيراد | Rust و Tokio |
| التخزين | المحادثات والرسائل والصادر والإعدادات | SQLite |
القاعدة التي تجعله سريعاً بسيطة: الواجهة تقرأ البيانات المحلية فقط وبشكل فوري، وكل ما يحتاج الشبكة يعود لاحقاً كإشارة. عندما تفتح محادثة، تطلب QML من الجسر ما هو موجود في SQLite وترسمه فوراً، والمزامنة تعمل على Tokio runtime صغير داخل التطبيق وتُطلق إشارة عند وصول بريد جديد. التمرير والكتابة لا يتوقفان أبداً بسبب خادم.
حتى وقت كتابة المقال، يضم المشروع نحو 7,300 سطر Rust و 3,800 سطر QML، مع 64 اختباراً آلياً.
خمسة قرارات أبقته سريعاً وموثوقاً
1. تجميع اتصالات IMAP لكل حساب
تسجيل الدخول إلى IMAP أبطأ ما يفعله عميل البريد، وبعض المزوّدين يقيّدون الحسابات التي تسجّل الدخول كثيراً. يحتفظ المحرّك بمجموعة صغيرة من الاتصالات الجاهزة لكل حساب، ويفحص الاتصال بفحص خفيف قبل إعادة استخدامه، ثم يعيده بعد انتهاء المهمة. فتح مجلد يعيد استخدام جلسة جاهزة بدل مصافحة TLS وتسجيل دخول جديدين.
2. التراجع عن الإرسال صندوق صادر وليس مؤقتاً
الضغط على إرسال لا يرسل فوراً، بل يكتب الرسالة في جدول صادر محلي بوقت إرسال: الآن مضافاً إليه مهلة التراجع، أو الوقت الذي اخترته للجدولة. التراجع يعيد الصف مسودة. حلقة في الخلفية تلتقط الصفوف المستحقة وترسلها، وإن فشل الخادم يُعلَّم الصف بالفشل ويبقى ضمن المجدوَلة ويُعاد إرساله. ولأن الصادر محفوظ في SQLite، فلا تضيع رسالة إذا أُغلق التطبيق أو الجهاز.
3. الصندوق الذكي يقرأ الترويسات لا المحتوى
فرز البريد إلى أشخاص وإشعارات ونشرات لا يحتاج ذكاءً اصطناعياً ولا خادماً. الإشارات موجودة أصلاً في كل رسالة: ترويسة List-Unsubscribe أو List-Id تعني نشرة، وجزء تقويم يعني دعوة، و Precedence: bulk أو مرسل مثل noreply@ يعني إشعاراً آلياً، وما عدا ذلك شخص. فرز ثابت وفوري ويعمل بالكامل على جهازك.
4. عرض بريد HTML داخل بيئة معزولة
بريد HTML محتوى غير موثوق. كل رسالة تُعرض في إطار iframe خاص بخاصية sandbox وبدون allow-scripts، فلا يعمل أي سكربت داخل أي رسالة، والروابط تُفتح في متصفحك الافتراضي لا داخل التطبيق. بقية الواجهة Qt Quick أصلية، وعارض الويب يُستخدم لمحتوى الرسائل فقط.
5. الاستيراد من Thunderbird بقراءة ملفاته مباشرة
أغلب من يغيّرون عميل البريد قادمون من Thunderbird، وإعادة كتابة إعدادات الخوادم هي اللحظة التي يستسلمون فيها. يقرأ Rusty Inbox ملف Thunderbird الشخصي مباشرة — إعدادات الحسابات في prefs.js وكلمات المرور المحفوظة في logins.json بعد فك تشفيرها بالمفتاح الموجود في key4.db — فتنتقل الحسابات والخوادم وكلمات المرور بنقرة واحدة (إذا لم يكن الملف محمياً بكلمة مرور رئيسية).
الرد في Rusty Inbox مع خانات المستلمين والمرفقات
نشر كود واحد على لينكس وويندوز وماك
كل من Qt و Rust يدعمان البناء لعدة أنظمة جيداً، فكان العمل في التحزيم لا في النقل. خط GitHub Actions يبني كل إصدار:
- لينكس: AppImage وحزمة Flatpak، مع ملف PKGBUILD لآرتش لينكس يبني من المصدر.
- ويندوز 10/11: مثبّت ونسخة محمولة zip.
- ماك 12+: ملف
.dmgلمعالجات Apple Silicon و Intel.
وسكربت تثبيت يختار الحزمة المناسبة لنظامك ويحدّثها عند تشغيله مرة أخرى.
كيف أثبّت Rusty Inbox؟
نزّل حزمة من صفحة الإصدارات على GitHub، أو ابنِه بنفسك باستخدام Rust 1.85+ و Qt 6.8+ (مع Qt Quick و Quick Controls 2 و Qt WebEngine):
git clone https://github.com/karem505/rusty-inbox && cd rusty-inbox
cargo build --release
./target/release/rusty-inbox
ثم افتح الإعدادات ← الحسابات. يتعرّف التطبيق على أغلب المزوّدين من العنوان وحده؛ ولـ Gmail أنشئ كلمة مرور للتطبيقات واستخدمها ككلمة المرور. وإن كنت قادماً من Thunderbird فاختر الاستيراد من Thunderbird.
ما تعلّمته من بنائه
السرعة في تطبيقات سطح المكتب قرار معماري قبل أن تكون تحسيناً لاحقاً: اجعل الواجهة على البيانات المحلية، وادفع كل ما هو بطيء خلف إشارة، فيبدو التطبيق فورياً على أي جهاز. ونفس التفكير أطبّقه في الأنظمة التي أبنيها للشركات — أدوات داخلية تُفتح فوراً ولا تجعل الموظفين ينتظرون. إن كان هذا ما يحتاجه فريقك، فهذا هو دور خدمات التحول الرقمي.
أسئلة شائعة
هل Rusty Inbox مجاني؟ نعم. مفتوح المصدر برخصة MIT أو Apache 2.0، بلا خطة مدفوعة ولا حاجة لإنشاء حساب.
هل يعمل Rusty Inbox مع Gmail؟ نعم، عبر IMAP و SMTP. أنشئ كلمة مرور للتطبيقات من Google واستخدمها ككلمة مرور الحساب.
هل Rusty Inbox بديل لـ Thunderbird؟ هو صندوق وارد أسرع يُدار بلوحة المفاتيح، ويستورد حسابات Thunderbird وخوادمه وكلمات المرور المحفوظة بنقرة واحدة.
هل يجمع Rusty Inbox بيانات؟ لا. لا يحتوي على تحليلات ولا تقارير أعطال ولا خوادم خاصة به، ولا يتصل إلا بخوادم البريد التي تضيفها.
بماذا بُني Rusty Inbox؟ محرّك بريد بلغة Rust (async-imap و rustls و lettre و mail-parser و SQLite و Tokio) وواجهة Qt 6 / QML متصلة عبر cxx-qt.
جرّبه، أو ادعمه بنجمة، أو افتح issue: github.com/karem505/rusty-inbox.