كيف يعمل
ما يجري داخل mailctl بين قراءة الإعداد وتطبيق الخطة.
كل أمر يمرّ بالمسار نفسه. معرفته تشرح معظم سلوك mailctl: لماذا يتوقف التطبيق الأول في منتصف الطريق، ولماذا تكون إعادة التشغيل آمنة دائمًا، ولماذا تُرفض بعض الإعدادات بدل قبولها.
المسار
-
التحميل. يُحلَّل ملف YAML بصرامة. المفتاح المجهول خطأ يذكر رقم سطره، وتُطبَّق القواعد بين الحقول قبل أي اتصال بالشبكة، فيفشل الخطأ في الملف مبكرًا بدل أن يفشل في منتصف التطبيق.
-
القراءة. لكل نطاق يقرأ mailctl منطقة Cloudflare ويسأل كل مزوّد بريد عن حالته الحية: النطاقات وصناديق البريد والأسماء البديلة والالتقاط الشامل.
-
المطلوب. يحدد كل مزوّد سجلات DNS التي يحتاجها. تُجمع تلك القوائم، وتضيف طبقة قابلية التسليم DMARC وMTA-STS وTLS-RPT وBIMI، وتدمج متطلبات SPF لكل مزوّد في سجل واحد.
-
المقارنة. تُقارن الحالة المطلوبة بالحالة الحية. كل ما ينقص يصير
CREATE، وكل ما يختلفUPDATE، ومع-pruneيصير كل ما لم يعد الإعداد يذكرهDELETE. -
الترتيب. توضع الإجراءات في الترتيب الوحيد الذي ينجح (انظر أدناه).
-
الطباعة أو التنفيذ. يتوقف
planهنا ويطبع. وينفّذapplyالقائمة نفسها، سطرًا لكل إجراء، ويتوقف عند أول خطأ.
لا تُخزَّن أي حالة بين التشغيلات. ملف الإعداد والمزوّدون هم مصادر الحقيقة الوحيدة، فلا شيء ينحرف أو يُقفل أو يحتاج إلى إصلاح.
لماذا يهم الترتيب
تُنفَّذ الإجراءات داخل النطاق بترتيب ثابت:
| الخطوة | لماذا تأتي هناك |
|---|---|
MTA-STS Worker |
يجب أن تُقدَّم السياسة قبل أن يعلن سجل TXT |
سجلات DNS |
يفحص مزوّدو البريد DNS عند إضافة نطاق. يرفض Purelymail النطاق حتى يُحَلّ سجل TXT الخاص بملكيته. |
كائنات مزوّد البريد |
يرتّب كل مزوّد إجراءاته بنفسه، بدءًا بالنطاق، لأن صناديق البريد والأسماء البديلة لا يمكن أن توجد قبله. |
لهذا يتوقف أول apply عادة برسالة "DNS ownership checks did not pass": نُشرت
السجلات قبل لحظة ولم تنتشر بعد. انتظر، وشغّل apply مرة أخرى، فتُتخطّى الإجراءات
المكتملة.
كيف يُحكم على تعارضات DNS
لكل سجل يريده mailctl دور: MX أو SPF أو DKIM أو DMARC أو الملكية أو MTA-STS أو TLS-RPT أو BIMI. والدور يحدد أي السجلات القائمة يُعدّ تعارضًا.
-
السجل القائم المطابق أصلًا يُترك كما هو. تُقارن الأسماء دون تمييز لحالة الأحرف ودون النقطة الأخيرة.
-
سجل SPF أو MTA-STS أو TLS-RPT أو BIMI يتعارض فقط مع سجل TXT له وسم الإصدار نفسه. سجلات TXT الأخرى على جذر النطاق لا تُمس.
-
يعيش DKIM وDMARC على أسماء يملكها mailctl بالكامل، فأي شيء آخر هناك تعارض.
-
سجلات TXT للملكية لا تتعارض أبدًا: قد يكون لكل مزوّد سجله.
يوقف التعارض الخطة بخطأ يذكر السجل. مرّر -replace-dns لاستبداله بدل ذلك. لا
يُكتب فوق أي شيء افتراضيًا.
قد يقترح مزوّدان على نطاق واحد محتوى مختلفًا لسجل يجب أن يكون فريدًا، مثل DMARC.
هذا خطأ في الإعداد يبلّغ عنه plan وaudit كلاهما، بدل سباق على أيهما يفوز.
الخطة والتطبيق متّفقان
apply بلا وسائط يخطّط من جديد وينفّذ النتيجة، فيعمل دائمًا على الحالة الحالية.
وapply -plan saved.json ينفّذ خطة حُفظت سابقًا بـ plan -json، ويرفض إن تغيّرت
الحالة الحية منذ إعدادها. استخدم الصيغة الثانية حين يراجع شخص الخطة ويطبّقها شيء
آخر.
كل إجراء آمن التكرار. إعادة التشغيل بعد تطبيق جزئي تنفّذ ما تبقّى فقط. والنطاق
المتقارب كليًا يبلّغ No changes.
الإجراءات اليدوية
بعض التغييرات لا يمكن إجراؤها عبر واجهة المزوّد. تظهر في الخطة بوسم MANUAL مع
المكان الذي تُجرى فيه، مثل مركز إدارة Microsoft 365. لا ينفّذها apply أبدًا،
والخطة التي لم يتبقَّ فيها إلا إجراءات يدوية تُعدّ متقاربة.
التدقيق شيء مختلف
يسأل plan المزوّدين عمّا يحتفظون به. أما audit فيسأل الإنترنت: يحلّ السجلات
المنشورة عبر محلّل حقيقي ويجلب سياسة MTA-STS عبر HTTPS. واجهة المزوّد تبلّغ بما
طلبته، وaudit يبلّغ بما سيراه الخادم المستقبِل. شغّله بعد أن يأخذ DNS وقته
في الانتشار.
خريطة الشيفرة
للمساهمين، كل خطوة تعيش في حزمة واحدة تحت internal/:
| الحزمة | الدور |
|---|---|
|
مخطط YAML والتحميل الصارم والتحقق |
|
يحوّل الإعداد والحالة الحية إلى خطة مرتّبة، وينفّذها |
|
قائمة الإجراءات وترتيبها وعرضها |
|
نموذج السجلات وقواعد التعارض وعميل منطقة Cloudflare |
|
دمج SPF وسجلات DMARC وMTA-STS وTLS-RPT وBIMI |
|
حزمة لكل مزوّد بريد، خلف واجهة واحدة |
|
يرفع Worker سياسة MTA-STS |
|
يفحص DNS المنشور عبر محلّل |
|
تحديد بيانات الاعتماد وسلسلة مفاتيح macOS |
|
سطر الأوامر وصفحة الإدارة وعقد JSON |
عدّل هذه الصفحة آخر تحديث