تخطَّ إلى المحتوى

عناوين بريد الاختبار للمطورين وفرق QA: ما تخفيه بيئة التجريب في الرسائل التشغيلية

لنقل إن فريقك أطلق رسالة جديدة لإعادة تعيين كلمة المرور. يوافق فريق QA عليها في بيئة التجريب: تظهر الرسالة، ويعمل الرابط، ويبدو القالب سليمًا. وبعد يومين من الإطلاق، تتراكم تذاكر الدعم. يقول أصحاب عناوين Gmail إن الرسالة لم تصل قط. ويقول موظفون في بضع شركات كبرى إنها وصلت، لكن الرابط كان «مستخدمًا من قبل» من أول نقرة. لم يغيّر أحد الكود بين بيئة التجريب والإنتاج، وما زالت كل الاختبارات تنجح.

فأي عنوان بريد للاختبار كان سيكشف هذا للمطورين؟ لا يوجد عنوان واحد. يناسب ملتقِط SMTP المحلي التطوير اليومي، ويناسب وضع الاختبار لدى مزوّدك أو نطاق اختبار تتحكم فيه الاختبارات الآلية، ويناسب صندوق خارجي حقيقي الفحص اليدوي للتأكد من أن البريد يغادر إعدادًا شبيهًا بالإنتاج ويصل إلى نطاق غريب. ويغطي صندوق مؤقت مثل VookMail هذه الحالة الأخيرة دون أي إعداد، لأن العنوان يكون جاهزًا عند تحميل الصفحة. ثم تغطي حسابات المراقبة لدى كبار مزوّدي البريد الجزء الذي لا يراه أي مما سبق. ويتناول باقي هذا الدليل كيف تختار بين هذه الخيارات، وكيف تقرأ حالات الفشل عند وقوعها، والفحوص التي يجب أن تكون جزءًا من الإطلاق.

لماذا نجحت إعادة التعيين في بيئة التجريب

نادرًا ما تتشابه بيئة التجريب والإنتاج بالقدر الذي يوحي به مخطط النشر، ويكشف البريد هذه الفروق أكثر من معظم الميزات. تمر الرسالة عبر تطبيقك، وقائمة انتظار، ومزوّد، وDNS، وخادم المستلم، وبرنامج المستلم. وقد تستخدم بيئة التجريب نسخة مختلفة من كل ذلك تقريبًا.

خذ التذكرة الأولى، مستخدمي Gmail الذين لم يصلهم شيء. لنفترض أن بيئة التجريب ترسل عبر نطاق فرعي لدى المزوّد جرت مصادقته قبل أشهر، بينما يرسل الإنتاج من نطاق From جديد ظهر مع تغيير العلامة التجارية. تشترط إرشادات المرسلين من Google على جميع المرسلين المصادقة بـSPF أو DKIM، ويدرج جدول أخطاء Gmail الرمز 5.7.26 للبريد غير المصادق عليه. وقد يمرر صندوق QA داخلي على نطاقك الرسالة نفسها دون اعتراض، لأن خادمك قد يثق بمرحّلك. لم يكن بإمكان الاختبار أن يفشل أصلًا.

أما التذكرة الثانية، الرابط «المستخدم من قبل»، فلها سبب مختلف. كثيرًا ما تفتح بوابات الأمان في الشركات الروابط في البريد الوارد لفحصها قبل أن يراها الشخص. فإذا كان رابطك يستهلك الرمز عند طلب GET عادي، استهلكته أداة الفحص، فينقر الموظف على رابط ميت. ولا يشغّل أي صندوق لديك في بيئة التجريب أداة الفحص هذه، إلا إذا صادف أن شركتك تستخدم واحدة.

لا يمكن رؤية هذين الخللين من المكان نفسه. يحتاج أحدهما إلى تسليم حقيقي إلى نظام استقبال لا تديره. ويحتاج الآخر إلى تغيير في سلوك الرابط، وهو ما تكشفه مراجعة الكود بسهولة أكبر من الاختبار. وهذه هي حجة الاختبار متعدد الطبقات: كل نوع من العناوين يجيب عن سؤال واحد ويصمت عن البقية.

ما يختلف غالبًا بين بيئة التجريب والإنتاجما قد يخفيه
نطاق الإرسال وعنوان FromSPF وDKIM مفقودان أو غير متوافقين
حساب المزوّد أو الحساب الفرعيوضع sandbox، وحدود الإرسال، وسمعة IP مختلفة
المستلموننطاقات داخلية تثق بك، وقوائم سماح تخفي العناوين السيئة
تتبع النقراتروابط معاد كتابتها تتعطل، أو نطاق تتبع بلا شهادة صالحة
الحجمقوائم انتظار وحدود معدل لا تظهر إلا تحت الضغط
قوائم الاستبعادعناوين إنتاج ارتدت رسالتها مرة وصارت تُتخطى بصمت
إعدادات الرابط الأساسيروابط تشير إلى المضيف الخطأ

أي عنوان يجيب عن أي سؤال

إليك الخيارات، ومع كل منها السؤال الذي يستطيع الإجابة عنه فعلًا.

ملتقِط محلي: «ماذا أنتج تطبيقي؟»

يقبل ملتقِط SMTP كل ما يرسله تطبيقك ويعرضه في صفحة ويب دون تسليم أي شيء. وMailpit خيار مفتوح المصدر شائع. يستمع افتراضيًا إلى SMTP على المنفذ 1025 ويقدم واجهته على الويب على المنفذ 8025، فتوجّه إعدادات التطوير إلى localhost:1025 وتفتح http://localhost:8025. وEthereal من Nodemailer فكرة مشابهة مع خدمة SMTP وهمية مستضافة. الملتقِط سريع وخاص، ويتيح لك الإرسال إلى أي عنوان دون أي خطر الوصول إلى شخص حقيقي. لكنه لا يقول شيئًا عن DNS أو المصادقة أو الفلترة، لأن شيئًا لا يعبر الإنترنت.

