Gửi email transactional trên VPS với Postfix relay

Ứng dụng của bạn cần gửi email xác nhận đơn hàng, thông báo mật khẩu, hay email kích hoạt tài khoản, nhưng relay SMTP từ VPS thường xuyên bị spam, rớt vào thư rác, hoặc bị chặn bởi Gmail, Outlook vì IP không có reputation. Giải pháp là thiết lập Postfix làm relay agent trên chính VPS của bạn, gửi email qua các dịch vụ SMTP trung gian có uy tín như SendGrid, Amazon SES, hay Mailgun. Bài viết này hướng dẫn chi tiết cách cấu hình Postfix relay trên Ubuntu 24.04, kèm khai báo SPF, DKIM, DMARC để đảm bảo email transactional đến được hộp thư chính.
Yêu cầu trước khi bắt đầu
- Một máy chủ VPS chạy Ubuntu 24.04 LTS với quyền sudo (hoặc root). Bạn có thể thuê VPS Linux tại các nhà cung cấp trong nước hoặc quốc tế.
- Tên miền riêng (ví dụ: example.com) đã trỏ DNS về VPS.
- Tài khoản dịch vụ SMTP trung gian: SendGrid, Amazon SES, Mailgun, hoặc Mailjet. Bài viết sử dụng SendGrid làm relay chính.
- Cổng SMTP (25, 587, 465) đã được mở trên firewall của VPS và nhà cung cấp mạng. Nếu VPS dùng IPv4 Việt Nam, kiểm tra thêm port 25 có bị chặn không.
Tại sao cần relay SMTP thay vì gửi trực tiếp từ Postfix?
Postfix tự gửi email trực tiếp qua SMTP của VPS (port 25) thường xuyên bị từ chối bởi các hộp thư lớn (Gmail, Outlook, Yahoo) vì IP VPS chưa có reputation, dễ bị liệt vào blacklist. Các dịch vụ relay trung gian (SendGrid, SES, Mailgun) có IP pool sạch, reputation đã được xây dựng, và cung cấp các cơ chế chống spam (SPF, DKIM, DMARC) ngay từ đầu. Việc cấu hình Postfix làm relay chỉ gửi qua dịch vụ này giúp email transactional của bạn tỷ lệ vào inbox cao hơn rõ rệt, đồng thời bạn vẫn giữ toàn quyền quản trị trên VPS SMTP của mình.
Bước 1 - Cài đặt Postfix và các gói hỗ trợ
Cập nhật hệ thống và cài Postfix cùng các gói cần thiết:
sudo apt update
sudo apt install -y postfix mailutils libsasl2-modules
Trong quá trình cài đặt, chọn "Internet Site" khi được hỏi loại cấu hình Postfix. Nhập tên domain (ví dụ: mail.example.com) làm System mail name (có thể chỉnh sau).
Giải thích: mailutils cung cấp các lệnh kiểm tra thư như sendmail, mail. libsasl2-modules hỗ trợ xác thực SASL cho phiên SMTP relay.
Bước 2 - Lấy thông tin xác thực từ dịch vụ SMTP relay
Đăng nhập vào tài khoản SendGrid (hoặc SES/Mailgun). Tạo API key hoặc username/password cho SMTP. Với SendGrid:
- Vào Settings > API Keys > Create API Key.
- Chọn Full Access, copy key (dạng:
SG.xxxxx). - Server SMTP của SendGrid:
smtp.sendgrid.net, port587(STARTTLS) hoặc465(SSL/TLS).
Nếu dùng Amazon SES: lấy SMTP credentials từ IAM, server: email-smtp.{region}.amazonaws.com, port 587. Mailgun: server: smtp.mailgun.org, port 587, username là domain của bạn, password là SMTP password.
Bước 3 - Cấu hình Postfix relay qua SMTP trung gian
Sửa file cấu hình chính của Postfix:
sudo nano /etc/postfix/main.cf
Thêm hoặc chỉnh sửa các dòng sau (ví dụ dùng SendGrid):
# Relay host: server + port
relayhost = [smtp.sendgrid.net]:587
# Bật SASL authentication
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
# TLS
smtp_use_tls = yes
smtp_tls_security_level = encrypt
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
# Giới hạn số lượng kết nối đồng thời tới relayhost (tránh bị rate limit)
smtp_connection_cache_destinations = smtp.sendgrid.net:587
smtp_connection_cache_time_limit = 2m
Nếu dùng SES hoặc Mailgun, thay relayhost tương ứng. Lưu file và đóng.
Tạo file mật khẩu cho SASL:
sudo nano /etc/postfix/sasl_passwd
Nội dung (thay apikey:your_api_key bằng API key SendGrid thật):
[smtp.sendgrid.net]:587 apikey:your_api_key
Lưu ý: Với SendGrid, username là apikey, password là chính API key. Với SES, username và password lấy từ IAM. Với Mailgun, username là domain đăng ký (vd: [email protected]), password là SMTP password.
Cập nhật quyền và tạo database hash:
sudo chmod 600 /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sasl_passwd
Khởi động lại Postfix:
sudo systemctl restart postfix
Bước 4 - Xác thực cấu hình bằng lệnh gửi thử
Dùng lệnh sendmail hoặc mail để gửi email kiểm tra:
echo "Subject: Test email from Postfix relay" | sendmail -v [email protected]
Hoặc dùng mail:
echo "Body content" | mail -s "Test Postfix relay" [email protected]
Kiểm tra log của Postfix để xem gửi thành công không:
sudo tail -f /var/log/mail.log
Bạn sẽ thấy dòng như: status=sent (250 OK id=xxxxx). Vào hộp thư Gmail/Outlook kiểm tra email có vào inbox không. Nếu vào Spam, cần chuyển sang bước thiết lập SPF/DKIM.
Bước 5 - Cấu hình SPF, DKIM, DMARC cho domain
Đây là bước quan trọng nhất đảm bảo email không bị đánh dấu spam. Các bản ghi DNS này cho phép máy chủ nhận xác thực domain của bạn.
5.1. Thêm bản ghi SPF
SPF cho phép domain chỉ định IP nào được phép gửi email. Vào DNS zone của domain (thường trên Cloudflare, quản trị tên miền, hoặc hosting). Thêm bản ghi TXT:
- Tên: @ (hoặc để trống tùy DNS provider)
- Giá trị:
v=spf1 include:_spf.sendgrid.net ~all
Nếu dùng SES: include:amazonses.com. Mailgun: include:mailgun.org. Bạn có thể kết hợp nhiều include cách nhau bằng dấu cách. ~all (softfail) an toàn hơn -all (hardfail) khi bắt đầu.
5.2. Cấu hình DKIM
SendGrid tự quản lý DKIM. Vào Settings > Sender Authentication > Domain Authentication, làm theo hướng dẫn để thêm bản ghi CNAME vào DNS. Tương tự SES và Mailgun cũng yêu cầu thêm bản ghi TXT chứa public key DKIM.
Nếu bạn muốn tự ký DKIM (không qua relay), có thể dùng OpenDKIM. Cài đặt:
sudo apt install -y opendkim opendkim-tools
Sau đó cấu hình file /etc/opendkim.conf và thêm Domain, KeyFile, Selector. Tạo key và thêm bản ghi TXT vào DNS. Do phạm vi bài viết, tôi khuyên dùng DKIM do relay provider quản lý vì dễ hơn và vẫn đạt hiệu quả.
5.3. Thêm bản ghi DMARC
DMARC cho biết hộp thư nhận nên làm gì với email không đạt SPF/DKIM. Thêm bản ghi TXT:
- Tên:
_dmarc - Giá trị:
v=DMARC1; p=none; rua=mailto:[email protected]
Bắt đầu với policy p=none để giám sát, sau 1-2 tuần chuyển sang p=quarantine hoặc p=reject khi đã ổn định.
Bước 6 - Kiểm tra và tối ưu
Sau khi thêm DNS, chờ tối đa 24h (thường vài phút với Cloudflare). Gửi lại email kiểm tra và dùng công cụ mail-tester.com để đánh giá điểm spam (nên đạt 10/10).
Các tối ưu thêm:
- Giới hạn số lượng email gửi mỗi giờ từ Postfix (trong
main.cf:smtp_destination_rate_delay = 1s). - Cài fail2ban để khóa IP gửi thư rác qua relay của bạn (nếu mở relay cho ứng dụng bên ngoài).
- Bật logging chi tiết:
smtp_tls_loglevel = 1.
Xử lý lỗi thường gặp
Lỗi 1: "SASL authentication failed" khi gửi
Nguyên nhân: file mật khẩu sai hoặc chưa chạy postmap. Kiểm tra lại dòng trong sasl_passwd đúng định dạng [server]:port username:password. Chạy lại sudo postmap /etc/postfix/sasl_passwd và restart Postfix.
Lỗi 2: Email gửi được nhưng vào Spam
Chưa có SPF/DKIM/DMARC hoặc sai cú pháp. Dùng mail-tester.com để kiểm tra điểm. Thêm thiếu include:_spf.sendgrid.net (hoặc provider của bạn) trong SPF là lỗi phổ biến.
Lỗi 3: "Connection timed out" tới relayhost
Port 587 hoặc 465 có thể bị chặn bởi firewall VPS hoặc nhà mạng. Kiểm tra bằng sudo ss -tlnp | grep :587 (không thấy là firewall đang chặn ra). Mở port đi:
sudo ufw allow out 587/tcp
Nếu ở Việt Nam, một số ISP chặn port 25, nhưng port 587 (submission) và 465 (smtps) thường không bị chặn. Nếu dùng thuê VPS Việt Nam, kiểm tra chính sách mạng trước.
Câu hỏi thường gặp
Có thể dùng Postfix relay với nhiều dịch vụ SMTP cùng lúc không?
Có. Bạn có thể cấu hình relayhost chỉ định một relay chính, hoặc dùng transport_maps để route từng domain đích qua relay khác nhau. Ví dụ: gửi qua SendGrid cho email thường, qua SES cho email marketing.
Cấu hình Postfix relay có làm chậm ứng dụng không?
Hầu như không, vì Postfix xếp hàng đợi (queue) và gửi nền. Thời gian gửi trung bình từ lúc ứng dụng push mail đến khi tới relay = vài giây.
Phải dùng relay trả phí hay có thể dùng Gmail SMTP miễn phí?
Gmail SMTP (smtp.gmail.com) chỉ cho phép gửi 500 email/ngày với tài khoản cá nhân, không phù hợp sản xuất. Dịch vụ relay trả phí như SendGrid (100 email/ngày free) hoặc SES (giá rẻ) đáng tin hơn.
Làm sao biết email của tôi bị blacklist?
Kiểm tra IP VPS tại mxtoolbox.com. Nếu bị liệt, gửi yêu cầu gỡ hoặc dùng relay provider có IP pool sạch (như SendGrid).
Có cần mua SSL riêng cho Postfix không?
Không, Postfix dùng chứng chỉ hệ thống từ CA đã cài sẵn. Nhưng nếu bạn tự ký DKIM, cần tạo key riêng (miễn phí).
Bài viết liên quan
- Phần mềm email marketing miễn phí và opensource 2026
- Hướng dẫn sử dụng Thunderbird email trên VPS
- Cách cấu hình DNS record A, CNAME, MX, TXT cho tên miền
- Cấu hình Nginx làm reverse proxy trên Ubuntu 24.04


