Khi bạn cần gửi email marketing định kỳ cho một danh sách khách hàng: ví dụ những người đã tham gia một chiến dịch contest: việc chọn đúng nền tảng gửi email là bước quyết định chất lượng chiến dịch. Trong quá trình triển khai dự án cho khách hàng tại CODE TỐT, chúng tôi cần một giải pháp open-source, nhẹ, hỗ trợ Amazon SES và có REST API để đồng bộ danh sách user một cách tự động. Bài viết này tổng hợp kết quả đánh giá chi tiết các platform đáp ứng đúng những tiêu chí đó.
Bối cảnh và yêu cầu
Dự án tham chiếu là một ứng dụng tổ chức contest (Laravel 13 + React SPA). Sau khi contest kết thúc, khách hàng cần gửi email marketing tới những user đã tham gia. Use case cụ thể là broadcast + phân khúc: không cần automation phức tạp. Nền tảng được chọn phải đáp ứng 4 tiêu chí:
- Hỗ trợ Amazon SES: gửi qua SMTP endpoint, chi phí thấp, deliverability tốt.
- Open source: tự chủ về dữ liệu, không bị lock-in.
- REST API tốt: để đồng bộ danh sách user từ ứng dụng một cách tự động.
- Tài nguyên thấp: chạy thoải mái cạnh ứng dụng chính trên cùng một server.
Bảng so sánh nhanh
| Platform | License | Stack | Database | SES | Automation | API | Tài nguyên |
|---|---|---|---|---|---|---|---|
| Listmonk | AGPL-3.0 | Go | Postgres | Có (SMTP) | Broadcast + segment | Mạnh | Thấp |
| Mautic | GPL-3.0 | PHP | MySQL/MariaDB | Có (SMTP) | Đầy đủ | Có | Cao |
| Keila | AGPL-3.0 | Elixir | Postgres | Có (SMTP) | Broadcast + segment | Kém | TB |
| Mailtrain | GPL-3.0 | Node.js | MySQL/MariaDB | Có (SMTP) | Broadcast | Yếu | TB |
| MailWizz | GPL/commercial | PHP | MySQL | Có | Broadcast + autoresponder | Có | TB |
| phpList | AGPL-3.0 | PHP | MySQL | Có (SMTP) | Broadcast | Yếu | TB |
| Sendportal | MIT | Laravel | MySQL | Có (SMTP) | Broadcast | Có | Thấp |
Lưu ý quan trọng: Sendy và AcelleMail thường bị nhầm là open-source, nhưng thực tế không phải. Sendy là phần mềm trả phí một lần (69 USD): chỉ là wrapper của SES. AcelleMail theo mô hình freemium, bản đầy đủ tính phí. Vì vậy chúng không được đưa vào danh sách open-source ở trên.
Đi sâu từng platform
Listmonk: lựa chọn tối ưu cho broadcast nhẹ
Listmonk là một binary Go duy nhất (hoặc Docker container), cực kỳ nhẹ: chạy thoải mái cạnh ứng dụng chính trên cùng một server. Nó hỗ trợ Amazon SES native qua SMTP endpoint, có REST API rất mạnh để đồng bộ danh sách user từ ứng dụng, UI hiện đại và xử lý list lớn tốt. Phân khúc được thực hiện bằng Lists + attributes (tag theo giai đoạn tham gia).
Điểm cần lưu ý duy nhất: Listmonk chỉ hỗ trợ PostgreSQL, không hỗ trợ SQLite hay MySQL. Đây là điều nhiều nguồn cũ ghi nhầm: nếu server của bạn chưa có Postgres, cần cài thêm. Giấy phép là AGPL-3.0 (không phải MIT như một số nguồn ghi nhầm).
GitHub: knadh/listmonk
Mautic: đầy đủ automation nhưng nặng
Mautic là open-source thật sự (GPL-3.0) với hệ thống automation đầy đủ: lead scoring, workflow, drip campaign. Tuy nhiên nó khá nặng: cần cron + worker và tốn RAM, nên dễ trở thành overkill cho use case broadcast đơn giản. Chọn Mautic khi bạn thực sự cần marketing automation phức tạp.
GitHub: mautic/mautic
Keila: câu chuyện GDPR/EU tốt
Keila (AGPL-3.0) có nguồn gốc từ Đức, mang lại lợi thế về câu chuyện GDPR/EU: một điểm marketing tốt nếu khách hàng của bạn ở châu Âu. Nó hỗ trợ broadcast + segment nhưng API còn kém trưởng thành so với Listmonk.
GitHub: pentacent/keila
Mailtrain, MailWizz, phpList, Sendportal
Bốn platform này đều hỗ trợ Amazon SES qua SMTP và phù hợp với broadcast cơ bản. MailWizz có thêm autoresponder và API tốt: tuy nhiên mã nguồn chính không công khai trên GitHub, nên truy cập qua trang chủ mailwizz.com. Sendportal (MIT, Laravel) nhẹ và có API tốt: một lựa chọn hợp lý nếu team đã quen hệ sinh thái Laravel. Mailtrain (Node.js) và phpList (AGPL-3.0) thiên về broadcast thuần, API còn yếu.
GitHub: Mailtrain-org/mailtrain | phpList/phplist3 | mettle/sendportal
Kinh nghiệm triển khai thực tế: Listmonk
Chúng tôi đã thực tế triển khai Listmonk cho một dự án khách hàng cần gửi email marketing cho user đã tham gia contest. Quá trình triển khai xác nhận đúng những đánh giá ở trên và bộc lộ vài điểm cần lưu ý:
- Triển khai cực nhẹ: Listmonk chạy như một systemd service, binary Go bind vào
127.0.0.1:9000, phía sau Apache reverse proxy trỏ public domain vào cổng đó. Chạy thoải mái cạnh app Laravel trên cùng một server mà không ảnh hưởng hiệu năng. - PostgreSQL là bắt buộc: đúng như phân tích, Listmonk chỉ dùng Postgres. Chúng tôi phải cài thêm PostgreSQL (role
listmonk+ databaselistmonk) bên cạnh MySQL sẵn có của server. - SMTP và root URL nằm trong DB, không phải config.toml: đây là điểm dễ vấp nhất. Listmonk lưu cấu hình SMTP và
app.root_urltrong bảngsettingscủa database, ghi đè config.toml. Nếu không setroot_url, mọi link (form subscribe, archive, RSS) sẽ render thànhlocalhost:9000thay vì domain thật. - Admin tạo qua web UI: ở phiên bản 6.x, sau khi chạy
./listmonk --install, tài khoản admin được tạo trên giao diện web ở lần truy cập đầu tiên, không phải trong lúc cài đặt.
Kết quả là Listmonk đáp ứng đúng nhu cầu broadcast + phân khúc của dự án, với tài nguyên tối thiểu và REST API giúp đồng bộ danh sách user từ Laravel một cách tự động.
Khuyến nghị cuối
- Listmonk: lựa chọn hàng đầu cho broadcast nhẹ, đặc biệt khi đã có Postgres. Phù hợp nhất với use case gửi email cho user đã tham gia contest.
- Mautic: nếu cần automation nặng (lead scoring, workflow, drip).
- Keila: nếu ưu tiên GDPR/EU và khách hàng ở châu Âu.
Checklist deliverability với Amazon SES
Bất kể chọn platform nào, deliverability phụ thuộc vào cấu hình SES đúng cách:
- Verify domain + DKIM trên Amazon SES trước khi gửi.
- Request production access: sandbox chỉ gửi được tới email đã verify.
- Consent / double opt-in: chỉ gửi tới user đã đồng ý nhận email, tránh bị đánh dấu spam.
Tham khảo: Cấu hình email SMTP trên website WordPress | So sánh AWS Native và RunCloud
