التحقق من المستلم: أمثلة على رمز التحقق من البريد الإلكتروني

البريد الإلكتروني

1 min read

التحقق من المستلم: أمثلة على رمز التحقق من البريد الإلكتروني

البريد الإلكتروني

1 min read

التحقق من المستلم: أمثلة على رمز التحقق من البريد الإلكتروني

خدمة SparkPost Recipient Validation متاحة الآن لكل من عملاء SparkPost الحاليين والعملاء الجدد الذين لا يرسلون رسائل. تستخدم هذه الخدمة تحليلاً قوياً مستنداً إلى البيانات على مليارات من حالات الارتداد والتسليم وإحداثيات التفاعل اليومية لتدريب خوارزمياتنا، مما يوفر لك واحدة من أقوى أدوات التحقق من البريد الإلكتروني المستندة إلى البيانات في السوق، حتى تتمكن من إرسال رسائل البريد الإلكتروني بشكل أذكى.

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

توضح هذه المقالة كيف يمكنك تحقيق أقصى استفادة من البيانات التي ستحصل عليها لكل مستلم تم التحقق منه - سترى أننا نصنف العناوين بأنها "صالحة"," "محفوفة بالمخاطر", "محايدة"," "غير قابلة للتسليم"," و"خطأ إملائي". نقدم لك رمز "السبب" وأيضًا "هل تعني_؟" لأخطاء العنوان المعروفة.

طلبات API

في تطبيق SparkPost على الويب، يمكنك سحب وإفلات قائمة كاملة للتحقق. يمكنك أيضًا استخدام واجهة برمجة التطبيقات (API) للتحقق من العناوين الفردية، بحيث يمكنك بناء التحقق مباشرة في سير عمل إدخال العنوان الخاص بك.

في وقت سابق، قمنا بإعداد أداة سطر أوامر بايثون باستخدام هذه الواجهة. تحدثنا حول ما يجب القيام به من أجل لغات أخرى – وهنا نحن الآن! لنبدأ.

هذا مجلد مستودع Github يحتوي على أمثلة لاستدعاء واجهة برمجة التطبيقات للتحقق من المستلمين في حوالي اثنتي عشرة لغة مختلفة. نحاول تغطية اللغات الأكثر شيوعًا.

الطريقة الشائعة للعمل من خلال كل هذه الأمثلة هي:

  • احصل على مفتاحك من المتغير البيئي SPARKPOST_API_KEY

  • قم باستدعاء واجهة برمجة التطبيقات إلى /api/v1/recipient-validation/single/ للتحقق من المستلم

  • استلم سلسلة استجابة تحتوي على بيانات بتنسيق JSON مع النتيجة

  • اطبع النتيجة

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

باش / كورل

هذا يفوز بجائزة أقصر كود – فهو ببساطة يستخدم أداة سطر الأوامر "curl" لعمل الطلب وطباعة الرد مباشرة في الطرفية. يمكنك رؤية أن المخرج هو سلسلة تحتوي على JSON؛ لا نقوم في الواقع بتحليل سمات النتائج الفردية.

هذا يفوز بجائزة أقصر كود – فهو ببساطة يستخدم أداة سطر الأوامر "curl" لعمل الطلب وطباعة الرد مباشرة في الطرفية. يمكنك رؤية أن المخرج هو سلسلة تحتوي على JSON؛ لا نقوم في الواقع بتحليل سمات النتائج الفردية.

هذا يفوز بجائزة أقصر كود – فهو ببساطة يستخدم أداة سطر الأوامر "curl" لعمل الطلب وطباعة الرد مباشرة في الطرفية. يمكنك رؤية أن المخرج هو سلسلة تحتوي على JSON؛ لا نقوم في الواقع بتحليل سمات النتائج الفردية.

بي إتش بي

لدى 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

هناك العديد من مكتبات node.js HTTP(S). بدأت باستخدام حزمة request الأقدم (باستخدام دالة رد النداء)، لكنها أصبحت مهملة ولم تعد تحت الصيانة الفعالة.   اخترت الحزمة الأحدث axios (باستخدام promises).  

يمكن لـ Postman أيضًا أن يوفر لك مثالاً بلغتك الطبيعية على JavaScript وUnirest، إذا كنت تفضل ذلك.

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

اذهب

يهدف Go إلى فلسفة "طريقة جيدة واحدة" للقيام بشيء ما؛ في هذه الحالة، باستخدام المكتبات المدمجة "البطاريات المضمنة" مثل net/http، encoding/json وغيرها.

يرجع الطول في الغالب إلى بنود التحقق من الأخطاء الصريحة if err != nil {} في كل مكان (لا استثناءات هاها).

كما نعلن عن هيكل كائن النتائج مع علامات الحقول، لتمكيننا من "فك تجميع" سلسلة JSON التي تم إرجاعها. نتراكب علامات "results" و "errors" للسماح بكلا النوعين من الإرجاع.

