
خدمة SparkPost Recipient Validation متاحة الآن لكل من عملاء SparkPost الحاليين والعملاء الجدد الذين لا يرسلون رسائل. تستخدم هذه الخدمة تحليلاً قوياً مستنداً إلى البيانات على مليارات من حالات الارتداد والتسليم وإحداثيات التفاعل اليومية لتدريب خوارزمياتنا، مما يوفر لك واحدة من أقوى أدوات التحقق من البريد الإلكتروني المستندة إلى البيانات في السوق، حتى تتمكن من إرسال رسائل البريد الإلكتروني بشكل أذكى.
يعتبر التحقق من صحة المستلم في SparkPost الآن متاحًا لكل من العملاء الحاليين والجدد الذين لا يرسلون بريدًا. يستخدم التحليل القائم على البيانات القوية على مليارات الأحداث اليومية من الارتداد، والتسليم، والتفاعل لتدريب خوارزمية لدينا، مما يجلب لك واحدة من أقوى أدوات التحقق من صحة البريد الإلكتروني القائمة على البيانات في السوق، حتى تتمكن من إرسال البريد الإلكتروني بذكاء. هذا يمثل أحدث تطور في تقنيات التحقق من صحة البريد الإلكتروني، متجاوزًا الفحوصات البسيطة للنحو إلى أساليب متقدمة تعتمد على البيانات تقدم نتائج أكثر دقة.
تشرح هذه المقالة كيفية تحقيق أقصى استفادة من البيانات التي ستتلقاها لكل مستلم مُعتمد - سترى كيف نصنف العناوين لتكون "صالحة"، "خطرة"، "محايدة"، "غير قابلة للتسليم"، و"خطأ مطبعي". نقدم لك "رمز السبب" وكذلك "هل تقصد" للخطأ المطبعي المعروف في العناوين.
طلبات API
في تطبيق الويب لـSparkPost، يمكنك سحب وإفلات قائمة كاملة للتحقق من الصحة. يمكنك أيضًا استخدام واجهة برمجة التطبيقات للتحقق من صحة العناوين الفردية، بحيث يمكنك بناء التحقق من الصحة مباشرة في سير عمل إدخال العناوين الخاص بك.
قبل فترة، قمنا بإعداد أداة سطر أوامر Python باستخدام هذه الواجهة. ناقشنا ما يجب القيام به للغات الأخرى - وهنا نحن الآن! لنبدأ.
هذا المجلد في مستودع Github يحتوي على أمثلة لاستدعاء واجهة برمجة التطبيقات الخاصة بالتحقق من صحة المستلمين في حوالي اثنتي عشرة لغة مختلفة. نحاول تغطية أكثر اللغات شيوعًا وتطبيقًا.
الطريقة الشائعة للعمل عبر جميع هذه الأمثلة هي:
احصل على مفتاحك من متغير البيئة
SPARKPOST_API_KEY
قم بإجراء مكالمة إلى واجهة برمجة التطبيقات
/api/v1/recipient-validation/single/
للتحقق من صحة المستلمتلقي سلسلة استجابة تحتوي على بيانات بتنسيق JSON مع النتيجة
اطبع النتيجة
لدى SparkPost مكتبات لبعض، ولكن ليس كل اللغات المذكورة هنا. اخترنا كتابة هذه الأمثلة بشكل "محلي" بدلاً من ذلك، لنتمكن من a) تغطية المزيد من اللغات، b) إظهار بساطة الكود الأساسي، وc) تمكينك من رؤية التشابهات والاختلافات بوضوح بين اللغات.
باش / كورل
بي إتش بي
يحتوي PHP الموثوق على بضع طرق مختلفة لجعل مكالمات API باستخدام HTTPS. هنا اخترنا استخدام curl_setopt
وcurl_exec
. (https://www.php.net/manual/en/function.curl-exec.php)
إذا كنت تفضل HTTP_Request2 أو pecl_http، فإن Postman يحتوي على مولد كود مدمج يمكنك استخدامه لإنشاء أمثلة مشابهة - فقط قم بإعداد طلب GET عملي واضغط على زر “Code”.

بايثون
هذا يستخدم الوحدة الشهيرة requests، والتي هي عالية المستوى وبالتالي يسهل استخدامها. يتحقق هذا المثال من رمز الحالة المرتجع، ويحول نتائج JSON مرة أخرى إلى كائن قاموس بايثون، ويطبع الكائن الناتج بدلاً من مجرد سلسلة.
إذا كنت تفضل مكتبة http.client المدمجة، يمكن لـ Postman أيضًا توليد الكود لذلك؛ إنه ليس أطول بكثير.
Node.js
هناك العديد من مكتبات HTTP(S) لnode.js. بدأت بالحزمة الأقدم request (باستخدام دالة رد النداء) لكنها أصبحت في الوقت الحالي متوقفة عن الدعم ولم تعد تُدعم بنشاط. اخترت الحزمة الأحدث axios (باستخدام وعود).
يمكن لPostman أيضًا أن يزودك بمثال بلغة جافا سكريبت الأصلية وUnirest، إذا كنت تفضل ذلك.
لأن هذا الكود يتطلب الوصول إلى مفتاح API الخاص بك، نوصي بشدة بالاتصال بAPI الخاص بنا من جانب الخادم الخاص بك، وليس من الجانب العميل (المتصفح / الجهاز المحمول).
اذهب
يسعى Go نحو فلسفة "طريقة جيدة واحدة" لفعل شيء ما؛ في هذه الحالة، باستخدام المكتبات المدمجة "البطاريات المضمنة" net/http، encoding/json وغيرها.
يرجع الطول في الغالب إلى شروط التحقق من الأخطاء الصريحة if err != nil {}
في كل مكان (لا استثناءات هاها).
نحن أيضًا نعلن عن هيكل كائن النتائج مع علامات الحقول، لتمكيننا من "إلغاء التعبئة" لسلسلة JSON المعادة. نقوم بتراكب العلامات "النتائج" و"الأخطاء" للسماح بكلا نوعي الإرجاع.
أحب السرعة والأمان النوعي والوضوح في Go، حتى إذا كان الكود أطول من الأمثلة السابقة لدينا.
سي شارب
أنا أقل إلماماً بــ C# - بالنسبة لي، يبدو مشابهاً إلى حد كبير لجافا، بدلاً من C. لقد تمكنت من تكوين هذا استناداً إلى الأمثلة المعروضة في مكتبة الطلبات System.Net.Http.
يمكن لـ Postman إنشاء رمز مثال تلقائياً باستخدام RestSharp، إذا كنت تفضل ذلك.
روبي
كانت هذه أول محاولة لي في كود Ruby؛ لقد استخدمت مكتبة Net::http، واتبعت هذا المثال (الذي يتضح أنه قريب جدًا من الكود الذي يقوم Postman بتوليده تلقائيًا).
واجهت غرابة واحدة في اللغة / المكتبة تستحق التوضيح. مجرد إعداد باستخدام URI يبدأ بـ “https://” لا يكفي، يجب عليك أن تحدد بشكل خاص http.use_ssl = true
.
بدون هذا، سيحاول الكود الخاص بك تنفيذ طلب على المنفذ 443 – ولكن دون استخدام SSL/TLS (أي بشكل عادي)، وسترفض SparkPost بالتأكيد السماح بتنفيذ الطلب. لا تجرب هذا في المنزل، لأن مفتاح API الخاص بك سيكون ضمن رأس Authorization. هذه الخاصية في اللغة / المكتبة شعرت أنها غير آمنة بالنسبة لي.
جافا
لم أكتب أي جافا بشكل جاد من قبل، ولكن كان من السهل تجميع هذا معًا باتباع النهج العام المستخدم في مكتبة SparkPost للمكالمات GET الأخرى.
بالمناسبة، استخدام VS Code كمحرر / مصحح أخطاء كان يعمل بشكل جيد لجميع اللغات هنا، مما أعطاني تمييزًا للتركيب، وتصحيح خطوة بخطوة / عرض المتغيرات، وما إلى ذلك. إن التركيبات The InputStreamReader
وBufferedReader
مشابهة لـ (وأفترض تم نسخها بواسطة) Go.
C / C++
كانت هذه رحلة إلى الماضي، حيث كتبت الكثير من كود C في التسعينيات، ولا يزال البعض يعمل بعمق في شبكات الاتصالات في مكان ما. وبما أن تاريخ C يسبق الويب الحديث، فلا يُفاجأ بأن دعم المكتبة هو مهمة يدوية. نحتاج إلى تنزيل (وتجميع) أحدث إصدار من Libcurl، وربطها بمكتبة OpenSSL - راجع README للخطوات الفعلية.
يبدو أن هذا يتطلب الكثير من العمل مقارنة باللغات الحديثة، خاصة عندما تكون Go (أو Lua، أو Python، أو أي من الآخرين) سريعة بما يكفي لمهام مثل هذه.
الشيء الآخر الذي كنت قد نسيته، رغم تحمل آثار المعارك السابقة، هو رعب تخصيص الذاكرة! للحفاظ على البساطة في المثال، قمت بتخصيص مسبق لطول سلسلة URL كـ 1024 حرفًا، وتحققت من حدود طول عنوان البريد الإلكتروني (باستخدام strlen
) قبل أن ندمج فيها (باستخدام strcat
).
نتعامل مع سلسلة Authorization مع مفتاح API مدمج بنفس الطريقة .. على الرغم من أننا نعلم أن مفتاح API صالح لن يكون طويلًا جدًا .. فهذا ليس عذرًا! إدخال المستخدم الذي يأتي من متغير البيئة يمكن أن يكون أي شيء. يجب عليك البرمجة بشكل دفاعي.
قد يستخدم مطور أكثر تطوراً malloc
بدلاً من تخصيص متغير على المكدس، ويحساب بالضبط طول السلاسل المدمجة. التفكير في هذا التعقيد الإضافي أعطاني ألمًا في الديودات في جانبي الأيسر; ذكرني بالمخاطر التي يواجهها مبرمجو C كل يوم، في محاولة لتجنب تجاوزات الذاكرة والآثار الجانبية غير المتوقعة. ما يقودنا إلى ..
لغة البرمجة Lua
يُعرف عن Lua سهولة التعايش بجانب شفرة C، وهنا في SparkPost، قمنا باستخدام Lua بشكل مكثف لتخصيص السياسات داخل خادم البريد الإلكتروني الخاص بنا في الموقع. يمكنك أيضًا استخدامها كلغة برمجة مستقلة، وهي جيدة جدًا لذلك أيضًا.
مع Lua 5.3 ومدير الحزم luarocks، نستخدم المكتبات luasocket
وluasec
. نظراً إلى تراث اندماجها مع C، نقوم بالربط مع مكتبة OpenSSL المحلية لدينا. تتضمن عملية تثبيت luarocks استدعاء المترجم gcc
(أو أي مترجم C تستخدمه)، لذا فإن إضافة مكتبات جديدة يستغرق بعض الوقت.
شفرة Lua بسيطة للغاية. تُستخدم العلامات — لتعليق الشفرة. وظيفة https.request
تقدم قيم عائدة متعددة (قليلاً مثل Python وGo). يتم دمج السلاسل مع المعامل .. (بدلاً من + في Python).
يتم التعامل مع نص الاستجابة من هذا الاستدعاء باستخدام وحدة “ltn12” – انظر هنا. يتيح ذلك التعامل بكفاءة مع البيانات التي يمكن إرجاعها في "قطع" متعددة. كما يوضح هذا المقال:
يقوم مصنع الجدول بإنشاء مصرف يحفظ جميع البيانات التي تم الحصول عليها في جدول. يمكن بعد ذلك دمج البيانات بطريقة فعالة في سلسلة واحدة باستخدام وظيفة مكتبة table.concat.
مثالنا يقوم فقط بدمج الجدول t وطباعة الناتج؛ يمكنك استخدام فلتر لإجراء معالجة إضافية.
بيرل
في حين أن Perl تشتهر بـ one liners، فإن هذا ليس من بينها. تم تصميم Perl للبحث والتعديل السريع جدًا في المستندات، ولكنه في الواقع قادر على أكثر من ذلك بكثير. مرة كتبت مجموعة كاملة للتحكم في المخزون باستخدام Perl. فكر في ذلك. على أية حال…
يستخدم هذا السكربت LWP::UserAgent وHTTP::Request وربما حزم JSON وData::Dumper اعتمادًا على كيفية رغبتك في رؤية الإخراج. كما هو الحال مع جميع السكربتات الأخرى في هذه الصفحة، يجب عليك ضبط متغير البيئة مسبقًا SPARKPOST_API_KEY
إلى مفتاح API الخاص بك الذي يتضمن وظيفة التحقق من صحة المستلم. هذا السكربت يقوم بتحديد $recipient = ‘test@gmail.com’ بشكل مباشر، ولكن يمكنك بسهولة إضافة مدخلات سطر الأوامر أو الاستهلاك من ملف.
بعد أن يتم تعبئة جميع المتغيرات، نقوم بتحميل HTTP:Request مع معلمات GET وإرسالها إلى LWP:UserAgent. "الرسالة" الناتجة هي نتيجة اختبار التحقق من صحة البريد الإلكتروني كمصفوفة. يمكنك استخدام JSON وDUMPER لعرض النتيجة أو فقط تمرير المصفوفة للمزيد من المعالجة.
في بي .نت
فيجوال بيسك ليس مرئيًا وليس أساسيًا (بحسب رأيي)، ولكنه يحتل المركز السادس في مؤشر لغة TIOBE لذا هيا بنا.
هناك طرق أخرى للقيام بذلك، ولكن أسهل طريق للنجاح هو استخدام Visual Studio SDK على منصة Windows. شغل Visual Studio، ابدأ مشروعًا جديدًا واختر Visual Basic، ثم اختر console.app. تأكد من استخدام إصدار VB وليس إصدار C# – من السهل تفويت ذلك في SDK.

في هذه المرحلة يمكنك تحرير السطور يدويًا أو نسخ/لصق الكود من هنا إلى VS وتوفير الكثير من الوقت. لجعل هذا الكود يعمل، تحتاج إلى إضافة متغير بيئة Windows. أسهل طريقة للقيام بذلك هي فتح موجه الأوامر واستخدام setx.exe بهذه الطريقة:
C:\Users\me>setx SPARKPOST_API_KEY "142<redacted<redacted>c531c3"
في نظام Windows 10، يُطبق هذا المتغير على بيئة المستخدم الخاصة بك، ولكنه لن يكون متاحًا فورًا في جلسة الأوامر الحالية، لذا لن يعمل اختباره باستخدام “set”، ولكنه سيكون متاحًا للكود. إذا قمت ببناء وتشغيل الكود الموجود في المستودع، فسترى نتيجة التحقق. بالنسبة للمطورين الذين يقومون ببناء مستهلكي webhook في الإنتاج الذين يحتاجون إلى التحقق من عناوين البريد الإلكتروني على نطاق واسع، يقدم دليل Azure Functions webhook consumer كيفية بناء حلول بدون خادم يمكنها معالجة تدفقات العمل للتحقق بكفاءة.
الصدأ
روست هي لغة برمجة للأنظمة وخدمات الويب تركز على الأداء والسلامة والتزامن. كما تقول ويكيبيديا، كانت روست "اللغة البرمجية الأكثر حبًا" في مسح مطوري Stack Overflow منذ عام 2016.
يستخدم الكود روست في مستودعنا على Github مكتبة reqwest
مع tokio
غير المتزامنة، مشابهة لـ هذا المثال من كتاب روست. (هذا ليس خطأً إملائيًا، فإن اسم مكتبة reqwest
يُكتب هكذا). لقد قمنا بتضمين ملف تكوين مدير الحزم لشركة شحن، حتى تتمكن من البناء والعمل باستخدام:
cd rust_recipient_validation cargo run
سيؤدي هذا إلى تجميع الحزمة في كود تنفيذي، وتشغيله:
اكتملت عملية التطوير [غير محسن + معلومات تصحيح الأخطاء] الأهداف في 0.10s تشغيل `target/debug/rust_recipient_validation` حالة: 200 حسنًا الجسم: : (إلخ)
يستخدم الكود std:env
لقراءة متغير البيئة SPARKPOST_API_KEY
. تتعامل جملة المطابقة مع الحالة التي يكون فيها المفتاح غير معرّف. إذا كان كل شيء على ما يرام، يتم إنشاء عميل reqwest::Client
جديد وتصدر استدعاء غير متزامن، يليه .await?
(انظر هنا). يبدو أن غير المتزامن، بدلاً من الاستدعاء البسيط الحاصل على الاستجابة، مطلوب لتعيين رؤوس الطلبات. يتم قراءة نص جسم الاستجابة باستخدام .await?
ثانية، كما في هذا المثال.
ملخص
في هذه المقالة، قدمنا أمثلة على كود التحقق من المستلم في العديد من اللغات. إليكم طلبنا منك.
أخبرنا إذا كنت تعتقد أننا أغفلنا لغتك المفضلة. قد لا يكون لدينا العديد من الأمثلة مثل The Fibonacci Project، ولكننا نود أن نضيف المزيد. أيضًا، إذا كنت تعتقد أن أمثلتنا يمكن تحسينها، فأخبرنا بذلك!