Triển khai Mailpit với Docker Compose: Giải pháp Test Email thay thế MailHog

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

Vấn đề: Đừng để email test bay thẳng vào inbox khách hàng

Chắc hẳn ai trong chúng ta cũng từng một lần “thót tim” khi lỡ tay chạy script gửi email trên database thật. Chỉ một giây sơ suất, hàng nghìn khách hàng bỗng nhận được nội dung “Test email 123”. Trước đây, MailHog là cái tên quen thuộc giúp anh em developer chặn đứng thảm họa này. Tuy nhiên, MailHog hiện đã ngừng bảo trì từ lâu. Nó thường xuyên treo máy khi xử lý mail đính kèm file lớn hoặc khiến trình duyệt lag vì giao diện cũ kỹ.

Sau 6 tháng chuyển sang Mailpit, mình khẳng định đây là bản nâng cấp cực kỳ đáng giá. Viết bằng ngôn ngữ Go, Mailpit cho tốc độ phản hồi gần như tức thì. Nó mô phỏng hoàn hảo một SMTP server nhưng không gửi mail ra ngoài internet. Mọi dữ liệu chỉ nằm gói gọn trong máy dev hoặc server staging của bạn.

Tại sao Mailpit lại vượt trội hơn MailHog?

Mailpit không đơn thuần là một “hố đen” chứa email. Nó là một hệ sinh thái nhỏ gọn nhưng đầy đủ võ nghệ:

  • SMTP Server: Nhận yêu cầu từ Laravel, Node.js, hay Python cực nhanh.
  • Web UI: Giao diện hiện đại, hỗ trợ Dark Mode và xem trước email trên nhiều thiết bị.
  • Hiệu năng: Mailpit chỉ tốn khoảng 20-30MB RAM, trong khi MailHog có thể ngốn hàng trăm MB nếu chứa nhiều mail.
  • API mạnh mẽ: Phù hợp để viết script integration test, tự động kiểm tra nội dung mail.

Điểm cộng lớn nhất là khả năng tìm kiếm. Với Mailpit, bạn có thể lọc hàng nghìn email theo tiêu đề hoặc người nhận trong nháy mắt.

Triển khai Mailpit bằng Docker Compose

Dùng Docker Compose là cách nhanh nhất để setup mà không làm “bẩn” hệ điều hành. Bạn chỉ cần vài dòng cấu hình là có ngay một hệ thống test chuyên nghiệp.

1. Tạo file docker-compose.yml

Hãy tạo thư mục mail-test-lab và lưu file docker-compose.yml với nội dung sau:

version: '3.8'

services:
  mailpit:
    image: axllent/mailpit:latest
    container_name: mailpit
    restart: always
    ports:
      - "8025:8025" # Web UI
      - "1025:1025" # SMTP server
    environment:
      - MP_MAX_MESSAGES=5000
      - MP_DATABASE=/data/mailpit.db
      - TZ=Asia/Ho_Chi_Minh
    volumes:
      - ./mailpit-data:/data

2. Những thông số bạn cần lưu ý

  • Port 8025: Địa chỉ truy cập giao diện quản lý trên trình duyệt.
  • Port 1025: Cổng SMTP để ứng dụng kết nối vào.
  • MP_MAX_MESSAGES: Mình thường giới hạn 5000 mail để tránh đầy ổ cứng máy dev.
  • Volumes: Đừng quên mount volume. Nếu thiếu dòng này, mỗi lần bạn restart Docker là toàn bộ email test cũ sẽ biến mất sạch sẽ.

3. Khởi chạy

Mở terminal và gõ lệnh duy nhất:

docker compose up -d

Bây giờ, hãy truy cập http://localhost:8025. Giao diện Mailpit đã sẵn sàng chờ đợi những email đầu tiên từ app của bạn.

Kết nối ứng dụng tới Mailpit

Để kiểm tra, mình dùng một đoạn script Node.js với thư viện nodemailer. Các framework như Laravel hay Django cũng cấu hình tương tự.

const nodemailer = require("nodemailer");

async function main() {
  let transporter = nodemailer.createTransport({
    host: "localhost",
    port: 1025,
    secure: false,
  });

  let info = await transporter.sendMail({
    from: '"Kỹ sư IT" <[email protected]>',
    to: "[email protected]",
    subject: "Mailpit Test!",
    html: "<b>Nội dung email hiển thị cực mượt.</b>",
  });

  console.log("Đã gửi: %s", info.messageId);
}

main().catch(console.error);

Sau khi chạy script, email sẽ xuất hiện tức thì trên Web UI. Bạn có thể kiểm tra định dạng HTML có bị vỡ hay link đính kèm có chạy đúng không.

Kinh nghiệm thực chiến: Lỗi Network kinh điển

Sai lầm phổ biến nhất khi dùng Docker là cấu hình MAIL_HOST. Nếu ứng dụng của bạn cũng chạy trong container, đừng dùng localhost. Trong môi trường Docker, localhost chính là bản thân container chứa app chứ không phải Mailpit.

Giải pháp là gì? Bạn phải đổi MAIL_HOST thành tên service đã đặt trong file compose, ví dụ: MAIL_HOST=mailpit.

Một mẹo nhỏ khác: Mailpit có tính năng Check Spam Score. Khi click vào email, hãy xem tab phía trên để biết mail của bạn có thiếu header quan trọng nào không. Điều này giúp tránh việc mail thật bị rơi vào folder Spam sau này.

Nâng tầm quy trình làm việc team

Thay vì mỗi người tự chạy một bản local, hãy deploy Mailpit lên server staging chung của team. Mọi email từ môi trường test sẽ đổ về một mối. Tester có thể chủ động vào kiểm tra nội dung mà không cần làm phiền developer chụp màn hình.

Mailpit còn hỗ trợ tính năng Screenshot tự động. Nó render email và chụp ảnh lại trên các kích thước màn hình khác nhau. Đây là tính năng “ăn tiền” giúp bạn đảm bảo giao diện mail đẹp trên cả iPhone lẫn Desktop.

Kết luận

Chuyển từ MailHog sang Mailpit giống như đổi từ một chiếc xe cũ hay hỏng vặt sang xe đời mới. Nó êm ái, tốc độ và đầy đủ tiện nghi. Docker Compose giúp việc thiết lập này trở nên chuyên nghiệp và dễ dàng chia sẻ trong team.

Hãy thử cài đặt ngay hôm nay. Bạn sẽ tiết kiệm được hàng giờ chờ đợi email và loại bỏ hoàn toàn nỗi lo gửi nhầm mail cho khách hàng thật.

Share: