BillionMail là phần mềm mã nguồn mở của aaPanel, gói sẵn một mail server (Postfix, Dovecot, Rspamd, RoundCube) và công cụ gửi email marketing. Dự án có hơn 16.000 sao trên GitHub, và được quảng cáo là “gửi email không giới hạn” sau 8 phút cài đặt. Tôi đọc toàn bộ mã nguồn ở commit fc36c76c (11/06/2026) mà không chạy script cài đặt nào. Kết luận ngắn: chưa nên dùng BillionMail cho hệ thống gửi thư thật, và tuyệt đối không cài chung với server đang chạy website.
BillionMail là gì?
BillionMail gom hai thứ vào một bộ Docker Compose: phần mail server để nhận và gửi thư cho domain của bạn, và phần quản lý chiến dịch gồm danh sách liên hệ, mẫu thư, lịch gửi, warmup IP, theo dõi lượt mở và lượt click. Phần lõi viết bằng Go (GoFrame), giao diện Vue 3, cơ sở dữ liệu PostgreSQL và Redis. Giấy phép là AGPL-3.0.
Các số liệu quảng cáo đều khớp khi kiểm qua GitHub API: 16.107 sao, 1.788 fork, đúng 1.333 commit. Nhưng nhịp phát triển đã chậm hẳn. Năm 2025 có 21 bản phát hành, từ V0.01 tới v4.9 (12/2025). Từ tháng 7 đến tháng 11/2026 repo không có commit nào, trong khi số issue đang mở là 234.
aaPanel là ai?
aaPanel là bản quốc tế của BaoTa (宝塔面板), bảng điều khiển hosting rất phổ biến ở Trung Quốc. Panel này có lịch sử bảo mật đáng lo: lỗi cho vào phpMyAdmin không cần đăng nhập năm 2020 (CNNVD-202008-1141), các lỗi chạy lệnh tùy ý CVE-2020-14421 và CVE-2020-14950, và năm 2026 là CVE-2026-101008, CVE-2026-101009 (chèn lệnh, CVSS trên 9). Với hai CVE năm 2026, các nguồn tổng hợp ghi nhận hãng không phản hồi người báo lỗi.
BillionMail lặp lại cách xử lý đó. Kênh nhận báo cáo lỗ hổng ban đầu chỉ là một địa chỉ QQ mail. Một người báo lỗi qua GitHub Security Advisory từ tháng 10/2025 vẫn chưa được ai xem (issue #277). Lỗ hổng đọc file tùy ý báo công khai từ tháng 8/2025 (issue #172) đã được vá từ bản v4.4, nhưng issue vẫn để mở và không có thông báo nào cho người đang chạy bản cũ.
Những vấn đề bảo mật tìm thấy
1. Cài theo cách Docker trong README dùng secret mặc định công khai
README hướng dẫn cài nhanh bằng cp env_init .env && docker compose up -d. File env_init để sẵn tài khoản quản trị billion/billion, đường dẫn ẩn billion, và mật khẩu PostgreSQL, Redis cố định (dòng 2-18). Các giá trị này nằm công khai trên GitHub, và phần xác thực của trang quản trị phụ thuộc vào chúng. Máy nào cài theo cách này mà không đổi .env thì coi như trang quản trị không có khóa. Cách cài bằng install.sh thì tự sinh mật khẩu ngẫu nhiên nên an toàn hơn ở điểm này.
2. Lỗi đọc file tùy ý: đã vá nhưng không thông báo
Ở các bản tới v4.3, hai endpoint /file/read và /file/download cho tài khoản đã đăng nhập đọc file bất kỳ trong container, kể cả file .env chứa mật khẩu hệ thống (issue #172). Ngày 22/08/2025, commit 0325e001 tắt hẳn hai endpoint này, nên từ bản v4.4 trở đi không còn bị. Tuy vậy issue vẫn để mở, không có advisory hay ghi chú phát hành nào. Ai đang chạy bản v4.3 trở về trước nên cập nhật.
3. Khóa ký có thể đoán ra
Token hủy và xác nhận đăng ký được ký bằng một khóa tính từ các hằng số cấu hình (core/internal/service/batch_mail/jwt.go, dòng 98-120). Lỗi này đã có mã CVE-2026-111367. Hệ quả là người ngoài có thể đưa địa chỉ email của người khác vào danh sách nhận mà người đó chưa hề đồng ý. Với luật chống thư rác, đây là rủi ro pháp lý trực tiếp cho chủ hệ thống.
Link theo dõi click cũng “mã hóa” bằng AES nhưng nhét luôn khóa vào chuỗi kết quả (maillog_stat/encryption.go, dòng 16-36). Ai cũng giải mã và tạo lại được, nên domain gửi thư của bạn có thể bị dùng để chuyển hướng tới trang lừa đảo (issue #390).
4. Container quản trị có quyền gọi Docker trên máy chủ
Container core mount /var/run/docker.sock (docker-compose.yml, dòng 195). Cờ :ro không giới hạn Docker API, nên chiếm được trang quản trị gần như chiếm được cả máy chủ. Đây là lý do không nên cài BillionMail chung với website.
5. Script cài đặt và cập nhật
install.shbắt buộc chạy bằng root, tắt SELinux vĩnh viễn (dòng 287-288), và tải Docker, docker-compose, các unit systemd từnode.aapanel.comvới cờ--no-check-certificate, không kiểm checksum (dòng 812-832).- Script bật ufw với chính sách mặc định chặn hết, rồi mở các cổng mail, kể cả POP3 và IMAP không mã hóa (110, 143).
- Lệnh
bm updatetải code mới từ GitHub, merge đè bằng-X theirsrồi pull image theo tag, không kiểm chữ ký (update.sh, dòng 224-267). - Image
billionmail/corechỉ chép một file chạy đã build sẵn, repo không có CI công khai. Không có cách chứng minh image trên Docker Hub khớp với mã nguồn. - Repo còn commit sẵn một private key TLS (
ssl-self-signed/key.pem).
6. Gửi số liệu về aaPanel
Cứ 2 giờ, phần mềm gửi về aapanel.com số thư đã gửi và số relay (core/internal/service/collect/collect.go), không có công tắc tắt. Script cài đặt cũng ping thống kê lượt cài. Nội dung thư và danh sách liên hệ không bị gửi đi, nhưng aaPanel biết IP máy chủ và khối lượng thư của bạn.
Những điểm làm tốt
Postfix được cấu hình đúng, không phải open relay: mynetworks chỉ gồm localhost và có reject_unauth_destination. DKIM 2048 bit, mẫu SPF -all, DMARC p=quarantine và chứng chỉ Let's Encrypt có sẵn. PostgreSQL và Redis chỉ nghe trên localhost.
Thư gửi đi có vào được inbox không?
Có một thiếu sót ảnh hưởng thẳng tới khả năng vào inbox: thư hàng loạt của BillionMail không có header List-Unsubscribe theo RFC 8058. Mã gửi thư chỉ đặt Message-ID và tên người gửi. Gmail và Yahoo bắt buộc header này với người gửi số lượng lớn từ 2024, Outlook áp dụng từ tháng 5/2025, và Gmail bắt đầu từ chối thư không đạt chuẩn từ tháng 11/2025.
Ngoài phần mềm, tự host mail còn gặp các rào cản thực tế:
- Nhiều nhà cung cấp chặn cổng 25: DigitalOcean, Vultr, Hetzner với tài khoản mới; AWS EC2 cho tới khi làm đơn gỡ; Google Cloud chặn hẳn. Nhiều VPS Việt Nam cũng chặn hoặc bắt đăng ký.
- Cần IP sạch, bản ghi PTR khớp hostname, SPF, DKIM, DMARC, và đăng ký Google Postmaster Tools, Microsoft SNDS.
- IP mới phải warmup 2 đến 6 tuần, giữ tỉ lệ bị báo spam dưới 0,1% (ngưỡng cứng của Gmail là 0,3%).
Vì vậy, “gửi không giới hạn” chỉ có nghĩa là phần mềm không đếm số thư. Giới hạn thật nằm ở uy tín IP và domain. Một IP mới sau warmup thực tế gửi được vài nghìn thư mỗi ngày vào inbox, không phải hàng triệu.
So với Listmonk, Mailcow, Postal, Mautic
- Listmonk: quản lý danh sách và chiến dịch, viết bằng Go, nhẹ và ổn định, gửi qua SMTP hoặc Amazon SES bên ngoài, có sẵn List-Unsubscribe.
- Mailcow: bộ mail server Docker trưởng thành, chú trọng bảo mật. Phần mail server của BillionMail là phiên bản đơn giản hơn.
- Postal: MTA gửi số lượng lớn, giống SendGrid tự host, có API và webhook.
- Mautic: marketing automation đầy đủ (luồng tự động, chấm điểm lead) nhưng nặng.
- Mailtrain: gần như ngừng phát triển, không nên chọn mới.
Chi phí thật so với Amazon SES, Resend, Brevo
BillionMail miễn phí, nhưng cần VPS khoảng 5 đến 20 USD mỗi tháng, cộng công vận hành, vá lỗi và xử lý blacklist. Amazon SES tính khoảng 0,10 USD cho 1.000 thư. Resend có gói miễn phí 3.000 thư mỗi tháng, gói Pro khoảng 20 USD cho 50.000 thư. Brevo miễn phí khoảng 300 thư mỗi ngày. Với khối lượng vài nghìn đến vài chục nghìn thư mỗi tháng, gửi qua dịch vụ có sẵn rẻ hơn công tự vận hành mail server. Giá ở đây là số tham khảo, nên kiểm lại trên trang của từng hãng.
Lưu ý pháp lý
- AGPL-3.0: dùng nội bộ, không sửa mã thì không phải làm gì thêm. Sửa mã rồi cung cấp cho người khác dùng qua mạng thì phải công bố phần mã đã sửa.
- Nghị định 91/2020/NĐ-CP: chỉ gửi thư quảng cáo khi người nhận đã đồng ý trước, gắn nhãn quảng cáo ở tiêu đề, có cách từ chối nhận, không dùng địa chỉ thu thập trái phép.
- CAN-SPAM và GDPR: tiêu đề trung thực, có địa chỉ liên hệ, xử lý yêu cầu hủy nhanh; với người nhận ở EU cần sự đồng ý rõ ràng.
Có nên dùng BillionMail không?
Với hệ thống gửi thư thật, câu trả lời của tôi là chưa. Cách an toàn hơn là dùng Listmonk (hoặc tính năng Broadcasts của Resend) để quản lý danh sách, rồi gửi qua Resend hoặc Amazon SES trên một subdomain riêng cho marketing.
Nếu vẫn muốn thử BillionMail để học hoặc làm hộp thư nội bộ:
- Cài trên một VPS riêng và trống. Hỏi trước nhà cung cấp về cổng 25 và PTR.
- Không dùng
env_initnhư README. Tự sinh mọi mật khẩu bằngopenssl rand, đặtjwt.secretriêng, xóa và sinh lại thư mụcssl-self-signed. - Đổi dải mạng
IPV4_NETWORKmặc định (172.66.1.0/24, trùng dải IP của Cloudflare) sang dải như 10.66.1.0/24. - Không mở trang quản trị ra Internet. Đặt sau Cloudflare Tunnel và Cloudflare Access, hoặc bật danh sách IP được phép.
- Đóng cổng 110 và 143, bắt buộc TLS khi đăng nhập.
- Chặn kết nối ra
aapanel.comvàbt.cn, tự build imagecoretừ mã nguồn, không chạybm update. - Gửi ra ngoài qua relay SES hoặc Resend, nhưng nhớ rằng thư hàng loạt vẫn thiếu header List-Unsubscribe.
Bài viết dựa trên việc đọc mã nguồn và metadata công khai của GitHub, Docker Hub; tôi không chạy phần mềm và không đăng nhập trang demo. Repo: github.com/aaPanel/BillionMail.



![[Dowload] Avast 8! – Tính năng của phần mềm antivirus mới [Dowload] Avast 8! – Tính năng của phần mềm antivirus mới](/wp-content/uploads/2013/09/p8_s1.jpg)


