📧 دليل إرسال رسائل البريد الإلكتروني في Laravel مع صور CID

في هذا البرنامج التعليمي، سنتعلم كيفية إرسال رسائل البريد الإلكتروني في Laravel مع الصور الثابتة باستخدام **CID (Content-ID)**. باستخدام هذه الطريقة، تبقى الصور معروضة حتى عندما يكون مستلم البريد الإلكتروني غير متصل بالإنترنت.

Tags:
  • #Laravel
  • #البريد الإلكتروني
  • #صور CID
  • #PHP
  • #البريد
Learning Path: | Category: نصائح Laravel

📌 جدول المحتويات

  1. مقدمة
  2. التحضير
  3. إنشاء مساعد البريد الإلكتروني
  4. إنشاء عرض البريد الإلكتروني مع صورة CID
  5. استخدام المساعد لإرسال البريد الإلكتروني
  6. الخلاصة

🔧 التحضير

  1. تأكد من تثبيت Laravel.
  2. تكوين SMTP في .env:
    MAIL_MAILER=smtp
    MAIL_HOST=smtp.example.com
    MAIL_PORT=587
    MAIL_USERNAME=your_email@example.com
    MAIL_PASSWORD=your_password
    MAIL_ENCRYPTION=tls
    MAIL_FROM_ADDRESS=your_email@example.com
    MAIL_FROM_NAME="اسمك"
  3. قم بتشغيل php artisan storage:link للوصول إلى الصور من التخزين.

📌 إنشاء مساعد البريد الإلكتروني

أنشئ الملف app/Helpers/EmailHelper.php:

<?php

namespace App\Helpers;

use Illuminate\Support\Facades\Mail;
use Exception;

class EmailHelper
{
    public static function sendEmail($to, $subject, $message, $attachments = [], $cc = [], $bcc = [])
    {
        try {
            Mail::send([], [], function ($messageObj) use ($to, $subject, $message, $attachments, $cc, $bcc) {
                $messageWithInlineImages = self::processInlineImages($message, $messageObj);
                
                $messageObj->to($to)
                           ->subject($subject)
                           ->html($messageWithInlineImages);
                
                if (!empty($cc)) $messageObj->cc($cc);
                if (!empty($bcc)) $messageObj->bcc($bcc);
                if (!empty($attachments)) {
                    foreach ($attachments as $attachment) {
                        $messageObj->attach($attachment);
                    }
                }
            });

            return true;
        } catch (Exception $e) {
            logger("EmailHelper: " . $e->getMessage());
            throw new Exception("فشل إرسال البريد الإلكتروني: " . $e->getMessage());
        }
    }

    private static function processInlineImages($body, $messageObj)
    {
        return preg_replace_callback('/<img[^>]+src=["\'](.*?)["\']/i', function ($matches) use ($messageObj) {
            $imagePath = $matches[1];
            
            if (strpos($imagePath, '/storage') === 0) {
                $filePath = storage_path('app/public' . parse_url($imagePath, PHP_URL_PATH));
                
                if (file_exists($filePath)) {
                    $cid = 'cid_' . uniqid();
                    $messageObj->embed($filePath, ['content-id' => $cid]);
                    return 'src="cid:' . $cid . '"';
                }
            }
            
            return $matches[0];
        }, $body);
    }
}

🖼 إنشاء عرض البريد الإلكتروني مع صورة CID

أنشئ الملف resources/views/emails/sample.blade.php:

<!DOCTYPE html>
<html dir="rtl">
<head>
    <title>البريد الإلكتروني مع صورة CID</title>
</head>
<body>
    <h2>مرحبًا، هذا بريد إلكتروني مع صورة CID</h2>
    <p>فيما يلي صورة مضمنة:</p>
    <img src="/storage/email/logo.png" alt="الشعار">
</body>
</html>

تأكد من تخزين الصورة في storage/app/public/email/logo.png


🔍 فهم processInlineImages

دالة processInlineImages مسؤولة عن تحويل الصور من المسارات المحلية (/storage/...) إلى معرف المحتوى (CID) ليتم تضمينها كمرفقات مضمنة في رسائل البريد الإلكتروني.

كيفية العمل:

  1. اكتشاف علامات <img> في البريد الإلكتروني باستخدام preg_replace_callback.
  2. استخراج src من علامات <img> للتحقق مما إذا كانت الصورة من تخزين Laravel (/storage/...).
  3. تحويل مسار الصورة إلى المسار الكامل على الخادم باستخدام storage_path().
  4. تضمين الصورة في البريد الإلكتروني باستخدام $messageObj->embed() لترميزها كـ صورة CID.
  5. استبدال src الصورة في HTML بـ cid:unique_id، بحيث يتم عرض الصورة من البريد الإلكتروني وليس من عنوان URL خارجي.

مثال على تحويل HTML في البريد الإلكتروني:

قبل:

<img src="/storage/email/logo.png" alt="الشعار">

بعد:

<img src="cid:cid_123456789" alt="الشعار">

مع هذه الطريقة، تبقى الصور معروضة حتى عندما يكون مستلم البريد الإلكتروني غير متصل بالإنترنت.


📤 استخدام المساعد لإرسال البريد الإلكتروني

في وحدة التحكم أو الخدمة، استخدم الكود التالي لإرسال بريد إلكتروني:

use App\Helpers\EmailHelper;

EmailHelper::sendEmail(
    'recipient@example.com',
    'موضوع البريد الإلكتروني',
    view('emails.sample')->render()
);

✅ الخلاصة

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

بالتوفيق في البرمجة! 🎉

Logo Adib

© 2025 Adib

GitHub