أحب السرعة وسلامة النوع ووضوح Go، حتى وإن كان الكود أطول من أمثلتنا السابقة.

سي شارب

أنا أقل دراية بـ C# – بالنسبة لي، يبدو أشبه بجافا، بدلاً من أن يكون شبيهاً بـ C. تمكنت من تجميع ذلك باتباع الأمثلة الموضحة في مكتبة الطلبات System.Net.Http.

يمكن لبرنامج Postman توليد كود أمثلة تلقائيًا باستخدام RestSharp، إذا كنت تفضل ذلك.

روبي

كانت هذه محاولتي الأولى في كود Ruby؛ لقد استخدمت مكتبة Net::http واتّبعت هذا المثال (والذي تبيّن أنه قريب جدًا من الكود الذي يولده Postman تلقائيًا).

لقد واجهت غموضًا في اللغة / المكتبة يستحق التوضيح. مجرد إعداد استخدام URI الذي يبدأ ب “https://” ليس كافيًا، يجب عليك تحديد http.use_ssl = true

بدون هذا، سيحاول كودك إجراء طلب على المنفذ 443 - ولكن بدون استخدام SSL/TLS (أي بشكل صريح)، وسترفض SparkPost ترخيص الطلب بحق. لا تجرب هذا في المنزل، لأن مفتاح API الخاص بك يكون في رأس التفويض. هذه الميزة في اللغة / المكتبة شعرت بأنها غير آمنة بالنسبة لي.

جافا

لم أكتب أي شيء جاد في Java من قبل، ولكن كان من السهل تجميع هذا عن طريق اتباع النهج العام المستخدم في مكتبة SparkPost لمكالمات GET الأخرى.

بالمناسبة، استخدام VS Code كمحرر / مصحح أخطاء عمل بشكل جيد حقًا لجميع اللغات هنا، مما أعطاني تمييزًا بناءً، وتخطي عمليات التصحيح / عرض المتغيرات إلخ. الـ InputStreamReader وBufferedReader تُشبه إلى حد كبير (وأفترض أنها استُنسخت بواسطة) Go.

C / C++

كانت هذه رحلة في شريط الذاكرة، حيث كتبت الكثير من كود C في التسعينيات، ولا يزال بعضهم يعمل بعمق في شبكات الاتصالات في مكان ما. بما أن تاريخ C يسبق شبكة الويب الحديثة، فمن غير المفاجئ أن تكون دعم المكتبات مهمة يدوية. نحتاج إلى تنزيل (وتجميع) إصدار حديث من Libcurl، وربطه بمكتبة OpenSSL – اطلع على ملف README للخطوات الفعلية.

يبدو أن هذا يمثل الكثير من العمل مقارنة باللغات الحديثة، خاصة عندما تكون Go (أو Lua، أو Python، أو أي من اللغات الأخرى) سريعة بما فيه الكفاية لمهام مثل هذه.

الشيء الآخر الذي نسيته، على الرغم من تحملي لندوب المعارك السابقة، هو رعب تخصيص الذاكرة! للحفاظ على المثال بسيط، قمت بتخصيص مسبق لطول سلسلة عنوان URL على أنها 1024 حرفًا، وتحققت من طول عنوان البريد الإلكتروني (باستخدام strlen) قبل أن ندمج فيه (باستخدام strcat).

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

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

لغة البرمجة Lua

Lua معروفة بتعايشها السهل جنبًا إلى جنب مع كود C، وهنا في SparkPost، نحن نستخدم Lua على نطاق واسع لتخصيص السياسات داخل سير عمل Momentum on-premises MTA. يمكنك أيضًا استخدامها كلغة برمجة مستقلة، وهي جيدة لهذا الغرض أيضًا.

مع Lua 5.3 ومدير الحزم luarocks، نستخدم المكتبات luasocket وluasec. يظهر دمجها مع C في نطاقنا، نحن نربطها بمكتبة OpenSSL المحلية لدينا. عملية التثبيت الخاصة بـ luarocks تستدعي المترجم gcc (أو أي مترجم C الذي تستخدمه)، لذا إضافة مكتبات جديدة تستغرق بعض الوقت.

كود Lua بسيط جدًا. الأحرف — تشير إلى التعليقات. وظيفة https.request تقدم قيم متعددة كسابق لـ (مثل Python وGo). يتم الربط بين السلاسل النصية باستخدام المشغل .. (بدلاً من + في Python).

يتم معالجة جسم الرد من النداء باستخدام وحدة “ltn12” – انظر هنا. يتيح ذلك المعالجة الفعالة للبيانات التي يمكن أن تُعاد في "chunks" متعددة. كما يوضح المقال:

المعامل التجاري ينشئ مصبًا يخزن جميع البيانات المحصلة في جدول. يمكن دمج البيانات لاحقًا بكفاءة في سلسلة نصية واحدة باستخدام وظيفة المكتبة 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 لعرض النتيجة أو فقط تمرير المصفوفة لمزيد من المعالجة.

