JavaScript is not enabled!...Please enable javascript in your browser

جافا سكريبت غير ممكن! ... الرجاء تفعيل الجافا سكريبت في متصفحك.

الصفحة الرئيسية

كيف أنشأت نظام تسجيل وتفعيل حساب عبر البريد في Laravel وتجاوزت مشكلة الرسائل التي لا تصل – تجربة شخصية

 

✍️ المقدمة:

في مشروع حديث قمت ببنائه باستخدام Laravel، طُلب مني إضافة نظام تسجيل يتضمن:

  • تسجيل مستخدم جديد

  • إرسال رسالة تأكيد بالبريد

  • تفعيل الحساب بعد الضغط على الرابط

الأمر يبدو سهلًا ظاهريًا، خصوصًا مع أن Laravel يوفّر بعض الأدوات الجاهزة لذلك، ولكن بعد التطبيق ظهرت لي مشكلة مفاجئة:

[الرسائل لا تصل، أو تصل لبريد Spam، وأحيانًا الرابط لا يعمل بعد ساعات].


في هذا المقال أشارك تجربتي الكاملة، خطوة بخطوة لبناء هذا النظام بشكل عملي وآمن، مع حل أهم المشاكل المتعلقة به.

🎯 أهداف النظام:

  • المستخدم يسجل عبر نموذج

  • رسالة تُرسل لبريده تتضمن رابط تفعيل

  • إذا لم يفعل، لا يمكنه تسجيل الدخول

  • رابط التفعيل له صلاحية محدودة

⚙️ خطوات تنفيذ النظام:

✅ 1. تجهيز Laravel Breeze أو Jetstream (اختياري)

composer require laravel/breeze --dev
php artisan breeze:install
npm install && npm run dev
php artisan migrate
[استخدمت Breeze لأنه خفيف وسريع، لكن يمكنك تطبيق الفكرة بدون أي سكافولد.]

✅ 2. تفعيل خاصية تأكيد البريد الإلكتروني

في User model:

use Illuminate\Contracts\Auth\MustVerifyEmail;

class User extends Authenticatable implements MustVerifyEmail
{
    // ...
}

✅ 3. حماية الصفحات للمستخدمين المفعّلين فقط

في routes/web.php:

Route::middleware(['auth', 'verified'])->group(function () {
    Route::get('/dashboard', function () {
        return view('dashboard');
    });
});

✅ 4. إرسال البريد بعد التسجيل تلقائيًا

Laravel يقوم بذلك تلقائيًا إن قمت بتفعيل MustVerifyEmail، ولكن تأكد من استخدام Mailer مناسب.

في ملف .env:

MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=your_username
MAIL_PASSWORD=your_password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=example@yourdomain.com
MAIL_FROM_NAME="My Laravel App"
[استخدمت Mailtrap لاختبار البريد، وهو ممتاز للمطورين.]

✅ 5. تخصيص شكل البريد المرسل (اختياري)

أنشئ قالب مخصص للبريد:

php artisan vendor:publish --tag=laravel-mail

ثم عدل القالب كما يناسبك في:
resources/views/vendor/mail/html/*

⚠️ المشاكل التي واجهتها وكيف حللتها:

❌ المشكلة 1: البريد لا يصل للمستخدم

✅ الحل:

  • استخدمت SMTP بدلًا من mail()

  • فعلت SPF وDKIM في إعدادات DNS إذا كان البريد حقيقيًا

  • استخدمت Mailtrap للتجربة بدون مشاكل

❌ المشكلة 2: رابط التفعيل لا يعمل بعد ساعة

✅ الحل:

  • Laravel يستخدم رابط موقّع "Signed URL" صالح لمدة محددة

  • غيرت القيمة في VerifyEmailController:

URL::temporarySignedRoute(
    'verification.verify',
    now()->addMinutes(120),
    ['id' => $user->id, 'hash' => sha1($user->email)]
);

❌ المشكلة 3: المستخدم ينسى التفعيل ويريد إعادة إرسال الرابط

✅ الحل:
وفرت زرًا في صفحة تسجيل الدخول لإعادة الإرسال:

<form method="POST" action="{{ route('verification.send') }}">
    @csrf
    <button type="submit">إعادة إرسال رابط التفعيل</button>
</form>

✅ النتيجة النهائية:

  • كل مستخدم جديد يجب أن يُفعّل بريده قبل الدخول

  • يمكنه طلب رابط جديد بسهولة

  • تم حماية جميع الصفحات من الوصول غير المصرح به

🧠 ملاحظات مهمة:

(الملاحظة) (السبب)
(استخدم SMTP محترف مثل SendGrid أو Mailgun في الإنتاج) (لضمان وصول البريد وعدم اعتباره Spam)
ا(ختبر التفعيل على نطاق حقيقي وليس localhost فقط) (لأن Gmail يحجب رسائل localhost)
(فعّل حماية XSS و CSRF حتى في صفحة التأكيد) (الرابط موقّع لكنه قابل للهجوم لو أُهمِل)

🧾 الخلاصة:

بناء نظام تفعيل البريد خطوة مهمة جدًا في أي تطبيق يعتمد على التسجيل.
لكن الأهم هو أن تفهم كيف يحمي Laravel هذا النظام عبر توقيعات URL، وكيف يمكنك تخصيصه وتحسينه.

هذا النظام يزيد من موثوقية تطبيقك ويمنع المستخدمين المزيفين من الدخول.

💬 هل واجهت مشاكل في تسجيل الدخول أو تأكيد البريد؟

شارك بها وسأكتب عنها مقالًا في السلسلة القادمة.

الاسمبريد إلكترونيرسالة