أداة اختبار في إطار العمل: «هل طلب الكود البريد الصحيح؟»

تستطيع معظم أطر العمل تسجيل البريد الصادر في الذاكرة أثناء تشغيل الاختبارات. لدى Laravel الدالة Mail::fake()، ويجمع Django الرسائل في django.core.mail.outbox، ولدى Rails ActionMailer::Base.deliveries. استخدمها للتأكد من أن مهمة تعمل مرة واحدة بالمستلم الصحيح والرمز الصحيح. وهي أسرع ما يمكنك الحصول عليه من نتائج، وتختبر من العالم الخارجي أقل مما يختبره الملتقِط.

وضع الاختبار لدى المزوّد: «هل يعمل تكاملي؟»

يقدم المزوّدون أنواعًا مختلفة من المساعدة هنا، والفروق مهمة. لدى Amazon SES محاكي صناديق بعناوين مثل success@simulator.amazonses.com وbounce@simulator.amazonses.com وcomplaint@simulator.amazonses.com، تنتج هذه النتائج دون الإضرار بسمعتك. كما يبدأ حساب SES الجديد في وضع sandbox لا يرسل فيه إلا إلى عناوين موثقة. ويتحقق وضع sandbox في SendGrid، المضبوط عبر mail_settings.sandbox_mode.enable، من طلبك دون تسليم. ويقبل Postmark الرمز POSTMARK_API_TEST للغرض نفسه. وهذه جيدة لأخطاء API ولخطافات الويب الخاصة بالارتداد والشكاوى، ولا تُظهر أن البريد وصل إلى أحد. راجع وثائق مزوّدك الحالية، فهذه الميزات تتغير.

نطاق اختبار تملكه: «هل يعمل المسار كله مرارًا؟»

للاختبارات الآلية الشاملة، جهّز نطاقًا أو نطاقًا فرعيًا تتحكم فيه، مع صندوق شامل أو خطاف ويب للبريد الوارد، حتى يقرأ كود الاختبار البريد عبر API. يتطلب إعداده بعض الجهد، لكنه خاص ومستقر ولا يعتمد على موقع أي شخص آخر. لا تخترع عناوين على نطاقات لا تملكها. فقد يملك شخص ما testuser@gmail.com، وسيتلقى ما ترسله. تحجز RFC 2606 النطاق example.com والنطاقين العلويين .test و.example كي تجد الوثائق وبيانات الاختبار مكانًا آمنًا تشير إليه. ولا تستطيع هذه الأسماء استقبال البريد، وهذا يجعلها مناسبة لبيانات الاختبار الثابتة وعديمة الفائدة لاختبارات التسليم.

صندوق مؤقت خارجي حقيقي: «هل سيستقبل نطاق غريب هذه الرسالة؟»

هنا يثبت الصندوق المؤقت جدواه. فهو صندوق حقيقي على نطاق لا تتحكم فيه وليس لك فيه قائمة سماح. يجب أن تجد رسالتك سجل MX، وتجري اتصال SMTP، وتُقبل. في VookMail، تشير سجلات MX للنطاقات إلى مزوّد لتسليم البريد يستقبل الرسالة ويحوّلها عبر HTTPS. ويعني العنوان الجديد أيضًا عدم وجود تاريخ: لا رسائل قديمة، ولا ارتداد سابق في قائمة الاستبعاد لديك، ولا فلاتر. وهذا يجعله طريقة سريعة لإعادة إنتاج حالة «سجّلت بعنوان جديد ولم يصلني شيء». وهو مفيد أيضًا لغير المطورين. يستطيع المصمم أو مدير المنتج قراءة ما يتلقاه المستخدم الجديد دون أي صلاحية على أدواتك.

حسابات مراقبة لدى كبار مزوّدي البريد: «أين تصل الرسالة؟»

لا تخبرك رسالة سُلّمت في نطاق واحد بشيء عن مجلد الرسائل المزعجة في نطاق آخر. احتفظ بمجموعة صغيرة من الحسابات الحقيقية (seed accounts) لدى المزوّدين الذين يستخدمهم مستخدموك فعلًا، وافحص مكان الوصول قبل التغييرات الكبيرة في القوالب أو النطاقات. ثم راقب أرقام الارتداد والشكاوى بعد الإطلاق. وإذا بدا بريدك مشكلة رسائل مزعجة، فهذه الحسابات هي أول مكان ستراها فيه.

الطريقةتعبر الإنترنتالإعدادالأتمتةخصوصية المحتوىأفضل مرحلة
أداة اختبار في إطار العمللالا شيءممتازةيبقى داخل العمليةاختبارات الوحدة والميزات
ملتقِط SMTP محليلامنخفضجيدةيبقى محليًاالتطوير
وضع الاختبار لدى المزوّدعادةً لامنخفضجيدةيبقى لدى المزوّداختبارات التكامل
نطاق الاختبار الخاص بكنعممتوسط إلى مرتفعجيدةتتحكم فيه أنتالاختبارات الشاملة في CI، وبيئة التجريب
صندوق مؤقتنعملا شيءغير موصى بهاتعامل معه على أنه عامQA اليدوي والفحوص قبل الإطلاق
حسابات المراقبةنعممتوسطمحدودةمتوسطةفحوص مكان الوصول

