انتقال للمقال

أداة MailHog بديل مجاني لـ Mailtrap

السلام عليكم ورحمة الله وبركاته

وقت القراءة: ≈ 5 دقائق

المقدمة

اليوم سنتحدث عن أداة وجدتها أحببت أن اشاركها معكم وهي 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
لذا حاول أن تثبته بالطريقة التى تناسبك

  1. اذهب لـ صفحة Releases في GitHub
  2. حمل النسخة المناسبة لنظامك (مثلاً MailHog_windows_amd64.exe لأنني أستخدم Windows حاليًا)
  3. شغل الملف

بعد تشغيل ملف 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 أو أي لغة أخرى