الخلاصة

  • أضافت RFC 5231 مقارنات مرتبة من نوع :value واختبارات عدّ من نوع :count إلى اختبارات address وenvelope وheader القائمة في Sieve. ويتوقف ما يحصيه :count على الاختبار الذي يقرأ الرسالة.
  • يحصي اختبار العناوين عناصر صناديق البريد، واختبار الغلاف عناوين النقل، واختبار الترويسة مرات ظهور الحقول لا العناوين المكتوبة داخلها. أما envelope :count مع to فيكشف عمداً عنوان المستخدم الحالي وحده.

«كم عدد المستلمين؟» ليس سؤالاً واحداً

قد يبدو عدّ المستلمين سهلاً عند النظر إلى سطر To: في رسالة. صندوقا بريد يعنيان مستلمين اثنين، أليس كذلك؟ لكن مرشّح البريد لا يعمل على الانطباع البصري للسطر. فهو يرى ترويسة الرسالة، وغلاف SMTP، وبنى عناوين محلّلة؛ ولكل سطح منها معنى مختلف وحدود مختلفة لما يجوز كشفه.

صدرت RFC 5231 في يناير 2008، وأضافت مفردات المقارنة العلائقية إلى اختبارات address وenvelope وheader الموجودة في لغة Sieve. لم يعد السؤال مقتصراً على تطابق قيمة مع أخرى؛ صار بإمكان النص أن يسأل إن كانت أكبر أو أصغر أو مساوية أو مختلفة. وقدمت الإضافة نوعين للمطابقة: :value يقارن سلاسل باستخدام مقارن يعيد معلومات ترتيب، و:count يحصي عناصر مختارة ثم يقارن العدد.

المعاملات هي gt وge وlt وle وeq وne. في :value تكون قيمة الرسالة الطرف الأيسر، وتكون قيمة قائمة المفاتيح في النص الطرف الأيمن. وإذا وُجدت قيم متعددة على أي جانب، يكفي أن تحقق مقارنة واحدة الشرط حتى ينجح الاختبار. ويتوقف معنى الترتيب على المقارن، لا على فهم طبيعي موحّد للكلمات. لذلك يجب أن يدعم التنفيذ i;ascii-numeric، وأن يتعامل هذا المقارن مع أعداد صحيحة غير موقعة لا يقل نطاقها عن 32 بت؛ ولا تمثل هذه المقارنة الأعداد السالبة.

أما :count فيكشف اختلافاً أوضح. لنفترض أن To: يتضمن عنواني صندوق بريد، وأن Cc: يتضمن عنواناً واحداً. اختبار address :count المحدد فيه to وcc يحصي ثلاثة عناصر من صناديق البريد. لا يُضاف اسم المجموعة إلى العدد، لكن صناديق البريد داخلها تُحسب. وإذا استُخدم header :count مع to وcc، فالذي يُحصى هو مرات ظهور حقول الترويسة. ففي رسالة عادية متوافقة مع RFC 2822 تضم حقلاً واحداً لكل من To: وCc: تكون النتيجة اثنين، لا ثلاثة أشخاص.

ويحصي envelope :count شيئاً آخر: العناوين في أجزاء غلاف النقل المحددة. يحتوي غلاف to دائماً على مُدخل واحد، وهو عنوان المستخدم الذي يعمل نص Sieve لديه. وتلزم المواصفة بهذا الحد كي لا يستنتج المستخدم ما إذا كانت الرسالة قد وصلت إلى شخص آخر. أما عدّ from فيساوي صفراً إذا كان أمر SMTP MAIL FROM فارغاً، وواحداً خلاف ذلك. وهكذا قد يعني «عدّ المستلمين» صناديق بريد ظاهرة في الترويسة، أو عناوين غلاف متاحة للنص، أو أسطر ترويسة. اسم الاختبار وحده لا يحسم المقصود.

ويغيّر ذلك أيضاً طريقة تركيب الشروط. فعدّ العناوين على to وcc يجمع عددي صناديق البريد في الحقلين. إذا كانت القاعدة المطلوبة «ثلاثة على الأقل في To أو ثلاثة على الأقل في Cc»، فينبغي كتابة مقارنتين منفصلتين داخل anyof. أما العدّ الموحّد فيجيب عن سؤال مختلف: «ثلاثة على الأقل في الحقلين معاً؟». يبيّن مثال RFC أن عنوانين في To وعنواناً في Cc يحققان المجموع ثلاثة، لكنهما لا يحققان أياً من الشرطين المنفصلين ذوي العتبة ثلاثة.

لم تخترع RFC 5231 الاختبارات العلائقية في Sieve من الصفر. فقد قدمت RFC 3431 الصادرة عام 2002 الامتداد ونوعي المطابقة، ثم حلّت RFC 5231 محلها. حدّثت النسخة اللاحقة مرجع المقارن إلى سجلّ المقارنة لبروتوكولات تطبيق الإنترنت في RFC 4790، وصححت أمثلة، ووضحت عناصر RFC 2822 التي يحصيها COUNT، وأزالت شرطاً خاصاً لحذف المسافات بعد إدراج مطلب أوسع في مواصفة Sieve الأساسية. ويسجل سجل IANA الامتداد بقدرة relational.

لكن هذا الامتداد يتوقف عند الاختبار. فهو لا يغيّر إجراء KEEP الضمني ولا الأفعال الصريحة مثل fileinto وredirect وreject. قد يحدد الشرط أي فرع ينفذه النص، لكنه لا يثبت ما الذي حلله الخادم، أو ما إذا نفّذ الفرع كما ينبغي، أو أين سُلّمت الرسالة أخيراً. وتكمن فائدة الدقة وحدّها العملي في فصل وحدة القياس عن المقارن وعن التنفيذ الفعلي.

المصادر