جولة يدوية بصندوق مؤقت

إليك جولة قابلة للتكرار عبر مسار التسجيل في بيئة التجريب أو بيئة ما قبل الإنتاج. ينبغي أن تستغرق نحو عشر دقائق بعد أن تعتادها.

  1. تأكد من أن البيئة تستخدم إعدادات المزوّد نفسها المستخدمة في الإنتاج، عدا بيانات الاعتماد، وأنها لا تحتوي إلا على بيانات مختلقة. وإذا لم تكن كذلك، فدوّن ذلك، لأنه يحد مما يمكنك استنتاجه.
  2. افتح VookMail واضغط جديد. اكتب اسم مستخدم يشير إلى الاختبار، مثل email-signup-03-x7، واختر أحد النطاقات التي يزيد عددها على 30، واضغط السهم. استخدم زر «عشوائي» الأصفر إذا كان في البريد ما قد يكون حساسًا، لأن كل من يعرف عنوانًا أو يخمّنه يستطيع فتح ذلك الصندوق.
  3. اضغط نسخ وسجّل مستخدمًا جديدًا ببيانات ملف شخصي مختلقة.
  4. دوّن وقت الإرسال ووقت ظهور الرسالة. يتحقق الصندوق كل بضع ثوانٍ، فالفارق بالدقائق يشير إلى قائمة الانتظار لديك أو إلى المزوّد. اضغط تحديث إذا أردت التأكد.
  5. اقرأ الرسالة كما يقرؤها مستخدم جديد: اسم المرسل، والموضوع، ونص المعاينة، والمتن، والزر، والرابط النصي، والتذييل. يعرض VookMail الأكواد وروابط التأكيد المكتشفة فوق الرسالة، وهذا فحص تقريبي لسهولة التقاط الكود والرابط في رسالتك.
  6. انظر إليها والصور متوقفة. يُبقي VookMail الصور متوقفة حتى تسمح بها ويزيل أدوات التتبع المخفية. وإذا لم يكن للرسالة معنى في هذه الحالة، فإن بعض مستخدميك يرون الشيء نفسه. لكن لا تستخدم هذا الصندوق للحكم على تتبع الفتح لديك، لأن أدوات التتبع لن تعمل.
  7. اضغط زر QR، وامسح العنوان بهاتف اختبار وافتح الصندوق نفسه هناك للنقر على الرابط الحقيقي في جهاز حقيقي، خصوصًا إذا كنت تستخدم universal links أو app links.
  8. أكمل التحقق وتأكد من أن حالة الحساب تتغير كما ينبغي.
  9. نفّذ الحالات السلبية من قائمة الفحص أدناه: أعد استخدام الرابط، وانتظر انتهاء الصلاحية، واطلب إعادة الإرسال.
  10. احفظ أدلتك: لقطات الشاشة، والأوقات، والعنوان المستخدم. تُحذف الرسائل بعد نحو يوم، فلن يجد تقرير خلل يُكتب الأسبوع المقبل ما يشير إليه.
  11. اضغط حذف وأزل حساب الاختبار إذا كانت عمليتك تتطلب ذلك.

يمكن الاحتفاظ بعدة عناوين في متصفح واحد، فيمكن أن يكون الداعي والمدعو، أو العنوانان القديم والجديد عند تغيير البريد، مفتوحين معًا. وإذا أرفقت ملفات في اختبارك، فتذكر أن VookMail يرفض ملفات البرامج الشائعة مثل .exe ويعرض تنبيهًا على الملفات المضغوطة، فقد لا يكون المرفق المرفوض هناك خللًا من جهتك.

كيف تقرأ الفشل

عبارة «لم تصل الرسالة قط» تصف عرَضًا قد يقع في نحو ستة أماكن، وتضيع الفرق ساعات بالبدء من المكان الخطأ. تحرك على طول المسار من كودك إلى الخارج، وتوقف عند أول مكان لا تعود ترى فيه الرسالة.

  1. هل حاول التطبيق؟ ابحث في سجل التطبيق عن محاولة الإرسال وأي استثناء. ابحث عن مهمة لم تُنشأ قط، غالبًا لأن شرطًا أو علم ميزة كان false.
  2. هل عمل العامل؟ افحص المهام العالقة أو الفاشلة أو المعاد تشغيلها. قد يشغّل عامل قائمة انتظار لم يُعد تشغيله بعد النشر كودًا قديمًا، وقد ترسل سياسة إعادة المحاولة نسخًا مكررة.
  3. هل قبلها المزوّد؟ ابحث عن المستلم أو Message-ID في سجل نشاط مزوّدك. المقبول والمؤجل والمرتد والمُسقَط أربع قصص مختلفة.
  4. هل استُبعدت؟ إذا ارتدت رسالة ذلك العنوان أو اشتكى من قبل، يتخطى كثير من المزوّدين الإرسالات القادمة بصمت. وكثيرًا ما يوقع هذا المختبرين الذين يعيدون استخدام عنوان قديم.
  5. ماذا قال الخادم المستقبِل؟ تعرض سجلات المزوّد عادةً رد SMTP، وهذا النص هو أنفع سطر في التحقيق كله.
  6. هل DNS سليم؟ افحص SPF وDKIM وDMARC لنطاق الإرسال الفعلي.
  7. هل هي موجودة لكنها مخفية؟ تأتي مجلدات الرسائل المزعجة والتبويبات وفلاتر البرنامج أخيرًا، حين يستطيع حساب مراقبة أن يريك إياها.

