Postfix, SMTP relay và mySQL

Ở 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 PostfixmySQL để 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_relayhostsender_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;

Comments Off on Postfix, SMTP relay và mySQL

Filed under Software

Comments are closed.