Ở bài trước chúng ta mô tả việc dùng SMTP relay bằng cách soạn thảo trực tiếp vào các file cấu hình của Postfix.
Việc soạn thảo trực tiếp các file cấu hình của Postfix ngoài ưu điểm đơn giản ra còn có bất tiện là phải mã hoá file và khởi động lại Postfix.
Nếu mail server có dùng CSDL thì có thể dùng câu lệnh SQL để cấu hình mail server, không cần mã hoá file và khởi động lại Postfix. Ngoài ra có thể cấu hình từ xa không cần ssh.
Trong thư mục /etc/postfix/mysql có nhiều file .cf chứa các câu lệnh SQL để cấu hình Postfix, khi đó thay vì cấu hình bằng file hash:filename thì dùng mysql:thefile.cf
Sau đây chúng ta cấu hình Postfix và mySQL để gởi mail qua nhiều SMTP relay.
A. Trong CSDL vmail có bảng sender_relayhost, tạo thêm nếu chưa có
USE vmail;
CREATE TABLE `sender_relayhost` (
`id` int(10) UNSIGNED AUTO_INCREMENT NOT NULL,
`account` varchar(255) DEFAULT NULL,
`relayhost` varchar(512) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Đây chính là nơi chúng ta cất relayhost
USE vmail;
INSERT INTO sender_relayhost (account, relayhost)
VALUES ('me@domain.com', '[in-v3.mailjet.com]:25');
INSERT INTO sender_relayhost (account, relayhost)
VALUES ('@domain.com', '[smtp.gmail.com]:587');
Các dòng trên mô tả me@domain.com relay qua in-v3.mailjet.com:25, còn các user khác relay qua smtp.gmail.com:587
1 me@domain.com [in-v3.mailjet.com]:25
2 @domain.com [smtp.gmail.com]:587
Để sử dụng thông tin về relay host trong CSDL, trong main.cf thêm dòng
sender_dependent_relayhost_maps = proxy:mysql:/etc/postfix/mysql/sender_dependent_relayhost_maps.cf
Trong đó nội dung của file sender_dependent_relayhost_maps.cf đã được vmail tạo sẵn như sau
hosts = 127.0.0.1:3306
user = vmail
password = tUIdayNEz5DiB2aDyqgNvbJKD9FjJ6
dbname = vmail
query = SELECT relayhost FROM sender_relayhost WHERE account='%s' LIMIT 1;
Nó chỉ cho Postfix cách kết nối CSDL vmail và lấy ra relayhost cho account
B. Chúng ta còn cần mô tả user nào gởi email relay qua tài khoản SMTP nào. Vì vmail không có sẵn bảng nào như vậy nên chúng ta phải tạo mới bảng sender_relayhost_auth
USE vmail;
CREATE TABLE `sender_relayhost_auth` (
`id` int(11) AUTO_INCREMENT NOT NULL,
`sender` varchar(100) NOT NULL,
`username` varchar(100) NOT NULL,
`password` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
và điền thông tin về account và relayhost vào
INSERT INTO sender_relayhost_auth (sender, username, password) VALUES ('[smtp.gmail.com]:587', 'acc@gmail.com', 'gmail_password');
INSERT INTO sender_relayhost (sender, username, password) VALUES ('me@domain.com', 'mailjet_acc', 'mailjet_password');
1 [smtp.gmail.com]:587 acc@gmail.com gmail_password
2 me@domain.com mailjet_acc mailjet_password
File hướng dẫn sử dụng cho postfix được tạo mới tên /etc/postfix/mysql/sender_dependent_relayhost_auth với nội dung
hosts = 127.0.0.1:3306
user = vmail
password = tUIdayNEz5DiB2aDyqgNvbJKD9FjJ6
dbname = vmail
query = SELECT concat(username, ':', password) FROM sender_relayhost_auth WHERE email='%s' LIMIT 1;
* Chú ý là nếu ở sender_relayhost_auth có khai báo cho một email, thí dụ me@domain.com thì trong sender_relayhost cũng phải có khai báo cho email đó.
* Một cách khai báo khác cho sender_relayhost_auth dễ dùng hơn:
1 @domain.com acc@gmail.com gmail_password
2 me@domain.com mailjet_acc mailjet_password
Trong đó nói rõ tất cả sender thuộc domain.com relay qua gmail, riêng me@domain.com relay qua mailjet.
Cuối cùng sửa file /etc/postfix/main.cf để Postfix dùng dữ liệu của CSDL
relayhost =
smtp_sasl_password_maps = mysql:/etc/postfix/mysql/sender_dependent_relayhost_auth.cf
Việc thêm/bớt relayhost và tài khoản SMTP relay qua SQL có thể thực hiện từ xa, không có nguy cơ làm hỏng cấu hình hệ thống của Postfix.
Hai bảng dữ liệu cần thay đổi khi cần thiết là sender_relayhost và sender_relayhost_auth, các file cấu hình khác của Postfix không thay đổi.
Chú thích
Có thể khai báo nhiều account/password cho một SMTP relay, thí dụ về bảng sender_relayhost_auth
1 [smtp.gmail.com]:587 acc1@gmail.com password1
2 [smtp.gmail.com]:587 acc2@gmail.com password2
3 [smtp.gmail.com]:587 acc3@gmail.com password3
4 me@domain.com acc_mailjet mailjet_passwd
Khi đó câu lệnh SQL đọc tài khoản relayhost chỉ trả về dòng đầu tiên
SELECT concat(username, ':', password) FROM sender_relayhost_auth WHERE email='%s' LIMIT 1;
Có thể sửa câu SQL để trả ngẫu nhiên một tài khoản cho relayhost Gmail
SELECT concat(username, ':', password) FROM sender_relayhost_auth WHERE email='%s' ORDER BY rand() LIMIT 1;