Postfix và SMTP relay

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/

Comments Off on Postfix và SMTP relay

Filed under Software

Comments are closed.