نحوه اعتبارسنجی آدرس‌های ایمیل با استفاده از پکیج Laravel Mailbox Layer

آفلاین
user-avatar
عرفان حشمتی
20 مهر 1400, خواندن در 8 دقیقه

یکپارچگی و اعتبارسنجی داده‌ها از جنبه‌های مهم توسعه وب و جمع آوری داده‌ها به شمار می‌رود. این مهم است که ما به عنوان توسعه دهنده وب قبل از ذخیره داده‌ها در دیتابیس، آنها را اعتبارسنجی کنیم. به عنوان مثال تصور کنید که در حال ساختن فرم برای یک وب سایت جدید هستید که بازدیدکنندگان می‌توانند از آن برای عضویت در خبرنامه ایمیل استفاده کنند. بنابراین شما می‌خواهید مطمئن شوید کسی که فرم را ارسال می‌کند از یک آدرس ایمیل معتبر استفاده کرده و سعی بر اضافه کردن آدرس هرزنامه ندارد.

مطمئنا مواردی وجود دارد که می‌توانید برای اعتبارسنجی آن ایمیل انجام دهید مانند ارسال ایمیل تأیید برای بازدید کننده تا مطمئن شود که واقعا می‌خواهد عضو شود. اما ممکن است بخواهید در واقع وجود ایمیل را تأیید کنید، حتی قبل از اقدام به ارسال آن.

برای این کار می‌توانید از پکیج Laravel Mailbox Layer استفاده کرده تا به سرعت تمام مراحل را پیاده سازی و اجرا کنید. 

 

چرا از توابع PHP داخلی استفاده نمی‌شود؟

همانطور که می‌دانید، PHP و Laravel با متدهایی ارائه می‌شوند که می‌توانند برای تأیید اعتبار ایمیل‌ها استفاده شوند. اما این متدها برای بررسی صحیح ساختار آدرس ایمیل مناسب ترند.

به عنوان مثال فرض کنید آدرس ایمیل زیر را داریم که وجود ندارد:

[email protected]

اگر بخواهیم این ایمیل را با استفاده از توابع PHP داخلی یا قوانین تایید اعتبار ایمیل در لاراول اعتبارسنجی کنیم، آن را تأیید می‌کند. دلیل این امر آن است که آدرس با ساختار استانداردی که برای آدرس ایمیل انتظار می‌رود مطابقت دارد. با این حال با توجه به اینکه آدرس ایمیل واقعا وجود ندارد، انتظار داریم که اعتبارسنجی انجام نشود.

به همین دلیل می‌خواهیم از پکیج Laravel Mailbox Layer برای تأیید ایمیل استفاده کنیم و در صورت وجود آدرس واقعا بررسی کنیم و مطمئن شویم که این آدرس از منبع معتبری است که می‌خواهیم به آن دسترسی داشته باشیم. به عنوان مثال ممکن است بخواهیم از آدرس‌های یکبار مصرف سرویس‌هایی مانند Mailinator چشم پوشی کنیم.

دریافت کلید API

پکیج Laravel Mailbox Layer نوعی بسته بندی برای Mailbox Layer API است. بنابراین برای شروع باید در سایت آنها ثبت نام کنید و یک کلید API جدید بگیرید. پس از دریافت کلید API، می‌توانید آن را به فایل env. اضافه کنید. مانند شکل زیر:

MAILBOX_LAYER_API_KEY=your-api-key-here

نصب پکیج

اکنون که کلید API خود را به فایل env. اضافه کردیم، می‌توانیم با اجرای دستور زیر در روت پروژه لاراول، پکیج را نصب کنیم:

composer require ashallendesign/laravel-mailboxlayer

تایید اعتبار ایمیل آدرس

اکنون آماده هستیم تا اعتبارسنجی ایمیل‌ها را شروع کنیم.

برای مثال‌های زیر فرض می‌کنیم که یک فرم اشتراک خبرنامه در یک وب سایت داریم.

بنابراین تصور کنید کنترل کننده زیر را داشته باشیم. در حال حاضر با استفاده از قوانین داخلی لاراول آدرس ایمیل را تأیید می‌کند و سپس فرایندی را برای پایان مراحل اشتراک بازدید کننده ارسال می‌نماید.

use App\Jobs\CompleteNewsletterSubscription;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class NewsletterSubscriptionController extends Controller
{
/**
* Store a new newsletter subscriber.
*
* @param Request $request
* @return JsonResponse
*/
public function store(Request $request): JsonResponse
{
$request->validate([
'email_address' => 'required|email'
]);

CompleteNewsletterSubscription::dispatch();

return response()->json(['success' => true]);
}
}

