Postfix MailServer + Dovecot + MySql
Có tìm trên mạng, trên trang chủ của Postfix cũng có tut hướng dẫn chi tiết vấn đề này. Tuy nhiên đó là nền Debian leny. Mình lại dùng CentOS. :(.
Nhưng nói chung giống nhau. Hn viết lại theo chuẩn CentOS :))
Chuẩn bị
Đảm bảo hostname + DNS chuẩn nhé
yum instal -y db4 db4-devel
Cái này để lấy file db.h. hix.
yum -y install mysql mysql-devel dovecot cyrus-sasl
Cấu hình mysqlserver nhé.
Tiếp theo là postfix. Mặc định postfix trên CentOS ko hỗ trợ mysql, do đó cần cài từ source. Đây là đoạn code configure của mình:
make -f Makefile.init makefiles \
CCARGS='-DUSE_SASL_AUTH -I/usr/include/sasl \
-DHAS_MYSQL -I/usr/include/mysql' \
AUXLIBS='-L/usr/lib -lsasl2 \
-L/usr/lib/mysql -lmysqlclient -lz -lm'
make
make install
Trước đó:
groupadd -g 1001 postfix
groupadd -g 1002 postdrop
useradd -g 1001 postfix
useradd -g 1002 postdrop
Cài xong type:
postfix start
postconf -m
Để ý sẽ thấy module mysql
Cái này vì postfix yêu cầu tên 2 user đó độc lập.
Bước vào cấu hình.
Đăng nhập vào mysqlserver nhé:
Bắt đầu nào:
mysql -u root -p
Type pass root, tại dấu nhắc mysql>
create database mailserver;
GRANT SELECT ON mailserver.\* TO mailuser@localhost IDENTIFIED BY '12346';
Tạo xong user và database, trình SQL có hạn nên chỉ biết có vậy:
Tiếp là tạo table lưu domain:
use mailserver;
CREATE TABLE \`virtual\_domains\` ( id INT NOT NULL AUTO\_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL ) ENGINE = InnoDB;
Table lưu user:
CREATE TABLE \`virtual\_users\` (
id int(11) NOT NULL AUTO\_INCREMENT PRIMARY KEY,
domain\_id INT(11) NOT NULL,
user VARCHAR(40) NOT NULL,
password VARCHAR(32) NOT NULL,
CONSTRAINT UNIQUE\_EMAIL UNIQUE (domain\_id,user),
FOREIGN KEY (domain\_id) REFERENCES virtual\_domains(id) ON DELETE CASCADE
) ENGINE = InnoDB;
Table alias:
CREATE TABLE \`virtual\_aliases\` (
id int(11) NOT NULL AUTO\_INCREMENT PRIMARY KEY,
domain\_id INT(11) NOT NULL,
source VARCHAR(40) NOT NULL,
destination VARCHAR(80) NOT NULL,
FOREIGN KEY (domain\_id) REFERENCES virtual\_domains(id) ON DELETE CASCADE
) ENGINE = InnoDB;
Tạo map file:
Taọ file: /etc/postfix/mysql-virtual-mailbox-domains.cf với nội dung:
user = mailuser
password = 123456
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual\_domains WHERE name='%s'
Map vào postfix:
postconf -e virtual\_mailbox\_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
```
Bây h ta add domain, ngừoi ta dùng lệnh nhưng mình xài phpmyadmin; |
Các bạn vào ấy add bt, nếu ko vào mysql:
```
> ```
> INSERT INTO virtual\_domains (id, name) VALUES (1, 'example.com');
> ```
Nhập domain ấy cho postfix:
> ```
> postmap -q example.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
>
> ```
Nếu kết quả là 1 thì ok, còn nếu ko đc thì có thể lỗi phần config connect to mysql
tiếp đến là virtual mailbox: Hiểu đơn giản là postfix nhận thư nhé, deliver tới cho dovecot. Dovecot sẽ chia tới các mail dir. Nhưng mà vì là user ảo nên cần có 1 user thật đứng ra nhận cho nó:
> ```
> groupadd -g 5000 vmail
> useradd -g vmail -u 5000 vmail -d /home/vmail -m
> postconf -e virtual\_uid\_maps=static:5000
> postconf -e virtual\_gid\_maps=static:5000
>
> ```
Vào mysql add 1 user:
> ```
> INSERT INTO virtual\_users (id, domain\_id, user, password)
> VALUES (1, 1, 'john', MD5('summersun'));
>
> ```
Tạo 1 view trung gian:
> ```
> CREATE VIEW view\_users AS
> SELECT CONCAT(virtual\_users.user, '@', virtual\_domains.name) AS email,
> virtual\_users.password
> FROM virtual\_users
>
> ```
> ```
> LEFT JOIN virtual\_domains ON virtual\_users.domain\_id=virtual\_domains.id;
>
> ```
Tạo file: /etc/postfix/mysql-virtual-mailbox-maps.cf
> ```
> user = mailuser
> password = 123456
> hosts = 127.0.0.1
> dbname = mailserver
> query = SELECT 1 FROM view\_users WHERE email='%s'
>
> ```
Nạp vào cấu hình postfix:
```
postconf -e virtual\_mailbox\_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
Map user kia:
>
postmap -q john@example.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
```
Tạo: alias map, dùng để forward mail đó ra một hệ thống khác, kiểu như john@example.com có mail nữa là john@gmail.com. H bạn muốn cả gmail cũng nhận đc thì cần có nó:
INSERT INTO virtual\_aliases (id, domain\_id, source, destination)
VALUES (1, 1, 'john', 'john@example.com'),(2, 1, 'john', 'jmiller@gmail.com');
Tạo view, trình sql kém chỉ biết là nhìn cho đẹp:
CREATE VIEW view\_aliases AS
SELECT CONCAT(virtual\_aliases.source, '@', virtual\_domains.name) AS email,
destination
FROM virtual\_aliases
LEFT JOIN virtual\_domains ON virtual\_aliases.domain\_id=virtual\_domains.id;
Map file: /etc/postfix/mysql-virtual-alias-maps.cf:
user = mailuser
password = 123456
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM view\_aliases WHERE email='%s'
postmap -q [john@example.com](mailto:john@example.com) mysql:/etc/postfix/mysql-virtual-alias-maps.cf
File: etc/postfix/mysql-email2email.cf
user = mailuser
password = 123456
hosts = 127.0.0.1
dbname = mailserver
query = SELECT email FROM view\_users WHERE email='%s'
postmap -q [john@example.com](mailto:john@example.com) mysql:/etc/postfix/mysql-email2email.cf
```
postconf -e virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf,mysql:/etc/postfix/mysql-email2email.cf
Chmod:
>
chgrp postfix /etc/postfix/mysql-*.cf
chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf
```
Deliver mail với Dovecot:
Sửa file: /etc/postfix/master.cf. Thêm:
dovecot unix - n n - - pipe flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -d ${recipient}
postfix reload postconf -e virtual\_transport=dovecot postconf -e dovecot\_destination\_recipient\_limit=1
File: /etc/dovecot.conf
Bỏ dấu# :
protocols = imap imaps pop3 pop3s disable\_plaintext\_auth = no
Sửa các tham số:
mail\_location = maildir:/home/vmail/%d/%n/Maildir
namespace private { separator = . prefix = INBOX. inbox = yes }
mechanisms = plain login
passdb sql { args = /etc/dovecot/dovecot-sql.conf }
userdb static { args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow\_all\_users=yes }
socket listen { master { path = /var/run/dovecot/auth-master mode = 0600 user = vmail } client { path = /var/spool/postfix/private/auth mode = 0660 user = postfix group = postfix } }
protocol lda { log\_path = /home/vmail/dovecot-deliver.log auth\_socket\_path = /var/run/dovecot/auth-master postmaster\_address = [postmaster@example.com](mailto:postmaster@example.com) global\_script\_path = /home/vmail/globalsieverc }
Tạo file: /etc/dovecot/dovecot-sql.conf
driver = mysql connect = host=127.0.0.1 dbname=mailserver user=mailuser password=123456 default\_pass\_scheme = PLAIN-MD5 password\_query = SELECT email as user, password FROM view\_users WHERE email='%u';
service dovecot restart
postfix reloadchgrp vmail /etc/dovecot.conf chmod g+r /etc/dovecot.conf
Phù, tail -f /var/log/maillog, nếu:
dovecot: Dovecot v1.0.rc15 starting up
dovecot: auth-worker(default): mysql: Connected to 127.0.0.1 (mymailserver)
Là ok, dovecot đã connect tới mysql
Test.
Add domain:
INSERT INTO virtual_domains (name) VALUES ('');
postmap -q mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
Add user:
INSERT INTO virtual_users (id, domain_id, user, password)
VALUES (1, 1, 'test', MD5('hbn'));
postmap -q test@example.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
xong, vất vả, trong quá trình test, có lỗi gì thì các bạn cứ tail log ra + google là ok thôi.
Cấu hình SSL:
mkdir -p /etc/ssl/private/
mkdir -p /etc/ssl/certs/
openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/dovecot.pem \
-keyout /etc/ssl/private/dovecot.pemchmod o= /etc/ssl/private/dovecot.pem
Hoàn tất cấu hình SMTP
postconf -e smtpd_sasl_type=dovecot
postconf -e smtpd_sasl_path=private/auth
postconf -e smtpd_sasl_auth_enable=yes
postconf -e smtpd_recipient_restrictions=permit_mynetworks,per mit_sasl_authenticated,reject_unauth_destination
Phù, vất vả qúa.
Thanks for reading
---------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------
All my Lab:
Linux Lab -- window and Cisco Lab
to be continued - I will update more.
Nam Habach