ماذا يخبرك به رد SMTP

وفق RFC 5321، الرد الذي يبدأ بـ4 فشل مؤقت، وينبغي للمرسل أن يحاول لاحقًا. والرد الذي يبدأ بـ5 دائم. وتضيف رموز الحالة المحسّنة من RFC 3463 تفاصيل بعد ذلك. قد يبدو سطر سجل مختلق هكذا، مثالًا على التنسيق فقط:

مثال فقط: to=user@gmail.example status=bounced reply="550 5.7.26 unauthenticated sender"

اقرأه من اليسار إلى اليمين. يعني الرقم 5 أن إعادة المحاولة لن تفيد. وتتعلق عائلة 5.7 بالأمان أو السياسة، وهذا يرسلك إلى DNS والتوقيع، بعيدًا عن عنوان المستلم. ويعطيك الجدول أدناه نقطة بداية للأنماط الشائعة.

ما تراهالطبقة الأرجحأول مكان تنظر فيه
لا شيء في سجل المزوّدالتطبيق أو قائمة الانتظارسجلات التطبيق والمهام الفاشلة
يقول المزوّد «dropped» أو «suppressed»قائمة الاستبعاد لدى المزوّدأزل عنوان الاختبار، أو استخدم عنوانًا جديدًا
تعيد API نجاحًا، لكن لا يُسجَّل أي إرسال أبدًاوضع sandbox ما زال مفعّلًاإعدادات المزوّد لتلك البيئة
5.1.1 أو ما يشبههعنوان المستلمالأخطاء الإملائية، والتحقق في النموذج الذي غيّر العنوان
5.7.26 في GmailالمصادقةSPF وDKIM والتوافق مع نطاق From
تأجيلات 4xx تزول بعد فترةالمستقبِل يبطئكالحجم، أو السمعة، أو IP إرسال جديد
سُلّمت في صندوق خارجي، ومفقودة في Gmailسياسة المستقبِل أو فلترتهحسابات المراقبة وإرشادات المرسلين من Google
تصل، لكن الرابط يقول «مستخدم من قبل»أداة فحص تجلب الرابط مسبقًااستهلك الرموز عند POST، لا GET
يؤدي الرابط إلى تحذير أمنينطاق تتبع النقراتالشهادة على النطاق الفرعي للتتبع
تصل مرتينمنطق إعادة المحاولةعدم تكرار أثر المهمة (idempotency) والمهل التي تطلق إعادة المحاولة
تصل متأخرة جدًاقائمة الانتظارقدرة العامل، وهل تشارك رسائل إعادة التعيين قائمة انتظار مع البريد الجماعي

يطرح الصف الأخير نقطة تصميم تستحق جملة إضافية. إذا شاركت رسائل إعادة تعيين كلمة المرور قائمة انتظار مع إرسال نشرة، فستنتظر خلفها. أعطِ الرسائل التشغيلية قائمة انتظار خاصة بها، ويفضل أيضًا نطاق فرعي ومسار إرسال خاصين بها، حتى لا تؤخر مشكلة تسويقية تسجيل دخول.

أوامر تختصر البحث

يمكنك فحص معظم هذا دون مغادرة الطرفية. في هذه الأمثلة، استبدل الأسماء النموذجية بأسمائك.

  • يعرض dig +short MX example.com أين يستقبل النطاق البريد. وتستحق الإجابة الفارغة نظرة أقرب، لأن RFC 5321 تتيح للمرسلين الرجوع إلى سجل العنوان، بينما الإجابة 0 . هي null MX وفق RFC 7505، ومعناها أن النطاق لا يقبل أي بريد إطلاقًا.
  • يعرض dig +short TXT example.com سجل SPF بين السجلات النصية الأخرى.
  • يعرض dig +short TXT selector._domainkey.example.com مفتاح DKIM. خذ المحدِّد الحقيقي من قيمة s= في ترويسة DKIM-Signature في الرسالة.
  • يعرض dig +short TXT _dmarc.example.com سياسة DMARC.
  • يتحقق openssl s_client -starttls smtp -connect smtp.example.com:587 من قدرتك على الوصول إلى المرحّل ويعرض شهادته. ويعني الفشل هنا مشكلة في جدار الحماية أو TLS، قبل وقت طويل من أي شيء يتعلق بالمحتوى.
  • يرسل swaks --to qa@example.test --from app@example.test --server localhost:1025 رسالة بسيطة يدويًا. وهو يتجاوز تطبيقك، فتعرف هل تعود المشكلة إلى كودك أم إلى المسار.

للحصول على أدلة على مستوى الترويسات، فإن أوثق عرض هو صندوق تتحكم فيه لدى مزوّد كبير. في Gmail، افتح الرسالة، واستخدم قائمة النقاط الثلاث، واختر عرض الأصل (Show original)، فتظهر نتائج SPF وDKIM وDMARC في الأعلى. وتذكر أن «نجاح» الفحص لدى مستقبِل واحد لا يضمنه لدى آخر.

ما تفحصه في كل مسار

«هل وصلت؟» هو السؤال الأول، وهو عادةً أقلها إثارة للاهتمام. فلكل مسار طرقه الخاصة في الخطأ بعد ذلك.

إعادة تعيين كلمة المرور

