الـ Webhooks
الـ Webhooks بتبعت طلب HTTP POST للسيرفر بتاعك لما يحصل حدث على إيميلاتك، عشان أنظمتك تفضل متزامنة.
الأحداث
| الحدث | بيتبعت لما |
|---|---|
unsub |
عميل يلغي اشتراكه |
complaint |
عميل يعلّم الإيميل Spam |
bounce |
إيميل يرجع رجوع دايم (Hard bounce) |
open |
عميل يفتح إيميل |
click |
عميل يضغط على رابط |
open_click |
عميل يفتح أو يضغط |
unsub_complaint |
عميل يلغي اشتراكه أو يشتكي |
اعمل Webhook
في البورتال افتح الربط → Webhooks وضيف الرابط اللي هيستقبل الأحداث، واختار الحدث. استخدم نافذة Test Webhook عشان تشوف مثال للبيانات لكل حدث.
بالـ API:
curl -s -X POST https://mailhoor.com/api/webhooks \
-H "X-Auth-APIKey: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Unsubscribes to CRM", "target_url": "https://yourapp.com/hooks/mailhoor", "event": "unsub"}'
الرد بيكون 201 ومعاه الـ Webhook الجديد. ولو رجع 409 يبقى نفس الـ Webhook موجود بالفعل.
استقبال الأحداث
- الرابط لازم يكون HTTPS ويرد بـ HTTP
200بسرعة. اعمل الشغل التقيل بعد ما ترد. - نفس الحدث ممكن يوصل أكتر من مرة. خلّي الكود بتاعك يستحمل التكرار.
- اعتبر البيانات مدخلات غير موثوقة: راجعها قبل ما تكتبها في قاعدة البيانات.
اتأكد من التوقيع
كل Webhook فيه هيدرين: X-MailHoor-Timestamp (ثواني Unix) وX-MailHoor-Signature (sha256= + HMAC-SHA256 للـ timestamp ونقطة والـ body زي ما وصل). هتلاقي مفتاح التوقيع في الربط → Webhooks → مفتاح التوقيع.
import hashlib, hmac, time
def verify(secret: str, timestamp: str, signature: str, raw_body: bytes) -> bool:
if abs(time.time() - int(timestamp)) > 300:
return False
expected = "sha256=" + hmac.new(secret.encode(), timestamp.encode() + b"." + raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, signature)
استخدم الـ body زي ما وصل بالظبط قبل ما تحوّله لـ JSON. وارفض أي طلب أقدم من 5 دقايق. ولو غيّرت المفتاح، حدّث السيرفر بتاعك على طول.
استخدامات شائعة
- تعليم العملاء اللي ألغوا اشتراكهم في الـ CRM (
unsubوcomplaint). - تنضيف العناوين اللي رجعت من قاعدة بياناتك (
bounce). - تقييم العملاء المحتملين حسب التفاعل (
open_click).
لسه محتاج مساعدة؟ ابعتلنا على support@mailhoor.com أو كلّمنا على +20 101 072 9258. بنرد بالعربي والإنجليزي.