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

Bird

08‏/07‏/2020

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

1 min read

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

Bird

08‏/07‏/2020

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

1 min read

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

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

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

تشرح هذه المقالة كيفية تحقيق أقصى استفادة من البيانات التي ستتلقاها لكل مستلم مُعتمد - سترى كيف نصنف العناوين لتكون "صالحة"، "خطرة"، "محايدة"، "غير قابلة للتسليم"، و"خطأ مطبعي". نقدم لك "رمز السبب" وكذلك "هل تقصد" للخطأ المطبعي المعروف في العناوين.

طلبات API

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

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

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

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

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

  • قم بإجراء مكالمة API إلى /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".

Postman interface used for API testing, featuring a "Single Address Validation" endpoint with GET parameters, a Headers section showing Authorization and Accept keys, and a highlighted area labeled "Cookies" and "Code" on the right side.

بايثون

هذا يستخدم الوحدة الشهيرة 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 المعادة. نقوم بتراكب العلامات "النتائج" و"الأخطاء" للسماح بكلا نوعي الإرجاع.

أحب السرعة والأمان النوعي والوضوح في 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 MTA المحلي. ويمكنك أيضًا استخدامها كلغة برمجة مستقلة، وهي جيدة لذلك أيضًا.

مع 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 لعرض النتيجة أو فقط تمرير المصفوفة لمزيد من المعالجة.

في بي .نت

Visual Basic ليس مرئيًا وليس أساسيًا (IMHO)، ولكنه رقم #6 في مؤشر لغة TIOBE لذا هيا بنا.

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

Visual Studio interface for creating a new project, highlighting options such as Console App (.NET Core) and ASP.NET Web Application, with sections for selecting the language, platform, and project type.


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

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

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

الصدأ

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 في 30 دقيقة.

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

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

دعنا نوصلك بخبير من Bird.
رؤية القوة الكاملة لـ Bird في 30 دقيقة.

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

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

دعنا نوصلك بخبير من Bird.
رؤية القوة الكاملة لـ Bird في 30 دقيقة.

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

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

R

وصول

G

نمو

م

إدارة

A

أتمتة

النشرة الإخبارية

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