Quay lại

Tích Hợp MailHog Bằng Docker trong Laravel Chuyên mục PHP và Laravel    2024-03-26    10 Lượt xem    10 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

Tích Hợp MailHog Bằng Docker trong Laravel

Chào mừng bạn đến với hướng dẫn về việc sử dụng MailHog trong Laravel để phát triển và kiểm thử chức năng gửi email trong ứng dụng của bạn. MailHog là một công cụ giả lập SMTP server được sử dụng phổ biến trong quá trình phát triển phần mềm, giúp bạn dễ dàng theo dõi và kiểm tra các email được gửi từ ứng dụng của mình mà không cần gửi thực sự đến hòm thư điện tử của người nhận.

Trong môi trường phát triển, việc kiểm thử và debug các tính năng gửi email có thể trở nên khó khăn khi bạn không muốn gửi email thực sự đến người dùng cuối. Đây là lúc MailHog trở thành một công cụ hữu ích, cho phép bạn gửi email từ ứng dụng của mình nhưng nó sẽ được chứa lại và hiển thị trên giao diện web của MailHog để bạn có thể kiểm tra.

Trong hướng dẫn này, chúng ta sẽ khám phá cách tích hợp MailHog vào Laravel để mô phỏng và kiểm thử chức năng gửi email trong ứng dụng của bạn. Chúng ta sẽ hướng dẫn cách cài đặt MailHog sử dụng Docker Compose và cấu hình Laravel để sử dụng MailHog như một SMTP server trong quá trình phát triển.

Hãy bắt đầu và khám phá cách sử dụng MailHog để đơn giản hóa quá trình phát triển và kiểm thử tính năng gửi email trong Laravel của bạn!

Để triển khai MailHog bằng Docker Compose trong Laravel, bạn có thể thực hiện các bước sau:

  1. Tạo File Docker Compose cho MailHog:

    Trước tiên, bạn cần tạo một file docker-compose.yml trong thư mục gốc của dự án Laravel của bạn hoặc trong thư mục riêng cho Docker Compose:

    version: '3.8'
    
    services:
      mailhog:
        image: mailhog/mailhog
        logging:
          driver: 'none'  # disable saving logs
        ports:
          - 1025:1025 # SMTP server port
          - 8025:8025 # MailHog web interface port​

    Trong đó:

    • mailhog: Đây là tên của dịch vụ MailHog, bạn có thể đặt tên bất kỳ tuỳ ý cho dịch vụ của mình.

    • image: mailhog/mailhog: Đây là hình ảnh Docker được sử dụng cho dịch vụ, trong trường hợp này là mailhog/mailhog. Điều này có nghĩa là Docker sẽ tải hình ảnh MailHog từ Docker Hub nếu nó chưa được tải trước đó.

    • logging: Đây là một phần của cấu hình Docker Compose để thiết lập cách ghi log của dịch vụ. Trong trường hợp này, driver: 'none' được sử dụng để tắt việc lưu log của MailHog, giúp giảm dung lượng và tài nguyên được sử dụng bởi Docker.

    • ports: Định nghĩa các cổng được expose từ container Docker ra bên ngoài. Trong trường hợp này, cổng 1025 được map tới cổng 1025 trên máy host (SMTP server của MailHog), và cổng 8025 được map tới cổng 8025 trên máy host (giao diện web của MailHog).

  2. Cấu hình Laravel để Sử Dụng MailHog: Trong file .env của Laravel, bạn cần cấu hình Laravel để sử dụng MailHog bằng cách thiết lập các giá trị sau:

    1. MAIL_MAILER=smtp
      MAIL_HOST=mailhog
      MAIL_PORT=1025
      MAIL_USERNAME=null
      MAIL_PASSWORD=null
      MAIL_ENCRYPTION=null
      MAIL_FROM_ADDRESS=hello@example.com
      MAIL_FROM_NAME="${APP_NAME}"
      

      Trong đó, `MAIL_HOST` được thiết lập là `mailhog`, `MAIL_PORT` là `1025` để đồng bộ với cổng mà MailHog đang lắng nghe.

  3. Triển Khai MailHog và Laravel Sử Dụng Docker Compose
    1. docker-compose up -d
    2. Hoặc
    3. docker-compose up -d --build mailhog

      Lệnh này sẽ tạo và chạy các container cho cả MailHog và Laravel. MailHog sẽ được kết nối với Laravel thông qua cổng SMTP và bạn có thể truy cập vào giao diện web của MailHog bằng cách truy cập `http://localhost:8025` trong trình duyệt.

Bây giờ, khi ứng dụng Laravel gửi email, các email sẽ được chuyển đến MailHog. Bạn có thể kiểm tra và xem các email đã gửi bằng cách truy cập vào giao diện web của MailHog theo địa chỉ `http://localhost:8025`.

Dưới đây là một ví dụ:

OrderCompletedEvent.php

<?php

namespace App\Events;

use App\Models\Order;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class OrderCompletedEvent
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $order;

    /**
     * Create a new event instance.
     */
    public function __construct(Order $order)
    {
        $this->order = $order;
    }
}

NotifyAdminListener.php

<?php

namespace App\Listeners;

use App\Events\OrderCompletedEvent;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Message;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\Mail;

class NotifyAdminListener
{
    /**
     * Create the event listener.
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     */
    public function handle(object $event): void
    {
        $order = $event->order;
        Mail::send('admin', ['order' => $order], function(Message $message) use($order) {
            $message->to($order->customer_email);
            $message->subject('A new order has been completed');
        });
    }
}

EventServiceProvider.php

protected $listen = [
    ...
    OrderCompletedEvent::class => [
        NotifyCustomerListener::class,
        NotifyAdminListener::class,
    ]
];

OrderController.php

public function success(Request $request) {
    $order = Order::where('transaction_id', $request->source)->first();
    if(!$order) return $this->responseBadRequest();
    
    $order->complete = 1;
    $order->save();

    event(new OrderCompletedEvent($order));

    return $this->responseSuccess(
        [],
        __('common.success_message')
    );
}

Kết quả:

 

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday