البرمجة مبتدئ 9 دقيقة

كيفية إرسال رسائل بريد إلكتروني عبر Laravel

نظام Mail في Laravel يُغلّف مُرسِل PHP في واجهة برمجية نظيفة وقابلة للاختبار. تُعرّف كل بريد إلكتروني كـ Mailable class — مع موضوعه وقالبه وبياناته — ثم ترسله في سطر واحد من أي مكان في تطبيقك.

يغطي هذا الدليل ضبط بيانات SMTP، وإنشاء Mailable وبناءه، وتصميم قالب البريد الإلكتروني في Blade، وإضافة البريد إلى طابور حتى لا يُبطئ استجابة HTTP في الإنتاج.

في بيئة التطوير المحلية، يتيح لك Mailtrap ودرايفر log في Laravel التكرار دون إرسال رسائل حقيقية.

الخطوات

  1. 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. 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. 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. 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. 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. 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. 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>&lt;style&gt;</code> مما يكسر التخطيطات التي تعتمد عليها.
  • حدد عنوان reply-to مختلفًا عن عنوان from عند إرسال البريد التحويلي، حتى تصل الردود إلى صندوق وارد مراقب لا إلى خدمة الإرسال.
  • اختبر HTML البريد الإلكتروني في برامج بريد حقيقية (Gmail وOutlook وApple Mail) باستخدام أداة مثل Litmus قبل الإطلاق — عرض البريد الإلكتروني متقلب بشكل مشهور.

خاتمة

أصبح بإمكانك الآن إرسال البريد الإلكتروني التحويلي وإضافته إلى الطابور في Laravel باستخدام Mailable class مكتوبة بوضوح وقالب Blade واستدعاء إرسال في سطر واحد. الخطوة التالية هي إعداد أحداث البريد مثل MessageSent لتسجيل محاولات التسليم، أو دمج webhook من مزود البريد لتتبع فتح الرسائل والارتدادات.

#Laravel #Email #SMTP
العودة إلى جميع الأدلة

هل تحتاج مساعدة في مشروعك؟

احجز استشارة مجانية لمدة 30 دقيقة لمناقشة تحدياتك التقنية واستكشاف الحلول معًا.