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ư có mail nữa là . 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 reload

chgrp 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 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.pem

chmod 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