مرجع OWASP Forgot Password Cheat Sheet هو الأساس الذي تبني عليه هنا. وهو يطلب رسالة موحدة سواء كان الحساب موجودًا أم لا، واستجابات تستغرق وقتًا موحدًا، ورموزًا عشوائية وطويلة ومخزنة بأمان ولاستخدام واحد، وReferrer-Policy: no-referrer في صفحة إعادة التعيين.

  • تعرض صفحة الطلب الرسالة نفسها للعناوين المسجلة وغير المسجلة، وتستغرق الوقت نفسه تقريبًا. فالرد الفوري على العناوين المجهولة يسرّب بقدر ما تسرّبه الصياغة.
  • يعمل الرابط مرة واحدة. افتحه مرة ثانية فتحصل على شرح واضح مع طريقة لطلب رابط آخر.
  • يُبطل طلب إعادة تعيين جديد الروابط الأقدم، أو يقول تصميمك غير ذلك عن قصد.
  • يفرض الخادم انتهاء الصلاحية، وقد اختُبر بالانتظار أو بتغيير الوقت في بيئة اختبار.
  • ترسل إعادة التعيين الناجحة رسالة تأكيد، وتُعالج الجلسات الأخرى وفق سياستك.
  • لا يغيّر فتح الرابط شيئًا بحد ذاته. يُستهلك الرمز عند إرسال النموذج.
  • لا ترسل صفحة إعادة التعيين رابطها إلى أدوات التحليلات أو تتبع الأخطاء الخارجية.
  • تُطبَّق حدود المعدل لكل حساب ولكل IP، حتى لا يستطيع أحد إغراق صندوق شخص غريب.
  • تعمل العناوين ذات الأحرف الكبيرة والصغيرة أو علامات الزائد كما تعمل البسيطة.

التحقق عند التسجيل

  • يرسل التسجيل الواحد رسالة واحدة، حتى عند إعادة تشغيل المهمة.
  • يعمل الرابط أو الكود مرة واحدة، وتقدم صفحة الرابط المنتهي طريقة للمتابعة.
  • إعادة الإرسال إما تُبطل الرمز السابق وإما تتعايش معه حسب التصميم، وتخضع لحد معدل.
  • تخضع الحسابات غير الموثقة للقيود التي قصدتها بالضبط.
  • لا يخبر التسجيل مجددًا بعنوان مسجل زائرًا مجهولًا بأن الحساب موجود، إذا كان منتجك يعد ذلك حساسًا. ومن الأنماط الشائعة مراسلة المالك الحالي بدلًا من ذلك.
  • يشير الرابط إلى البيئة الصحيحة. فرسالة من بيئة التجريب تربط بالإنتاج ستغيّر عاجلًا أو آجلًا بيانات الإنتاج.

أكواد الدخول والروابط السحرية

  • الأكواد طويلة بما يكفي، وتنتهي بسرعة، ولها حد للمحاولات.
  • تعرض الروابط السحرية صفحة هبوط فيها زر، ويتم الاستهلاك عند طلب POST ذلك، فلا يضر طلب GET من أداة الفحص.
  • يفعل فتح الرابط على جهاز آخر ما يقوله تصميمك، ويستطيع المستخدم معرفة ما حدث.
  • لا يحمل سطر الموضوع كودًا إلا إذا قررت أن ذلك مقبول، لأن الإشعارات تعرضه على شاشات القفل.

تغيير عنوان البريد

  • يذهب التأكيد إلى العنوان الجديد، ولا يتغير شيء حتى يتم التأكيد.
  • يذهب إشعار إلى العنوان القديم، حتى يتمكن المالك الحقيقي من الرد على تغيير غير مصرح به.
  • تتوقف رموز إعادة التعيين المعلقة عن العمل بعد التغيير.
  • يجعل صندوقان مؤقتان تنفيذ هذا يدويًا سريعًا.

الدعوات والإيصالات والإشعارات

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

مراجعة كود الرموز

يُظهر الاختبار عبر الصندوق السلوك. أما المراجعة القصيرة للكود فتكشف عيوب التصميم التي لن يريك إياها أي صندوق. حين تقرأ الكود الذي يقف خلف روابط إعادة التعيين والتحقق والروابط السحرية، ابحث عن هذه الأمور.

  • مصدر العشوائية. ينبغي أن يكون مولّدًا آمنًا تشفيريًا، مثل secrets.token_urlsafe(32) في Python، أو crypto.randomBytes(32) في Node، أو random_bytes(32) في PHP. ولا يُقبل طابع زمني أو معرّف متزايد أو تجزئة للبريد.
  • الطول. تحمل رموز الروابط عادةً 128 بت على الأقل من العشوائية. ولا يصلح كود من ستة أرقام إلا مع انتهاء صلاحية سريع وحد للمحاولات.
  • التخزين. احتفظ بتجزئة الرمز، حتى لا يسلّم تسريب قاعدة البيانات روابط إعادة تعيين عاملة.
  • المقارنة. استخدم دالة ثابتة الوقت مثل hmac.compare_digest أو hash_equals أو crypto.timingSafeEqual حيثما تقارن القيم السرية مباشرة.
  • الغرض. يجب ألا يعمل رمز التحقق رمزًا لإعادة التعيين، ويجب ألا يعمل رمز حساب مع حساب آخر.
  • انتهاء الصلاحية. يحتفظ الخادم بوقت الانتهاء، فلا يمكن تغييره بتعديل الرابط.
  • الإبطال. ينبغي أن يؤدي استخدام الرمز، أو تغيير كلمة المرور بطريق آخر، أو تغيير البريد، إلى إلغاء كل الرموز المعلقة.
  • التسجيل. ينبغي ألا تصل الروابط الكاملة التي تحمل رموزًا إلى سجلات التطبيق أو أحداث التحليلات أو أدوات تتبع الأخطاء. افحص سجلات الوصول إلى HTTP أيضًا.

