Cài đặt MailHog trên Ubuntu

Mình đang dùng Mailtrap để test mail. Nhưng ngặt một nỗi sài free nên chỉ tạo được 1 inbox và bị giới hạn 500 email/tháng. Bình thường ít traffic thì không sao, nhưng tới khi cần test mail nhiều thì bị giới hạn, phải đợi tháng sau hoặc tạo tài khoản mới.

Hôm nay gặp phải vấn đề này, mình chợt nhớ tới MailHog . Một open source project cho email testing. Tính năng cũng tương tự Mailtrap.

mailhog/MailHog

Web and API based SMTP testing

  • Star
    12003
  • Fork
    959
  • Issues
    235
  • Updated
    tháng 5 19, 2023

Có nhiều cách để cài MailHog. Bạn có thể cài local để test mail cho dự án của mình thông qua brew, docker hoặc build MailHog cli từ go. Vì mình muốn share cho team cùng sài vì vậy đã quyết định cài trên một con server Ubuntu version 20.04.

Cài đặt go

Mình quyết định sẽ cài đặt MailHog bằng go nên mình sẽ cài go trên server.

$ sudo apt-get -y install golang-go

Kiểm tra go đã cài thành công chưa?

$ go version
go version go1.17.1 linux/amd64

Cài đặt MailHog cli

Sau khi cài go, chúng ta sẽ cài MailHog như sau:

$ go get github.com/mailhog/MailHog

Sau khi chạy xong, bạn sẽ thấy có một file binary là MailHog trong $HOME/go/bin

$ ls $HOME/go/bin
MailHog

Để chạy được MailHog bạn cần chắc chắn rằng $HOME/go/bin đã được thêm vào PATH. Nếu chưa có bạn có thể thêm như sau:

$ export PATH=$PATH:$HOME/go/bin
$ MailHog -h
Usage of MailHog:
  -api-bind-addr string
...

Cấu hình MailHog

Bây giờ chúng ta sẽ start MailHog, các bạn có thể xem qua danh sách options hoặc environtment variables mà MailHog sử dụng tại đây .

Bài viết này mình sẽ đề cập tới 2 config đó là nơi lưu trữ mailHTTP auth để hạn chế người ngoài truy cập vào web UI.

Dưới đây là command mình đã dùng. Mình sẽ giải thích chi tiết từng flag ở phần bên dưới.

$ MailHog \
    -storage=maildir \
    -maildir-path=/home/thien/.config/mailhog/storage/ \
    -auth-file=/home/thien/.config/mailhog/auth

Nếu muốn chạy deamon, bạn có thể sử dụng nohup đặt ở đầu command.

Sau khi chạy command line trên xong, ta có:

  • SMTP server chạy trên port 1025
  • HTTP server chạy trên port 8025

Tất cả đều là port default của MailHog, bạn có thể thay đổi thông qua cli option.

Nếu không thể connect được tới 2 port này, bạn nhớ check Firewall trên server. Thông thường 2 port này chưa được thêm vào. Vì vậy bạn cần thêm vào danh sách port cho phép.

HTTP server cho phép bạn chạy web UI để xem email. Cách truy cập như sau:

your_server_ip:8025

Hoặc config NGINX reverse proxy để không phải gõ IP dài dòng nữa.

Ngoài ra chúng ta còn có một SMTP server để các ứng dụng khác có thể gởi mail tới MailHog thông qua SMTP. Chúng ta sẽ tìm hiểu ở phần Testing .

Lưu trữ

MailHog cho phép bạn chọn 1 trong 3 loại storage (được cấu hình thông qua -storage) đó là:

  • memory -> default
  • mongodb
  • maildir -> mình chọn option này.

maildir có nghĩa chúng ta sẽ lưu trữ email trên disk. Vì vậy, cần phải cung cấp đường dẫn tới nơi lưu trữ email thông qua -maildir-path. Như bạn có thể thấy, mình đã lưu trữ email trên

$HOME/.config/mailhog/storage

Xem thử sau khi gởi email thì nó sẽ được lưu trữ thế nào

$ ls -la ~/.config/mailhog/storage/
'1X02KI7tIk3RHKrI4iM9BB52d9uLp6xXqzAiQORj0ZU=@mailhog.example'
'26vlyTBhSdZch2oIRBt4wsXQmXZ8d-wOgMfzPrwvGS4=@mailhog.example'

Mỗi dòng tương ứng với 1 email

HTTP auth

Việc chặn những người ngoài truy cập vào HTTP server để xem email cũng khá cần thiết. Trong trường hợp bạn sợ bị lộ thông tin development trong email test. Hoặc đơn giản là không muốn ai xem email của mình trừ bạn và những người được chia sẻ HTTP auth credential.

Để cài đặt HTTP auth, chúng ta có thể cấu hình trong NGINX .

Tuy nhiên, MailHog đã support rất chu đáo khi hỗ trợ luôn việc cấu hình HTTP auth. Bạn có thể xem hướng dẫn chi tiết tại đây .

Mình xin tóm tắt lại các bước như sau:

Sử dụng bcrypt để tạo mật khẩu.

$ MailHog bcrypt <password>
$2a$04$xATkqGWpEto1opDnBUC5peiwwmm37LIu2p5KHmdMusg5RascsXLTa

Sau đó tạo một file để lưu trữ thông tin gồm username và password với format như sau:

username:password

Bạn có thể tạo nhiều tài khoản, mỗi tài khoản là 1 dòng. Ví dụ:

$ cat ~/.config/mailhog/auth
thien:$2a$04$1nbNyIOegat1PU3m5s2NDev7dI3I1Qz5hN8rf8LG3M3Fge8JCJyA.
another:$2a$04$1nbNyIOegat1PU3m5s2NDev7dI3I1Qz5hN8rf8LG3M3Fge8JCJyA.

Để sử dụng được HTTP auth, bạn cần truyền đường dẫn tới file chứa thông tin tài khoản thông qua -auth-file. Trong trường hợp của mình là

$ MailHog -auth-file=/home/thien/.config/mailhog/auth

Testing

Vì mình đang làm một project Laravel, nên mình sẽ config MailHog cho Laravel. Chúng ta chỉ cần thay đổi 2 biến môi trường sau là được:

$ cat .env
MAIL_HOST=<your_server_id>
MAIL_PORT=1025

Bên trên là ví dụ cho Laravel. Những project khác cũng chỉ cần cung cấp đúng host và port là có thể gởi email test được rồi.

Ngoài ra bạn có thể tham khảo một tool MailHog phát triển đó là mhsendmail

$ go get github.com/mailhog/mhsendmail

$ mhsendmail test@mailhog.local <<EOF
From: App <app@mailhog.local>
To: Test <test@mailhog.local>
Subject: Test message

Some content!
EOF

Kết

Việc cài Mailhog cũng tốn tiền server. Nhưng sử dụng Mailhog bạn sẽ thoải mái không sợ giới hạn gì nữa. Và việc cài đặt cũng thú vị, học được nhiều thứ cũng đáng để thứ đấy chứ.