تكاملات سير عمل البريد الإلكتروني وأدوات تطوير البرمجيات (SDKs)
استكشف واجهات برمجة تطبيقات SendRepute وعمليات التكامل الخاصة بها لتحليل البريد الإلكتروني، وأدوات التصميم وإعادة الصياغة بالذكاء الاصطناعي المدفوعة بشكل منفصل. نقاط النهاية المركزية للتحليل وإعادة الصياغة وأداة البناء لا ترسل بريدًا إلكترونيًا؛ فقط ميزة Campaigns المفعلة عمدًا ومحولات موفري خدمات معينين يمكنها الإرسال باستخدام الموفر الذي قمت بتكوينه. لا تضمن أي نتيجة الوصول إلى صندوق الوارد.
حزمة Node.js متوفرة على npm. يمكن تنزيل التكاملات الأخرى من هنا أو تثبيتها من مستودع GitHub عام وموثق. اختر أحد التكاملات، واتبع الدليل الخاص به، وراجع الأذونات والأسعار الحالية وإعدادات الفشل قبل تمكينه.
حافظ على سير عمل بريدك الإلكتروني الحالي. تقوم أمثلة API المركزية هذه فقط بتحليل المحتوى أو إعادة كتابته أو بنائه؛ ولا تقوم بإرسال البريد الإلكتروني أبدًا. وبشكل منفصل، يمكن لميزات "Campaigns" والمحولات الخاصة بمزودي الخدمة، عند تفعيلها عمدًا، الإرسال عبر المزود الذي قمت بتكوينه. اختر أداة بناءً على تعليمات تثبيتها وتكوينها وأمثلتها وقيود تشغيلها. لا يتم تشغيل الأمثلة في هذه الصفحة؛ يرجى مراجعة العمليات المدفوعة وإجراءات الإرسال بشكل منفصل.
إضافة WordPress
0.2.0
يتطلب WordPress 5.7+، و PHP 7.4+ و OpenSSL. قم برفع ملف ZIP عبر Plugins > Add New > Upload Plugin، ثم افتح Settings > SendRepute. قم بتهيئة رمز التوكن والموافقة على التحليل المدفوع لكل موقع بشكل منفصل. تغطي أدلة دورة حياة التثبيت WordPress 6.8.3 مع WooCommerce 10.4.3؛ وتغطي أدلة إضافة SMTP المنفصلة WordPress 7.1.2 مع WP Mail SMTP 4.9.0 و FluentSMTP 2.4.0.
تفحص الرسائل من خلال pre_wp_mail دون استبدال SMTP أو إعادة كتابة الرسائل. يسمح الوضع الاستشاري بالتسليم؛ بينما يطبق وضع الحظر عتبة احتمالية. يتم تهيئة سياسة فشل واجهة برمجة التطبيقات بشكل منفصل. الإضافات التي تتجاوز wp_mail لا تشملها التغطية؛ ولا يتم تحليل تغييرات النقل اللاحقة. الحظر لا يقوم بوضع الرسائل في قائمة الانتظار.
التحليل معطل افتراضياً. قم بتهيئة رمز عميل محدد النطاق، وقم بتشغيل فحص الاتصال غير المدفوع، وراجع الأسعار ووافق صراحةً قبل تمكين التحليل المدفوع. تتطلب إجراءات الذكاء الاصطناعي اليدوية تأكيداً منفصلاً.
تنزيل ملف ZIP لـ WordPress
مستودع الكود المصدري العام
ملف README والأمثلة الكاملة
ملاحظات الأمان والقيود المعروفة
1. التثبيت
قم بتشغيل هذه الأوامر من دليل WordPress مع توفر WP-CLI، أو قم برفع ملف ZIP الذي تم تنزيله عبر Plugins > Add New > Upload Plugin وقم بتفعيله. افتح Settings > SendRepute. قم بتكوين وتفعيل كل موقع بشكل منفصل في حالة المواقع المتعددة. حافظ على مزيج مدعوم من WordPress/PHP؛ الإصدار الأدنى ليس توصية لتشغيل برمجيات انتهت فترة دعمها.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-wp.zip
wp plugin install ./sendrepute-wp.zip --activate
بديل: التثبيت من المصدر العام
استخدم مسار المصدر هذا بدلاً من تعليمات التنزيل الخاصة بالموقع أعلاه. يشرح ملف README الخاص بالمستودع خطوات التفعيل والإعداد المتبقية؛ فبناء ملف ZIP وحده لا يثبت الإضافة. بالنسبة لـ Python، يضيف الأمر الثاني دعم Django الاختياري. احتفظ ببيانات الاعتماد في أسرار الخادم وراجع ملاحظات الأمان قبل تمكين الميزات المدفوعة. Node فقط موجود على npm؛ وجود مستودع GitHub عام لا يعني النشر على WordPress.org أو n8n Cloud أو Packagist أو PyPI.
git clone https://github.com/sendrepute/sendrepute-wordpress.git
cd sendrepute-wordpress
python3 package.py
2. التهيأة بأمان
قم بإنشاء رمز عميل من جهة الخادم بنطاقات classify و account:read و catalog:read، مع تحديد انتهاء الصلاحية وحدود الإنفاق. أدخله في الإعدادات أو قم بتحميل SENDREPUTE_API_TOKEN من مخزن أسرار الخادم الخاص بك كما هو موضح. تستخدم الرموز المخزنة تشفيراً موثقاً مع أملاح WordPress و OpenSSL؛ أعد إدخالها بعد تدوير الأملاح. قم بتشغيل فحص الاتصال غير المدفوع، وراجع أسعار التصنيف، ثم قم بتمكين التحليل التلقائي صراحةً. قم بتعيين وضع الاستشارة/الحظر، والعتبة، وسياسة fail-open/fail-closed المستقلة.
// wp-config.php — optional server-secret alternative to settings storage.
$sendreputeToken = getenv('SENDREPUTE_API_TOKEN');
if (is_string($sendreputeToken) && $sendreputeToken !== '') {
define('SENDREPUTE_API_TOKEN', $sendreputeToken);
}
3. الاستخدام المتعمد
تستخدم الدالة أدناه wp_mail العادية وترسل فقط عندما يستدعيها تطبيقك. عند تمكين التحليل المدفوع، يقوم الإضافة بالتحليل عند pre_wp_mail ثم يسمح أو يحظر وسيلة النقل الحالية. قم بتوفير المستلم المصرح له الخاص بك؛ واختبره مقابل مصب بريد محلي لا يقوم بالترحيل أولاً. النتيجة الخاطئة تعني أن المتصل يجب أن يتعامل مع الإرسال المرفوض - لا يتم وضعه في قائمة الانتظار.
// Call deliberately: this sends through your existing WordPress transport.
function sendrepute_reviewed_message($recipient) {
return wp_mail(
$recipient,
'Your requested account summary',
'Here is the account summary you requested.'
);
}
ما الذي يمكنه فعله أيضاً؟
توفر الإعدادات أيضاً إجراءات يدوية لإعادة كتابة AI وتوليد القوالب مع تأكيد دفع منفصل. يتطلب عرض السعر vip:read؛ وتتطلب إعادة الكتابة rewrite؛ ويتطلب التوليد ai:generate، ويتطلب توليد VIP عضوية VIP نشطة. النتائج عبارة عن نص تم ترميزه وللنسخ فقط: لا يتم تطبيقه أو إرساله تلقائياً أبداً. الرموز الحالية لا تكتسب نطاقات تلقائياً.
النتائج والإخفاقات والقيود
يسمح Advisory بالتسليم؛ بينما يقارن الحظر بين احتمال البريد العشوائي (spam probability) المحدود والعتبة الخاصة بك. تتبع حالات انقطاع مهلة API والإخفاقات سياسة الفشل المنفصلة، وليس تصنيف البريد العشوائي. تمنع الأقفال المحلية (local locks) غير الشفافة التحليل المتكرر لمدة 24 ساعة؛ ولا تتم إعادة محاولة نتائج الشبكة غير المعروفة تلقائياً. عمليات الإرسال نفسها لا يتم إلغاء تكرارها. شملت فحوصات التحديث المثبتة ملف ZIP للإصدار 0.1.0 المتتبع والذي تمت ترقيته إلى 0.2.0، ورفض/حفظ administrator nonce، ومسار WooCommerce المحدد. غطت مصفوفة منفصلة من 40 سيناريو كلا أمرين تحميل الإضافات مع WP Mail SMTP و FluentSMTP، بما في ذلك To/Cc/Bcc، و Reply-To، والرؤوس، والمرفقات، ورفض SMTP ونتائج السياسة. هذه المجموعات الدقيقة لا تعتمد إصدارات CMS أو إضافات SMTP أو مزودي الخدمة الآخرين. تظل الخطافات (Hooks) التي تتجاوز wp_mail وتغييرات النقل اللاحقة خارج التغطية. يحافظ إلغاء التنشيط على الإعدادات؛ بينما يزيل إلغاء التثبيت الاعتمادات حتى عند الاحتفاظ بالإعدادات المعطلة. قم بإزالة رمز wp-config بنفسك.
محول بريد WooCommerce
0.2.0
مضمن في نفس ملف ZIP الخاص بـ SendRepute 0.2.0 مثل إضافات WordPress؛ لا يوجد ملحق أو تنزيل منفصل لـ WooCommerce. يتطلب المتطلبات الأساسية للإضافة: WordPress 5.7+ و PHP 7.4+ و OpenSSL. تمت مراجعة كود المحول مقابل WooCommerce 10.4.3، ولم يتم اعتماده لكل إصدارات WooCommerce أو ملحقات البريد.
يحتوي تحليل WooCommerce على مفتاح إدارة خاص به وتحديدات دقيقة لأنواع البريد المدمجة، وجميعها معطلة افتراضيًا. يجب أيضًا تفعيل عناصر التحكم في التحليل العام والموافقة المدفوعة. تتجاوز الأنواع غير المحددة والأنواع التي تحددها الملحقات عملية التحليل. كل نوع customer_* مدمج يتم تحديده يكون محميًا واستشاريًا فقط: قد يتم تحليله ولكن لا يتم حظره أبدًا. يفشل البريد المكون من عدة أجزاء في التصنيف قبل أي طلب مدفوع؛ حيث يحافظ الوضع الاستشاري أو الفتح عند الفشل على التسليم، بينما يحظر الإغلاق عند الفشل البريد غير المحمي فقط.
تنزيل ملف ZIP المشترك لـ WordPress و WooCommerce
مستودع الكود المصدري العام
ملف README والأمثلة الكاملة
ملاحظات الأمان والقيود المعروفة
1. التثبيت
هذا هو نفس ملف ZIP القابل للتثبيت المستخدم في دليل WordPress. قم بتثبيته مرة واحدة؛ لا تقم بتثبيت ملحق WooCommerce ثانٍ. قم بتنشيط SendRepute، ثم افتح الإعدادات > SendRepute. حافظ على تحديث ودعم WordPress وWooCommerce وPHP ووسيلة نقل البريد الحقيقية.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-wp.zip
wp plugin install ./sendrepute-wp.zip --activate
بديل: التثبيت من المصدر العام
استخدم مسار المصدر هذا بدلاً من تعليمات التنزيل الخاصة بالموقع أعلاه. يشرح ملف README الخاص بالمستودع خطوات التفعيل والإعداد المتبقية؛ فبناء ملف ZIP وحده لا يثبت الإضافة. بالنسبة لـ Python، يضيف الأمر الثاني دعم Django الاختياري. احتفظ ببيانات الاعتماد في أسرار الخادم وراجع ملاحظات الأمان قبل تمكين الميزات المدفوعة. Node فقط موجود على npm؛ وجود مستودع GitHub عام لا يعني النشر على WordPress.org أو n8n Cloud أو Packagist أو PyPI.
git clone https://github.com/sendrepute/sendrepute-wordpress.git
cd sendrepute-wordpress
python3 package.py
2. التهيأة بأمان
استخدم رمز عميل محدد من أسرار الخادم أو إعداد WordPress المشفر. قم أولاً بتكوين فحص الاتصال المشترك غير المدفوع، ومراجعة السعر الحالي، وطلب الموافقة المدفوعة العامة، ووضع المخاطر، والعتبة، وسياسة الفشل. ثم قم بتمكين تحليل WooCommerce بشكل منفصل وحدد فقط أنواع البريد الإلكتروني المضمنة التي قمت بمراجعتها. لا يتم تحديد الأنواع التي تحددها الإضافات تلقائياً أبداً.
// wp-config.php — keep the shared WordPress/WooCommerce token server-side.
$sendreputeToken = getenv('SENDREPUTE_API_TOKEN');
if (is_string($sendreputeToken) && $sendreputeToken !== '') {
define('SENDREPUTE_API_TOKEN', $sendreputeToken);
}
3. الاستخدام المتعمد
استمر في الإرسال عبر WooCommerce كالمعتاد. يقوم المحول (adapter) بتغليف الـ callback الذي اختاره WooCommerce بالفعل ويحافظ على وسائطه الأصلية ووسيلة النقل؛ ولا يوفر طريقة send جديدة. إذا قام فلتر آخر بتغيير وسائط الـ callback، أو تداخلت رسائل عادية أثناء ذلك الـ callback، أو إذا كان الـ callback المخصص لا يستدعي wp_mail أبداً، فسيتم تجاوز التحليل بشكل متحفظ بدلاً من الدخول في المسار المدفوع العام. اختبر الأنواع غير الحرجة المختارة باستخدام mail sink لا يقوم بالترحيل.
النتائج والإخفاقات والقيود
تتبع رسائل البريد ذات الجزء الواحد المحددة التوصيات المشتركة لـ WordPress وسياسات العتبة والفشل، باستثناء كل نوع من أنواع customer_* الذي يكون محمياً وللتوصية فقط. يستمر بريد العميل المحمي دائماً بعد ظهور نتيجة عالية المخاطر أو فشل API أو محتوى غير مدعوم. يقوم WooCommerce بإنشاء بدائل متعددة الأجزاء بعد pre_wp_mail، لذا تفشل رسائل البريد متعددة الأجزاء المحددة قبل أي طلب مدفوع بدلاً من تصنيفها جزئياً؛ فقط رسائل البريد المحددة غير المحمية يمكن رفضها بواسطة سياسة fail-closed. يتم إزالة سياق رد الاتصال بعد النجاح والفشل وعمليات الإرسال المتداخلة.
واجهة Drupal البرمجية للبريد
0.1.0
يتطلب Drupal 10.3+ أو 11.x و PHP 8.1+. قم بتثبيت ملف ZIP كموديول، وامنح صلاحية administer sendrepute للمسؤولين الموثوقين فقط، وقم بتهيئة اسم عرض مرسل غير محدد بعنوان، وحدد مسارات بريد module/key الدقيقة. يدعم الإصدار 0.1.0 نظام php_mail الأساسي في Drupal فقط؛ حيث يعتبر Mail backend، وليس مزودًا أو ناقلًا بديلًا. تغطي أدلة المواقع المثبتة إصدارات Drupal 10.6.17 و 11.4.7 الدقيقة مع PHP 8.4.10.
تكون الموافقة المدفوعة وكل مسار معطلة افتراضياً. يستخدم كل مسار محدد وكيل core php_mail الثابت، ووضع الاستشارة أو الحظر، وسياسة فشل حفظ أو حظر مستقلة، وعتبة، واختياراً متعمداً للرسائل الحرجة. تظل رسائل الحساب والأمان قابلة للإرسال ما لم يسمح ذلك المسار المحدد صراحةً بالحظر الحرج. تقوم نفس نسخة php_mail بتنسيق وإرسال نص نهائي واحد فقط؛ المخرجات متعددة الأجزاء والتي تحتوي على مرفقات غير مدعومة.
تنزيل ملف ZIP لـ Drupal
مستودع الكود المصدري العام
ملف README والأمثلة الكاملة
ملاحظات الأمان والقيود المعروفة
1. التثبيت
قم بالتشغيل من جذر مشروع Drupal، أو ارفع ملف ZIP باستخدام مثبت إضافات Drupal. يحتوي الأرشيف على جذر وحدة sendrepute مناسب لـ modules/contrib. قم بتمكينه، وامنح صلاحية administer sendrepute فقط للمسؤولين الموثوق بهم، وافتح التكوين > النظام > SendRepute.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-drupal.zip
unzip sendrepute-drupal.zip -d modules/contrib
drush en sendrepute -y
بديل: التثبيت من المصدر العام
استخدم مسار المصدر هذا بدلاً من تعليمات التنزيل الخاصة بالموقع أعلاه. يشرح ملف README الخاص بالمستودع خطوات التفعيل والإعداد المتبقية؛ فبناء ملف ZIP وحده لا يثبت الإضافة. بالنسبة لـ Python، يضيف الأمر الثاني دعم Django الاختياري. احتفظ ببيانات الاعتماد في أسرار الخادم وراجع ملاحظات الأمان قبل تمكين الميزات المدفوعة. Node فقط موجود على npm؛ وجود مستودع GitHub عام لا يعني النشر على WordPress.org أو n8n Cloud أو Packagist أو PyPI.
git clone https://github.com/sendrepute/sendrepute-drupal.git
cd sendrepute-drupal
2. التهيأة بأمان
قم بتخزين SENDREPUTE_API_TOKEN بنطاق classify فقط في بيئة عمل web/PHP. لا يتم قبوله أبداً عبر النموذج أو تصديره في إعدادات Drupal. في النموذج، أدخل اسم عرض المرسل المطلوب بحد أقصى 320 بايت بدون عنوان أو أقواس زاوية أو عناصر تحكم. أضف سطراً واحداً مكوناً من سبعة حقول لكل مسار دقيق كما هو موضح؛ يجب أن يكون المفوض (delegate) هو php_mail. اختر وضع advisory/block، سياسة فشل preserve/block، العتبة (threshold)، و critical yes/no. ابدأ بـ advisory و preserve و no.
export SENDREPUTE_API_TOKEN="replace-with-a-scoped-server-token"
# Enter a non-address sender display name in Configuration > System > SendRepute.
# One exact route in Configuration > System > SendRepute:
# contact|page_mail|php_mail|advisory|preserve|0.90|no
3. الاستخدام المتعمد
استمر في استدعاء مدير البريد العادي في Drupal. بالنسبة للمسار المشترك، يقوم sendrepute_mail باستدعاء format() الخاص بـ core php_mail، ويحلل ذلك الـ scalar body النهائي، ويطبق السياسة، ثم يستدعي mail() لنفس نسخة php_mail المخزنة مؤقتاً. يتم رفض معرفات الـ delegate الأخرى. لا يستخدم hook_mail_alter ولا يعيد كتابة الرسالة.
النتائج والإخفاقات والقيود
يحظر النجاح الذي تم التحقق منه فقط عند أو فوق العتبة المكونة في وضع الحظر. يتم التحقق من نتيجة التصنيف المتداخلة الكاملة واستجابة الفوترة قبل أن يؤثر spamProbability على التسليم. تتبع إخفاقات API، و authentication، و balance، و rate-limit، والرسائل المشوهة، و multipart، ومؤشر المرفقات والحجم سياسة فشل المسار المستقلة، باستثناء البريد الحرج المحمي الذي يستمر إرساله. غطت مصفوفة 10.6.17/11.4.7 المثبتة عملية التثبيت واستبدال ملف ZIP في مكانه أثناء التفعيل، وتسجيل دخول المسؤول الحقيقي، ورفض/حفظ Form API CSRF، واكتشاف الإضافات، والاشتراك في المسار، والتصنيف الاصطناعي، والحفاظ على البريد الحرج، و core php_mail من خلال مصرف محلي. تغطي فحوصات المصدر الأساسية أيضاً أرشيفات 10.3.0 و 11.0.0 غير القابلة للتغيير؛ لا تعتمد أي من النتيجتين كل تصحيح لاحق أو برنامج إرسال مساهم. يتم إرسال اسم العرض المكون، والموضوع غير الفارغ، والجسم المؤطر بالطول؛ ويتم استبعاد العناوين، والمستلمين، والرؤوس، والمعلمات، والمرفقات. يقتصر الموضوع على 998 بايت والجسم على 256 KiB. هناك محاولة واحدة مؤكدة عبر HTTPS، بدون تحويلات، أو إعادة محاولة، أو طابور.
وحدة بريد PrestaShop
0.1.1
يدعم الإصدار 0.1.1 تحديداً PrestaShop 9.0.0، 9.0.1، 9.0.2 و 9.0.3 مع PHP 8.1–8.4. قم برفع ملف ZIP في Modules > Module Manager، ثم قم بتهيئة تصنيف بريد SendRepute. اجتازت جميع الإصدارات الكلاسيكية الأربعة الرسمية المبنية مسبقاً فحوصات التثبيت المنعزل، وتهيئة المسؤول الموثق، وتحديثات ZIP؛ كما اجتازت تطبيقات Mail::send() غير المعدلة فيها مصفوفة البريد الحقيقي دون اتصال. PrestaShop 8، 9.1+ وتحديثات 9.0 اللاحقة غير المدرجة غير مدعومة.
إن الوحدة، وموافقة الدفع/المحتوى، واختيار القالب الدقيق كلها معطلة افتراضياً. يقوم النظام بتحليل الموضوع النهائي الذي تم إنشاؤه وكل نص معروض مدعوم دون إعادة بناء رسالة Symfony. يتم إرسال الرسالة التي تحتوي على كل من text/plain و text/html في طلب تصنيف مقيد واحد: يتم جعل البديل النصي خاملًا، ويتم الحفاظ على HTML الأصلي، وتقوم الخدمة بتحليل كل بديل مصنف بشكل مستقل دون دمج. تستخدم النتيجة أعلى مستوى مخاطرة مع تدقيقات المحتوى الكاملة، وتنتج تصنيفاً مدفوعاً واحداً، ولا تعيد أبداً درجة أمان جزئية. لا يقطع الوضع الاستشاري الإرسال أبداً. يؤدي حظر العتبة والإغلاق عند الفشل إلى رمي استثناء واحد ينفذ كل من ExceptionInterface الخاص بـ Symfony Mailer و ModuleErrorInterface الخاص بـ PrestaShop؛ في كل إصدار مدعوم، لاحظ الاختبار المثبت أن Mail::send() يعيد false بدون تسليم SMTP. سياسة الفشل مستقلة عن عتبة المخاطر.
تنزيل ملف ZIP لـ PrestaShop
مستودع الكود المصدري العام
ملف README والأمثلة الكاملة
ملاحظات الأمان والقيود المعروفة
1. التثبيت
قم بتنزيل ملف ZIP للإصدار 0.1.1، ثم استخدم وحدات التحكم (Modules) > مدير الوحدات (Module Manager) > رفع وحدة (Upload a module) وقم باختياره. افتح نافذة التهيئة (Configure) لتصنيف بريد SendRepute. لا تفرض التثبيت خارج نطاق PrestaShop 9.0.0–9.0.3 بدقة: يعتمد سلوك الإلغاء والتوقيع على مسارات Mail::send() التي تم فحصها.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-prestashop.zip
بديل: التثبيت من المصدر العام
استخدم مسار المصدر هذا بدلاً من تعليمات التنزيل الخاصة بالموقع أعلاه. يشرح ملف README الخاص بالمستودع خطوات التفعيل والإعداد المتبقية؛ فبناء ملف ZIP وحده لا يثبت الإضافة. بالنسبة لـ Python، يضيف الأمر الثاني دعم Django الاختياري. احتفظ ببيانات الاعتماد في أسرار الخادم وراجع ملاحظات الأمان قبل تمكين الميزات المدفوعة. Node فقط موجود على npm؛ وجود مستودع GitHub عام لا يعني النشر على WordPress.org أو n8n Cloud أو Packagist أو PyPI.
git clone https://github.com/sendrepute/sendrepute-prestashop.git
cd sendrepute-prestashop
2. التهيأة بأمان
قم بتعيين SENDREPUTE_API_BASE إلى أصل HTTPS لإنتاج SendRepute الرسمي المزود لهذه الوحدة، وSENDREPUTE_API_TOKEN إلى رمز خادم محدد في بيئة PHP-FPM/الخادم. يجب أن يكون الأساس أصل DNS HTTPS عاماً خالياً من المسارات؛ يتم رفض الثوابت الحرفية وبيانات الاعتماد وإعادة التوجيه واستجابات DNS الخاصة. قم بإجراء فحص اتصال الحساب/التسعير غير المدفوع، ثم قم بتمكين الوحدة صراحة، والموافقة على المحتوى المدفوع، وأسماء القوالب المحددة. اختر التوصية/الحظر، والعتبة، وسياسة الفشل المفتوحة/المغلقة بشكل مستقل.
export SENDREPUTE_API_BASE="replace-with-the-canonical-sendrepute-https-origin"
export SENDREPUTE_API_TOKEN="replace-with-a-scoped-server-token"
3. الاستخدام المتعمد
استمر في استخدام تدفق PrestaShop الطبيعي لـ Mail::send. يتذكر الـ hook المبكر فقط القالب المحدد الذي تم اختياره. يقرأ الـ hook النهائي موضوع بريد Symfony الذي تم تحويله بالفعل، متن النص (text body) ومتن HTML (HTML body) دون تغيير المستلمين، الترويسات، المرفقات أو وسيلة النقل. بالنسبة للمتون المزدوجة، فإنه يرسل نصاً عادياً (inert plain text) و HTML الأصلي كبدائل مطبوعة في طلب واحد؛ يمنع التوحيد المستقل للخدمة جزءاً واحداً من استهلاك جزء آخر مع الاحتفاظ بوجهات روابط وصور HTML المرئية للتدقيق. يظل المتن النصي الواحد على مسار النص الخامل الضيق، ويظل متن HTML الواحد على مسار استخراج DOM الضيق. يكتمل التصنيف قبل أن تنشئ PrestaShop رسالة منفصلة موقعة بـ DKIM. تحققت مصفوفة الإصدارات المدعومة من هيكل multipart المنبعث بالإضافة إلى هاش متن DKIM وتوقيع RSA بعد التصنيف. يحذف مسار التوقيع المثبت في PrestaShop الـ Bcc من الترويسات الموقعة المعدة ويفقد ذلك المستلم المخفي لـ SMTP؛ وبالتالي فإن أدلة التوقيع الصالحة لا تثبت التوافق مع تسليم Bcc. لا تجمع بين DKIM و Bcc على هذا المسار المدعوم. تتبع مصادر العرض غير المدعومة، الدلالات النشطة، HTML الغامض بترميز quoted-printable أو base64، والمحتوى الإجمالي المتجاوز للحجم سياسة الفشل المكونة قبل الدفع. اترك القوالب الحرجة غير محددة ما لم يتم الموافقة عليها عمداً.
النتائج والإخفاقات والقيود
يقبل المصنف متن text/plain واحداً، أو متن text/html واحداً، أو كليهما كبدائل معروضة يتم تحليلها بشكل مستقل. لا يمكن للنص الصريح، الكيانات، المحتوى المخفي أو محتوى الأنماط في بديل مقبول أن يستهلك أو يخفي بديلاً لاحقاً؛ يتم رفض HTML الغامض بترميز quoted-printable أو base64 قبل الدفع بدلاً من ذلك. يمكن لأي بديل مقبول أن يحدد النتيجة الأعلى مخاطرة، بينما تغطي عمليات تدقيق المحتوى كل بديل؛ يتم احتساب رسوم التصنيف مرة واحدة فقط بعد قبول المدخلات الكاملة المحدودة. يكرر المتن الموروث المطلوب البديل النصي الخامل بالضبط للرسالة المزدوجة، ويشارك هذا التكرار بالإضافة إلى كلا البديلين المطبوعين ميزانية الطلب البالغة 524288 بايت بالضبط. يتم استبعاد المستلمين والمرفقات والموارد المضمنة، ويتم الحفاظ على رسالة النقل الأصلية قبل التوقيع. يتحقق نموذج البريد الحقيقي بشكل منفصل من سلامة MIME/التوقيع ومستلمي SMTP الفعليين: تظل تواقيع DKIM صالحة بعد التصنيف، لكن مسار التوقيع العلوي الذي تم فحصه لا يحفظ مستلمي Bcc. يخزن التصنيف المعتمد ملخصاً استشارياً محدوداً للأحدث. يرمي وضع الحظر (Block mode) استثناءً فقط عند العتبة أو فوقها؛ ينجو استثناء الواجهة المزدوجة من إرسال الـ hook وينتج false قبل النقل في جميع الإصدارات الأربعة المثبتة. تتبع أخطاء المحتوى غير المدعوم و API والتحقق سياسة (فتح/إغلاق) بشكل مستقل. تستخدم محاولة HTTPS واحدة نظام DNS عاماً مثبتاً، TLS موثقاً، مهلات محددة، حداً أقصى للاستجابة يبلغ 256 كيبيبايت، ولا توجد إعادة توجيه أو إعادة محاولة. يعتمد الحظر على معالجة استثناء PrestaShop Mail::send() الذي تم فحصه، وليس على قيمة إرجاع الـ hook النهائي.
محول Symfony Mailer
0.1.1
يتطلب PHP 8.1+ ويستهدف Symfony Mailer 6.4 أو 7.4 فقط؛ الإصدارات المؤكدة هي 6.4.46 و 7.4.19. لا يُدعى التوافق مع Symfony 8.1 أو الخطوط غير المختبرة. قم بتثبيت ملف ZIP المصدري المحلي عبر مستودع مسار Composer؛ هذه الحزمة غير منشورة على Packagist.
تكون الحزمة والموافقة المدفوعة معطلين افتراضياً، وتكون الرسائل التي تحتوي على الترويسة المحددة للموافقة فقط مؤهلة. سياسة تقييم النصيحة أو الحظر مستقلة عن سياسة السماح أو الحظر عند الفشل. يتم التصنيف على MessageEvent الرسمي قبل الإرسال؛ ويستخدم الرفض MessageEvent::reject(). يتم تخطي أحداث النسخ المتسلسلة ليكون حدث النقل الخاص بالعامل هو نقطة التصنيف المدفوعة الوحيدة.
تنزيل ملف Symfony المصدري ZIP
مستودع الكود المصدري العام
ملف README والأمثلة الكاملة
ملاحظات الأمان والقيود المعروفة
1. التثبيت
قم بفك ضغط ملف ZIP الذي تم تنزيله في دليل packages محتفظ به، وقم بتسجيل ذلك الدليل كمستودع مسار Composer، واطلب الحزمة 0.1.1 بالضبط، وقم بتسجيل SendRepute\Symfony\SendReputeBundle إذا لم يقم Flex بذلك. الأرشيف المصدري محلي وغير منشور.
mkdir -p packages
curl -fL https://www.sendrepute.com/downloads/sendrepute-symfony.zip -o packages/sendrepute-symfony.zip
unzip packages/sendrepute-symfony.zip -d packages
composer config repositories.sendrepute path ./packages/sendrepute-symfony
composer require sendrepute/symfony:0.1.1
بديل: التثبيت من المصدر العام
استخدم مسار المصدر هذا بدلاً من تعليمات التنزيل الخاصة بالموقع أعلاه. يشرح ملف README الخاص بالمستودع خطوات التفعيل والإعداد المتبقية؛ فبناء ملف ZIP وحده لا يثبت الإضافة. بالنسبة لـ Python، يضيف الأمر الثاني دعم Django الاختياري. احتفظ ببيانات الاعتماد في أسرار الخادم وراجع ملاحظات الأمان قبل تمكين الميزات المدفوعة. Node فقط موجود على npm؛ وجود مستودع GitHub عام لا يعني النشر على WordPress.org أو n8n Cloud أو Packagist أو PyPI.
git clone https://github.com/sendrepute/sendrepute-symfony.git
cd sendrepute-symfony
2. التهيأة بأمان
قم باستخراج SENDREPUTE_API_TOKEN من أسرار الخادم. أبقِ enabled و paid_analysis_consent على false أثناء مراجعة التسعير الحالي. الوضع، والعتبة، وسياسة الفشل مستقلة. نقطة النهاية ثابتة على HTTPS موثق مع مواعيد نهائية محددة، بدون إعادات توجيه أو محاولات، وبحد أقصى للاستجابة يبلغ 1 MiB.
send_repute:
enabled: false
paid_analysis_consent: false
api_token: '%env(SENDREPUTE_API_TOKEN)%'
mode: advisory
failure_policy: allow
spam_probability_threshold: 0.8
3. الاستخدام المتعمد
أضف ترويسة الموافقة الصريحة فقط إلى كائنات Email التي تمت مراجعتها وغير الحساسة، ثم استمر عبر Mailer العادي. لن يتم إعادة كتابة الرسالة (message) أو المغلف (envelope) أو وسيلة النقل (transport) أو الترويسة (header). لتسليم الرسائل عبر Messenger، قم بتكوين حزمة (bundle) في العمال (workers): أحداث نسخ المنتج (producer clone) لا يتم تصنيفها عمدًا.
$email->getHeaders()->addTextHeader('X-SendRepute-Classify', 'yes');
$mailer->send($email);
النتائج والإخفاقات والقيود
يتم دعم نص واحد فقط بصيغة text أو HTML في الذاكرة. البدائل المختلطة، DataParts النصية، التدفقات أو المسارات، أقواس CSS، العلامات، صيغة quoted-printable، ترويسات base64 أو النص الكامل بصيغة base64 تفشل قبل الدفع وتتبع سياسة الفشل؛ المحتوى العادي الخالي من الأقواس لا يتغير. يتم التحقق من كل حقل استجابة متداخل مطلوب وفرع تدقيق اختياري وتُرفض الخصائص غير المعروفة. النمط الاستشاري لا يحظر النتائج أبدًا؛ الحظر يرفض عند العتبة من خلال حدث النقل الحقيقي.
محول Rails Action Mailer
0.1.0
يتطلب Ruby 3.2+ ومختبر بدقة مع Action Mailer 7.1.6 و Mail 2.9.1؛ كما لوحظ مسار الاستدعاء (callback) على Action Mailer 7.2.3.2. هذا لا يعد شهادة لكل إصدار مسموح من Rails 7.x. قم بتثبيت ملف ZIP المصدري المحلي عبر Bundler؛ لا يُدعى النشر على RubyGems.
كلا البوابتين المدفوعتين العالميتين معطلتان افتراضياً، ويجب على كل إجراء مرسل استدعاء sendrepute_paid_preflight! صراحةً. سلوك تقييم النصيحة/الحظر وسلوك الحفظ/الحظر عند الفشل مستقلان. يجب أن تظل مسارات إعادة تعيين كلمة المرور، و MFA، وتسجيل الدخول، والتحقق، والفواتير، والأمن غير مختارة. تُرفض كل رسالة متعددة الأجزاء والمحتوى الغامض من نوع CSS أو quoted-printable أو الذي يبدو كـ base64 قبل الدفع؛ يتم تحليل نص واحد مقبول فك تشفيره أو جسم HTML دون تغيير الرسالة الأصلية أو وسيلة النقل.
تنزيل ملف Rails المصدري ZIP
مستودع الكود المصدري العام
ملف README والأمثلة الكاملة
ملاحظات الأمان والقيود المعروفة
1. التثبيت
استخرج ملف ZIP تمامًا في vendor/sendrepute-rails، وأضف مدخل المسار المحلي إلى Gemfile، وشغل Bundler في بيئتك المتحكم بها، وقم بتضمين SendRepute::Rails::Mailer في ApplicationMailer. هذا ليس تثبيتًا عبر RubyGems.
# Download sendrepute-rails.zip, then extract it into vendor/sendrepute-rails.
gem "sendrepute-rails", path: "vendor/sendrepute-rails"
بديل: التثبيت من المصدر العام
استخدم مسار المصدر هذا بدلاً من تعليمات التنزيل الخاصة بالموقع أعلاه. يشرح ملف README الخاص بالمستودع خطوات التفعيل والإعداد المتبقية؛ فبناء ملف ZIP وحده لا يثبت الإضافة. بالنسبة لـ Python، يضيف الأمر الثاني دعم Django الاختياري. احتفظ ببيانات الاعتماد في أسرار الخادم وراجع ملاحظات الأمان قبل تمكين الميزات المدفوعة. Node فقط موجود على npm؛ وجود مستودع GitHub عام لا يعني النشر على WordPress.org أو n8n Cloud أو Packagist أو PyPI.
git clone https://github.com/sendrepute/sendrepute-rails.git
cd sendrepute-rails
2. التهيأة بأمان
اجعل enabled و paid_consent بقيمة false حتى تتم مراجعة الأسعار والمسارات الحالية. اقرأ الرمز (token) من Rails credentials أو أي سر خادم آخر. قم بتكوين advisory/block و preserve/block والعتبة (threshold) بشكل مستقل؛ يجب ألا تقوم استدعاءات on_result و on_error بتسجيل محتوى الرسالة أو بيانات التفويض أو الاستجابات الكاملة.
SendRepute::Rails.configure do |config|
config.enabled = false
config.paid_consent = false
config.token = Rails.application.credentials.dig(:sendrepute, :api_token)
config.mode = :advisory
config.failure_policy = :preserve
config.score_threshold = 0.8
end
3. الاستخدام المتعمد
استدعِ sendrepute_paid_preflight! فقط داخل كل إجراء mailer غير حساس يتم اختياره عمدًا. تتجاوز الإجراءات العادية التصنيف. يستخدم رابط الدفع (paid hook) مسار before_deliver الخاص بـ Action Mailer؛ لا يتم توفير خيار موافقة تلقائي شامل ولا يقوم المحول (adapter) بإعادة كتابة Mail::Message.
class ApplicationMailer < ActionMailer::Base
include SendRepute::Rails::Mailer
end
def newsletter
sendrepute_paid_preflight!
mail(to: params[:to], subject: "News")
end
النتائج والإخفاقات والقيود
يتم دعم نص واحد مفصول من نوع text/plain أو text/html للجسم المعروض. تفشل كل مدخلات التطبيع المتعددة الأجزاء أو الغامضة قبل الدفع وتتبع سياسة الفشل. يمكن للاستجابة المتداخلة المكتوبة بالكامل أن تحظر فقط في وضع الحظر عند العتبة أو أعلى منها؛ بينما يحفظ التوجيه الاستشاري كل درجة. تتلقى استدعاءات النتيجة والخطأ بيانات آمنة غير قابلة للتغيير، ويتم التقاط استثناءات الاستدعاء أو throw(:abort) محلياً حتى لا تنهي التوجيه الاستشاري أو تحافظ على التسليم. ترفض نقطة النهاية الثابتة عمليات إعادة التوجيه وإعادة المحاولة وتستخدم مهلة زمنية إجمالية محدودة. اجتازت اختبارات Action Mailer 7.1.6 الحقيقية: 19 تشغيلاً و59 تأكيداً؛ ولم يحدث أي طلب مدفوع أو تسليم حقيقي.
محول Spring JavaMailSender
0.1.1
يتطلب Java 17+ ويستهدف Spring Framework 6.2.x JavaMailSender؛ تم التحقق من الاعتماديات بدقة باستخدام Spring Framework 6.2.19. لا توجد مطالبات تتعلق بـ Spring Boot 4 أو توافق واسع مع إصدارات الإطار. قم ببناء ملف ZIP المصدري المحلي باستخدام Maven؛ وهو غير منشور على Maven Central أو أي سجل آخر.
إعدادات المزخرف والموافقة المدفوعة والوضع الاستشاري والسماح عند الفشل الافتراضية صريحة. فقط sendWithSendRepute(...) يقوم بإجراء التحليل المدفوع قبل الإرسال؛ بينما تتخطى كل عمليات send(...) العادية التصنيف ويتم تفويضها دون تغيير. استخدم send العادي للرسائل الهامة ما لم يتم اختيار هذا الإرسال الفردي عمداً. يتم تجميع بدائل MIME المعروضة والمدعومة معاً بشكل خامل؛ يفشل المحتوى غير المدعوم أو المتداخل أو الموقع أو المشفر أو الغامض قبل الدفع.
تنزيل ملف Spring Java المصدري ZIP
مستودع الكود المصدري العام
ملف README والأمثلة الكاملة
ملاحظات الأمان والقيود المعروفة
1. التثبيت
استخرج ملف ZIP المصدري 0.1.1، وقم بتشغيل mvn verify، وثبته فقط في مستودع Maven المحلي المتحكم به الخاص بك. يوفر التطبيق المستهلك JavaMailSender الحالي وتنفيذ البريد في وقت التشغيل. تم استخدام Java 17 bytecode و Spring Framework 6.2.19 والإصدارات الموثقة في ملف README المرفق للتحقق من التبعية الدقيقة.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-spring-mail.zip
unzip sendrepute-spring-mail.zip
cd sendrepute-spring-mail-0.1.1
mvn verify
mvn install
بديل: التثبيت من المصدر العام
استخدم مسار المصدر هذا بدلاً من تعليمات التنزيل الخاصة بالموقع أعلاه. يشرح ملف README الخاص بالمستودع خطوات التفعيل والإعداد المتبقية؛ فبناء ملف ZIP وحده لا يثبت الإضافة. بالنسبة لـ Python، يضيف الأمر الثاني دعم Django الاختياري. احتفظ ببيانات الاعتماد في أسرار الخادم وراجع ملاحظات الأمان قبل تمكين الميزات المدفوعة. Node فقط موجود على npm؛ وجود مستودع GitHub عام لا يعني النشر على WordPress.org أو n8n Cloud أو Packagist أو PyPI.
git clone https://github.com/sendrepute/sendrepute-java.git
cd sendrepute-java
2. التهيأة بأمان
قم بإنشاء SendReputeConfiguration باستخدام رمز من جانب الخادم ومفاتيح تبديل صريحة. اترك enabled و paidAnalysisConsent بقيمة false حتى تتم مراجعة التسعير والاستدعاءات المختارة. تُعد سياسة advisory/blocking، والعتبة (threshold)، وسياسة فشل allow/block مستقلة. نقطة النهاية ثابتة على HTTPS موثق بدون إعادة توجيه أو إعادة محاولة.
var settings = new SendReputeConfiguration(
token, false, false,
SendReputeConfiguration.Mode.ADVISORY,
SendReputeConfiguration.FailurePolicy.ALLOW,
0.80, Duration.ofSeconds(3), Duration.ofSeconds(10));
var reviewedSender = new SendReputeJavaMailSender(existingSender, settings);
3. الاستخدام المتعمد
استدعي sendWithSendRepute(...) فقط لرسائل SimpleMailMessage أو MimeMessage أو MimeMessagePreparator الفردية التي يجب أن تخضع للتحليل. يتم دعم التحميلات الزائدة الفردية و varargs. تتجاوز كل عمليات التحميل الزائد لـ send(...) العادية عملية التصنيف. تقوم الـ Preparators بالعرض مرة واحدة ويتم تفويض MIME الأصلي المُعد بعد أن تسمح السياسة بذلك.
// Paid classification is possible only on this explicit method.
reviewedSender.sendWithSendRepute(reviewedMessage);
// Every ordinary JavaMailSender send overload bypasses classification.
reviewedSender.send(criticalMessage);
النتائج والإخفاقات والقيود
يتم تحليل جميع أجزاء plain و HTML المعروضة المدعومة؛ ويتم استبعاد المستلمين والمرفقات. يقتصر التتبع على 16 مستوى و256 جزءاً و524,288 بايت UTF-8 معروضاً. لا يتم تجسيد البيانات الثنائية المضمنة التي تم تجاهلها أبداً؛ وتفشل المصادر المعروضة البطيئة (lazy) غير المعروفة أو غير المحدودة قبل فتح التدفق أو إجراء طلب مدفوع، وتكون قراءات المصدر المدعومة محدودة. يحافظ تأطير الكيانات الرقمية (Numeric-entity framing) على خمول الأجزاء من خلال ترتيب التطبيع (normalizer) المعتمد للخادم. يتم تحضير وتطبيع دفعات varargs بالكامل قبل أول طلب مدفوع، ولا يولد الفحص رؤوس Jakarta Mail. مطلوب استجابة متداخلة دقيقة بشكل متكرر.
محول بريد Magento Open Source
0.1.1
يدعم فقط Magento Open Source 2.4.7-p5 و 2.4.7-p6 مع مصادر immutable mail-interface المراجعة بدقة. اجتازت القوالب المكتوبة دون اتصال (Offline typed fixtures) الاختبار، ولكن لم يتم إجراء تثبيت كامل لـ Magento؛ ولا توجد نسخة أخرى من Magento أو Adobe Commerce معتمدة. قم بتثبيت ملف ZIP المحلي من خلال مستودع مسار Composer؛ فهو ليس حزمة من Adobe Marketplace.
يتم إيقاف تشغيل الوحدة (module) والموافقة المدفوعة وقوائم المسارات افتراضياً. يتطلب كل معرف قالب موافقتين مستقلتين ودقيقتين؛ لا يتم استنتاج الأهمية الحرجة أبداً من اسمه. يقوم ملحق aroundSendMessage بالتحليل عند حدود النقل النهائية دون إعادة بناء الرسالة. سياسة عتبة الاستشارة/الحظر وسياسة فشل الحفظ/الحظر مستقلتان؛ يؤدي الحظر إلى رفع Magento MailException مرئي. تفشل أجزاء MIME المتعددة المعروضة والمحتوى الغامض قبل الدفع.
Download Magento source ZIP
مستودع الكود المصدري العام
ملف README والأمثلة الكاملة
ملاحظات الأمان والقيود المعروفة
1. التثبيت
استخرج ملف ZIP إلى دليل حزمة محتفظ به، وسجل جذر SendRepute_MailAdapter كمسار مستودع Composer، واطلب الإصدار 0.1.1، ثم استخدم عملية تمكين الوحدة وترقية الإعداد العادية في Magento. لا تقدم هذا الأرشيف المحلي كحزمة Adobe Marketplace.
mkdir -p packages/sendrepute-magento
curl -fLO https://www.sendrepute.com/downloads/sendrepute-magento.zip
unzip sendrepute-magento.zip -d packages/sendrepute-magento
composer config repositories.sendrepute path ./packages/sendrepute-magento/SendRepute_MailAdapter
composer require sendrepute/magento-mail-adapter:0.1.1
bin/magento module:enable SendRepute_MailAdapter
bin/magento setup:upgrade
بديل: التثبيت من المصدر العام
استخدم مسار المصدر هذا بدلاً من تعليمات التنزيل الخاصة بالموقع أعلاه. يشرح ملف README الخاص بالمستودع خطوات التفعيل والإعداد المتبقية؛ فبناء ملف ZIP وحده لا يثبت الإضافة. بالنسبة لـ Python، يضيف الأمر الثاني دعم Django الاختياري. احتفظ ببيانات الاعتماد في أسرار الخادم وراجع ملاحظات الأمان قبل تمكين الميزات المدفوعة. Node فقط موجود على npm؛ وجود مستودع GitHub عام لا يعني النشر على WordPress.org أو n8n Cloud أو Packagist أو PyPI.
git clone https://github.com/sendrepute/sendrepute-magento.git
cd sendrepute-magento
2. التهيأة بأمان
قم بتعيين SENDREPUTE_API_TOKEN فقط في بيئة خادم PHP-FPM و CLI. في Stores > Configuration > Services > SendRepute، اترك الوحدة والموافقة المدفوعة مغلقة في البداية. أضف كل معرف قالب دقيق إلى كلتا قائمتي الموافقة على المسار المستقلتين؛ الأسماء، بما في ذلك الأسماء الرقمية، لا تستنتج الأهمية أبداً. قم بتكوين الاستشارة/الحظر، والعتبة، وسلوك فشل الحفاظ/الحظر بشكل منفصل.
export SENDREPUTE_API_TOKEN="replace-with-a-scoped-server-token"
# Then configure Stores > Configuration > Services > SendRepute.
3. الاستخدام المتعمد
استمر في استخدام قالب Magento العادي وتدفق النقل. يسجل ارتباط المسار المعرف الدقيق والمتجر المحدد من خلال TransportBuilder، بينما يقرأ المكون الإضافي Final aroundSendMessage واجهات البريد الإلكتروني و MIME الرسمية المكتوبة قبل استدعاء نفس النقل. يتم مسح حالة Builder في كتلة finally، ويستخدم ارتباط Builder/الرسالة إدخالات WeakMap ذات مفاتيح كائنية (object-keyed) بحيث لا يمكن للنقل المبني المتروك أن يترك ترخيصاً لمعرف كائن رقمي قابل لإعادة الاستخدام. لا يوفر المحول (adapter) طريقة إرسال جديدة ولا يغير الرسالة.
النتائج والإخفاقات والقيود
يتم قبول جزء MIME معروض واحد مدعوم فقط؛ يتم الاحتفاظ بالمرفقات ولكن يتم استبعادها من التحليل. تفشل الأجزاء المتعددة المعروضة، أو ترميزات النقل غير المدعومة، أو مجموعات الأحرف غير المدعومة، أو التدفقات، أو MIME المتداخل، أو نص الموحد الغامض قبل الدفع. طلب HTTPS واحد تم التحقق منه له مواعيد نهائية محددة وحجم استجابة محدود دون إعادة محاولة أو إعادة توجيه. قد تحظر النتيجة المتداخلة الصالحة عند العتبة؛ يؤدي تكوين fail-block إلى رفع Magento MailException.
.NET MailKit adapter
0.1.0
يتطلب .NET 8 وأدلة تبعية دقيقة لـ MailKit/MimeKit 4.18.0. هو غلاف صريح حول IMailTransport مملوك للتطبيق، وليس hook عالمياً أو عميل SMTP أو وسيلة نقل بديلة. قم ببناء أو الإشارة إلى ملف ZIP للمصدر المحلي؛ لا توجد دعوى لنشره عبر NuGet.
يتم إيقاف تشغيل المحول والموافقة المدفوعة افتراضياً؛ وتعد الاستشارة وحفظ الإرسال إعدادات افتراضية مستقلة. الاستدعاءات لـ AnalyzeAsync أو AnalyzeThenSend أو AnalyzeThenSendAsync هي استدعاءات صريحة. تتطلب رسائل الأمان/الحساب الحرجة فئة وموافقة منفصلة لكل مكالمة. يتم تأطير كل بديل نص عادي/HTML مدعوم ومعروض بشكل خامل في طلب واحد محدود؛ يفشل المحتوى غير المدعوم أو المتداخل أو الموقع أو المشفر قبل الدفع. تصل رسالة MimeMessage الأصلية ورمز الإلغاء إلى النقل الحالي فقط بعد أن تسمح السياسة بذلك.
Download .NET MailKit source ZIP
مستودع الكود المصدري العام
ملف README والأمثلة الكاملة
ملاحظات الأمان والقيود المعروفة
1. التثبيت
استخرج ملف ZIP للمصدر وقم بالإشارة إلى src/SendRepute.MailKit/SendRepute.MailKit.csproj من مشروع .NET 8 المستهلك. يحصل Restore على MailKit/MimeKit 4.18.0. حزمة المصدر هذه محلية وغير منشورة؛ إنها ليست عملية تثبيت NuGet.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-mailkit.zip
unzip sendrepute-mailkit.zip
dotnet add reference ./sendrepute-mailkit-0.1.0/src/SendRepute.MailKit/SendRepute.MailKit.csproj
بديل: التثبيت من المصدر العام
استخدم مسار المصدر هذا بدلاً من تعليمات التنزيل الخاصة بالموقع أعلاه. يشرح ملف README الخاص بالمستودع خطوات التفعيل والإعداد المتبقية؛ فبناء ملف ZIP وحده لا يثبت الإضافة. بالنسبة لـ Python، يضيف الأمر الثاني دعم Django الاختياري. احتفظ ببيانات الاعتماد في أسرار الخادم وراجع ملاحظات الأمان قبل تمكين الميزات المدفوعة. Node فقط موجود على npm؛ وجود مستودع GitHub عام لا يعني النشر على WordPress.org أو n8n Cloud أو Packagist أو PyPI.
git clone https://github.com/sendrepute/sendrepute-dotnet.git
cd sendrepute-dotnet
2. التهيأة بأمان
قم بتغليف IMailTransport الحالي المملوك للتطبيق باستخدام SendReputeMailAdapter. اقرأ رمز API من إعدادات الخادم وأبقِ خياري Enabled و PaidAnalysisConsent في حالة false حتى تتم المراجعة. إعدادات حد الاستشارة/الحظر وإعدادات حفظ/حظر الفشل مستقلة عن بعضها البعض. إن كل من endpoint، والحد الأدنى لـ TLS، وسلوك المحاولة الواحدة، والمواعيد النهائية، وحدود 1 MiB هي قيم ثابتة.
var options = new SendReputeOptions {
Enabled = false,
PaidAnalysisConsent = false,
ApiToken = configuration["SENDREPUTE_API_KEY"]!,
Enforcement = EnforcementPolicy.Advisory,
OnFailure = FailurePolicy.PreserveSend,
SpamProbabilityThreshold = 0.80
};
var adapter = new SendReputeMailAdapter(existingTransport, new SendReputeClient(options), options);
3. الاستخدام المتعمد
استدعِ AnalyzeAsync للتحليل فقط، أو AnalyzeThenSend و AnalyzeThenSendAsync لسلوك ما قبل الإرسال الصريح. لا يتم اعتراض أي مسار بريد عادي أو عام. قم بتمرير موافقة التحليل المدفوع وفئة الرسالة في كل عملية مختارة؛ يتطلب بريد الأمان/الحساب الحرج إعداد الموافقة الحرجة منفصل.
await adapter.AnalyzeThenSendAsync(message, new AnalysisConsent {
PaidAnalysisConsent = true,
Category = MessageCategory.Ordinary
}, cancellationToken);
النتائج والإخفاقات والقيود
يجمع فك ترميز MimeKit الفعلي كل بديل نصي وHTML معروض مدعوم في تأطير خامل مع استبعاد المستلمين والمرفقات. يعمل التأطير الخارجي غير التابع لـ base64 والكيانات التي يتم فك ترميزها لاحقاً على تحييد أقواس CSS، والنصوص المرمزة بـ quoted-printable، ورؤوس base64، وbase64 لكامل الجسم، والوسوم قبل تسوية الخدمة. يفشل المحتوى المعروض غير المدعوم، أو المتداخل، أو الموقع، أو المشفر قبل الدفع. كل حقل استجابة مطلوب يكون محدّد النوع؛ ويجب أن يكون flaggedTermCount الاختياري عدداً صحيحاً غير سالب، ويتم التحقق من contentAudit الاختياري بشكل كامل وتكراري مقابل العقد العام. تصل MimeMessage الأصلية الدقيقة ورمز الإلغاء إلى وسيلة النقل المقدمة فقط عندما تسمح سياسات الدرجة المستقلة والفشل بذلك.
Zapier manual draft analysis
0.2.0
وصفة Zapier يدوية لعرض تحليل مدفوع لثلاث سلاسل مسودات يختارها المالك بدقة. إنه ليس تطبيق SendRepute على Zapier، ولا إدراجاً في المتجر، ولا أداة استيراد، ولا محول ما قبل الإرسال، ولا مرسلاً، ولا مسار سماح/حظر، ولا مصنفاً للرسالة كاملة. يستخدم Zapier Webhooks بروكسي HTTPS محدوداً يديره المالك لأن SENDREPUTE_API_TOKEN يجب ألا يدخل إلى Zap.
يتم ضبط ثوابت وقت التحويل البرمجي (compile-time constants) افتراضياً على false قبل HTTP. يقوم Zap بربط اسم عرض المرسل والموضوع والجسم فقط، ويرسل JSON إلى تصميم بروكسي المالك المضمن، ويتحقق تماماً من الاستجابة المتداخلة، ثم يعرض حقول الاستشارة والفوترة في خطوة مراجعة خاصة. يجب ألا يضيف مرسلاً أو فرض مسارات (Paths enforcement) أو Autoreplay أو مسار failure-preserve؛ تتوقف خطوات Code أو Webhook الفاشلة.
Download Zapier and Make recipe ZIP
مستودع الكود المصدري العام
ملف README والأمثلة الكاملة
ملاحظات الأمان والقيود المعروفة
1. التثبيت
قم بتنزيل واستخراج مصدر وصفة 0.2.0 المشترك. اقرأ دليل Zapier المرفق وقم بنشر وكيل Node (loopback Node proxy) المضمن فقط خلف وكيل HTTPS عكسي يديره المالك. هذه الحزمة لا تقوم بنشره. لا يوجد تطبيق SendRepute في Zapier أو أداة Zap قابلة للاستيراد.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-automation-recipes.zip
unzip sendrepute-automation-recipes.zip
cd sendrepute-automation-recipes
بديل: التثبيت من المصدر العام
استخدم مسار المصدر هذا بدلاً من تعليمات التنزيل الخاصة بالموقع أعلاه. يشرح ملف README الخاص بالمستودع خطوات التفعيل والإعداد المتبقية؛ فبناء ملف ZIP وحده لا يثبت الإضافة. بالنسبة لـ Python، يضيف الأمر الثاني دعم Django الاختياري. احتفظ ببيانات الاعتماد في أسرار الخادم وراجع ملاحظات الأمان قبل تمكين الميزات المدفوعة. Node فقط موجود على npm؛ وجود مستودع GitHub عام لا يعني النشر على WordPress.org أو n8n Cloud أو Packagist أو PyPI.
git clone https://github.com/sendrepute/sendrepute-automation.git
cd sendrepute-automation
2. التهيأة بأمان
أبقِ الـ Zap قيد الإيقاف. في مصدر Code لـ preflight الدقيق، يظل كل من ENABLED و PAID_CONSENT في حالة false حتى تتم مراجعة الاستخدام المدفوع. يخزن وكيل المالك الـ SENDREPUTE_API_TOKEN؛ ويتلقى الـ Zap اعتماداً واحداً فقط قابلاً للإلغاء بشكل منفصل من SENDREPUTE_PROXY_CREDENTIALS. قد يكشفه المحررون وسجل المهام، لذا قم بتقييده وتدويره وإلغائه. قم بتكوين حدود token-bucket والتزامن لكل اعتماد، والحدود القصوى العالمية للاتصال/التزامن، وميزانية يومية للمكالمات المدفوعة يحددها المالك، وحدود إنفاق علوية تقييدية، وضوابط مطابقة لـ TLS-terminator من حيث الحجم/المعدل/الموعد النهائي. لا تقم بتمكين Autoreplay.
// In zapier/preflight.js; review charges before changing either literal.
const ENABLED = false;
const PAID_CONSENT = false;
3. الاستخدام المتعمد
قم ببناء الخطوات يدوياً: مسودة المشغل؛ وتعيين Code للـ preflight للمرسل والموضوع والمتن فقط؛ ثم Webhooks POST مع صفوف JSON إلى وكيل المالك؛ وكود التحقق من الاستجابة؛ وعرض المراجعة الخاصة. لا تقم أبداً بإدراج JSON خام يدوياً. قم بعرض requestId و model و label و spamProbability والفوترة فقط؛ ولا تضف إجراء بريد أو قرار مسارات (Paths).
{
"sender": "Mapped draft sender display name",
"subject": "Mapped draft subject",
"body": "Mapped draft body"
}
النتائج والإخفاقات والقيود
تقوم الوصفة بتحليل السلاسل الثلاث المحددة فقط؛ بينما تظل ملفات MIME غير المحددة، وبدائل HTML، والمرفقات، والمحتوى الصادر النهائي بدون تحليل. يرفض preflight المحافظ محفزات التسوية المعروفة ولكنه لا يثبت تغطية الرسالة بأكملها. ترفض حدود معدل الوكيل، والتزامن، والميزانية اليومية الطلب قبل الوصول إلى upstream، ويستمر حجز الميزانية قبل المحاولة المدفوعة؛ قم بتشغيل عملية وكيل واحدة لكل ملف ميزانية. يقوم الوكيل بمحاولة ثابتة واحدة عبر HTTPS محدود. أي استجابة دقيقة غير 200 أو غير مكتملة تؤدي إلى throw وتتوقف؛ لا يوجد preserve، أو Resume أو نتيجة بديلة.
Make manual draft analysis
0.2.0
تعليمات سيناريو Make اليدوية لعرض التحليل المدفوع لثلاثة نصوص مسودة مختارة بدقة. هذا ليس مخططاً (blueprint)، أو تطبيق SendRepute معتمداً، أو مرسل بريد، أو مسار إنفاذ، أو ادعاءً بشأن MIME غير المخطط، أو HTML، أو المرفقات أو المحتوى الصادر النهائي. الـ bearer token يوضع فقط في سلسلة مفاتيح Make HTTP الآمنة.
القيم المنطقية المستمرة لـ enabled و paidConsent تكون افتراضياً false، ويقوم فلتر AND بالإيقاف قبل HTTP. يتم إنتاج JSON بواسطة وحدة JSON في Make ويتم إرساله مرة واحدة بواسطة وحدة HTTP مع تعطيل إعادة التوجيه والمحاولات. فلتر الاستجابة هو مجرد حارس عرض، وليس تحققاً كاملاً أو إذناً بالإرسال. تستخدم إخفاقات HTTP الخيار Break، ولا تستخدم Resume أبداً أو تستبدل المخرجات.
تنزيل ملف ZIP لوصفات Zapier و Make
مستودع الكود المصدري العام
ملف README والأمثلة الكاملة
ملاحظات الأمان والقيود المعروفة
1. التثبيت
قم بتنزيل واستخراج مصدر الوصفة 0.2.0 المشترك، ثم اتبع دليل Make المرفق لبناء الوحدات الأصلية الحالية يدوياً. لا يتم ادعاء وجود مخطط (blueprint) أو تطبيق في المتجر أو تنسيق استيراد. أبقِ جدولة السيناريو قيد الإيقاف أثناء الاختبار مقابل نقطة نهاية وهمية.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-automation-recipes.zip
unzip sendrepute-automation-recipes.zip
cat sendrepute-automation-recipes/make/README.md
بديل: التثبيت من المصدر العام
استخدم مسار المصدر هذا بدلاً من تعليمات التنزيل الخاصة بالموقع أعلاه. يشرح ملف README الخاص بالمستودع خطوات التفعيل والإعداد المتبقية؛ فبناء ملف ZIP وحده لا يثبت الإضافة. بالنسبة لـ Python، يضيف الأمر الثاني دعم Django الاختياري. احتفظ ببيانات الاعتماد في أسرار الخادم وراجع ملاحظات الأمان قبل تمكين الميزات المدفوعة. Node فقط موجود على npm؛ وجود مستودع GitHub عام لا يعني النشر على WordPress.org أو n8n Cloud أو Packagist أو PyPI.
git clone https://github.com/sendrepute/sendrepute-automation.git
cd sendrepute-automation
2. التهيأة بأمان
قم بإنشاء متغيرات أدوات (Tools) منطقية مستمرة بقيمة enabled=false و paidConsent=false، متبوعة بفلتر AND يتطلب كلاهما true. استخدم JSON > Create JSON للمرسل والموضوع والمتن بالتحديد. قم بتخزين رمز حامل SendRepute فقط في سلسلة المفاتيح الآمنة لتطبيق HTTP؛ يجب ألا تحتوي السيناريوهات المصدرة على أي بيانات اعتماد.
Tools variables: enabled = false; paidConsent = false
Filter: enabled = true AND paidConsent = true
HTTP credential: secure keychain; Authorization header
Body type: Raw; Content type: application/json; map serialized JSON
Follow redirect: No; Timeout: 10 seconds; no retry
Response filter: Minimal display guard
3. الاستخدام المتعمد
قم بتهيئة طلب HTTP POST واحد إلى URL الثابت الخاص بـ classify. اختر نوع الـ Body ليكون Raw وتحكم content-type هو application/json دون إضافة رأس نص حر متعارض، ثم قم بربط المخرجات المتسلسلة من JSON > Create JSON. قم بتفعيل الاستجابة المحللة، وتعطيل عمليات إعادة التوجيه، وضبط مهلة زمنية قدرها 10 ثوانٍ، ولا تضف أي أداة تكرار أو إعادة محاولة تلقائية. تتطلب الوحدة حداً أقصى للاستجابة يبلغ 1 MiB؛ إذا لم يكن متاحاً، استخدم proxy محدوداً يتحكم فيه المالك بدلاً من ذلك. أضف فقط عرض مراجعة خاص بعد Minimal display guard—ولا تضف أبداً جهاز توجيه للسماح/الحظر أو مرسلاً.
{
"sender": "Mapped draft sender display name",
"subject": "Mapped draft subject",
"body": "Mapped draft body"
}
النتائج والإخفاقات والقيود
يتم تحليل السلاسل المخططة فقط؛ ولا يعتبر التوحيد مطابقاً للهوية مع البريد الإلكتروني الأصلي أو الصادر. يتحقق مرشح الاستجابة من الحالة ووجود النتيجة الأساسية/الفواتير فقط، وهو صراحةً ليس تحققاً كاملاً من المخطط أو فرضاً له. تستخدم أخطاء HTTP الخيار Break حتى لا يتم تشغيل الإجراءات اللاحقة؛ لا تستخدم أبداً Resume، أو مخرجات مفبركة أو مساراً يحفظ الفشل.
Node.js SDK
0.1.1
SDK للخوادم فقط لـ Node.js 18.17+. قم بتثبيت @sendrepute/node من npm أو استخدم ملف tarball القابل للتنزيل. يحافظ محول Nodemailer الاختياري على وسيلة النقل الحالية لديك. قم بتعيين مفتاح API محدد النطاق وعنوان API base URL صريح في بيئة الخادم الخاص بك، ولا تضعه أبداً في كود المتصفح.
قم بتسجيل createSendReputePlugin في مرحلة التدفق (stream stage). يقوم الوضع الاستشاري بالإبلاغ عن النتائج دون حظر التسليم. يفرض وضع الحظر spamProbabilityThreshold؛ ويختار onApiFailure بين السماح أو الحظر. التصنيف هو عملية API مدفوعة.
تنزيل ملف tarball لـ Node.js
مستودع الكود المصدري العام
ملف README والأمثلة الكاملة
ملاحظات الأمان والقيود المعروفة
عرض حزمة npm الموثقة
1. التثبيت
حزمة npm الموثقة هي @sendrepute/node بالإصدار 0.1.1؛ يُنصح بتثبيت النسخة المثبتة عبر @sendrepute/node@0.1.1. يوفر ملف tarball الخاص بالموقع والمستودع العام المثبت مصدر وبناء إصدار 0.1.1. يعد Nodemailer اختيارياً وتدعو الحاجة إليه فقط لمحول النقل. يدعم SDK طلبات API الخاصة بـ customer المصنفة لـ account و catalog و classification و AI و builders. استخدمه في خادم Node.js، ولا تستخدمه أبداً في متصفح.
npm install @sendrepute/node nodemailer
بديل: التثبيت من المصدر العام
استخدم مسار المصدر هذا بدلاً من تعليمات التنزيل الخاصة بالموقع أعلاه. يشرح ملف README الخاص بالمستودع خطوات التفعيل والإعداد المتبقية؛ فبناء ملف ZIP وحده لا يثبت الإضافة. بالنسبة لـ Python، يضيف الأمر الثاني دعم Django الاختياري. احتفظ ببيانات الاعتماد في أسرار الخادم وراجع ملاحظات الأمان قبل تمكين الميزات المدفوعة. Node فقط موجود على npm؛ وجود مستودع GitHub عام لا يعني النشر على WordPress.org أو n8n Cloud أو Packagist أو PyPI.
npm install @sendrepute/node@0.1.1
npm install nodemailer
2. التهيأة بأمان
قم بحقن SENDREPUTE_API_KEY من مخزن أسرار الخادم الخاص بك وتعيين عنوان URL الأساسي الصريح أدناه لـ customer API المستضاف. لا تقم بلصق الأسرار في الأوامر أو ملفات المصدر أو السجلات. امنح فقط النطاقات التي تتطلبها عملياتك. يستخدم الإعداد وسيلة نقل عرض محلية، وليس SMTP؛ تم ضبط maxRetries على صفر هنا لجعل المحاولات المدفوعة متعمدة.
export SENDREPUTE_API_BASE_URL=https://www.sendrepute.com/api
إعداد Nodemailer
يقوم هذا المثال بتهيئة وسيلة نقل عرض محلية (local rendering transport) ولا يستدعي sendMail. الإرسال عبر الإضافة التي تمت تهيئتها يؤدي إلى إجراء تحليل مدفوع. استبدل وسيلة النقل المحلية بوسيلة نقل SMTP الحالية فقط عندما تكون جاهزاً.
import nodemailer from "nodemailer";
import { SendReputeClient } from "@sendrepute/node";
import { createSendReputePlugin } from "@sendrepute/node/nodemailer";
const apiKey = process.env.SENDREPUTE_API_KEY;
const baseUrl = process.env.SENDREPUTE_API_BASE_URL;
if (!apiKey || !baseUrl) {
throw new Error("SENDREPUTE_API_KEY and SENDREPUTE_API_BASE_URL are required");
}
const client = new SendReputeClient({ apiKey, baseUrl, maxRetries: 0 });
const transporter = nodemailer.createTransport({
streamTransport: true,
buffer: true,
newline: "unix",
});
transporter.use("stream", createSendReputePlugin({
client,
policy: {
paidAnalysisConsent: true,
mode: "blocking",
spamProbabilityThreshold: 0.85,
onApiFailure: "block",
},
}));
3. الاستخدام المتعمد
استخدم العميل من الإعداد أعلاه. اقرأ الحساب والأسعار الحالية قبل عرض إجراء الموافقة. استدعِ classifyAfterConsent فقط من إجراء خادم موثق بعد التأكيد؛ حيث يعيد استجابة التصنيف والفوترة المحددة. الإرسال عبر إضافة Nodemailer المكونة هو أيضاً إجراء تصنيف مدفوع. يتطلب المحول paidAnalysisConsent: true ويرفض أي قيمة أخرى قبل التسجيل؛ اضبطه فقط بعد التفويض.
// Uses client from the setup above; nothing calls this function automatically.
async function classifyAfterConsent({ sender, subject, body, confirmed }) {
if (confirmed !== true) throw new Error("Paid consent required");
return client.request("classifyCustomerEmail", { body: { sender, subject, body } });
}
async function readAccountAndPricing() {
return Promise.all([
client.request("customerGetAccount", {}),
client.request("customerGetPricingSettings", {}),
]);
}
بناة VIP القياسيون والأصليون
تقوم أداة البناء القياسية المجانية باستيراد MJML والتحقق من صحتها وتجميعها وتصديرها كـ HTML أو MJML أو ملف ZIP يحتوي على كليهما. تستخدم أداة بناء VIP الأصلية المنفصلة تنسيق مستند خاص بها، وليس MJML: تتطلب عمليات الاستيراد والتحقق والتجميع والتصدير اشتراكاً نشطاً واستحقاق وصول مفتوح مملوكاً، ويحتوي ملف ZIP الخاص بها على ثلاثة متغيرات لـ HTML CSS. يتم دفع رسوم إنشاء الذاء الاصطناعي الاختياري بشكل منفصل، مما ينتج تصميماً قياسياً قابلاً للتعديل بـ MJML أو VIP أصلي؛ اعرض التسعير الفعلي الحالي وقم بتمرير قيمة expectedPriceMillicents المؤكدة، ولا تستخدم سعراً ثابتاً أبداً. تحتوي استجابات ZIP على archiveBase64 وليس حقل html: تعيد وظيفة decodeExportBytes وحدات بايت ليقوم تطبيقك بحفظها. لا تقوم نقاط نهاية المعالجة هذه بجلب الأصول أو حفظ التصميمات أو إرسال البريد الإلكتروني.
import { decodeExportBytes } from "@sendrepute/node";
async function exportStandardZip(mjml) {
const exported = await client.request("customerStandardBuilderExport", {
body: { mjml, format: "zip", filename: "newsletter.zip" },
});
return decodeExportBytes(exported);
}
async function generateNativeAfterConsent(prompt, expectedPriceMillicents, confirmed) {
if (confirmed !== true) throw new Error("Paid consent required");
return client.request("customerCreateVipEmailTemplate", {
body: { prompt, expectedPriceMillicents },
});
}
ما الذي يمكنه فعله أيضاً؟
تغطي معرفات العمليات التي تم إنشاؤها قراءات الحساب والأسعار، والتصنيف والتعديلات اليدوية، وإعادة كتابة AI/توليد القوالب، وخطط/حالة/مشتريات VIP، والقوالب الأصلية/استحقاقات الوصول، والاستيراد/التصدير القياسي والأصلي عديم الحالة. استشر أمثلة المصدر ومرجع API للعميل لكل نوع طلب، والنطاق المطلوب، والسعر الحالي. قراءات الكتالوج لا تشتري حق الوصول. تتطلب القدرات المدفوعة الجديدة رموزاً ذات نطاق محدد (scoped token) وتأكيداً صريحاً من واجهة المستخدم.
النتائج والإخفاقات والقيود
يُظهر SendReputeError حالات status و code و requestId؛ احتفظ فقط بهذه البيانات التشغيلية الوصفية الآمنة. لا تقم أبدًا بتسجيل أجسام الرسائل (bodies) أو الأوامر (prompts) أو الرؤوس (headers) أو الاستجابات الكاملة. يقوم AbortSignal بإلغاء العمل؛ ويتم تطبيق timeoutMs لكل محاولة. عمليات إعادة المحاولة المقيدة (Bounded retries) مدركة للعملية وحماية الإيصالات محدودة زمنياً، وليست فواتير دفع غير محدودة لكل عملية بالضبط. يقوم وضع Advisory Nodemailer بتقديم تقارير دون حظر؛ بينما يستخدم الحظر spamProbabilityThreshold و onApiFailure بشكل مستقل. قم بالحفاظ على وسيلة النقل (transport) الحقيقية الخاصة بك واختبارها بشكل منفصل.
import { SendReputeError } from "@sendrepute/node";
async function readAccountSafely() {
try {
return await client.request("customerGetAccount", {});
} catch (error) {
if (error instanceof SendReputeError) {
console.error({
status: error.status, code: error.code, requestId: error.requestId,
});
}
throw error;
}
}
مرجع واجهة برمجة التطبيقات والأساليب
يتطلب SendReputeClient وجود apiKey و baseUrl؛ وتكون قيمة timeoutMs الاختيارية افتراضياً 30000 (بحد أقصى 300000)، بينما تكون maxRetries افتراضياً 2 (بين 0-10)، ويقبل fetch تطبيق خادم متوافق. تعيد الدالة request(operationId, input, { signal }) استجابة العملية المحددة؛ حيث يحتوي input على جسم الطلب أو المسار أو حقول الاستعلام. يؤدي التكوين غير الصالح إلى ظهور TypeError؛ بينما تستخدم حالات فشل API فئة SendReputeError مع status و code و requestId و retryAfterMs. تقوم دالة decodeExportBytes بتحويل ملف ZIP مصدر إلى Uint8Array وترفض مدخلات base64 غير الصالحة أو التي ليست بتنسيق ZIP. يتم تصدير OperationInput و OperationResponse وأنواع المخططات المنشأة لمستخدمي TypeScript.
بديل: تغليف وسيط نقل Nodemailer منخفض المستوى
تقوم الوظيفة createSendReputeTransport(existingTransport, options) بتغليف كائن نقل موجود مع توفير طرق send وطرق اختيارية مثل close و verify؛ وهي ليست وحدة نقل sendMail. اختر هذه الوظيفة أو createSendReputePlugin، ولا تستخدمهما معاً لتجنب التكرار في التحليل. كلتاهما تقبل client و policy بالإضافة إلى خيارات model و sender string/resolver و signal و onDiagnostic. لا يمكن لاستدعاءات Diagnostic تغيير عملية التسليم. تميز أكواد SendReputeNodemailerError بين حالات السياسة/الرسالة غير الصالحة، المحتوى غير المدعوم، حظر البريد العشوائي، وإخفاقات API. تدمج حزمة npm 0.1.1 المنشورة وتنزيل الموقع 0.1.1 كافة بدائل text/plain و text/html المعروضة في الذاكرة في طلب تصنيف واحد محدود؛ وفي وضع الحظر يتم رفض البدائل المعروضة غير المدعومة. تظل الرسائل الخام والتدفقات والمسارات وعناوين URL غير مدعومة.
import { createSendReputeTransport } from "@sendrepute/node/nodemailer";
function wrapExistingTransport(existingTransport) {
return createSendReputeTransport(existingTransport, {
client,
policy: {
paidAnalysisConsent: true,
mode: "advisory",
spamProbabilityThreshold: 0.85,
onApiFailure: "block",
},
onDiagnostic(diagnostic) {
console.info(diagnostic.kind, diagnostic.action);
},
});
}
جميع عمليات واجهة برمجة تطبيقات العميل الـ 49
قم بتوسيع أي عملية لرؤية نوع مدخلات SDK الدقيق ونوع الإرجاع والنطاق وحالات HTTP الموثقة. يفتح رابط المخطط المعلمات الكاملة وحقول الاستجابة والأمثلة في مرجع واجهة برمجة تطبيقات العميل. تستخدم هذه الأغلفة العميل الذي تم تكوينه أعلاه؛ يتطلب الأمر تأكيداً ولا يتم تنفيذ أي شيء تلقائياً. عمليات القراءة لا تسمح بالمشتريات. تتطلب عمليات التعديل والمدفوعات وإغلاق الوصول والذكاء الاصطناعي المدفوع إجراء حساب متعمد مطابق.
عرض سعر لتحليل مجمع واحد لرؤى الحملة
POST /v1/campaign-insights/quote
النطاق المطلوب: ai:generate
المدخلات: { body: CustomerCampaignInsightsQuoteInput; }
المخرجات: CustomerCampaignInsightsQuote
حالات HTTP الموثقة: 200, 400, 401, 403, 429, 503
المعلمات والمخططات وأمثلة HTTP
// The configured server-side client needs ai:generate scope.
// A quote is free; it does not authorize or start paid analysis.
const quote = await client.request("customerQuoteCampaignInsights", { body: {} });
// quote.priceMillicents: 10000 (USD 0.10) regular, 5000 (USD 0.05) active VIP.
// The quoted rate can change; obtain fresh consent before analysis.
تحليل مقاييس تسليم الحملة المجمعة باستخدام الذكاء الاصطناعي
POST /v1/campaign-insights/analyze
النطاق المطلوب: ai:generate
المدخلات: { body: CustomerCampaignInsightsAnalyzeInput; }
المخرجات: CustomerCampaignInsightsAnalysis
حالات HTTP الموثقة: 200, 400, 401, 402, 403, 409, 413, 429, 502, 503
المعلمات والمخططات وأمثلة HTTP
import { randomUUID } from "node:crypto";
import type { CustomerCampaignInsightsMetrics } from "@sendrepute/node";
async function analyzeReviewedAggregate(
metrics: CustomerCampaignInsightsMetrics,
paidConsent: boolean,
) {
if (paidConsent !== true) throw new Error("Explicit price consent required");
// Aggregate counts/rates only: never include campaign IDs, contacts,
// message bodies or individual events. Requires ai:generate scope.
const quote = await client.request("customerQuoteCampaignInsights", { body: {} });
const body = {
analysisId: randomUUID(), // Persist this opaque ID and exact body for safe replay.
expectedPriceMillicents: quote.priceMillicents,
consent: true as const,
metrics,
};
// USD 0.10 regular or USD 0.05 active VIP; no automatic retry on a paid request.
// 409 PRICE_CHANGED requires a new quote and fresh consent, not blind retry.
// Aggregate input and result expire after 30 days.
return client.request("customerAnalyzeCampaignInsights", { body });
}
قائمة نماذج تصنيف واجهة برمجة تطبيقات العميل
GET /v1/models
النطاق المطلوب: models:read
المدخلات: Record<string, never>
المخرجات: CustomerApiModelsResponse
حالات HTTP الموثقة: 200, 401, 403, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function getCustomerApiModels(
input: OperationInput<"getCustomerApiModels">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"getCustomerApiModels">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("getCustomerApiModels", input, { signal });
}
الحصول على استخدام وحدود واجهة برمجة تطبيقات العميل
GET /v1/usage
النطاق المطلوب: usage:read
المدخلات: Record<string, never>
المخرجات: CustomerApiUsageResponse
حالات HTTP الموثقة: 200, 401, 403, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function getCustomerApiUsage(
input: OperationInput<"getCustomerApiUsage">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"getCustomerApiUsage">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("getCustomerApiUsage", input, { signal });
}
تصنيف رسالة إلكترونية واحدة للعميل
POST /v1/classify
النطاق المطلوب: classify
المدخلات: { body: CustomerClassificationInput; }
المخرجات: CustomerClassificationResponse
حالات HTTP الموثقة: 200, 400, 401, 402, 403, 409, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function classifyCustomerEmail(
input: OperationInput<"classifyCustomerEmail">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"classifyCustomerEmail">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("classifyCustomerEmail", input, { signal });
}
الحصول على الحساب الحالي والرصيد
GET /v1/account
النطاق المطلوب: account:read
المدخلات: Record<string, never>
المخرجات: Account
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetAccount(
input: OperationInput<"customerGetAccount">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetAccount">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetAccount", input, { signal });
}
الحصول على رابط الإحالة ونشاط المكافآت للحساب الحالي
GET /v1/account/referrals
النطاق المطلوب: account:read
المدخلات: { query?: { page?: number; pageSize?: number; }; }
المخرجات: ReferralDashboard
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetAccountReferrals(
input: OperationInput<"customerGetAccountReferrals">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetAccountReferrals">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetAccountReferrals", input, { signal });
}
قائمة بسجل ائتمان الحساب الحالي
GET /v1/account/ledger
النطاق المطلوب: billing:read
المدخلات: { query?: { kind?: "usage" | "payments"; limit?: number; offset?: number; }; }
المخرجات: Array<CreditLedgerEntry>
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetCreditLedger(
input: OperationInput<"customerGetCreditLedger">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetCreditLedger">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetCreditLedger", input, { signal });
}
قائمة بفواتير البيتكوين للحساب الحالي
GET /v1/payments/invoices
النطاق المطلوب: billing:read
المدخلات: { query?: { limit?: number; offset?: number; }; }
المخرجات: Array<BitcoinInvoice>
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerListPaymentInvoices(
input: OperationInput<"customerListPaymentInvoices">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerListPaymentInvoices">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerListPaymentInvoices", input, { signal });
}
إنشاء فاتورة إيداع بيتكوين مقومة بالدولار الأمريكي
POST /v1/payments/invoices
النطاق المطلوب: billing:write
المدخلات: { body: InvoiceInput; }
المخرجات: BitcoinInvoice
حالات HTTP الموثقة: 201, 400, 401, 402, 403, 404, 409, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCreatePaymentInvoice(
input: OperationInput<"customerCreatePaymentInvoice">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCreatePaymentInvoice">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCreatePaymentInvoice", input, { signal });
}
إخفاء فاتورة بيتكوين غير مدفوعة
DELETE /v1/payments/invoices/{invoiceId}
النطاق المطلوب: billing:write
المدخلات: { path: { invoiceId: string; }; }
المخرجات: undefined
حالات HTTP الموثقة: 204, 400, 401, 402, 403, 404, 409, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerDeletePaymentInvoice(
input: OperationInput<"customerDeletePaymentInvoice">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerDeletePaymentInvoice">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerDeletePaymentInvoice", input, { signal });
}
GET /payments/methods
GET /v1/payments/methods
النطاق المطلوب: billing:read
المدخلات: Record<string, never>
المخرجات: Array<PaymentMethod>
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerListPaymentMethods(
input: OperationInput<"customerListPaymentMethods">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerListPaymentMethods">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerListPaymentMethods", input, { signal });
}
الحصول على عرض مكافأة إيداع البيتكوين النشط حالياً
GET /v1/payments/deposit-offer
النطاق المطلوب: billing:read
المدخلات: Record<string, never>
المخرجات: DepositBonusOffer | null
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetActiveDepositOffer(
input: OperationInput<"customerGetActiveDepositOffer">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetActiveDepositOffer">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetActiveDepositOffer", input, { signal });
}
تحديث التأكيدات لفواتير الحساب الحالي
POST /v1/payments/refresh
النطاق المطلوب: billing:write
المدخلات: Record<string, never>
المخرجات: Array<BitcoinInvoice>
حالات HTTP الموثقة: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerRefreshMyPayments(
input: OperationInput<"customerRefreshMyPayments">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerRefreshMyPayments">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerRefreshMyPayments", input, { signal });
}
الحصول على أسعار التحليل والتحرير العامة الحالية
GET /v1/pricing
النطاق المطلوب: catalog:read
المدخلات: Record<string, never>
المخرجات: PricingSettings
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetPricingSettings(
input: OperationInput<"customerGetPricingSettings">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetPricingSettings">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetPricingSettings", input, { signal });
}
الحصول على عرض أسعار VIP العام الحالي وأسعار المقارنة
GET /v1/vip/plans
النطاق المطلوب: catalog:read
المدخلات: Record<string, never>
المخرجات: VipPlanQuote
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetVipPlans(
input: OperationInput<"customerGetVipPlans">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetVipPlans">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetVipPlans", input, { signal });
}
GET /vip
GET /v1/vip
النطاق المطلوب: vip:read
المدخلات: Record<string, never>
المخرجات: VipState
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetVip(
input: OperationInput<"customerGetVip">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetVip">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetVip", input, { signal });
}
POST /vip/purchase
POST /v1/vip/purchase
النطاق المطلوب: vip:purchase
المدخلات: { body: CustomerVipPurchaseInput; }
المخرجات: VipPurchaseResult
حالات HTTP الموثقة: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerPurchaseVip(
input: OperationInput<"customerPurchaseVip">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerPurchaseVip">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerPurchaseVip", input, { signal });
}
تقدير سعر التعديل وإعادة التحقق مقابل تصنيف محفوظ
POST /v1/rewrite/quote
النطاق المطلوب: rewrite
المدخلات: { body: EditQuoteInput; }
المخرجات: EditQuote
حالات HTTP الموثقة: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerQuoteClassificationEdit(
input: OperationInput<"customerQuoteClassificationEdit">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerQuoteClassificationEdit">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerQuoteClassificationEdit", input, { signal });
}
تقدير سعر التعديل وإعادة التحقق مقابل تصنيف محفوظ
POST /v1/classify/edit/quote
النطاق المطلوب: classify
المدخلات: { body: EditQuoteInput; }
المخرجات: EditQuote
حالات HTTP الموثقة: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerQuoteManualClassificationEdit(
input: OperationInput<"customerQuoteManualClassificationEdit">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerQuoteManualClassificationEdit">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerQuoteManualClassificationEdit", input, { signal });
}
تصنيف بريد إلكتروني باستخدام اسم المرسل، والموضوع، ونص الرسالة
POST /v1/classify/edit
النطاق المطلوب: classify
المدخلات: { body: CustomerManualEditInput; }
المخرجات: CustomerManualEditResult
حالات HTTP الموثقة: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerClassifyEmail(
input: OperationInput<"customerClassifyEmail">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerClassifyEmail">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerClassifyEmail", input, { signal });
}
طلب إعادة كتابة المصطلحات المحددة التي تم وضع علامة عليها باستخدام ذكاء اصطناعي مدفوع بشكل منفصل وإعادة تصنيف النتيجة
POST /v1/rewrite
النطاق المطلوب: rewrite
المدخلات: { body: CustomerAiRewriteInput; }
المخرجات: AiRewriteResult
حالات HTTP الموثقة: 200, 400, 401, 402, 403, 404, 409, 413, 429, 502, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerRewriteFlaggedTermsWithAi(
input: OperationInput<"customerRewriteFlaggedTermsWithAi">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerRewriteFlaggedTermsWithAi">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerRewriteFlaggedTermsWithAi", input, { signal });
}
التحقق من مسودة نهائية معالجة واحدة مقابل إيصال "Rewrite All" مدفوع ومملوك دون خصم رصيد إضافي
POST /v1/rewrite/finalize
النطاق المطلوب: rewrite
المدخلات: { body: { requestId: string; sender: string; subject: string; body: string; }; }
المخرجات: { requestId: string; input: RewrittenClassificationInput; classification: ClassificationResult; }
حالات HTTP الموثقة: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerFinalizeAiRewrite(
input: OperationInput<"customerFinalizeAiRewrite">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerFinalizeAiRewrite">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerFinalizeAiRewrite", input, { signal });
}
استرداد إيصال مكتمل لعملية إعادة كتابة ذكاء اصطناعي مدفوعة ومملوكة
GET /v1/rewrite/result/{requestId}
النطاق المطلوب: rewrite
المدخلات: { path: { requestId: string; }; }
المخرجات: AiRewriteResult
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetAiRewriteResult(
input: OperationInput<"customerGetAiRewriteResult">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetAiRewriteResult">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetAiRewriteResult", input, { signal });
}
عرض السعر الأقصى المصرح به لإعادة كتابة بواسطة الذكاء الاصطناعي مدفوعة بشكل منفصل
POST /v1/rewrite/ai-quote
النطاق المطلوب: rewrite
المدخلات: { body: AiRewriteQuoteInput; }
المخرجات: AiRewriteQuote
حالات HTTP الموثقة: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerQuoteAiRewrite(
input: OperationInput<"customerQuoteAiRewrite">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerQuoteAiRewrite">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerQuoteAiRewrite", input, { signal });
}
إنشاء تصميم بريد إلكتروني MJML قياسي قابل للتعديل باستخدام الذكاء الاصطناعي بسعر الحساب المؤكد
POST /v1/email-builder/ai-template
النطاق المطلوب: ai:generate
المدخلات: { body: CustomerAiEmailTemplateInput; }
المخرجات: AiEmailTemplateResult
حالات HTTP الموثقة: 200, 400, 401, 402, 403, 404, 409, 413, 429, 502, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCreateAiEmailTemplate(
input: OperationInput<"customerCreateAiEmailTemplate">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCreateAiEmailTemplate">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCreateAiEmailTemplate", input, { signal });
}
إنشاء تصميم بريد إلكتروني VIP أصلي قابل للتعديل باستخدام الذكاء الاصطناعي بسعر العضو المؤكد
POST /v1/vip/email-template
النطاق المطلوب: ai:generate
المدخلات: { body: CustomerVipEmailTemplateInput; }
المخرجات: CustomerVipEmailTemplateResult
حالات HTTP الموثقة: 200, 400, 401, 402, 403, 404, 409, 413, 429, 502, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCreateVipEmailTemplate(
input: OperationInput<"customerCreateVipEmailTemplate">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCreateVipEmailTemplate">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCreateVipEmailTemplate", input, { signal });
}
فتح جلسة محرر تصميم بريد إلكتروني قياسي مجانًا
POST /v1/email-builder/access
النطاق المطلوب: builder:write
المدخلات: { body: CustomerEmailBuilderAccessInput; }
المخرجات: EmailBuilderAccess
حالات HTTP الموثقة: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerAccessEmailBuilder(
input: OperationInput<"customerAccessEmailBuilder">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerAccessEmailBuilder">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerAccessEmailBuilder", input, { signal });
}
GET /email-builder/access/{accessId}
GET /v1/email-builder/access/{accessId}
النطاق المطلوب: builder:read
المدخلات: { query?: { designId?: string; }; path: { accessId: string; }; }
المخرجات: EmailBuilderActiveAccess
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetEmailBuilderAccess(
input: OperationInput<"customerGetEmailBuilderAccess">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetEmailBuilderAccess">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetEmailBuilderAccess", input, { signal });
}
DELETE /email-builder/access/{accessId}
DELETE /v1/email-builder/access/{accessId}
النطاق المطلوب: builder:write
المدخلات: { path: { accessId: string; }; }
المخرجات: undefined
حالات HTTP الموثقة: 204, 400, 401, 402, 403, 404, 409, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCloseEmailBuilderAccess(
input: OperationInput<"customerCloseEmailBuilderAccess">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCloseEmailBuilderAccess">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCloseEmailBuilderAccess", input, { signal });
}
POST /vip/email-builder/access
POST /v1/vip/email-builder/access
النطاق المطلوب: vip:builder
المدخلات: { body: CustomerVipBuilderAccessInput; }
المخرجات: VipBuilderAccess
حالات HTTP الموثقة: 201, 400, 401, 402, 403, 404, 409, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCreateVipEmailBuilderAccess(
input: OperationInput<"customerCreateVipEmailBuilderAccess">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCreateVipEmailBuilderAccess">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCreateVipEmailBuilderAccess", input, { signal });
}
GET /vip/email-builder/access/{accessId}
GET /v1/vip/email-builder/access/{accessId}
النطاق المطلوب: builder:read
المدخلات: { path: { accessId: string; }; }
المخرجات: VipBuilderAccess
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetVipEmailBuilderAccess(
input: OperationInput<"customerGetVipEmailBuilderAccess">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetVipEmailBuilderAccess">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetVipEmailBuilderAccess", input, { signal });
}
DELETE /vip/email-builder/access/{accessId}
DELETE /v1/vip/email-builder/access/{accessId}
النطاق المطلوب: vip:builder
المدخلات: { path: { accessId: string; }; }
المخرجات: undefined
حالات HTTP الموثقة: 204, 400, 401, 402, 403, 404, 409, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerDeleteVipEmailBuilderAccess(
input: OperationInput<"customerDeleteVipEmailBuilderAccess">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerDeleteVipEmailBuilderAccess">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerDeleteVipEmailBuilderAccess", input, { signal });
}
Read permanent paid-result evidence with the original account and credential
GET /customer/paid-results/{recoveryId}
النطاق المطلوب: authenticated original credential
المدخلات: { path: { recoveryId: string; }; }
المخرجات: { status: "pending" | "succeeded" | "failed"; operation: "customerStandardAiGenerate" | "customerVipAiGenerate" | "customerVipBuilderAccess"; settlement: { kind: "paid_result" | "no_charge" | "confirmed_refund" | "unresolved"; accountId: string; credentialId: string | null; recoveryId: string; receiptId: string; chargeMillicents?: number; refundMillicents?: number; deletedAt?: string; }; result?: { [key: string]: unknown; }; error?: { [key: string]: unknown; }; }
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetPaidResult(
input: OperationInput<"customerGetPaidResult">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetPaidResult">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetPaidResult", input, { signal });
}
Read the authenticated account and credential identity before paid dispatch
GET /customer/paid-results/identity
النطاق المطلوب: authenticated credential
المدخلات: Record<string, never>
المخرجات: { accountId: string; credentialId: string; }
حالات HTTP الموثقة: 200, 401, 403, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerPaidResultIdentity(
input: OperationInput<"customerPaidResultIdentity">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerPaidResultIdentity">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerPaidResultIdentity", input, { signal });
}
Explicitly resolve an owned paid result with the original credential and service scope
POST /customer/paid-results/{recoveryId}/resolve
النطاق المطلوب: original ai:generate or vip:builder service scope
المدخلات: { body: { action: "resolve"; reason: string; }; path: { recoveryId: string; }; }
المخرجات: { status: "pending" | "succeeded" | "failed"; operation: "customerStandardAiGenerate" | "customerVipAiGenerate" | "customerVipBuilderAccess"; settlement: { kind: "paid_result" | "no_charge" | "confirmed_refund" | "unresolved"; accountId: string; credentialId: string | null; recoveryId: string; receiptId: string; chargeMillicents?: number; refundMillicents?: number; deletedAt?: string; }; result?: { [key: string]: unknown; }; error?: { [key: string]: unknown; }; }
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerResolvePaidResult(
input: OperationInput<"customerResolvePaidResult">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerResolvePaidResult">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerResolvePaidResult", input, { signal });
}
استيراد وتجميع تصميم MJML قياسي دون حفظه أو إرساله
POST /v1/email-builder/import
النطاق المطلوب: builder:write
المدخلات: { body: CustomerStandardBuilderInput; }
المخرجات: CustomerStandardBuilderImportResult
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerStandardBuilderImport(
input: OperationInput<"customerStandardBuilderImport">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerStandardBuilderImport">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerStandardBuilderImport", input, { signal });
}
التحقق من صحة وتجميع تصميم MJML قياسي دون حفظه أو إرساله
POST /v1/email-builder/validate
النطاق المطلوب: builder:write
المدخلات: { body: CustomerStandardBuilderInput; }
المخرجات: CustomerStandardBuilderValidateResult
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerStandardBuilderValidate(
input: OperationInput<"customerStandardBuilderValidate">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerStandardBuilderValidate">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerStandardBuilderValidate", input, { signal });
}
تجميع تصميم MJML قياسي إلى HTML دون حفظه أو إرساله
POST /v1/email-builder/compile
النطاق المطلوب: builder:write
المدخلات: { body: CustomerStandardBuilderInput; }
المخرجات: CustomerStandardBuilderCompileResult
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerStandardBuilderCompile(
input: OperationInput<"customerStandardBuilderCompile">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerStandardBuilderCompile">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerStandardBuilderCompile", input, { signal });
}
تصدير تصميم MJML قياسي بتنسيق HTML أو MJML أو ملف ZIP دون إرسال
POST /v1/email-builder/export
النطاق المطلوب: builder:write
المدخلات: { body: CustomerStandardBuilderInput; }
المخرجات: CustomerStandardBuilderExportResult
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerStandardBuilderExport(
input: OperationInput<"customerStandardBuilderExport">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerStandardBuilderExport">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerStandardBuilderExport", input, { signal });
}
استيراد وتجميع تصميم VIP أصلي مع عضوية نشطة ووصول مفتوح مملوك
POST /v1/vip/email-builder/import
النطاق المطلوب: vip:builder
المدخلات: { body: CustomerNativeBuilderInput; }
المخرجات: CustomerNativeBuilderImportResult
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerNativeBuilderImport(
input: OperationInput<"customerNativeBuilderImport">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerNativeBuilderImport">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerNativeBuilderImport", input, { signal });
}
التحقق من صحة وتجميع تصميم VIP أصلي مع عضوية نشطة ووصول مفتوح مملوك
POST /v1/vip/email-builder/validate
النطاق المطلوب: vip:builder
المدخلات: { body: CustomerNativeBuilderInput; }
المخرجات: CustomerNativeBuilderValidateResult
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerNativeBuilderValidate(
input: OperationInput<"customerNativeBuilderValidate">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerNativeBuilderValidate">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerNativeBuilderValidate", input, { signal });
}
تجميع تصميم VIP أصلي إلى HTML مع عضوية نشطة ووصول مفتوح مملوك
POST /v1/vip/email-builder/compile
النطاق المطلوب: vip:builder
المدخلات: { body: CustomerNativeBuilderInput; }
المخرجات: CustomerNativeBuilderCompileResult
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerNativeBuilderCompile(
input: OperationInput<"customerNativeBuilderCompile">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerNativeBuilderCompile">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerNativeBuilderCompile", input, { signal });
}
تصدير تصميم VIP أصلي كملف HTML أو ملف ZIP بـثلاثة متغيرات HTML دون إرسال
POST /v1/vip/email-builder/export
النطاق المطلوب: vip:builder
المدخلات: { body: CustomerNativeBuilderInput; }
المخرجات: CustomerNativeBuilderExportResult
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerNativeBuilderExport(
input: OperationInput<"customerNativeBuilderExport">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerNativeBuilderExport">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerNativeBuilderExport", input, { signal });
}
تشغيل عملية تسليم واحدة لمحرر مستضاف أصلي (VIP) قياسي أو مفوض
POST /v1/email-builder/hosted-handoffs
النطاق المطلوب: builder:write
المدخلات: { body: CustomerHostedBuilderHandoffInput; }
المخرجات: CustomerHostedBuilderHandoff
حالات HTTP الموثقة: 201, 400, 401, 403, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCreateHostedBuilderHandoff(
input: OperationInput<"customerCreateHostedBuilderHandoff">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCreateHostedBuilderHandoff">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCreateHostedBuilderHandoff", input, { signal });
}
عرض قائمة قوالب أداة البناء VIP
GET /v1/vip/email-builder/templates
النطاق المطلوب: vip:read
المدخلات: Record<string, never>
المخرجات: CustomerVipTemplateCatalog
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerListVipBuilderTemplates(
input: OperationInput<"customerListVipBuilderTemplates">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerListVipBuilderTemplates">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerListVipBuilderTemplates", input, { signal });
}
الحصول على قالب أداة البناء VIP
GET /v1/vip/email-builder/templates/{templateId}
النطاق المطلوب: vip:read
المدخلات: { path: { templateId: string; }; }
المخرجات: CustomerVipTemplateDocument
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetVipBuilderTemplate(
input: OperationInput<"customerGetVipBuilderTemplate">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetVipBuilderTemplate">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetVipBuilderTemplate", input, { signal });
}
عرض قائمة قوالب أداة البناء Standard
GET /v1/email-builder/templates
النطاق المطلوب: catalog:read
المدخلات: Record<string, never>
المخرجات: CustomerStandardTemplateCatalog
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerListStandardBuilderTemplates(
input: OperationInput<"customerListStandardBuilderTemplates">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerListStandardBuilderTemplates">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerListStandardBuilderTemplates", input, { signal });
}
الحصول على قالب أداة البناء Standard
GET /v1/email-builder/templates/{templateId}
النطاق المطلوب: catalog:read
المدخلات: { path: { templateId: string; }; }
المخرجات: CustomerStandardTemplateDetail
حالات HTTP الموثقة: 200, 400, 401, 403, 404, 413, 429, 503
المعلمات والمخططات وأمثلة HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetStandardBuilderTemplate(
input: OperationInput<"customerGetStandardBuilderTemplate">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetStandardBuilderTemplate">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetStandardBuilderTemplate", input, { signal });
}
عقدة n8n ذاتية الاستضافة
0.1.0
يتطلب Node.js 20.19+ وتثبيت n8n مستضاف ذاتياً ومعدل يوفر n8n-workflow >=2.39.3 <3. لا تقم بالتثبيت القسري في مضيف قديم غير متوافق. قم بتثبيت ملف tarball الذي تم تنزيله في دليل custom-node الخاص بك وأعد تشغيل n8n. هذا العقد (node) غير المنشور غير متاح عبر n8n Cloud أو تثبيت المجتمع عبر npm-name.
الموافقة المدفوعة معطلة افتراضياً. ينفذ كل عنصر موافق عليه طلب تصنيف واحد دون محاولات إعادة تلقائية. تُدرج النتائج ضمن مساحة الأسماء sendrepute. استخدم بوابة IF على sendrepute.allowed قبل الإرسال، وتحقق من حالة الفشل (failure status) بشكل منفصل. تعيد أوضاع الاستشارة (Advisory) والحظر (blocking) قرارات صريحة. العقدة (node) نفسها لا تقوم بإرسال البريد.
Download n8n tarball
مستودع الكود المصدري العام
ملف README والأمثلة الكاملة
ملاحظات الأمان والقيود المعروفة
1. التثبيت
قم بالتشغيل على مضيف n8n المستضاف ذاتيًا، ثم أعد تشغيل خدمة n8n باستخدام مدير العمليات المعتاد لديك. تأكد من ظهور SendRepute في منتقي العقد (node picker). قم باستيراد الملف المستخرج package/examples/classify-email.workflow.json من محرر n8n. تثبيت عقد المجتمع عبر npm-name و n8n Cloud غير مدعومين بواسطة هذه الحزمة غير المنشورة.
mkdir -p ~/.n8n/nodes
cd ~/.n8n/nodes
curl -fLO https://www.sendrepute.com/downloads/sendrepute-n8n.tgz
npm install ./sendrepute-n8n.tgz
tar -xzf sendrepute-n8n.tgz package/examples/classify-email.workflow.json
بديل: التثبيت من المصدر العام
استخدم مسار المصدر هذا بدلاً من تعليمات التنزيل الخاصة بالموقع أعلاه. يشرح ملف README الخاص بالمستودع خطوات التفعيل والإعداد المتبقية؛ فبناء ملف ZIP وحده لا يثبت الإضافة. بالنسبة لـ Python، يضيف الأمر الثاني دعم Django الاختياري. احتفظ ببيانات الاعتماد في أسرار الخادم وراجع ملاحظات الأمان قبل تمكين الميزات المدفوعة. Node فقط موجود على npm؛ وجود مستودع GitHub عام لا يعني النشر على WordPress.org أو n8n Cloud أو Packagist أو PyPI.
git clone https://github.com/sendrepute/n8n-nodes-sendrepute.git
cd n8n-nodes-sendrepute
npm ci
npm run pack:check
npm pack --ignore-scripts
archive="$PWD/n8n-nodes-sendrepute-0.1.0.tgz"
mkdir -p ~/.n8n/nodes
cd ~/.n8n/nodes
npm install "$archive"
2. التهيأة بأمان
أنشئ اعتماد (credential) لـ SendRepute API باستخدام مفتاح عميل بنطاق classify في مخزن اعتمادات n8n. لا تضعه أبدًا في ملف JSON الخاص بسير العمل أو في التعبيرات البرمجية. يوضح ملف JSON أدناه معلمات العقدة، وليس سير عمل كامل قابل للاستيراد. قم بربط اسم عرض المرسل والموضوع والجسم؛ اختر بين advisory/blocking، والعتبة (threshold)، وسياسة الفشل المفتوحة/المغلقة (open/closed). راجع الأسعار قبل تحويل paidConsent إلى true. كل عنصر موافق عليه يقوم بطلب واحد كحد أقصى.
{
"operation": "classify",
"paidConsent": false,
"sender": "={{ $json.sender }}",
"subject": "={{ $json.subject }}",
"body": "={{ $json.body }}",
"decisionMode": "blocking",
"threshold": 0.8,
"failurePolicy": "closed"
}
3. الاستخدام المتعمد
ضع عقدة IF مباشرة بعد SendRepute واستخدم هذا الشرط المنطقي. قم بتوصيل مخرج true فقط بعقدة البريد الإلكتروني الموجودة لديك؛ وقم بتوجيه false للمراجعة أو الإيقاف. افحص analysisStatus بشكل منفصل حتى عندما يكون allowed هو true. يبدأ سير العمل المضمن مع تعطيل الموافقة على الدفع ولا يحتوي على اعتمادات. SendRepute نفسه لا يرسل البريد أبدًا.
{{ $json.sendrepute.allowed === true }}
النتائج والإخفاقات والقيود
تستبدل النتائج الناجحة مساحة الاسم sendrepute بـ analysisStatus و decision و allowed و recommendation والدرجة المعتمدة وحقول الفوترة. تحذف الإخفاقات درجات الرسائل غير المرغوب فيها وتعيد failureCategory/errorCode بصيغة مطهرة. الإخفاقات المغلقة تحظر؛ بينما تسمح الإخفاقات المفتوحة ولكنها تحدد analysisStatus كـ failed. النجاحات الاستشارية تسمح دائماً بغض النظر عن التوصية. Consent-off يعيد not_run. لا توجد عمليات إعادة محاولة، مستلمون، مرفقات، عمليات إعادة كتابة، محدد نموذج أو نقاط نهاية مخصصة. أبلغ تدقيق تبعية المصدر المحدث عن صفر من النتائج؛ هذه نتيجة في نقطة زمنية محددة وليست شهادة أمان. حافظ على تصحيح بيئة التشغيل المستضافة ذاتياً وراجع SECURITY.md قبل التثبيت.
تكامل Laravel
0.1.0
يستهدف إصدارات PHP 8.2+ و Laravel 12–13. قم بتثبيت ملف ZIP باستخدام مستودع Composer artifact محلي، أو استخرجه وقم بتكوين مستودع مسار (path repository) في Composer كما هو موضح في ملف README المرفق. لا يُزعم وجود أي نشر على Packagist.
الموافقة المدفوعة وخطاف البريد (mail hook) معطلان افتراضياً. حتى عند التمكين، يجب أن تشارك كل رسالة صراحةً عبر X-SendRepute-Classify: yes. يتم إزالة الترويسة قبل التسليم. تمتلك أوضاع Advisory و blocking سياسات فشل مستقلة؛ تظل عمليات إعادة تعيين كلمة المرور والبريد المعاملاتي دون تغيير ما لم يتم اختيار المشاركة عمداً.
Download Laravel ZIP
مستودع الكود المصدري العام
ملف README والأمثلة الكاملة
ملاحظات الأمان والقيود المعروفة
1. التثبيت
قم بالتشغيل داخل تطبيق Laravel الخاص بك. هذه الأوامر تستخرج التحميل وتسجل مستودع مسار Composer؛ هذا ليس تثبيتاً عبر Packagist. تسجيل اكتشاف الحزمة (Package discovery) يسجل المزود، و vendor:publish ينشئ config/sendrepute.php. احتفظ بدليل الحزمة المستخرج متاحاً لـ Composer. يعد مستودع القطع الأثرية (artifact repository) خياراً آخر موثقاً في ملف README.
mkdir -p packages
curl -fL https://www.sendrepute.com/downloads/sendrepute-laravel.zip -o packages/sendrepute-laravel.zip
unzip packages/sendrepute-laravel.zip -d packages
composer config repositories.sendrepute path ./packages/sendrepute-laravel
composer require sendrepute/laravel:@dev
php artisan vendor:publish --tag=sendrepute-config
بديل: التثبيت من المصدر العام
استخدم مسار المصدر هذا بدلاً من تعليمات التنزيل الخاصة بالموقع أعلاه. يشرح ملف README الخاص بالمستودع خطوات التفعيل والإعداد المتبقية؛ فبناء ملف ZIP وحده لا يثبت الإضافة. بالنسبة لـ Python، يضيف الأمر الثاني دعم Django الاختياري. احتفظ ببيانات الاعتماد في أسرار الخادم وراجع ملاحظات الأمان قبل تمكين الميزات المدفوعة. Node فقط موجود على npm؛ وجود مستودع GitHub عام لا يعني النشر على WordPress.org أو n8n Cloud أو Packagist أو PyPI.
composer config repositories.sendrepute vcs https://github.com/sendrepute/sendrepute-laravel
composer require sendrepute/laravel:dev-main
php artisan vendor:publish --tag=sendrepute-config
2. التهيأة بأمان
قم بتخزين SENDREPUTE_API_KEY في أسرار الخادم. ينتهي عنوان URL الأساسي بـ /api؛ ويضيف العميل /v1/classify. مطلوب تطابق تام للمضيف الموثوق (trusted-host) و HTTPS موثق. يظل كلا المفتاحين الموضحين معطلين حتى تراجع الأسعار وتضبطهما صراحةً على true. في config/sendrepute.php اختر mail.mode و mail.spam_probability_threshold و mail.failure_policy بشكل مستقل. الافتراضي هو advisory مع السماح عند الفشل.
SENDREPUTE_API_BASE_URL=https://www.sendrepute.com/api
SENDREPUTE_TRUSTED_HOSTS=www.sendrepute.com
SENDREPUTE_PAID_ANALYSIS_CONSENT=false
SENDREPUTE_MAIL_ENABLED=false
3. الاستخدام المتعمد
أضف رأس الموافقة (opt-in header) الدقيق فقط إلى فئات Mailable المختارة بعناية، وليس أبداً إلى رد نداء بريدي عالمي (global mail callback). يلزم وجود كل من المفاتيح العالمية ورأس الرسالة الفردي للخطاف التلقائي (automatic hook). يتم إزالة الرأس قبل التسليم. احتفظ بعمليات إعادة تعيين كلمة المرور والإشعارات الحرجة بعيداً عن الحظر التلقائي ما لم يتم اختبارها صراحةً. يمكن بدلاً من ذلك أن يحل التصنيف اليدوي عقد Classifier ويمنح الموافقة لكل استدعاء، كما هو موضح.
// Inside your deliberately opted-in Mailable:
public function headers(): \Illuminate\Mail\Mailables\Headers
{
return new \Illuminate\Mail\Mailables\Headers(text: [
'X-SendRepute-Classify' => 'yes',
]);
}
// Or classify manually inside an authenticated, explicitly confirmed action:
function classifyAfterConsent(bool $confirmed, string $subject, string $body): \SendRepute\Laravel\ClassificationResult
{
if (!$confirmed) {
throw new \RuntimeException('Paid consent required');
}
return app(\SendRepute\Laravel\Contracts\Classifier::class)->classify(
sender: 'Example Company',
subject: $subject,
body: $body,
paidAnalysisConsent: true,
);
}
مرجع واجهة برمجة التطبيقات والأساليب
قم باستدعاء واجهة Classifier من حاوية Laravel. تعيد classify(string sender, string subject, string body, ?string model = null, bool paidAnalysisConsent = false) الكائن ClassificationResult. حقوله العامة هي requestId و model و label و spamProbability و confidence و replayed و chargedMillicents. يوفر SendReputeException الفئة المنقحة وحالة HTTP ورمز واجهة برمجة التطبيقات ومعرف الطلب. الخطاف التلقائي هو AnalyzeOutgoingMessage عند MessageSending وتشخيصه الآمن هو ClassificationOutcome. يدعم هذا التكامل التصنيف فقط، وليس إدارة الحساب أو المدفوعات أو المنشئات أو إعادة كتابة الذكاء الاصطناعي.
النتائج والإخفاقات والقيود
يحتوي ClassificationResult على النتيجة التي تم التحقق منها وبيانات الفوترة. يعيد خطاف MessageSending القيمة false لإلغاء رسالة محظورة؛ الإلغاء ليس خطأ SMTP أو حدث MessageSent. يبلغ ClassificationOutcome فقط عن الإجراء والدرجة وبيانات الفشل المطهرة، وليس محتوى الرسالة أبداً. تغطي سياسة الفشل المدخلات/الاستجابات غير الصحيحة، والمصادقة، والرصيد، وحدود المعدل، ومشاكل النقل. لا يتم إضافة عمليات إعادة محاولة أو طابور انتظار. مطلوب مرسل مسمى وجسم رسالة text/plain أو text/html في الذاكرة.
فحص مسودة Mautic قبل الإرسال
0.1.0
يستهدف عمليات تثبيت Mautic 5.x على عقدة ويب واحدة مع PHP 8.1+ و ext-curl. الإصدارات Mautic 4 و Mautic 6 وعناقيد العقد المتعددة غير مدعومة. استخرج SendReputeBundle في دليل الإضافات (plugins)، ثم قم بإعادة تحميل الإضافات ومسح ذاكرة التخزين المؤقت باتباع ملف README المرفق. قم بتكوين بيانات الاعتماد وتأكيد وضع القفل local-flock صراحة في بيئة الخادم.
تحليل استشاري مدفوع لمسودة محفوظة فقط، يبدأه المسؤول. تحمي كل طلب موافقة عامة، وفحوصات وصول الكيانات، والتحقق من CSRF وتأكيد لمرة واحدة. لا يقوم بالإرسال أو إعادة الكتابة أو حظر رسائل البريد الإلكتروني وليس له فرض قيود وقت الإرسال. تظل استبدالات المستلمين غير موسعة؛ احفظ تغييرات المحرر أولاً.
Download Mautic ZIP
مستودع الكود المصدري العام
ملف README والأمثلة الكاملة
ملاحظات الأمان والقيود المعروفة
1. التثبيت
قم بالتشغيل من جذر Mautic الخاص بك باستخدام نفس مستخدم PHP والبيئة الخاصة بتطبيق الويب، أو استخرج ملف ZIP من خلال عملية النشر الخاصة بك قبل إعادة تحميل الإضافات. يتطلب Mautic 5.x و PHP 8.1+ و ext-curl ونقطة ويب Linux/POSIX واحدة. Mautic 4/6 ومجموعات العقد المتعددة (multi-node clusters) غير مدعومة؛ ولا يتم ادعاء أي اعتماد للتثبيت المباشر لكل تصحيح (patch-by-patch).
curl -fLO https://www.sendrepute.com/downloads/sendrepute-mautic.zip
unzip sendrepute-mautic.zip -d plugins
php bin/console mautic:plugins:reload
php bin/console cache:clear
بديل: التثبيت من المصدر العام
استخدم مسار المصدر هذا بدلاً من تعليمات التنزيل الخاصة بالموقع أعلاه. يشرح ملف README الخاص بالمستودع خطوات التفعيل والإعداد المتبقية؛ فبناء ملف ZIP وحده لا يثبت الإضافة. بالنسبة لـ Python، يضيف الأمر الثاني دعم Django الاختياري. احتفظ ببيانات الاعتماد في أسرار الخادم وراجع ملاحظات الأمان قبل تمكين الميزات المدفوعة. Node فقط موجود على npm؛ وجود مستودع GitHub عام لا يعني النشر على WordPress.org أو n8n Cloud أو Packagist أو PyPI.
git clone https://github.com/sendrepute/sendrepute-mautic.git
cd sendrepute-mautic
python3 package.py
2. التهيأة بأمان
أنشئ دليل السجل المستمر الموضح خارج جذر الويب، مملوكاً لمستخدم PHP مع وضع الصلاحيات 0700. لا تستخدم /tmp أو الحاويات المؤقتة أو الروابط الرمزية (symlinks) أو التخزين الشبكي غير المستقر. قم بتخزين SENDREPUTE_API_KEY على جانب الخادم. قم بتأكيد local-flock فقط عندما توفر عقدة ويب واحدة قفلاً مشتركاً للعمليات. يظل تحليل الدفع العالمي معطلاً عند 0؛ اضبطه على 1 فقط بعد مراجعة الأسعار والحدود. لا يجوز لأي حقل في المتصفح توفير الاعتماد أو نقطة النهاية.
SENDREPUTE_MAUTIC_PAID_ANALYSIS_ENABLED=0
SENDREPUTE_MAUTIC_ATOMIC_LOCK_MODE=local-flock
SENDREPUTE_MAUTIC_LEDGER_DIR=/var/lib/mautic/sendrepute-ledger
3. الاستخدام المتعمد
احفظ تغييرات المحرر أولاً. بصفتك مسؤول Mautic حقيقياً لديه حق الوصول إلى ذلك البريد الإلكتروني، افتح المسودة المحفوظة واختر SendRepute preflight. راجع التأكيد واقبل صراحةً العملية المدفوعة. يتطلب الطلب التحقق من CSRF وكياناً (intent) صالحاً للاستخدام مرة واحدة لمدة عشر دقائق مرتبطاً بالمحتوى المحفوظ. يمنع القفل المستمر والسجل الخالي من المحتوى الإنفاق المتزامن المكرر على العقدة الواحدة المدعومة.
النتائج والإخفاقات والقيود
يعرض الاحتمالية التي تم التحقق منها، والتسمية، والثقة، والمبلغ الفعلي الذي تمت فوترته أو إعادة تشغيل الإيصال. لا تعرض حالات الفشل أي قرار بشأن البريد العشوائي ولا تتم إعادة محاولتها تلقائياً. يتم تحليل اسم مرسل العرض المحفوظ، والموضوع، والجسم فقط؛ وتظل استبدالات جهات الاتصال غير موسعة. لا يقوم الملحق بإعادة كتابة المسودات، أو إرسال البريد الإلكتروني، أو حظر الحملات أو فرض سياسة وقت الإرسال. لا يمكن لمراجعة المسودة المحفوظة اعتماد الرسالة النهائية التي تظهر للمستلم.
عميل Python وواجهة Django الخلفية
0.1.0
يتطلب Python 3.9+. استخرج ملف ZIP المصدري وقم بتثبيت الدليل الخاص به باستخدام pip. يستخدم عميل الخادم العام المكتبة القياسية؛ Django هو تبعية اختيارية لواجهة البريد الإلكتروني الصريحة. هذه الحزمة غير منشورة على PyPI.
يتم ضبط الموافقة المدفوعة على وضع الإيقاف افتراضياً. يحافظ غلاف Django على كائنات النقل والرسائل الأصلية. يقوم بتحليل سلسلة نصية واحدة محدودة تجمع بين متن الرسالة الأساسي وبدائل text/plain و text/html المضمنة، ولا يشمل المرفقات. يرفض وضع الحظر المحتوى المعروض غير المدعوم أو الزائد عن الحجم. تؤدي إخفاقات المصادقة إلى الحظر افتراضياً حتى مع وجود سياسة سماح؛ اختر سلوك البريد الحرج بدقة.
تنزيل Python source ZIP
مستودع الكود المصدري العام
ملف README والأمثلة الكاملة
ملاحظات الأمان والقيود المعروفة
1. التثبيت
استخدم بيئة افتراضية. العميل العام مخصص للمكتبة القياسية فقط؛ يضيف الأمر الأخير تبعية Django الاختيارية وهو غير ضروري لاستخدام Flask أو FastAPI أو أي استخدام خادم عام آخر. يتم تثبيت الحزمة من دليل المصدر الذي تم تنزيله، وليس من PyPI. يتطلب الحد الأدنى للحزمة Python 3.9+؛ اختر إصدارات Python/Django المدعومة معاً.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-python.zip
unzip sendrepute-python.zip
python -m venv .venv
. .venv/bin/activate
python -m pip install ./sendrepute-python
python -m pip install './sendrepute-python[django]'
بديل: التثبيت من المصدر العام
استخدم مسار المصدر هذا بدلاً من تعليمات التنزيل الخاصة بالموقع أعلاه. يشرح ملف README الخاص بالمستودع خطوات التفعيل والإعداد المتبقية؛ فبناء ملف ZIP وحده لا يثبت الإضافة. بالنسبة لـ Python، يضيف الأمر الثاني دعم Django الاختياري. احتفظ ببيانات الاعتماد في أسرار الخادم وراجع ملاحظات الأمان قبل تمكين الميزات المدفوعة. Node فقط موجود على npm؛ وجود مستودع GitHub عام لا يعني النشر على WordPress.org أو n8n Cloud أو Packagist أو PyPI.
python -m pip install "sendrepute @ git+https://github.com/sendrepute/sendrepute-python.git@7d54935c4ae2db136800231136e4ea28d63118db"
python -m pip install "sendrepute[django] @ git+https://github.com/sendrepute/sendrepute-python.git@7d54935c4ae2db136800231136e4ea28d63118db"
2. التهيأة بأمان
قم بحقن SENDREPUTE_API_KEY عبر أسرار الخادم. يتجه العميل العام افتراضياً إلى نقطة النهاية المستضافة المعتمدة، مع HTTPS موثق، وبدون توجيهات أو إعادات محاولة. يتم إيقاف موافقة العميل افتراضياً؛ يمنح المثال موافقة لكل مكالمة فقط بعد التحقق من التأكيد. تتطلب تجاوزات نقاط النهاية قائمة سماح صريحة لأصل HTTPS. يحتوي القاموس المرتجع على النتيجة التي تم التحقق منها وبيانات الفوترة، وليس قرار إرسال.
import os
from sendrepute import SendReputeClient, SendReputeError
client = SendReputeClient(api_key=os.environ["SENDREPUTE_API_KEY"])
def classify_after_consent(sender, subject, body, confirmed=False):
if confirmed is not True:
raise ValueError("Paid consent required")
try:
return client.classify(
sender=sender, subject=subject, body=body,
paid_analysis_consent=True,
)
except SendReputeError as error:
# Safe metadata only; do not log message content or response bodies.
print(error.code, error.status, error.request_id)
raise
محرك البريد الإلكتروني لـ Django
احتفظ بـ backend الحالي الخاص بك في SENDREPUTE_ORIGINAL_EMAIL_BACKEND وحافظ على إعدادات SMTP العادية الخاصة به. يبقي المثال الموافقة المدفوعة متوقفة؛ اضبطها على True فقط بعد مراجعة الأسعار. تسمح المراجعة الاستشارية بالتحليلات الناجحة؛ بينما يقارن الحظر بـ SENDREPUTE_SPAM_THRESHOLD. اختر سياسة الفشل المستقلة بتعمد. أخطاء المصادقة تمنع الإرسال افتراضياً حتى في حالة السماح. يتبع المثال الإعدادات الافتراضية لملف README وليس توصية بالفشل المفتوح للبريد الهام.
# Django settings.py
import os
EMAIL_BACKEND = "sendrepute.django.SendReputeEmailBackend"
SENDREPUTE_ORIGINAL_EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
SENDREPUTE_API_KEY = os.environ["SENDREPUTE_API_KEY"]
SENDREPUTE_PAID_ANALYSIS_CONSENT = False
SENDREPUTE_POLICY_MODE = "advisory"
SENDREPUTE_SPAM_THRESHOLD = 0.90
SENDREPUTE_FAILURE_POLICY = "allow"
SENDREPUTE_ALLOW_AUTH_FAILURE = False
SENDREPUTE_TIMEOUT = 10
3. الاستخدام المتعمد
ترسل هذه الوظيفة فقط عند استدعائها. مع تكوين غلاف Django وتمكين الموافقة المدفوعة، يستلم الـ backend الأصلي كائنات الرسائل الأصلية دون تغيير. يستقبل المصنف سلسلة واحدة مقيدة تجمع بين الجسم الأساسي وبدائل text/plain و text/html المضمنة؛ المرفقات والمستلمون ليسوا مدخلات منفصلة. قم بمعالجة القوالب قبل الاستدعاء. استخدم backend اختبار محلي أولاً، ثم وسيلة النقل الحقيقية المكونة بتعمد.
from django.core.mail import EmailMultiAlternatives
def send_reviewed_message(recipient):
message = EmailMultiAlternatives(
subject="Your requested summary",
body="Here is the summary you requested.",
from_email="Example Team <team@example.com>",
to=[recipient],
)
message.attach_alternative(
"<p>Here is the summary you requested.</p>", "text/html"
)
return message.send()
مرجع واجهة برمجة التطبيقات والأساليب
المُنشئ العام هو SendReputeClient(api_key, endpoint, allowed_origins, timeout, paid_analysis_consent)، مع تمرير الكل باستثناء api_key ككلمة مفتاحية. يجب أن يكون timeout أكبر من صفر و30 ثانية كحد أقصى. يتطلب classify الكلمات المفتاحية sender و subject و body؛ بينما model و paid_analysis_consent لكل مكالمة اختيارية. المرسل 1–320 حرفاً، والموضوع 1–998 والجسم 1–524,288، مع حد منفصل للطلب المشفر. يحتوي القاموس المرتجع على requestId و model و result و billing؛ وتتضمن result الحقول label و spamProbability و confidence و reasons و contentAudit الاختياري. يحتوي billing على chargedMillicents و replayed. تشمل الأخطاء ConsentRequiredError و AuthenticationError و BalanceError و RateLimitError و TransportError و InvalidResponseError، وجميعها تحت SendReputeError. قد يؤدي التكوين غير الصالح إلى رفع ValueError. تعرض خلفية Django الأساليب open() و close() و send_messages(email_messages)، مع إرجاع عدد الرسائل المرسلة للخلفية الأصلية؛ ولا تضيف أي واجهة برمجة تطبيقات عامة أو مُنشئ أو إعادة كتابة أو طرق دفع.
النتائج والإخفاقات والقيود
يرفض الحظر المحتوى المعروض غير المدعوم أو كبير الحجم بدلاً من تحليل مجموعة فرعية أكثر أماناً فقط. تتطلب أخطاء المصادقة تجاوزاً صريحاً منفصلاً للسماح. تتبع الأخطاء الأخرى سياسة السماح/الحظر المختارة؛ يتحكم fail_silently فيما إذا كان سيتم رفع إخفاقات الحظر أو تخطيها. لا يقوم الغلاف بوضع الرسائل في قائمة الانتظار، أو إعادة المحاولة، أو تبديل وسائل النقل، أو فحص المرفقات أو معالجة القوالب. يقوم العميل العام برفع فئات فرعية مطهرة من SendReputeError مع الرمز/الحالة/request_id؛ لا تقم بتسجيل أجسام الرسائل.
عميل تصنيف Go
0.1.0
يتطلب الإصدار 1.22+ من Go. يدعم العميل المعتمد على المكتبة القياسية فقط عملية classification، ولا يدعم email transport. اختر ملف المصدر المضغوط ZIP القابل للتنزيل مع استبدال محلي للـ module، أو التثبيت عبر الـ module العام الموثق الموضح ضمن بديل المصدر.
تصنيف من جانب الخادم يعتمد على المكتبة القياسية فقط مع موافقة مدفوعة صريحة، وطلبات محدودة، و HTTPS موثق، ورفض عمليات إعادة التوجيه وعدم وجود محاولات إعادة. لا يرسل البريد الإلكتروني أو يتخذ قرارات الإرسال/الحظر. يجب أن يختار تطبيقك عمداً العتبات وسلوك الفشل، خاصة للبريد المعاملاتي الهام.
تنزيل Go source ZIP
مستودع الكود المصدري العام
ملف README والأمثلة الكاملة
ملاحظات الأمان والقيود المعروفة
1. التثبيت
استخرج المصدر في دليل تطبيق Go الحالي وقم بتشغيل أوامر الوحدة هناك. يشير الاستبدال المحلي إلى الوحدة التي تم تنزيلها؛ قم بنقل أو تعديل هذا المسار إذا كان مخطط مشروعك يختلف. قم بتشغيل go mod init مع اسم الوحدة الخاص بك أولاً فقط عند إنشاء تطبيق جديد. لا يتطلب هذا العميل أي وحدات وقت تشغيل خارجية.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-go.zip
unzip sendrepute-go.zip
# Run inside your existing application's module:
go mod edit -require=github.com/sendrepute/sendrepute-go@v0.0.0
go mod edit -replace=github.com/sendrepute/sendrepute-go=./sendrepute-go-v0.1.0
go mod tidy
بديل: التثبيت من المصدر العام
استخدم مسار المصدر هذا بدلاً من تعليمات التنزيل الخاصة بالموقع أعلاه. يشرح ملف README الخاص بالمستودع خطوات التفعيل والإعداد المتبقية؛ فبناء ملف ZIP وحده لا يثبت الإضافة. بالنسبة لـ Python، يضيف الأمر الثاني دعم Django الاختياري. احتفظ ببيانات الاعتماد في أسرار الخادم وراجع ملاحظات الأمان قبل تمكين الميزات المدفوعة. Node فقط موجود على npm؛ وجود مستودع GitHub عام لا يعني النشر على WordPress.org أو n8n Cloud أو Packagist أو PyPI.
go get github.com/sendrepute/sendrepute-go@bfd656f829618348232da506225a5d92587d48e2
2. التهيأة بأمان
قم بحقن SENDREPUTE_API_KEY من أسرار الخادم. الوظيفة الموضحة لا تقوم بأي عمل حتى يتم استدعاؤها مع confirmed=true؛ يمكن أن يتسبب هذا الاستدعاء في تصنيف مدفوع. تقوم بضبط سياق لمدة عشر ثوانٍ وتستخدم نقطة نهاية HTTPS المعتمدة. يتم إيقاف موافقة العميل افتراضياً؛ تمنح الوسيطة الأخيرة true الموافقة لهذا الطلب الواحد فقط. يتطلب تجاوز نقطة النهاية إدخال AllowedOrigins صريحاً؛ يتم رفض عمليات إعادة التوجيه.
package integration
import (
"context"
"errors"
"os"
"time"
sendrepute "github.com/sendrepute/sendrepute-go"
)
func Analyze(subject, body string, confirmed bool) error {
if !confirmed {
return errors.New("paid consent required")
}
client, err := sendrepute.NewClient(sendrepute.Config{
APIKey: os.Getenv("SENDREPUTE_API_KEY"),
})
if err != nil {
return err
}
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
result, err := client.Classify(ctx, sendrepute.ClassificationInput{
Sender: "Example Team", Subject: subject, Body: body,
}, true)
if err != nil {
return err
}
if result.Result.SpamProbability >= 0.90 {
return errors.New("review required")
}
return nil
}
3. الاستخدام المتعمد
قم باستدعاء Analyze من تطبيقك الموثق فقط بعد مراجعة الأسعار والموافقة الصريحة. حد 0.90 وخطأ المراجعة هما مثال لسياسة التطبيق، وليسا إعدادات SDK الافتراضية. قرر ما إذا كانت الأخطاء تعني التأجيل أو السماح أو الفشل المغلق قبل توصيل أي كود إرسال. يعيد العميل نتيجة مكتوبة مع Result.SpamProbability وحقول الفوترة؛ هو لا يرسل بريداً إلكترونياً أو يتخذ قرارات تسليم بنفسه أبداً.
مرجع واجهة برمجة التطبيقات والأساليب
يعيد NewClient(Config) كلاً من (*Client, error). يقبل Config الحقول APIKey و Endpoint و AllowedOrigins و Timeout و PaidAnalysisConsent. يعيد Classify(ctx, ClassificationInput, consent) كلاً من (*ClassificationResponse, error). حقول الإدخال هي Sender و Subject و Body و Model الاختياري. المرسل هو 1–320 رموز (runes)، والموضوع 1–998 رموز والجسم بحد أقصى 524,288 بايت بصيغة UTF-8. تحتوي الاستجابة المكتوبة على RequestID و Model و Result و Billing؛ ويعرض Billing الحقول ChargedMillicents و Replayed. تتضمن Result الحقول Label و SpamProbability و Confidence و Reasons و FlaggedTerms و ContentAudit الاختياري. استخدم errors.As لفحص *Error بأمان؛ تظل حالات فشل التكوين وواجهة برمجة التطبيقات أخطاءً وليست درجات سبام. لا توجد طرق للحساب أو الدفع أو المنشئ أو إعادة الكتابة.
النتائج والإخفاقات والقيود
يقوم استدعاء واحد بمحاولة HTTP مدفوعة واحدة كحد أقصى بدون إعادات محاولة. تكشف الأخطاء عن فئة آمنة، ورمز/request ID مقيد وحالة، ولا تكشف أبداً عن أوراق الاعتماد أو الأجسام أو تفاصيل الشبكة. مدة السياق وأحجام الطلبات والاستجابات مقيدة؛ يتم رفض الاستجابات غير الصحيحة بدلاً من تحويلها إلى درجات. لا يمتلك العميل إمكانيات تحليل MIME، أو المعالجة، أو المستلمين، أو المرفقات، أو قائمة الانتظار، أو البناء، أو إعادة الكتابة، أو إمكانيات SMTP. اختر النموذج صراحةً فقط إذا لزم الأمر؛ وإلا فسيتم تطبيق الإعداد الافتراضي للحساب.
listmonk HTTP Messenger
0.1.0
حزمة مصدر محلي غير منشورة لـ Node.js 20+ تستهدف واجهة Custom HTTP Messenger الخاصة بـ listmonk 6.2.0. تمتلك هذه الخدمة الخارجية تسليم SMTP في المراحل التالية بعد التصنيف؛ وهي ليست إضافية برمجية داخل العملية أو وكيل SMTP preflight. التحقق معزول وغير متصل بالإنترنت، وليس تثبيتاً لـ listmonk أو اختباراً حقيقياً لمزود SMTP.
كلا مفتاحي المدفوع يتم إيقافهما افتراضياً. يقبل المرسل جسماً واحداً مكتمل العرض، ويرفض المرفقات، ويتحقق من التسعير الجديد، ويتطلب نتيجة Inbox الصارمة: label inbox، و spam probability بحد أقصى 0.12، و zero flagged terms. ثم يقوم ببناء وإرسال نفس الجسم الذي تم فحصه عبر اتصال SMTP المكون. تمنع الإيصالات الدائمة التكرار التلقائي بعد النتائج المحظورة أو الفاشلة أو الجارية أو غير المؤكدة.
تنزيل ملف ZIP لمصدر listmonk غير المنشور
1. التثبيت
قم بفك ضغط ملف ZIP لمصدر موقع الويب غير المنشور هذا على مضيف المراسلة المخصص. راجع README.md و SECURITY.md، وانسخ بيئة المثال، وقم بإجراء فحص لبنية (syntax-check) نقطة دخول الخادم قبل الإعداد. يستبعد الأثر المصرح به القابل للتنزيل عمدًا مجموعة اختبارات المستودع. لا توجد حزم تشغيل من جهات خارجية. هذا ليس تثبيتًا من متجر listmonk أو تثبيتًا داخليًا للعملية.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-listmonk.zip
unzip sendrepute-listmonk.zip
cd sendrepute-listmonk
cp config.example.env .env
node --check src/server.mjs
2. التهيأة بأمان
استخدم حساباً مخصصاً غير مفوض ودليل حالة محلية مستداماً مع الوضع 0700. احتفظ بجميع مفاتيح الأمان الثلاثة الموضحة في حالة false حتى يتم قبول التسعير وقيود السعر غير الذري (non-atomic). قم بتخزين بيانات اعتماد SendRepute، و Basic Auth للمراسل، و SMTP للمصب (downstream) فقط في أسرار الخادم (server secrets). قم بإنهاء اتصال HTTPS عند وكيل عكسي (reverse proxy) موثوق.
SENDREPUTE_ENABLED=false
SENDREPUTE_PAID_CONSENT=false
SENDREPUTE_ALLOW_NONATOMIC_PRICE_CONFIRMATION=false
SENDREPUTE_CONFIRMED_MAX_PRICE_MILLICENTS=
STATE_DIRECTORY=/var/lib/sendrepute-listmonk
SMTP_HOST=smtp.example.com
SMTP_PORT=465
SMTP_SECURE=true
3. الاستخدام المتعمد
قم بالكشف فقط عن POST /v1/listmonk خلف HTTPS و Basic Auth مخصص. في إعدادات listmonk > Messengers، أضف الرابط الخاص به كـ Custom HTTP Messenger، واختر صفر محاولات (zero retries)، وحدده فقط للحملات التي يجب فحصها وتسليمها. لا تقم أيضاً بتحديد listmonk SMTP: حيث تقوم هذه الخدمة بعملية إرسال SMTP النهائية بنفسها.
Custom HTTP Messenger URL: https://messenger.example.com/v1/listmonk
Authentication: dedicated Basic Auth username and password
Retries: 0
Select this messenger only. Do not also select SMTP for the campaign.
النتائج والإخفاقات والقيود
ترجع النسخة المكررة التي تم تسليمها حالة نجاح دون إجراء Classification أو إرسال آخر. كل إيصال Blocked، أو Failed، أو Inspecting، أو Sending، أو Uncertain يرفض محاولة إرسال أخرى. بعد نتيجة SMTP غير مؤكدة (Uncertain)، قم بمطابقة سجلات المزود وسياق listmonk يدوياً؛ لا تقم أبداً بحذف إيصال لمجرد فرض إعادة المحاولة. التحقق الحالي من الأسعار حديث ولكنه ليس ذرياً (non-atomic) لأن الـ Classification لا يقبل حقل expectedPriceMillicents.
محول Mailcoach Self-Hosted
0.1.0
حزمة Composer محلية غير منشورة تستهدف Mailcoach Self-Hosted v10 على Laravel 12. بما أن نواة spatie/laravel-mailcoach v10 المرخصة غير متوفرة في مساحة العمل هذه، فإن هذه الحزمة لا تدعي وجود اختبار نهائي (end-to-end) مثبت لـ Mailcoach v10. تغطي اختبارات Laravel 12 Mailer الحقيقية حدث MessageSending الموثق القابل للإلغاء؛ يجب على حامل الترخيص التحقق من كل مسارات إرسال Mailcoach الدقيقة قبل الإنتاج.
يتم إيقاف تشغيل مفاتيح التبديل لـ enabled و paid-consent وإقرار current-pricing بشكل افتراضي. بمجرد التفعيل، ينطبق hook على كل رسالة من خلال Laravel mailer، وليس فقط المسارات المسماة Mailcoach. يقوم بتحليل بدائل Symfony Email التي تم تصييرها بالفعل ويمكنه إلغاء النقل. الخيار الافتراضي هو Fail-closed؛ ويعد السماح بفشل التحليل سياسة منفصلة ومتعمدة.
تنزيل ملف ZIP التجريبي لمصدر Mailcoach
1. التثبيت
ضع ملف ZIP غير المنشور الذي تم تنزيله في دليل Composer artifact خاص يمكن لتطبيق Mailcoach المرخص الوصول إليه. قم بتسجيل مستودع الـ artifact المحلي هذا، واطلب إصدار 0.1، وقم بعمل commit لملف الـ lockfile المستهلك، واختيارياً قم بنشر الإعدادات. هذا ليس تثبيتاً عبر Packagist. يجب على صاحب الترخيص إجراء التحقق مقابل إصدار Mailcoach Self-Hosted v10 تحديداً.
mkdir -p packages
curl -fL https://www.sendrepute.com/downloads/sendrepute-mailcoach.zip -o packages/sendrepute-mailcoach.zip
composer config repositories.sendrepute artifact packages
composer require sendrepute/mailcoach:^0.1
php artisan vendor:publish --tag=sendrepute-mailcoach-config
2. التهيأة بأمان
اجعل المفاتيح الثلاثة في وضع الإيقاف (false) مبدئياً. قم بتخزين api_key في أسرار الخادم (server secrets) وقم بتهيئة حد الإنفاق على جانب الحساب. عملية classify الحالية لا تحتوي على حماية atomic لـ expectedPriceMillicents، لذا فإن المفتاح الثالث يوافق صراحةً على تسعير API الحالي بدلاً من الوعد بسعر ثابت. قم بتهيئة threshold وسياسة الفشل allow/block بشكل مستقل.
SENDREPUTE_MAILCOACH_ENABLED=false
SENDREPUTE_MAILCOACH_PAID_CONSENT=false
SENDREPUTE_MAILCOACH_ACCEPT_CURRENT_API_PRICING=false
SENDREPUTE_API_BASE_URL=https://www.sendrepute.com/api
3. الاستخدام المتعمد
يقوم اكتشاف الحزمة بتسجيل مستمع Laravel MessageSending. لا يوجد استدعاء لكل حملة في كود التطبيق: عند التمكين المتعمد في تثبيت Mailcoach مخصص، فإنه يفحص كل رسالة Symfony Email يتم إرسالها عبر Laravel mailer مباشرة قبل النقل. في تطبيقات Laravel المختلطة، يتم تغطية رسائل التطبيق المضيف أيضاً.
النتائج والإخفاقات والقيود
يقوم المحول بإرسال الاسم المعروض للمرسل، والموضوع، وكل بديل text/plain أو text/html غير فارغ في الذاكرة مع استبعاد المستلمين، والعناوين، والمرفقات، وبيانات الغلاف (envelope)، و Raw MIME. المحتوى المفقود أو غير المدعوم، والاستجابات غير الصحيحة، وفشل API تؤدي إلى الحظر افتراضياً. تختبر الاختبارات الأساسية في وضع عدم الاتصال إلغاء Laravel Mailer الحقيقي، لكن مسارات حملات Mailcoach المرخصة والأتمتة والرسائل المعاملاتية ورسائل الاختبار تظل not_run.
تدفق الإرسال المتحكم فيه عبر Brevo
0.1.0
حزمة مصدر Node.js 20+ محلية غير منشورة تنفذ واجهة برمجة تطبيقات صريحة للإرسال من جانب الخادم حول عملية Brevo's transactional POST /v3/smtp/email. لا تقوم باعتراض إرسالات Brevo dashboard، أو الحملات، أو الأتمتة، أو SMTP relay، أو الاستدعاءات عبر SDKs الأخرى. الاختبارات خاضعة للتحكم وغير متصلة بالإنترنت؛ وهي لا تعتمد حساب Brevo نشط.
يتم إيقاف الموافقة المدفوعة افتراضياً. يتم قبول الرسائل النصية الثابتة ورسائل HTML فقط؛ يتم رفض القوالب عن بُعد، والمعلمات، والإرسالات المجدولة، وإصدارات الرسائل، والمحتوى المدعوم بعناوين URL. يتم إرسال اللقطة الدقيقة غير القابلة للتعديل والتي تم فحصها إلى Brevo. يقوم سجل sendKey المتين بحظر عمليات إعادة المحاولة المتكررة والغامضة، وتتطلب نتائج المزود غير المؤكدة تسوية من قبل المشغل.
تنزيل ملف Brevo source ZIP غير المنشور
1. التثبيت
قم بفك ضغط ملف ZIP للمصدر غير المنشور في تطبيق خادم، وراجع README وملاحظات الأمان الخاصة به، وقم بإجراء فحص لبنية src/index.mjs. يستبعد الأثر المصرح به القابل للتنزيل عمدًا مجموعة اختبارات المستودع. قم باستيراد SendReputeBrevo من src/index.mjs؛ هذا ليس تثبيتًا من npm أو متجر Brevo. يتطلب إصدار Node.js 20+ ولا توجد تبعات تشغيل.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-brevo.zip
unzip sendrepute-brevo.zip
cd sendrepute-brevo
node --check src/index.mjs
2. التهيأة بأمان
اجعل paidConsent بقيمة false حتى يتم قبول التسعير الحالي وقيود السعر غير الذرية. احتفظ بكلا مفتاحي API في أسرار الخادم واستخدم دليل سجل مستمر خاص على وحدة تخزين متينة ذات مضيف واحد. يجب أن يساوي expectedPriceMillicents الحد الأقصى الذي تم جلبه حديثاً، ولكن خصم classify لا يمكنه بعد فرض تلك القيمة بشكل ذري.
const integration = new SendReputeBrevo({
sendreputeApiKey: process.env.SENDREPUTE_API_KEY,
brevoApiKey: process.env.BREVO_API_KEY,
paidConsent: false,
expectedPriceMillicents: approvedMaximum,
ledgerDirectory: "/var/lib/my-app/sendrepute-brevo",
});
3. الاستخدام المتعمد
قم باستدعاء send فقط من مسار الخادم المتحكم فيه والذي يجب أن يقوم بكل من classify والتسليم. أعد استخدام sendKey واحد مستقر لكل محاولة لنفس البريد الإلكتروني المقصود. قدم محتوى ثابتاً مضمناً؛ لا تقدم Brevo template IDs، أو معاملات متغيرة، أو جدولة، أو إصدارات للرسائل. عمليات الإرسال التي تتم في مكان آخر تتجاوز هذا الغلاف تماماً.
await integration.send({
sendKey: durableBusinessEventId,
message: {
sender: { name: "Example Shop", email: "orders@example.com" },
to: [{ email: recipient }],
subject,
textContent,
htmlContent,
},
});
النتائج والإخفاقات والقيود
تسمح نتيجة Inbox ضمن العتبة المحددة بإرسال طلب واحد لـ Brevo transactional API لنفس الـ snapshot غير القابلة للتغيير. يتغير السجل إلى delivery-unknown قبل الإرسال للمزود. لا يتم إعادة محاولة تنفيذ العمليات تلقائيًا في حالات Timeouts أو الانقطاعات أو النجاحات المشوهة (malformed) أو الانهيارات أو رفض المزود؛ قم بمطابقتها مع سجلات Brevo قبل اتخاذ أي قرار يدوي.
تدفق الإرسال المتحكم فيه عبر BigMailer
0.1.0
غلاف محلي (Wrapper) غير منشور لبيئة Node.js 24+ لإجراء مكالمات صريحة لواجهة برمجة تطبيقات (API) المعاملات في BigMailer. لا يتم تثبيته داخل BigMailer أو اعتراض عمليات الإرسال من لوحة التحكم أو واجهات البرمجة غير ذات الصلة. ونظرًا لأن BigMailer يمتلك محتوى الحملة القابل للتحرير عن بُعد، فلا يمكن للغلاف إثبات بقاء الحملة مطابقة للقطة العرض (render snapshot) المقدمة من المتصل بين المراجعة والتسليم.
يتم إيقاف ENABLED و paid_consent و remoteTemplateSnapshotLimitationAcknowledged افتراضيًا. يجب على المتصل تقديم وعمل التجزئة (hash) لقطة عرض كاملة، وتجميد عملية الحملة البعيدة المطابقة تشغيليًا، وتقديم مفتاح تسليم دائم. يُعاد التحقق من الأسعار قبل التصنيف، لكن واجهة برمجة تطبيقات التصنيف الحالية لا تحتوي على حقل atomic لـ expected-price. حالات التسليم المكررة، والمحظورة، والمرفوضة، والغامضة لا يتم إعادة إرسالها تلقائيًا أبدًا.
تنزيل ملف ZIP لمصدر BigMailer التجريبي
1. التثبيت
استخرج ملف ZIP للمصدر غير المنشور هذا في تطبيق خادم Node.js 24+ الخاضع للتحكم وراجع ملفي README.md و SECURITY.md. قم باستيراد الـ wrapper و FileDeliveryStore مباشرة من src. هذا ليس تثبيتًا من npm أو متجر تطبيقات BigMailer، وليس له أي تبعات تشغيل (runtime dependencies) من جهات خارجية.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-bigmailer.zip
unzip sendrepute-bigmailer.zip
cd sendrepute-bigmailer
node --check src/index.mjs
node --check src/file-delivery-store.mjs
2. التهيأة بأمان
اجعل enabled و paidConsent و remoteTemplateSnapshotLimitationAcknowledged في حالة false حتى المراجعة. قم بتخزين مفاتيح API ومعرفات UUID الخاصة بـ brand و campaign في جانب الخادم فقط. ضع FileDeliveryStore على وحدة تخزين متينة وخاصة. انسخ الأسعار المراجعة حديثًا إلى expectedPricing، مع إدراك أن classify API الحالي لا يمكنه قفلها بشكل ذري.
const integration = createBigMailerIntegration({
enabled: false,
paidConsent: false,
remoteTemplateSnapshotLimitationAcknowledged: false,
sendReputeApiKey: process.env.SENDREPUTE_API_KEY,
bigMailerApiKey: process.env.BIGMAILER_API_KEY,
brandId,
campaignId,
expectedPricing,
deliveryStore: new FileDeliveryStore("/var/lib/my-app/bigmailer-deliveries.json"),
});
3. الاستخدام المتعمد
لكل إرسال مراقب عبر واجهة برمجة التطبيقات، يجب تقديم deliveryKey مستقر، وجميع بدائل text/plain و text/html المعروضة، ولقطة العرض الدقيقة و snapshotDigest(snapshot). قم بتأكيد remote-template limitation فقط عندما يجمد تحكم تشغيلي مراجعة حملة BigMailer المطابقة لتلك اللقطة. تتجاوز لوحة التحكم وعمليات الإرسال غير المرتبطة بواجهة برمجة التطبيقات هذا الغلاف.
await integration.send({
deliveryKey: durableBusinessEventId,
snapshot,
snapshotSha256: snapshotDigest(snapshot),
email: recipient,
variables,
});
النتائج والإخفاقات والقيود
يقوم مخزن الملفات بحجز مفتاح التسليم قبل التصنيف. لا يمكن إعادة إرسال النتائج المكررة، أو المتعارضة، أو المحظورة، أو المرفوضة، أو نتائج التسليم الغامضة تلقائياً. تقبل نقطة نهاية الإرسال في BigMailer بيانات الدمج بدلاً من نص الرسالة الذي تم فحصه، لذا فإن التصنيف الناجح ليس دليلاً على أن محتوى الحملة عن بعد القابل للتغيير لا يزال متطابقاً؛ استخدم مزوداً آخر عند الحاجة إلى اقتران دقيق.
الخصوصية والعمليات المدفوعة
يرسل التحليل اسم عرض المرسل، والموضوع، ونص الرسالة إلى SendRepute. لا يتم إرسال المستلمين والمرفقات بشكل منفصل، ولكن يتم إرسال المحتوى المضمن في نص الرسالة. حافظ على سرية بيانات الاعتماد وقم بتعطيل سجلات الطلبات/النصوص. لا يوجد ضمان لوصول الرسائل إلى صندوق الوارد أو ضمان للتسليم.
عملية التصنيف (Classification) مدفوعة. يرجى الاطلاع على الأسعار الحالية وقيود الإنفاق الخاصة بحسابك قبل منح الموافقة. قد يؤدي طلب متطابق للحساب/المحتوى/النموذج إلى إعادة عرض إيصال خلال 24 ساعة؛ بينما قد يؤدي تغيير المحتوى أو النموذج إلى فرض رسوم جديدة. لا تفترض أن محاولة إعادة الإرسال مجانية. تتطلب إعادة الكتابة بالذكاء الاصطناعي عرض سعر بالحد الأقصى للتكلفة للإيصال الأصلي والوضع والشروط المحددة قبل الإرسال المدفوع؛ قم بالاستعلام عن حالة الإيصال قيد التنفيذ واسترجع النتائج المكتملة باستخدام معرف الطلب الأصلي بدلاً من بدء طلب آخر. تتيح ميزة "إعادة كتابة الكل" (Rewrite All) التحقق من مسودة نهائية واحدة محددة دون خصم إضافي. يتم تسعير إنشاء القوالب بالذكاء الاصطناعي ووصول VIP الأصلي بشكل منفصل؛ بينما تكون معالجة أداة البناء القياسية مجانية. لا تضمن نتائج التحليل أو إعادة الكتابة أو البناء وصول البريد الإلكتروني أو وضعه في صندوق الوارد أو الامتثال.
التحقق من الصحة دون اتصال بالإنترنت ليس اعتماداً لكل إصدار من أطر العمل أو المكونات الإضافية أو بروتوكولات النقل. اقرأ تعليمات التثبيت والأمان المرفقة، وحافظ على تعطيل التحليل المدفوع حتى يتم تكوينه عمداً، واختبر سياسة الفشل المختارة قبل تمكينها للبريد الهام.
مراجعة الأسعار
مرجع API الخاص بالعملاء
طلب دعم التكامل