الترويسات والمصادقة

افتح المصدر الخام في ملتقِط لترى ما أنتجه تطبيقك، وفي صندوق تتحكم فيه لدى مزوّد كبير لترى ما أضافه المزوّد والشبكة.

الترويسة أو العنصرما تتحقق منه
Fromاسم العلامة التجارية الصحيح، على نطاق تملكه وتصادق عليه
Reply-Toصندوق خاضع للمتابعة، أو محذوف عن قصد
Return-Pathنطاق الارتداد، متوافقًا مع نطاقك إذا كنت تعتمد على SPF في DMARC
DKIM-Signatureموجود، مع نطاق d= يتوافق مع نطاق From
Message-IDموجود وفريد، فهو مفتاحك للتتبع في سجلات المزوّد
Content-Typemultipart/alternative بجزأي HTML ونص عادي
List-Unsubscribe، List-Unsubscribe-Postموجودان في البريد الجماعي والتسويقي، ويدعمان إلغاء الاشتراك بنقرة واحدة وفق RFC 8058
Auto-Submittedauto-generated في البريد الآلي، كما تعرّفه RFC 3834، للمساعدة في منع حلقات الردود

بعض القواعد التي تفحصها قبل إطلاق نطاق إرسال جديد. لا يجوز أن يتجاوز تقييم SPF عشر عمليات بحث DNS (RFC 7208)، وتجاوز الحد طريقة سهلة للفشل بعد إضافة مورّد آخر إلى سجلك. ويحتاج DKIM إلى نشر سجل المحدِّد الخاص بالمزوّد ونجاح التحقق منه. ويحتاج DMARC إلى سجل على نطاق From، يبدأ عادةً بـp=none مع تفعيل التقارير، ثم يُشدَّد بعد تأكيد التوافق.

ويغيّر الحجم القواعد أيضًا. تعامل إرشادات Google المرسل على أنه جماعي عند نحو 5,000 رسالة في اليوم إلى حسابات Gmail الشخصية، ويحتاج المرسلون بالجملة إلى SPF وDKIM وDMARC، وإلغاء الاشتراك بنقرة واحدة في البريد الترويجي، ومعدل رسائل مزعجة يبلغ عنها المستخدمون يبقى دون 0.3%، مع 0.1% هدفًا موصى به. ولدى المزوّدين الآخرين قواعدهم. فمثلًا يضع Amazon SES الحساب قيد المراجعة عند معدل ارتداد 5% أو معدل شكاوى 0.1%. اقرأ الأرقام الحالية في وثائق مزوّدك قبل التخطيط بناءً عليها، فهي تتغير.

معالجة العناوين والتحقق منها

ترفض النماذج عناوين صالحة أكثر مما يدرك الناس، وقد يبدو خلل التحقق في مرحلة مبكرة تمامًا مثل فشل التسليم. اختبر نموذجك بهذه الحالات.

المدخلالمعالجة المتوقعةالخلل الشائع
user+tag@example.comقبولتعبير نمطي يرفض علامة الزائد
User@Example.COMقبول، والتعامل مع النطاق دون تمييز حالة الأحرفحسابات مكررة لا تختلف إلا في حالة الأحرف
o'brien@example.comقبوليُرفض، أو يكسر استعلامًا أو قالبًا إذا لم يُعالَج
first.last@sub.example.co.ukقبوليفترض التحقق وجود نقطة واحدة في النطاق
مسافات في البداية أو النهايةاحذفها أولًا«بريد غير صالح» عند لصق صحيح
عنوان طويل جدًاافرض 64 حرفًا للجزء المحلي و254 إجمالًاعمود قصير في قاعدة البيانات يقتطعه بصمت
النطاقات والعناوين الدوليةاقبل أو ارفض باتساق، مع رسالة واضحةانهيار في الترميز أو التسجيل
نطاق بلا مسار بريدحذّر أو ارفضحساب لا يمكن التحقق منه أبدًا

تحقق بمرونة في النموذج، ثم دع رسالة التأكيد تثبت أن العنوان يعمل. فالتعبير النمطي الصارم يفقدك مستخدمين حقيقيين ولا يخبرك إلا بالقليل عن وجود صندوق.

إذا كان منتجك يرفض النطاقات القابلة للتخلص منها في الإنتاج، فما زالت عملية QA لديك تحتاج إلى مسار لها في بيئة التجريب. ومن الخيارات قائمة سماح لنطاقات الاختبار خارج الإنتاج، أو علم يعطل الفحص في بيئات الاختبار، أو نطاق الاختبار الخاص بك. لا تُضعف قاعدة الإنتاج لتسهيل الاختبار. وإذا كنت تقرر هل تعتمد هذه القاعدة أصلًا، فإن مقالنا عن سبب حظر المواقع للبريد القابل للتخلص منه يعرض التكاليف والفوائد من منظور المالك.

كيف تُعرض الرسالة

العرض هو أكثر ما تفيد فيه مراجعة المصمم، ويحتاج إلى رسائل حقيقية في برامج بريد حقيقية.

  • يُقرأ الجزء النصي جيدًا ويتضمن الرابط كاملًا. فعبارة «انقر الزر أدناه» لا فائدة منها هناك.
  • يُبقي الوضع الليلي الشعارات ظاهرة ويحافظ على التباين. في VookMail وضع ليلي، وهذه بداية، أما الاختبار الحقيقي فهو البرامج التي يفضلها مستخدموك.
  • عند حظر الصور، تظل الدعوة إلى الإجراء رابطًا نصيًا حقيقيًا أو زر HTML.
  • الأزرار كبيرة بما يكفي للنقر، ولا تكسر الروابط الطويلة تخطيط الهاتف.
  • نص المعاينة مكتوب عن قصد، دون بقايا صياغة من القالب.
  • العناوين دلالية، والتباين كافٍ، ونص الرابط وصفي، ولـHTML سمة لغة.
  • لا تنتج البيانات المفقودة «مرحبًا {first_name}» أو «مرحبًا ،».
  • يبقى حجم الرسالة أقل بكثير من نحو 102 KB، وهو الحد الذي يُذكر على نطاق واسع أن Gmail يقص عنده الرسائل الطويلة. وقد يخفي القص التذييل وأي رابط لإلغاء الاشتراك في المتن.

