Postfix gởi email từ một IP động thường bị chặn, trả lại hay vào Spam.
Vấn đề không chỉ vì IP động mà quan trọng nhất là IP động do nhà mạng cấp thường nằm trong nhiều danh sách đen của các tổ chức chống spam.
Ta né tránh vấn đề này bằng cách gởi email qua trung gian của các mail server uy tín khác như Google, Microsoft, Mailjet… Tất nhiên là có những hạn chế về số lượng email hay số người nhận được gởi trong ngày.
Giả sử dùng SMTP của Google. Ta soạn thảo file /etc/postfix/main.cf, thêm vào cuối file
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_auth_enable = yes
smtp_sasl_mechanism_filter = login
smtp_sasl_security_options = noanonymous
smtp_sender_dependent_authentication = yes
Trong đó file /etc/postfix/sasl_passwd mô tả cách email đi nhờ nhà hàng xóm như sau:
me@domain.com accA@gmail.com:accA_password
@domain.com accB@gmail.com:accB_password
email me@domain.com được gởi nhờ (relay) qua tài khoản Gmail của accA@gmail.com, còn các email khác được gởi qua tài khoản accB@gmail.com.
Mã hóa sasl_passwd bằng câu lệnh
postmap /etc/postfix/sasl_passwd
Tuy nhiên bấy nhiêu chưa đủ.
Để có thể gởi nhờ email, phải vào các tài khoản Gmail của accA và accB bật Less Secure Apps.
Ngoài ra, dù đã có username/password của tài khoản Gmail nhưng Postfix cần được chỉ rõ tên mail server của Gmail.
Thêm vào main.cf
relayhost = [smtp.gmail.com]:587
Sau đó khởi động lại postfix
sudo postfix reload
Bằng cách này, email sẽ được gởi đi an toàn dưới danh nghĩa Gmail. Người nhận email của me@domain.com sẽ thấy nhận từ accA@gmail.com
Có thể tránh điều này bằng cách vào tài khoản của accA@gmail.com, thêm me@domain.com vào danh sách Send Mail As. Khi đó me@domain.com gởi qua accA@gmail.com vẫn là From: me@domain.com
Nhưng với phần còn lại của @domain.com, nếu khoảng chục người thì thêm hết vào Send Mail As của accB@gmail.com, nếu nhiều quá thì giải pháp này không khả thi, phải dùng các server chuyên dùng cho quảng cáo như mailjet.com
Mailjet giải quyết chuyện gởi nhờ email theo kiểu khác. Khi có tài khoản mailjet gồm username/password_gởi_mail, chúng ta phải cho mailjet biết danh sách những người được phép gởi email qua mailjet, danh sách này có thể vài trăm người (không thể nạp vào Send Mail As của Google). Khi đó file sasl_passwd khai báo đơn giản như sau
@domain.com username:password_gởi_mail
và relayhost
relayhost = [in-v3.mailjet.com]:587
Khởi động lại postfix
sudo postfix reload
Để bảo đảm quản lý hoàn toàn email được gởi đi, mailjet còn hướng dẫn mail server của chúng ta phải cài đặt SPF, DKIM và rDNS theo tham số của mailjet. Nghĩa là khác với Gmail, mailjet cần mail server của chúng ta trở thành server con của mailjet để mailjet có thể thống kê được hiệu quả của việc gởi mail, dù chúng ta chỉ cần chuyển thư qua server của mailjet thôi (nhiều smtp chuyên cho quảng cáo cũng dùng cách này)
Dùng nhiều SMTP Relay
File /etc/postfix/sasl_passwd có thể khai báo tương tự như trên, nhưng dùng nhiều host relay
me@domain.com accMailjet:password_mailjet
@domain.com accGmail:password_gmail
Nhưng relayhost chỉ cho phép khai báo một relay, ngay cả cho relayhost trỏ đến một file cũng không hợp lệ. Khi đó, chúng ta khai báo:
relayhost =
nghĩa là không dùng, và khai báo thêm một dòng vào main.cf
sender_dependent_relayhost_maps = hash:/etc/postfix/sender_maps_user
...
Trong đó /etc/postfix/mysql/sender_maps_user như sau
me@domain.com [in-v3.mailjet.com]:587
* [smtp.gmail.com]:587
và mã hóa nó bằng postmap
Khởi động lại postfix
sudo postfix reload
Chú thích
1. Bên trên chúng ta bật Less Secure Apps để có thể gởi email qua acc/pass của tài khoản email của Gsuite/Gmail.
2. Một cách khác cho các tài khoản Gsuite/Gmail là bật 2 level authentication (xác thực 2 lớp), sau đó là nhờ Google sinh ra mật khẩu cho mỗi ứng dụng, cụ thể là postfix. Khi đó postfix dùng acc/pass_của_ứng_dụng để gởi mail.
Tài khoản Gmail có hạn mức gởi email hàng ngày. Theo thông báo từ Google cho email Gsuite
* Limits per user (Gsuite)
The maximum number of messages a user can send in a 24-hour period is 10,000. However, this can vary, depending on the number of user licenses in your G Suite account.
A registered G Suite user can’t relay messages to more than 10,000 unique recipients in a 24-hour period.
Tuy nhiên còn thêm nhiều chú thích cho thấy định mức trên không rõ ràng.
* GMail thông thường có thể gởi đi 2.000 email/ngày đến một người nhận duy nhất, 500 email/ngày cho nhiều người nhận khác nhau.
Cũng như email GSuite, các thông báo này không rõ ràng và chưa thể kiểm chứng.
* https://support.google.com/a/answer/2956491#sendinglimitsforrelay
* https://www.gmass.co/blog/gmail-send-mail-as-setting-affects-email-deliverability/