الخطوات
-
1
ضبط بيانات SMTP في ملف .env
افتح ملف
.envوحدد متغيراتMAIL_*لمزودك. في التطوير المحلي، اضبطMAIL_MAILER=logلكتابة الرسائل فيstorage/logs/laravel.logبدلًا من إرسالها فعليًا. غيّر إلىsmtpفي مرحلة الاختبار والإنتاج.bash# .env — production (example with Mailgun SMTP) MAIL_MAILER=smtp MAIL_HOST=smtp.mailgun.org MAIL_PORT=587 MAIL_USERNAME=postmaster@mg.yourdomain.com MAIL_PASSWORD=your-mailgun-smtp-password MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=hello@yourdomain.com MAIL_FROM_NAME="${APP_NAME}" # .env — local development (no real emails sent) MAIL_MAILER=log -
2
إنشاء Mailable class
شغّل
make:mailلبناء هيكل الـ Mailable. الخيار--markdownيولّد الـ class وقالب Blade باستخدام مكوّنات البريد Markdown المدمجة في Laravel. إذا كنت تفضل HTML عاديًا، احذف الخيار وأنشئ القالب بنفسك.bash# With a Markdown template stub php artisan make:mail WelcomeMail --markdown=emails.welcome # With no template (you write the Blade view yourself) php artisan make:mail WelcomeMail -
3
بناء Mailable class
افتح
app/Mail/WelcomeMail.php. مرّر البيانات عبر constructor، ثم ابنِ الرسالة في دالتيenvelope()وcontent(). المتغير$userسيكون متاحًا في قالب Blade تلقائيًا لأنه خاصية عامة.php<?php namespace App\Mail; use App\Models\User; use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailable; use Illuminate\Mail\Mailables\Content; use Illuminate\Mail\Mailables\Envelope; use Illuminate\Queue\SerializesModels; class WelcomeMail extends Mailable { use Queueable, SerializesModels; public function __construct( public User $user ) {} public function envelope(): Envelope { return new Envelope( subject: 'Welcome to ' . config('app.name'), ); } public function content(): Content { return new Content( view: 'emails.welcome', ); } } -
4
تصميم قالب البريد الإلكتروني في Blade
أنشئ
resources/views/emails/welcome.blade.php. أبقِ HTML بسيطًا — كثير من برامج البريد الإلكتروني تحذف CSS. الأنماط المضمّنة هي الخيار الآمن؛ إذا استخدمت خيار--markdown، فمكوّنات Markdown تتولى التنسيق تلقائيًا.html<!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body style="font-family: Arial, sans-serif; background: #f4f4f4; padding: 20px;"> <div style="max-width: 600px; margin: 0 auto; background: #fff; padding: 30px; border-radius: 6px;"> <h1 style="color: #333;">Welcome, {{ $user->name }}!</h1> <p style="color: #555; line-height: 1.6;"> Your account has been created. You can now log in and get started. </p> <a href="{{ url('/login') }}" style="display: inline-block; background: #3b82f6; color: #fff; padding: 10px 20px; border-radius: 4px; text-decoration: none;"> Log In </a> </div> </body> </html> -
5
إرسال البريد من وحدة التحكم
استورد واجهة
MailواستدعِMail::to($user)->send(new WelcomeMail($user)). هذا يرسل بشكل متزامن — استجابة HTTP تنتظر انتهاء المرسِل. مقبول في التطوير المحلي لكنه بطيء جدًا في الإنتاج (انظر الخطوة التالية).php<?php namespace App\Http\Controllers; use App\Mail\WelcomeMail; use App\Models\User; use Illuminate\Support\Facades\Mail; class RegisterController extends Controller { public function store(Request $request) { $user = User::create($request->validated()); Mail::to($user->email)->send(new WelcomeMail($user)); return redirect('/dashboard'); } } -
6
إضافة البريد إلى الطابور في الإنتاج
أضف
ShouldQueueإلى الـ Mailable وغيّر منsend()إلىqueue()عند الاستدعاء. سيُرسَل البريد الآن إلى درايفر الطابور (database أو Redis وغيره) ويُسلَّم بواسطة عامل خلفي، فتظل استجابة HTTP سريعة.تأكد من أن عامل الطابور يعمل:
php artisan queue:work. على خادم الإنتاج، استخدم Supervisor لإبقائه نشطًا بعد إعادة التشغيل.php// app/Mail/WelcomeMail.php — add the interface use Illuminate\Contracts\Queue\ShouldQueue; class WelcomeMail extends Mailable implements ShouldQueue { use Queueable, SerializesModels; // ... } // In your controller — queue instead of send Mail::to($user->email)->queue(new WelcomeMail($user)); // Or queue with a delay Mail::to($user->email) ->later(now()->addMinutes(5), new WelcomeMail($user)); -
7
استخدام Mailtrap للاختبار في التطوير
يلتقط Mailtrap جميع الرسائل الصادرة في صندوق وارد وهمي حتى تتمكن من فحص HTML المُصيَّر والترويسات ودرجة الـ spam دون الإرسال لعناوين حقيقية. أنشئ حسابًا مجانيًا على mailtrap.io، ثم انسخ بيانات SMTP المقدَّمة إلى ملف
.envالمحلي.bash# .env — Mailtrap MAIL_MAILER=smtp MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 MAIL_USERNAME=your_mailtrap_username MAIL_PASSWORD=your_mailtrap_password MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=test@example.com MAIL_FROM_NAME="My App Dev"
نصائح ومحاذير
- أضف البريد الإلكتروني دائمًا إلى الطابور في الإنتاج — الإرسال المتزامن يحجب الطلب لكامل مدة مصافحة SMTP، عادةً 200–800 ميلي ثانية.
- استخدم <code>Mail::fake()</code> في الاختبارات للتحقق من إرسال Mailable محدد دون الاتصال فعليًا بخادم SMTP.
- ضمّن CSS مباشرةً أو استخدم معالجًا مسبقًا مثل Premailer قبل الإرسال — Gmail يحذف كتل <code><style></code> مما يكسر التخطيطات التي تعتمد عليها.
- حدد عنوان reply-to مختلفًا عن عنوان from عند إرسال البريد التحويلي، حتى تصل الردود إلى صندوق وارد مراقب لا إلى خدمة الإرسال.
- اختبر HTML البريد الإلكتروني في برامج بريد حقيقية (Gmail وOutlook وApple Mail) باستخدام أداة مثل Litmus قبل الإطلاق — عرض البريد الإلكتروني متقلب بشكل مشهور.
خاتمة
أصبح بإمكانك الآن إرسال البريد الإلكتروني التحويلي وإضافته إلى الطابور في Laravel باستخدام Mailable class مكتوبة بوضوح وقالب Blade واستدعاء إرسال في سطر واحد. الخطوة التالية هي إعداد أحداث البريد مثل MessageSent لتسجيل محاولات التسليم، أو دمج webhook من مزود البريد لتتبع فتح الرسائل والارتدادات.