حواجز تمنع الحوادث

معظم حوادث البريد المحرجة أخطاء إعداد: بريد من بيئة التجريب يصل إلى عملاء حقيقيين، وإنتاج يعمل بمفتاح اختبار، وروابط إلى localhost. وتمنع إعدادات قليلة معظمها.

احتفظ ببيانات اعتماد منفصلة لكل بيئة، في متغيرات البيئة أو مدير أسرار. وخارج الإنتاج، استخدم قائمة سماح بالمستلمين حتى لا يسلّم نظام البريد إلا إلى نطاقات اختبار معتمدة، ويعيد توجيه كل ما عداها أو يسقطه. وابنِ كل رابط من إعداد واحد، مثل APP_URL، حتى لا تحتوي القوالب على مضيفين مكتوبين في الكود. وابدأ موضوعات البيئات غير الإنتاجية بشيء مثل [STAGING] حتى تكون الرسالة الخاطئة الوجهة واضحة لمن يتلقاها.

إذا نسخت بيانات الإنتاج إلى بيئة التجريب، فاستبدل كل عنوان حقيقي بعنوان اصطناعي قبل تشغيل أي عامل بريد. فالترتيب مهم، لأن العامل الذي يبدأ أولًا قد يشرع فورًا في معالجة البريد المجدول. وتابع وضع sandbox بعناية لكل بيئة. فالإطلاق والإنتاج ما زال في sandbox خطأ كلاسيكي: تعيد API نجاحًا، وتبدو السجلات نظيفة، ولا يخرج أي بريد.

ينبغي أن تبقى الحزم الآلية على بنية تتحكم فيها

الصندوق المؤقت العام اعتمادية خاطئة في CI. فكشط صفحة ويب لشخص آخر هش، وستفشل عمليات البناء لأسباب لا علاقة لها بكودك. كما أنه يضع حركة اختباراتك على خدمة لا تديرها. ويمكن لكل من يملك العنوان قراءة الرسائل هناك، فلا ينبغي أن يعتمد عليها أي شيء آلي.

يبدو الترتيب المعقول هكذا. تتأكد أدوات إطار العمل من طلب البريد الصحيح. وتستقبل حاوية Mailpit في حزمة الاختبار الرسالة الحقيقية، ويقرؤها اختبارك عبر HTTP API في Mailpit (GET /api/v1/messages)، ويستخرج الرابط ويتبعه. ويختبر وضع الاختبار لدى المزوّد خطافات الويب ومعالجة الأخطاء. وترسل مهمة ليلية على نطاق الاختبار الخاص بك عبر المزوّد الحقيقي وتقرأ النتيجة عبر خطاف ويب للبريد الوارد، فتحصل على إشارة يومية بأن التسليم الحقيقي ما زال يعمل.

ينتمي البريد المؤقت إلى الجوانب البشرية من الاختبار: الجلسات الاستكشافية التي تحتاج فيها إلى هوية جديدة بسرعة، وفحص سريع قبل الإطلاق، وإعادة إنتاج بلاغ مستخدم، ومراجعات النصوص والتصميم، والاختبار على الهاتف. وللحالة الأخيرة، ينقل زر QR أو التطبيق من Google Play أو Huawei AppGallery الصندوق إلى جهاز الاختبار. تأكد من أن الروابط تفتح تطبيقك إذا كان مثبتًا، وتنتقل إلى صفحة ويب عاملة إذا لم يكن كذلك، وأن التطبيق يلاحظ حالة التحقق دون طلب تسجيل دخول جديد.

حالة اختبار تصمد عند التسليم

يسهل تكرار حالات الاختبار المتسقة في كل إطلاق وتمريرها بين المختبرين. يتضمن هذا المثال الحقول التي تهم عادةً.

الحقلمثال
معرّف الاختبارEMAIL-RESET-03
المسارإعادة تعيين كلمة المرور، إعادة استخدام الرمز
الشروط المسبقةحساب اختبار موثق في بيئة التجريب، مع عنوان مؤقت جديد
الخطواتاطلب إعادة التعيين، وافتح الرابط، وعيّن كلمة مرور جديدة، وافتح الرابط نفسه مرة أخرى
النتيجة المتوقعةيوضح الاستخدام الثاني أن الرابط لم يعد صالحًا ويعرض طلبًا جديدًا
الأدلةلقطات شاشة، وMessage-ID إن توفر، والأوقات، والعنوان المستخدم
البيئةرقم بناء بيئة التجريب وإعدادات البريد

يربط وضع معرّف الاختبار في اسم المستخدم، كما في email-reset-03-x7، كل صندوق بحالته ويمنع تصادم مختبرَين على عنوان واحد. أما اللاحقة العشوائية القصيرة فموجودة لأن أي شخص يستطيع فتح الصندوق إذا خمّن الاسم.

ما لا ترسله إلى صندوق عام