حال همانطور که قبلا اشاره شد، انجام این کار مشکلی ندارد و بررسی می‌کند که آیا آدرس ایمیل در درخواست ارسال شده است. اما قرار نیست بررسی کند که آدرس ایمیل واقعا وجود دارد یا نه. تمام کاری که انجام می‌دهد بررسی این است که قسمت email_address وجود دارد و این رشته از ساختار آدرس ایمیل پیروی می‌کند. بنابراین می‌توانیم از پکیج ذکر شده برای بهبود این روش و اعتبارسنجی استفاده کنیم.

در کد زیر می‌بینید که چگونه بدون نیاز به ایجاد مورد جدید به صورت دستی یا استفاده از تزریق وابستگی، از فاساد MailboxLayer برای شروع کار استفاده کرده‌ایم. اگر شما در استفاده از دیگر روش‌ها راحت‌تر هستید، پس از آنها بهره بگیرید.

بعد از اینکه اعتبارسنجی لاراول را اجرا کردیم، سپس متد ()check را اجرا می‌کنیم که درخواستی را به Mailbox Layer API می‌دهد و نتایج را در یک شی ValidationResult برمی‌گرداند که می‌توانیم با آن کار کنیم.

همچنین می‌توانیم نادرست بودن خصوصیت smtpCheck را بررسی کنیم. اگر false باشد، بدان معناست که آدرس وجود ندارد و بنابراین می‌توانیم خطایی را به بازدید کننده برگردانیم تا به آنها اطلاع دهیم که آدرس نامعتبر است. اگر آدرس واقعی باشد، خصوصیت smtpCheck به عنوان true برگردانده می‌شود.

use App\Jobs\CompleteNewsletterSubscription;
use AshAllenDesign\MailboxLayer\Facades\MailboxLayer;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class NewsletterSubscriptionController extends Controller
{
/**
* Store a new newsletter subscriber.
*
* @param Request $request
* @return JsonResponse
*/
public function store(Request $request): JsonResponse
{
$request->validate([
'email_address' => 'required|email'
]);

$result = MailboxLayer::check($request->email_address);

if (! $result->smtpCheck) {
abort(۴۲۲, 'The email address is not valid.');
}

CompleteNewsletterSubscription::dispatch();

return response()->json(['success' => true]);
}
}

رد کردن آدرس‌های یکبار مصرف

بسته به نوع کاربری پروژه شما و مکانی که می‌خواهید از این اعتبارسنجی استفاده کنید، ممکن است بخواهید آدرس‌های یکبار مصرف را رد کنید. به عنوان مثال دریافت آدرس ایمیل برای سایتی مانند Mailinator ساده است که می‌توانید برای هرزنامه استفاده کنید و در صورت عدم نیاز به آن توجه نکنید. اگر تمایل دارید در مورد آدرس‌های ایمیل یکبار مصرف مقاله‌ای جداگانه منتشر کنیم، در بخش نظرات به ما اطلاع دهید.

برای توسعه کد بالا می‌توانیم به سادگی بررسی کنیم $result->disposable درست است. اگر true باشد، می‌دانیم که آدرس یکبار مصرف است و می‌توانیم دسترسی را رد کنیم. بیایید ببینیم که در متد کنترل کننده ما چگونه انجام می‌شود:

use App\Jobs\CompleteNewsletterSubscription;
use AshAllenDesign\MailboxLayer\Facades\MailboxLayer;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class NewsletterSubscriptionController extends Controller
{
/**
* Store a new newsletter subscriber.
*
* @param Request $request
* @return JsonResponse
*/
public function store(Request $request): JsonResponse
{
$request->validate([
'email_address' => 'required|email'
]);

$result = MailboxLayer::check($request->email_address);

if (! $result->mxFound) {
abort(۴۲۲, 'The email address is not valid.');
}

if ($result->disposable) {
abort(۴۲۲, 'The email address is disposable.');
}

CompleteNewsletterSubscription::dispatch();

return response()->json(['success' => true]);
}
}

افزودن حافظه کش به منظور بهبود عملکرد

هر بار که شما از Mailbox Layer API درخواست می‌کنید، یک قدم به حد مجاز API نزدیکتر می‌شوید. بنابراین هرچه درخواست کمتری انجام دهید، بهتر است. به همین دلیل فعال کردن مکانیزم ذخیره سازی که در پکیج وجود دارد، می‌تواند مفید باشد. با این کار هر زمان که درخواستی انجام شد، نتیجه در حافظه کش ذخیره می‌شود. از این طریق از ارائه درخواست دیگری در آینده برای همان آدرس جلوگیری می‌کند.

