المطوّرون
لا يهمّ صندوق البريد
من يقود.
كل ما يفعله التطبيق يفعله كودك: 104 عمليات موثّقة عبر 68 مساراً، خلف مستند OpenAPI 3.1 يمكنك قراءته دون مفتاح. وعميل TypeScript مُلزَم بذلك المستند في كل بناء.
لا يحتاج MCP إلى مفتاح تلصقه. يكتشف العميل خادم التفويض من نقطة النهاية، ويسجّل نفسه، ويرسلك إلى هنا لتسجيل الدخول.
104
عملية موثّقة
68
مساراً تحت مضيف واحد
116
دالة SDK، تغطيها جميعاً
20
حدث خطاف ويب، في ثلاث عائلات
مستند OpenAPI 3.1 على GET /openapi.json، وقراءته لا تحتاج مفتاحاً.
الواجهات
ثلاثة أبواب،
صندوق بريد واحد.
مفتاح مساحة العمل يحدّد ما يجوز للاستدعاء فعله وأي العناوين يجوز له الإرسال باسمها. والإبطال تحديث لا حذف، فيُبلَّغ أي استدعاء لاحق بأن المفتاح أُبطل.
يرسل المفتاح باسم ما يصل إلى 25 نطاقاً كاملاً و50 عنواناً مفرداً. ويعيد GET /ping قراءة النطاقات التي يحملها والنطاقات التي أبقاها له دوره.
وجّه عميلاً إلى نقطة النهاية وسجّل الدخول. لا مفتاح تلصقه، لأن العميل يسجّل نفسه ويرسلك إلى هنا.
تُبنى الأدوات مما يجوز للمستدعي فعله، فالعميل المحصور بالقراءة لا أداة إرسال فيه. ومع ذلك يصل الرمز إلى صندوق البريد كاملاً.
سجّل نقطة نهاية https فيرسل إليها صندوق البريد. والتسليمات يطلقها صندوق البريد نفسه لا استدعاء API، فالكتابة في التطبيق والإرسال إلى الواجهة يُطلقان التسليم نفسه.
20 حدثاً في ثلاث عائلات، وعشر نقاط نهاية لكل صندوق بريد.
التكافؤ
لا يمكن للعميل أن يتأخر
عن الواجهة.
يقرأ فحص التكافؤ مستند OpenAPI في كل بناء ويفشل عند أي انحراف: دالة تشير إلى عملية لا يملكها التوصيف، أو عملية موثّقة بلا دالة، أو قائمة نطاقات تخالف ما تتطلبه العملية. ويطبع ما أثبته، وهو اليوم 116 دالة SDK تغطي كل العمليات الموثّقة الـ104.
الإعداد والطلب والاستدعاء عملية واحدة، مكتوبة بثلاث طرق.
الوكلاء وAPI وMCP
OpenEmail مصمَّم ليُشغَّل ببرمجيات كما يُشغَّل بأشخاص. وصندوق البريد هو نفسه في الحالتين.
خادم MCP
وجّه Claude، أو أي عميل MCP، إلى صندوق بريدك.
OAuth لتطبيقات الطرف الثالث
قريبًاتسجيل ذاتي للتطبيقات باستخدام PKCE، ليطلب التطبيق الوصول كما ينبغي.
الموافقة والإلغاء متوفّران؛ أمّا النطاق فلا، لذا يصل الرمز إلى صندوق بريدك كاملًا بدل الجزء الذي طلبه التطبيق.
واجهة REST API
واجهة HTTP موثّقة بمفاتيح قابلة للإصدار والتقييد والإبطال.
بداية سريعة
من لا شيء إلى رسالة مُرسَلة.
ثلاث خطوات.
- 1
أنشئ مفتاحاً
الإعدادات، مفاتيح API، على صندوق بريد تملكه. اختر نطاقاته، وضيّق ما يجوز له الإرسال باسمه إلى نطاقات كاملة أو عناوين مفردة. يُعرض السرّ مرة واحدة، وما يُخزَّن هو تجزئة أحادية الاتجاه.
يجيب GET /ping بالنطاقات الموجودة على المفتاح والنطاقات التي أبقاها له دوره. export OPENEMAIL_API_KEY=oe_live_9f2c1a4b7e05d3862c1f0a44_kX7… curl https://api.openemail.uk/ping \ -H "Authorization: Bearer $OPENEMAIL_API_KEY" - 2
ثبّت العميل
عميل TypeScript بلا تبعيات، منشور بصيغتي ESM وCommonJS، يقرأ المفتاح من OPENEMAIL_API_KEY. تجاوزه إن كنت تفضّل إرسال JSON بنفسك، فكل نقطة نهاية هي HTTP صِرف.
Node 18 فما فوق، وWorkers وDeno وBun والمتصفح. bun add @openemail/sdk - 3
أرسل
تحمل الاستجابة المعرّف. وGET /emails/{id} يحلّه، و/events فيه الأثر لكل مستلم، و/tracking فيه عمليات الفتح والنقر.
إعادة المحاولة بالمفتاح Idempotency-Key نفسه تعيد النتيجة الأولى مع Idempotency-Replayed: true. import { init, openemail } from '@openemail/sdk' init({ apiKey: process.env.OPENEMAIL_API_KEY }) const email = await openemail.emails.send({ from: 'Acme Billing <[email protected]>', to: '[email protected]', subject: 'Your September invoice', html: '<p>Invoice attached.</p>',}) console.log(email.id, email.status)
غائب
ما لن يفعله
لك بعد.
خمسة أمور يجدر معرفتها قبل أن تبني على هذا، لا بعده.
- لا نقطة نهاية للرفع
- تُرسَل المرفقات المضمّنة بصيغة base64 ضمن حد إجمالي قدره 5 ميغابايت. ويُرسَل الملف الأكبر بتسمية ملف موجود في مساحة العمل بمعرّفه، فينتقل كرابط تنزيل.
- الارتدادات تتوقف عند صندوق البريد
- يُحلَّل تقرير التسليم، ويُطابَق عبر Message-ID، ويُوسَم على المحادثة، ويُدفَع كخطاف ويب email.bounced. لا شيء يكتب مرة أخرى في سجل الإرسال، لذا تبقى الرسالة المرتدّة عبر GET /emails مقروءة على أنها مُرسَلة.
- بريد المحرّر ليس في GET /emails
- لا يظهر البريد المُرسَل من محرّر التطبيق في تلك القائمة، لأن المحرّر لا يكتب عبر مسار الإرسال نفسه.
- OAuth فيه موافقة، لا نطاق
- يُعرَض الطلب قبل منحه، و«التطبيقات المتصلة» تسحبه، لكن الرمز يصل إلى صندوق بريدك كاملاً لا إلى الجزء الذي طلبه التطبيق.
- لا سير عمل للإصدار
- نشر العميل تشغيل يدوي للفحص المسبق والبناء وbun publish، فتصل النسخة إلى npm حين يشغّلها أحدهم لا حين يصل التغيير.
التحقق من التسليم
كل تسليم موقّع،
وكل إعادة محاولة تحمل معرّفه.
التوقيع هو HMAC-SHA-256 على الطابع الزمني ونقطة والجسم الخام. تحقّق مقابل البايتات كما وصلت، لأن التحليل وإعادة التسلسل يعيدان ترتيب المفاتيح فيُفسدانه.
X-OpenEmail-Signature: t=1758240000,v1=9f0c4b2e7d1a86c3X-OpenEmail-Event: email.deliveredX-OpenEmail-Delivery: evt_4b7e05d3862c1f0a- نافذة إعادة الإرسال
- 300 ثانية، وفرضها مهمة المستقبِل. والمُتحقِّق في SDK يعتمدها افتراضياً.
- Idempotency-Key
- يُحجَز مقابل فهرس فريد على المفتاح ومفتاح API الخاص بك معاً، فإعادة المحاولة بعد انتهاء المهلة تعيد النتيجة الأولى مع Idempotency-Replayed: true بدل الإرسال مرتين.
- إعادات المحاولة
- خمس محاولات: عند وقوع الحدث، ثم بعد دقيقة و5 و25 دقيقة وساعتين. ولا يُعاد إلا مع انتهاء مهلة أو اتصال مرفوض أو 408 أو 425 أو 429 أو 5xx.
- X-OpenEmail-Delivery
- يُنشأ معرّف الحدث مرة واحدة وتحمله كل محاولة، فالمستقبِل الذي يرى المعرّف نفسه مرتين يمكنه إسقاط الثانية بدل التصرف بها من جديد.
لمن هذا
صندوق بريد واحد.
ثلاثة مداخل إليه.
عنوان مجاني على openemail.uk، وخلفه التطبيق.
صندوق البريد نفسه عبر API وSDK وMCP.
أنشئ مفتاحاً.
أرسل شيئاً.
Full API, MCP and SDK access في كل خطة. وFree تحمل معها 50 AI actions a day.