تعامل مع أي صندوق مؤقت على أنه مقروء لكل من يعرف العنوان، واختبر وفق ذلك.

  • لا ترسل إلا بيانات اصطناعية: أسماء مزيفة، وطلبات مزيفة، وعناوين مزيفة. لا مكان هناك لبيانات العملاء الحقيقية، وقد يسبب إرسالها أيضًا مشكلة قانونية لك، بحسب مكان عملك.
  • لا ترسل أبدًا مفاتيح API أو بيانات اعتماد قواعد البيانات أو دعوات مشرفين لأنظمة حقيقية.
  • احذف حسابات الاختبار بانتظام، خصوصًا ذات الصلاحيات. فمستخدم اختبار مشرف مرتبط بصندوق عام مدخلٌ إذا فتح شخص آخر ذلك الصندوق وطلب إعادة التعيين. ولأن العنوان لا يبقى محجوزًا لك بعد تفريغه، يستمر هذا الخطر بعد الاختبار.
  • لا تستخدم أبدًا عنوانًا مؤقتًا مالكًا لحساب إنتاج حقيقي أو لخدمة خارجية تعتمد عليها شركتك.
  • اعرف مدة الاحتفاظ. تُحذف الرسائل والمرفقات بعد نحو يوم، وتتضمن سياسة الخصوصية التفاصيل.

اختبار منتجك هو أحد أوضح الاستخدامات المشروعة للبريد القابل للتخلص منه. فأبقه كذلك: اختبر الأنظمة التي تملكها أو المصرّح لك باختبارها. لا تستخدم الصناديق المؤقتة لإنشاء حسابات في خدمات شركات أخرى بما يخالف شروطها، أو لجمع الفترات التجريبية، أو لاختبار تحميل نموذج تسجيل يخص غيرك. وتغطي الشروط والأحكام الاستخدام المقبول، وتشرح صفحة المنهجية كيف تعمل الخدمة. وVookMail جزء من شبكة PAYATE للأدوات المجانية.

قبل الإطلاق

  1. التحقق من SPF وDKIM وDMARC لنطاق الإرسال الفعلي في الإنتاج، مع توافق نطاق From.
  2. نظام بريد الإنتاج يعمل ببيانات اعتماد الإنتاج، ووضع sandbox متوقف، ويؤكد ذلك رسالة حقيقية.
  3. استلام رسالة التحقق عند التسجيل على عنوان خارجي جديد، واستخدام الرابط مرة واحدة، واختبار انتهاء الصلاحية.
  4. اختبار إعادة تعيين كلمة المرور من البداية إلى النهاية، بما في ذلك الاستجابات المتطابقة للعناوين المجهولة ورسالة التأكيد.
  5. استهلاك رموز إعادة التعيين والروابط السحرية عند إرسال نموذج، حتى لا يستهلكها طلب GET من أداة الفحص.
  6. يرسل تغيير البريد إلى العنوانين الجديد والقديم.
  7. تشير كل الروابط إلى مضيف الإنتاج عبر HTTPS، بما فيها الروابط التي يعيد تتبع النقرات كتابتها.
  8. فصل الرسائل التشغيلية عن البريد الجماعي، في قائمة الانتظار على الأقل.
  9. وجود HTML والنص العادي وسهولة قراءتهما، مع فحص الوضع الليلي والصور المحظورة.
  10. فحص مكان الوصول في حسابات المراقبة إذا تغير النطاق أو القالب تغيرًا كبيرًا.
  11. عمل إلغاء الاشتراك في البريد غير الأساسي، ومراجعة القوالب المترجمة.
  12. إرفاق الأدلة بتذكرة الإطلاق، ووضع أرقام الارتداد والشكاوى في لوحة متابعة سيراقبها شخص ما بعد الإطلاق.

أسئلة يطرحها المطورون

قبل صندوق حقيقي بريدي. هل أنا في أمان لدى Gmail؟

لا. يبيّن التسليم إلى نطاق واحد أن رسالتك غادرت ووجدت مسارًا وقُبلت هناك. يطبق Gmail قواعد المصادقة والفلترة الخاصة به، وكذلك كل مزوّد كبير آخر. استخدم حسابات المراقبة وأدوات Postmaster Tools من Google لهذا السؤال.

هل يمكنني إعادة استخدام عنوان الاختبار نفسه؟

يمكنك ذلك خلال الجلسة، لكن العنوان الجديد يمنحك اختبارًا أنظف. تجمع العناوين القديمة مدخلات استبعاد ورسائل قديمة، وفي الخدمة المؤقتة يُفرَّغ الصندوق بعد نحو يوم على أي حال.

يصل البريد إلى الملتقِط لكن لا يصل إلى الخارج. من أين أبدأ؟

يبيّن الملتقِط أن تطبيقك أنتج رسالة ولا شيء بعد ذلك، فابدأ بسجل نشاط المزوّد. وفي معظم الأحيان يكون الجواب إعداد sandbox، أو مدخل استبعاد، أو بيانات اعتماد خاطئة، أو رفض SMTP يذكر المصادقة.

كم ينبغي أن يبقى رابط إعادة التعيين صالحًا؟

قصيرًا بما يحد من الضرر وطويلًا بما يكفي لوصول البريد البطيء. تستقر فرق كثيرة على مدة بين 15 دقيقة وساعة، لكن ذلك يعتمد على مخاطرك وعلى سرعة تسليم بريدك، وقد يتأخر بريد مستخدميك لأسباب خارجة عن إرادتك. وأيًا كان اختيارك، فاختبر حالة الانتهاء وأخبر الناس بما يجب فعله بعدها.