في بي .نت

فيجوال بيزيك ليس مرئيًا وليس بسيطًا (في رأيي)، لكنه يحتل المرتبة #6 على مؤشر لغة TIOBE لذا ها نحن ذا.

هناك طرق أخرى للقيام بذلك، ولكن الطريق الأسهل للنجاح هو استخدام SDK لبرنامج Visual Studio على منصة ويندوز. قم بتشغيل فيجوال ستوديو، ابدأ مشروعًا جديدًا واختر فيجوال بيزيك، ثم اختر console.app. تأكد من استخدام إصدار VB وليس إصدار C# - من السهل أن تخطئ في ذلك في SDK.




في هذه النقطة يمكنك تعديل السطور يدويًا أو نسخ/لصق الكود من هنا إلى VS وتوفير الكثير من الوقت. لكي تجعل هذا الكود يعمل، تحتاج إلى إضافة متغير بيئة ويندوز.  أسهل طريقة للقيام بذلك هي فتح موجه الأوامر واستخدام setx.exe مثل هذا: 

C:\Users\me>setx SPARKPOST_API_KEY "142<redacted<redacted>c531c3"

في ويندوز 10، يتم تطبيق ذلك على بيئة المستخدم الخاصة بك، لكنه لا يتوفر فوراً في جلسة الأوامر الحالية، لذا لن يعمل اختبارها بـ “set”، لكنها ستكون متاحة للكود. إذا قمت ببناء وتشغيل الكود المضمن في المستودع، سترى نتيجة التحقق.

الصدأ

Rust هي لغة لبرمجة الأنظمة وخدمات الويب تركز على الأداء والسلامة والتزامن. كما تقول ويكيبيديا، كانت Rust "اللغة البرمجية الأكثر حباً" في استبيان مطوري Stack Overflow منذ عام 2016.

يستخدم الكود Rust في مستودع Github الخاص بنا مكتبة reqwest مع tokio بطريقة غير متزامنة، مشابهة لهذا المثال من دليل Rust. (هذا ليس خطأ إملائيًا، اسم مكتبة reqwest متهجى هكذا). قمنا بتضمين ملف تهيئة لمدير حزم cargo ملف التهيئة، لذا يمكنك البناء والتشغيل باستخدام الأوامر التالية:

cd rust_recipient_validation cargo run

سيقوم ذلك بترجمة الحزمة إلى كود قابل للتنفيذ وتشغيله:

تم الانتهاء من التطوير [غير محسن + معلومات تصحيح الأخطاء] الهدف(ات) في 0.10 ثانية التشغيل `الهدف/التصحيح/rust_recipient_validation` الحالة: 200 حسنًا الجسم: إلخ.

يستخدم الكود std:env لقراءة متغير البيئة SPARKPOST_API_KEY. يتم معالجة الحالة التي لم يتم فيها تعريف المفتاح باستخدام شرط مطابقة. إذا كان كل شيء على ما يرام، يتم إنشاء reqwest::Client جديد وإصدار استدعاء غير متزامن، يليه .await? (انظر هنا). يبدو أن الاتصال غير المتزامن، بدلاً من الاتصال المسدود الأبسط، مطلوب لتعيين رؤوس الطلب. يتم قراءة نص جسم الاستجابة مع ثاني .await?، كما في هذا المثال.

ملخص

في هذه المقالة، قمنا بتوضيح أمثلة على رمز التحقق من صحة المستلم في العديد من اللغات. هذه هي طلبنا لك.

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

انضم إلى نشرتنا الإخبارية.

ابقَ على اطلاع مع Bird من خلال التحديثات الأسبوعية إلى بريدك الوارد.

بتقديمك طلبًا، فإنك توافق على أن تقوم Bird بالاتصال بك بشأن منتجاتنا وخدماتنا.

يمكنك إلغاء الاشتراك في أي وقت. انظر بيان الخصوصية الخاص بـ Bird للتفاصيل حول معالجة البيانات.

انضم إلى نشرتنا الإخبارية.

ابقَ على اطلاع مع Bird من خلال التحديثات الأسبوعية إلى بريدك الوارد.

بتقديمك طلبًا، فإنك توافق على أن تقوم Bird بالاتصال بك بشأن منتجاتنا وخدماتنا.

يمكنك إلغاء الاشتراك في أي وقت. انظر بيان الخصوصية الخاص بـ Bird للتفاصيل حول معالجة البيانات.

انضم إلى نشرتنا الإخبارية.

ابقَ على اطلاع مع Bird من خلال التحديثات الأسبوعية إلى بريدك الوارد.

بتقديمك طلبًا، فإنك توافق على أن تقوم Bird بالاتصال بك بشأن منتجاتنا وخدماتنا.

يمكنك إلغاء الاشتراك في أي وقت. انظر بيان الخصوصية الخاص بـ Bird للتفاصيل حول معالجة البيانات.