Trong phần này chúng ta tạo script để kết nối Postfix và MariaDB.
Making Postfix get its information from the MariaDB database
Postfix sẽ truy cập CSDL thông qua các dòng lệnh mysql được thiết lập trong các file /etc/postfix/*.cf
Nếu CSDL được biến tấu khác đi thì chỉnh sửa câu lệnh trong các file này.
- virtual_mailbox_domains: Giúp Postfix lấy thông tin về mail domain ảo trong CSDL
- virtual_mailbox_maps: xác định xem địa chỉ email tương ứng với mailbox nào trên đĩa. Postfix chỉ cần xác định email có hợp lệ không còn việc lưu trữ mail dành cho Dovecot.
- virtual_alias_maps: chỉ định chuyển tiếp email sang (nhiều) địa chỉ khác.
Một khi Postfix nhận một email cho somebody@example.org và muốn kiểm tra xem example.org có phải là mail domain ảo hay không. Nó sẽ chạy một truy vấn SQL bằng cách thay ‘%s’ bằng ‘example.org’. Nếu tìm thấy một dòng trong virtual_mailbox_domains, kết quả trả về là ‘1’.
Chúng ta sử dụng user mailserver / $svr_pwd cho thao tác CSDL. Chú ý là $svr_pwd phải đang còn hiệu lực (xem ~/readme.txt)
## virtual_mailbox_domains ##
cat > /etc/postfix/mysql-virtual-mailbox-domains.cf <<EOT
user = mailserver
password = $svr_pwd
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'
EOT
postconf virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
## virtual_mailbox_maps ##
cat > /etc/postfix/mysql-virtual-mailbox-maps.cf <<EOT
user = mailserver
password = $svr_pwd
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_users WHERE email='%s'
EOT
postconf virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
## virtual_alias_maps ##
cat > /etc/postfix/mysql-virtual-alias-maps.cf <<EOT
user = mailserver
password = $svr_pwd
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM virtual_aliases WHERE source='%s'
EOT
## Sửa đổi cấu hình Postfix ##
postconf virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf
Catch-all aliases
Chuyển tiếp các email không tồn tại sang một địa chỉ nào đó. Qui luật trong bảng virtual_aliases có dạng @example.org -> user@domain.ltd
Postfix sẽ tìm email dạng you@example.org rồi mới đến @example.org nên nếu mail user tồn tại thì không bị chuyển đi. Muốn vậy, mọi mail account phải là alias của chính nó như cách iRedMail áp dụng, nhược điểm là trùng lặp dữ liệu. Hoặc chúng ta dùng cách rà soát cả trên virtual_users cùng với virtual_alias.
## virtual_alias_maps ##
cat > /etc/postfix/mysql-email2email.cf <<EOT
user = mailserver
password = $svr_pwd
hosts = 127.0.0.1
dbname = mailserver
query = SELECT email FROM virtual_users WHERE email='%s'
EOT
## Sửa đổi cấu hình Postfix ##
postconf virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf,mysql:/etc/postfix/mysql-email2email.cf
chgrp postfix /etc/postfix/mysql-*.cf
chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf
Script
#!/bin/bash
# Tên script: 03.postfix.sh
# Cấu hình Postfix cho Maria DB
# © 2020 LNT <lnt@ly-le.info>
# version 20200801
#
echo 'Cấu hình Postfix cho Maria DB...'
HOSTNAME=$(hostname)
DOMAIN=${HOSTNAME#*.}
SEL_PWD=$(sed -n '/mailselect/{n;s/\s*password: \(.*\)/\1/;p;q}' ~/${DOMAIN}.txt)
sed 's/^\(smtpd_banner =\).*/\1 $myhostname ESMTP/' -i /etc/postfix/main.cf
cat > /etc/postfix/mysql-virtual-mailbox-domains.cf <<EOT
hosts = 127.0.0.1:3306
user = mailselect
password = ${SEL_PWD}
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'
EOT
postconf virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
## virtual_mailbox_maps ##
cat > /etc/postfix/mysql-virtual-mailbox-maps.cf <<EOT
hosts = 127.0.0.1:3306
user = mailselect
password = ${SEL_PWD}
dbname = mailserver
query = SELECT 1 FROM virtual_users WHERE email='%s'
EOT
postconf virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
## virtual_alias_maps ##
cat > /etc/postfix/mysql-email2email.cf <<EOT
hosts = 127.0.0.1:3306
user = mailselect
password = ${SEL_PWD}
dbname = mailserver
query = SELECT email FROM virtual_users WHERE email='%s'
EOT
postconf virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf,mysql:/etc/postfix/mysql-email2email.cf
postconf inet_protocols=ipv4
chgrp postfix /etc/postfix/mysql-*.cf
chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf
echo "Restart Postfix ..."
systemctl restart postfix