أداة MailHog بديل مجاني لـ Mailtrap
السلام عليكم ورحمة الله وبركاته
المقدمة
اليوم سنتحدث عن أداة وجدتها أحببت أن اشاركها معكم وهي MailHog ووجدتها مفيدة لذا فضلت أن أكتب مقالة عنها لتعريف الآخرين عنها
أنت كمطور Backend بشكل عام سواء كنت تستخدم Nodejs أو Laravel أو غيرهما
أظنك صادفت خدمة Mailtrap الشهيرة وهى خدمة سحابية توفر SMTP server وهمي لاختبار الرسائل الإلكترونية
غالبًا نستخدمها فقط في بيئة الـ Development و Testing لرؤية شكل الرسائل الإلكترونية التي يتم إرسالها
لكنني مؤخرًا واجهت مشكلة وهى أن Mailtrap يأتي مع قيود:
- 100 رسالة فقط شهرياً في النسخة المجانية
- عندما تنتهي من الـ
100رسالة، تضطر للانتظار حتى الشهر القادم أو الدفع للترقية - يوجد
rate limitعلى عدد الرسائل التي يمكنك إرسالها في الـrequestالواحد
في الشركة التى أعمل بها، واجهت مشكلة في الرسائل وكنت أحاول اختبارها
والاختبار كان يتطلب إرسال رسائل إلى Mailtrap بشكل متكرر لأرى هل المشكلة حلت أم لا
ثم اتفاجيء أني وصلت للحد الأقصى للرسائل في الشهر وأنا لم أنتهى من حل المشكلة بعد
ماذا أفعل الآن ؟
هل أنتظر حتى الشهر القادم ؟، بالطبع لا فزميلي الـ Tester أراه يسن فأسه منذ فترة وينظر لي ويبتسم
لذا سارعت لايجاد حل بديل
حل لا يتطلب تسجيل دخول أو استخدام خدمة سحابية
أو عدد محدود من الرسائل
وحل يضمن نجاتي من الفأس الذي يتم سنه أمامي
ظنت أن الأمر خيالي لكن وجدت الأداة المثالية وهى MailHog
الحل هو MailHog كبديل يعمل على الـ localhost
خدمة MailHog هي أداة مفتوحة المصدر تعمل على localhost كـ SMTP server وهمي
أي يمكنك تشغيله على جهازك الشخصي دون الحاجة لإنترنت أو تسجيل في أي خدمة خارجية
رابط المشروع: MailHog على GitHub
المميزات الرائعة لـ MailHog:
- يعمل على
localhostالميزة الرئيسية له - مجاني تمامًا بالطبع
- أمان كامل لأن كل البيانات لا تخرج من جهازك، لأنها
localhost - غير محدود سواء في عدد الرسائل ككل أو في الـ
requestالواحد - لا يحتاج إنترنت لأنه يعمل على
localhost - واجهة ويب بسيطة لعرض الرسائل
- سريع في الاستجابة لأن كل شيء على جهازك
وبالطبع بما أنه localhost فيمكنك استخدامه في بيئة الـ Development في port مختلف على الـ Server إذا أردت
وبالطبع لا تستخدمه في بيئة الـ Production أو الـ Staging لأنك هنا تريد التعامل مع خدمة حقيقية لإرسال البريد الإلكتروني
مثال تطبيقي شامل في Laravel عن MailHog
أحب أن أشرح باستخدام مثال عملي، لذا سنبني مثال شامل باستخدام Laravel مع MailHog
لذا اصبر علي في هذه الفقرة لأننا سنقوم فقط بعمل مشروع Laravel بسيط
ثم نقوم بعمل كلاس mail يدعى NewsletterEmail من أجل الاختبار
وسأقوم بإنشاء ملف blade خاص به في resources/views/emails/
ثم في الفقرة التالية سنقوم بتحميل MailHog واستخدامه في مشروعنا
تجهيز مشروع Laravel بسيط
أولاً، دعنا ننشئ مشروع mailhog-example جديد باستخدام Laravel:
composer create-project laravel/laravel mailhog-example
cd mailhog-example
وسنقوم بإنشاء على سبيل المثال رسالة لنشرة بريدية خاصة بنا
لذا دعنا نبدأ بإنشاء كلاس لهذه الرسالة:
php artisan make:mail NewsletterEmail
الآن لدينا ملف جديد ثم تم إنشائه وهو app/Mail/NewsletterEmail.php
سنقوم الآن بعمل بعض التغيرات فيه ونجعله يقوم بأخذ template وليكن newsletter.blade.php الذي سننشئه لاحقًا في مجلد resources/views/emails/
وأيضًا سنقوم بتمرير محتوى النشرة البريدية كمتغير يدعى content
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class NewsletterEmail extends Mailable
{
use Queueable, SerializesModels;
public function __construct(public string $content)
{
}
public function build()
{
return $this->view('emails.newsletter')
->subject('النشرة البريدية الأسبوعية لمدونة الطبراني');
}
}
الآن دعنا ننشئ ملف newsletter.blade.php في resources/views/emails/
محتواه سيكون كالتالي:
<!DOCTYPE html>
<html>
<head>
<title>النشرة البريدية</title>
<meta charset="utf-8" />
</head>
<body
style="font-family: Arial, sans-serif; line-height: 1.6; color: #333;"
>
<div style="max-width: 600px; margin: 0 auto; padding: 20px;">
<header style="text-align: center; margin-bottom: 30px;">
<h1 style="color: #2c3e50;">
📧 النشرة البريدية الأسبوعية لمدونة الطبراني
</h1>
<p style="color: #666;">{{ date('Y-m-d') }}</p>
</header>
<div
style="background-color: #ecf0f1; padding: 20px; border-radius: 5px; margin: 20px 0;"
>
{!! $content !!}
</div>
<footer
style="margin-top: 30px; padding-top: 20px; border-top: 1px solid #eee; text-align: center;"
>
<p style="font-size: 12px; color: #666;">
تلقيت هذه النشرة لأنك مشترك في موقع مدونة الطبراني
<a href="{{ url('/unsubscribe') }}" style="color: #e74c3c;"
>إلغاء الاشتراك</a
>
</p>
</footer>
</div>
</body>
</html>
تثبيت وتشغيل MailHog خطوة بخطوة
أولًا مشروع MailHog على GitHub يوفر عدة طرق مختلفة للتثبيت سواء على Windows أو Linux أو MacOS
أو حتى باستخدام Docker
لذا حاول أن تثبته بالطريقة التى تناسبك
- اذهب لـ صفحة Releases في GitHub
- حمل النسخة المناسبة لنظامك (مثلاً
MailHog_windows_amd64.exeلأنني أستخدمWindowsحاليًا) - شغل الملف
بعد تشغيل ملف MailHog_windows_amd64.exe ستظهر لك نافذة Terminal جديدة بهذا الشكل
2025/08/08 17:11:33 Using in-memory storage
2025/08/08 17:11:33 [SMTP] Binding to address: 0.0.0.0:1025
[HTTP] Binding to address: 0.0.0.0:8025
2025/08/08 17:11:33 Serving under http://0.0.0.0:8025/
Creating API v1 with WebPath:
Creating API v2 with WebPath:
هنا لدينا معلومات مهمة وهى:
- أنه يستعمل
in-memory storageبمعنى أنه يحتفظ بالرسائل على ذاكرة الجهازRAM
بالتالي في حالة أغلقت البرنامج أو الـTerminalستفقد جميع الرسائل
وهذا غالبًا شيء جيد لأنك تستخدمه فقط من أجل الاختبار فقط ولا تريد أن تحتفظ برسائل عشوائية على جهازك - أنه يستمع على
localhost:1025لاستقبال البريد الإلكتروني عبرSMTP
بالتالي عندما تربط مشروعك بـMailHog، سيكون الـMAIL_HOSTهوlocalhostوالـMAIL_PORTهو1025
وبالطبع الـMAIL_MAILERسيكونsmtp
وهذه أمور ستضعها في ملف.envالخاص بمشروعك - أنه يوفر واجهة ويب على
http://localhost:8025
يمكنك من خلالها رؤية الرسائل التي تم إرسالها
ملاحظة: اترك الـTerminalمفتوحًا عندما تريد اختبار البريد الإلكتروني، وعندما تنتهي من الاختبار يمكنك إغلاقه
وعليك أن تعرف أن الرسائل ستُحذف عند إغلاقMailHogلأنه يستخدمin-memory storage
ربط مشروع Laravel للعمل مع MailHog
الآن بعد تشغيل MailHog بنجاح، دعنا نربط مشروع Laravel الخاص بنا به
أولًا، سنقوم بتحديث إعدادات البريد الإلكتروني في ملف .env الخاص بمشروعنا
MAIL_MAILER=smtp
MAIL_HOST=127.0.0.1
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="noreply@example.com"
MAIL_FROM_NAME="${APP_NAME}"
لاحظ التالي أننا استعملنا 127.0.0.1 لأنه يمثل الـ localhost
والـ port هو 1025 وليس 8025 لأنه الـ MailHog يستمع على 1025 لاستقبال البريد عبر SMTP
أما 8025 فهو الـ port الخاص بواجهة الويب فقط الخاصة بـ MailHog
ولاحظ أن كلًا من MAIL_USERNAME و MAIL_PASSWORD هما null لأننا لا نحتاج إلى أي معلومات تسجيل دخول مع MailHog
اختبار ارسال رسالة إلى MailHog
الآن بعد أن قمنا بربط مشروع Laravel بـ MailHog، دعنا نختبر إرسال رسالة بريد إلكتروني
لنفترض أنه لدينا endpoint بسيطة لإرسال البريد الإلكتروني، سنقوم بإنشائها في routes/web.php:
Route::get('/send-newsletter', function () {
$content = '
<h1>مرحبًا بك في نشرتنا البريدية!</h1>
<p>هذا هو المحتوى الأسبوعي</p>
<p>احرص على متابعة مدونة الطبراني</p>
';
Mail::to('user1@example.com')->send(new NewsletterEmail($content));
return response()->json(['message' => 'تم إرسال البريد الإلكتروني بنجاح'], 200);
});
أولًا بالطبع نقوم بتشغيل الـ Server الخاص بمشروعنا
php artisan serve
الآن يمكنك اختبار إرسال البريد الإلكتروني:
عندما تقوم بزيارة الرابط: http://localhost:8000/send-newsletter
سترى أنه قد تم إرسال البريد الإلكتروني بنجاح
ويمكنك فتح واجهة MailHog لرؤية الرسالة التي تم إرسالها عن طريق الرابط: http://localhost:8025
وستجد هناك بالطبع قائمة بجميع الرسائل المرسلة
ويمكنك رؤية الرسائل سواء كـ HTML أو Plain Text
تحديث مهم: MailHog لم يعد قيد التطوير
ملحوظة: بعد كتابة هذه المقالة، اكتشفت أن مشروعMailHogتوقف التطوير فيه منذ أغسطس2022ولم يعد يتلقى أي تحديثات أمنية
إذا كنت تبحث عن بديل نشط ومحدث لـ MailHog، أنصحك بقراءة المقالة الجديدة البدائل النشطة لـ MailHog و Mailtrap
استعرضت في المقالة الجديدة قائمة متجددة لجميع البدائل النشطة وقمنا بتثبيت واستخدام أحدها وهو Mailpit
خاتمة
لقد وصلنا للنهاية وسعيد بأن هذه المقالة هى الأولى من نوعها حيث استعرضت تجربة شخصية باستخدام أداة مثل MailHog لحل مشكلة معينة واجهتها
لذا قد أفكر بكتابة مقالات أخرى عن تجارب شخصية أو أمور واجهتني وكيف قمت بحلها
على أي حال كما ترى فأن MailHog يعتبر بديل قوي ومجاني لـ Mailtrap وغيره من المواقع المشابهه
لاختبار البريد الإلكتروني في الجهاز الخاص بك في الـ localhost
وبما أنها تعمل على localhost فهي لا تحتاج إنترنت ولا قيود على عدد الرسائل المرسلة
لذا أراها أداة مثالية لأي مطور Backend وخصوصًا أنها بسيطة وسهلة ويمكنك استخدامها في أي مشروع بسهوله
برغم بأنني استخدمت Laravel في هذا المثال، إلا أن MailHog يمكن استخدامه مع أي لغة
مثل Nodejs عن طريق مكتب nodemailer أو مع Python باستخدام مكتبة smtplib أو أي لغة أخرى