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 0 Bình luận

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:
-
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).
-
-
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:
-
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.
-
- Triển Khai MailHog và Laravel Sử Dụng Docker Compose
-
docker-compose up -d
- Hoặc
-
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)