برای افزودن حافظه کش به پکیج، کار ساده‌ای همانند استفاده از متد ()shouldCache قبل از اجرای check() انجام می‌دهید. این به پکیج دستور می‌دهد تا بعد از دریافت آن از API، نتیجه را در حافظه کش ذخیره کند. این بدان معنی است که دفعه دیگر که می‌خواهید همان آدرس ایمیل را تأیید کنید، پکیج ابتدا حافظه کش شما را بررسی می‌کند تا ببینید آیا نتیجه کش شده در آنجا وجود دارد یا خیر. اگر به این گونه باشد، آن را برمی‌گرداند. در غیر این صورت درخواست دیگری ارائه خواهد شد.

در اینجا می‌توانید نحوه استفاده از کد متد کنترلر برای استفاده از حافظه کش را مشاهده کنید:

use App\Jobs\CompleteNewsletterSubscription;
use AshAllenDesign\MailboxLayer\Facades\MailboxLayer;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class NewsletterSubscriptionController extends Controller
{
/**
* Store a new newsletter subscriber.
*
* @param Request $request
* @return JsonResponse
*/
public function store(Request $request): JsonResponse
{
$request->validate([
'email_address' => 'required|email'
]);

$result = MailboxLayer::shouldCache()->check($request->email_address);

if (! $result->mxFound) {
abort(۴۲۲, 'The email address is not valid.');
}

if ($result->disposable) {
abort(۴۲۲, 'The email address is disposable.');
}

CompleteNewsletterSubscription::dispatch();

return response()->json(['success' => true]);
}
}

این ویژگی خاص ممکن است برای چیزی مانند فرم اشتراک خبرنامه مانند آنچه در بالا ذکر شد مفید نباشد. دلیل این امر آن است که به احتمال زیاد کسی قصد ندارد چندین بار در خبرنامه عضو شود. و این اقدام قطعا یک بار صورت می‌گیرد.

بنابراین این ویژگی برای چیزی مانند وارد کردن CSV به سیستم لاراول شما مفیدتر خواهد بود. برای کمک به نشان دادن مزایای این ویژگی، بیایید تصور کنیم که شما نیاز به وارد کردن یک CSV با ۱۰۰۰ کاربر به سیستم دارید و آدرس‌های ایمیل آنها همه منحصر به فرد نیستند. بگذارید بگوییم از هزار کاربر فقط ۶۰۰ آدرس منحصر به فرد وجود دارد. همانطور که حدس زده‌اید، فقط انجام ۶۰۰ درخواست API به جای ۱۰۰۰ مورد بسیار بهتر است. این امر احتمال دستیابی به محدودیت‌های API را کاهش می‌دهد و همچنین باعث بهبود عملکرد می‌شود؛ زیرا واکشی از حافظه کش بسیار سریع است.

قدم بعدی چیست؟

اگر فکر می‌کنید که احتمال دارد از این نوع اعتبارسنجی ایمیل در چندین قسمت مختلف از برنامه خود استفاده کنید، ممکن است ارزش ایجاد قوانین اعتبارسنجی لاراول خودتان را داشته باشد. به این صورت می‌توانید از آن در متد $request->validate خود برای جلوگیری از تکرار کد استفاده کنید. این بدان معناست که می‌توانید دستورات اضافی "if" را در کد خود حذف کرده و مطمئن باشید که اعتبارسنجی در قانون جدید شما انجام می‌شود. این همچنین بدان معنی است که اگر می‌خواهید ایمیل دیگری را در برنامه خود تأیید کنید، می‌توانید قانون را در اعتبارسنج جدید خود قرار دهید تا به سرعت اجرا شود و کار کند.

اگر هم تمایل دارید در مورد چگونگی ایجاد این نوع قانون اعتبارسنجی ایمیل اطلاعات بیشتری کسب کنید، در بخش نظرات به ما اطلاع دهید.

آن را در گیت‌هاب بررسی کنید

کد و مستندات کامل این پکیج را می‌توان در ریپازیتوری گیت هاب آن به آدرسی که در زیر قرار گرفته یافت. با خیال راحت به آن مراجعه کرده، کد را بررسی کنید و در بهبود آن مشارکت داشته باشید.

ریپازیتوری گیت هاب Laravel Mailbox Layer

جهت آشنایی بیشتر با فریمورک لاراول هم می‌توانید این دوره ارزشمند و رایگان را در وب سایت آموزشی راکت دنبال کنید.

منبع

چه امتیازی به این مقاله می دید؟
خیلی بد
بد
متوسط
خوب
عالی

دیدگاه‌ها و پرسش‌ها

برای ارسال دیدگاه لازم است، ابتدا وارد سایت شوید.

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

آفلاین
user-avatar
عرفان حشمتی @heshmati74
مهندس معماری سیستم های کامپیوتری، طراح و توسعه دهنده وب سایت
دنبال کردن

گفتگو‌ برنامه نویسان

بخشی برای حل مشکلات برنامه‌نویسی و مباحث پیرامون آن وارد شو