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é
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:
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:
Tiếp là tạo table lưu domain:
Taọ file: /etc/postfix/mysql-virtual-mailbox-domains.cf với nội dung:
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ó:
Sửa file: /etc/postfix/master.cf. Thêm:
Bỏ dấu# :
Test.
Add domain:
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:
Thanks for reading
---------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------
All my Lab:
Linux Lab -- window and Cisco Lab
to be continued - I will update more.
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-develCái này để lấy file db.h. hix.
yum -y install mysql mysql-devel dovecot cyrus-saslCấ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 \Trước đó:
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
groupadd -g 1001 postfixCài xong type:
groupadd -g 1002 postdrop
useradd -g 1001 postfix
useradd -g 1002 postdrop
postfix startĐể ý sẽ thấy module mysql
postconf -m
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 -pType pass root, tại dấu nhắc mysql>
create database mailserver;Tạo xong user và database, trình SQL có hạn nên chỉ biết có vậy:
GRANT SELECT ON mailserver.* TO mailuser@localhost IDENTIFIED BY '12346';
Tiếp là tạo table lưu domain:
use mailserver;Table lưu user:
CREATE TABLE `virtual_domains` ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL ) ENGINE = InnoDB;
Table alias: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;
Tạo map file: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;
Taọ file: /etc/postfix/mysql-virtual-mailbox-domains.cf với nội dung:
Map vào postfix:user = mailuser password = 123456 hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_domains WHERE name='%s'
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:
Nhập domain ấy cho postfix:INSERT INTO virtual_domains (id, name) VALUES (1, 'example.com');
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 mysqlpostmap -q example.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
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ó:
Vào mysql add 1 user: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
Tạo 1 view trung gian:INSERT INTO virtual_users (id, domain_id, user, password) VALUES (1, 1, 'john', MD5('summersun'));
CREATE VIEW view_users AS SELECT CONCAT(virtual_users.user, '@', virtual_domains.name) AS email, virtual_users.password FROM virtual_users
Tạo file: /etc/postfix/mysql-virtual-mailbox-maps.cfLEFT JOIN virtual_domains ON virtual_users.domain_id=virtual_domains.id;
Nạp vào cấu hình postfix:user = mailuser password = 123456 hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM view_users WHERE email='%s'
postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
Map user kia:
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ó:postmap -q john@example.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
Tạo view, trình sql kém chỉ biết là nhìn cho đẹp:INSERT INTO virtual_aliases (id, domain_id, source, destination) VALUES (1, 1, 'john', 'john@example.com'),(2, 1, 'john', 'jmiller@gmail.com');
Map file: /etc/postfix/mysql-virtual-alias-maps.cf: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;
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 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 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
Deliver mail với Dovecot:chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf
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}
File: /etc/dovecot.confpostfix reload postconf -e virtual_transport=dovecot postconf -e dovecot_destination_recipient_limit=1
Bỏ dấu# :
Sửa các tham số:protocols = imap imaps pop3 pop3s disable_plaintext_auth = no
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 } }
Tạo file: /etc/dovecot/dovecot-sql.confprotocol lda { log_path = /home/vmail/dovecot-deliver.log auth_socket_path = /var/run/dovecot/auth-master postmaster_address = postmaster@example.com global_script_path = /home/vmail/globalsieverc }
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
Phù, tail -f /var/log/maillog, nếu:chgrp vmail /etc/dovecot.conf chmod g+r /etc/dovecot.conf
Là ok, dovecot đã connect tới mysqldovecot: Dovecot v1.0.rc15 starting up dovecot: auth-worker(default): mysql: Connected to 127.0.0.1 (mymailserver)
Test.
Add domain:
INSERT INTO virtual_domains (name) VALUES ('Add user:');
postmap -qmysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
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.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.
Comments