📌 جدول المحتويات
- مقدمة
- التحضير
- إنشاء مساعد البريد الإلكتروني
- إنشاء عرض البريد الإلكتروني مع صورة CID
- استخدام المساعد لإرسال البريد الإلكتروني
- الخلاصة
🔧 التحضير
- تأكد من تثبيت Laravel.
- تكوين 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="اسمك"
- قم بتشغيل
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) ليتم تضمينها كمرفقات مضمنة في رسائل البريد الإلكتروني.
كيفية العمل:
- اكتشاف علامات
<img>
في البريد الإلكتروني باستخدامpreg_replace_callback
. - استخراج
src
من علامات<img>
للتحقق مما إذا كانت الصورة من تخزين Laravel (/storage/...
). - تحويل مسار الصورة إلى المسار الكامل على الخادم باستخدام
storage_path()
. - تضمين الصورة في البريد الإلكتروني باستخدام
$messageObj->embed()
لترميزها كـ صورة CID. - استبدال
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()
);
✅ الخلاصة
مع هذه الطريقة، تبقى الصور في رسائل البريد الإلكتروني معروضة حتى عندما يكون المستلم غير متصل بالإنترنت. هذا مفيد لإرسال رسائل بريد إلكتروني تحتوي على علامة تجارية أو صور مهمة دون الاعتماد على مصادر خارجية.
بالتوفيق في البرمجة! 🎉