June 19, 2015

Xây dựng mail server postfix và quản lý email bằng php mysql

Trước đây tôi đã có một bài viết hướng dẫn triển khai mail server đơn giản trên hệ điều hành linux, sử dụng các user của hệ điều hành làm email account. Nay tôi tiếp tục phát triển hướng này và chia sẻ cách để có thể quản lý được nhiều tên miền nhiều email trên một server.

Để tìm hiểu từ gốc đến ngọn các bạn có thể tham khảo bài viết này để biết cách hình thành một mail server nguyên thủy là như thế nào, tuy nhiên nếu muốn học theo kiểu step-by-step thì vẫn có thể bắt đầu ngay với bài viết này và chịu khó theo đúng từng bước của bài viết là xong.
Chuẩn bị: 

  • Bạn cần có một máy chủ hoặc một VPS cài đặt hệ điều hành Centos 5.x trở lên
  • Giả định là bạn đã biết về webserver và đã cài đặt sẵn các ứng dụng apache, php, mysql vàphpmyadmin lên server này nếu như bạn chưa có các ứng dụng này, hãy tham khảo bài viết này or bài này để cài đặt chúng.
1. Thiết lập hostname

Đầu tiên chúng ta cần kiểm tra hostname của máy chủ vì hostname này sẽ dùng cho một số thiết lập hệ thống sau này. Để kiểm tra hostname của linux, chúng ta dùng lệnh sau

# hostname -f

Để thay đổi hostname, chúng ta chỉnh sửa dòng HOSTNAME trong file /etc/sysconfig/network. 

Ngoài ra ta cũng cần định nghĩa hostname gắn với ip của máy chủ này trong file /etc/hosts. Việc định nghĩa hostname trong file /etc/hosts sẽ giúp server có thể diễn dịch các hostname dùng để test mà không cần phải định nghĩa các bản ghi trên DNS server. 


2: Kiểm tra và update yum and repo
Trước hết chúng ta update công cụ cài đặt yum bằng lệnh sau

# yum -y update

Ngoài ra chúng ta cũng cần kiểm tra trong repo của hệ điều hành đã có dòng lệnh exclude=postfix* như hình dưới đây hay chưa bằng lệnh sau:

# vi /etc/yum.repos.d/CentOS-Base.repo

Nếu chưa có thì thêm dòng này vào để quá trình download và cài đặt sẽ lấy bản postfix hỗ trợ mysql. 




3. Kiểm tra và cài đặt các gói mysql-devel, cyrus-sasl, dovecot,postfix 

Khi bạn cài đặt mysql có thể thiếu một số gói phần mềm cần thiết để kết nối postfix với mysql đó là mysql-develvà cyrus-sasl vì vậy chúng ta cần kiểm tra bằng các lệnh sau

# rpm -qa | grep mysql (kiểm tra xem có các gói dịch vụ nào đi kèm với mysql đã được cài đặt)
# rpm -qa | grep sasl (kiểm tra xem gói cyrus-sasl đã được cài đặt chưa)
# rpm -qa | grep dovecot
# rpm -qa | grep postfix

Nếu các gói trên đã có thì OK, còn nếu chưa có chúng ta dùng lệnh sau để cài đặt đồng loạt các gói này

# yum -y install mysql mysql-devel dovecot cyrus-sasl

Chúng ta cũng cần dùng lệnh sau đây để kiểm tra xem postfix đã được cài đặt cùng module mysql hay chưa

# postfix -m

Nếu nhìn thấy module mysql thì OK, còn nếu không thấy, chúng ta dùng lệnh yum remove postfix để gỡ bỏ bản postfix cũ và cài lại bản mới bằng lệnh sau

# yum --enablerepo=centosplus install postfix


4. gỡ bỏ các dịch vụ có xung đột và đặt chế độ tự khởi động cho postfix , dovecot

Hệ điều hành Centos có sẵn một số dịch vụ như sendmail, exim... chúng ta cần kiểm tra và tắt các dịch vụ này đi để tránh xung đột với postfix bằng cách sau

# service sendmail status
# service sendmail stop
# chkconfig sendmail off

Sau đó bật các dịch vụ mới cài đặt ở bước 3 lên

# service mysql start
# service dovecot start
# service postfix start
# chkconfig mysql on
# chkconfig dovecot on
# chkconfig postfix on

5. Đặt mật khẩu cho các user root của mysql 

Bạn cần lưu ý rằng, ngay sau khi cài đặt mysql, cơ sở dữ liệu này đã có sẵn một user có quyền tối cao. Đó là user root, trùng tên với user root của hệ thống nhưng khác là có password bằng trống. Vì vậy phải ngay lập tức đặt mật khẩu cho user này bằng lệnh sau:

# mysql_secure_installation

Khi thực hiện lệnh trên bạn sẽ nhận được 4 câu hỏi như sau:

- Set root password? [Y/n] (Đặt mật khẩu cho root )
- Remove anonymous users? [Y/n] (Xóa bỏ user vô danh)
- Disallow root login remotely? [Y/n] (Không cho phép root đăng nhập từ xa)
- Remove test database and access to it? [Y/n] (Xóa bỏ database test )

Bạn nên trả lời Y cho cả 4 câu hỏi trên để bịt các lỗ hổng bảo mật của mysql.


6. Tạo database mailserver để lưu các thông số domain, email account

Chúng ta dùng luôn user root vừa đặt mật khẩu trên để thực hiện các lệnh tạo database và table từ dòng lệnh như sau. Hoặc nếu bạn đã cài phpmyadmin thì có thể thao tác tạo database và table trên giao diện web.

# mysql -u root -p

sau khi gõ mật khẩu bạn sẽ được vào khu vực dòng lệnh của mysql với dấu nhắc như sau:

mysql >

Bạn gõ lệnh 

mysql> CREATE DATABASE mail

để tạo một database tên là mail. Sau đó tạo một user có quyền thao tác trên database này bằng lệnh sau:

mysql> USE mail;
mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO "mail_admin"@"localhost" IDENTIFIED BY "123#abc";
mysql> FLUSH PRIVILEGES;

Trong đó 123#abc là mật khẩu của user mail_admin. Bạn nên ghi lại mật khẩu này vì sau đó nó sẽ bị mã hóa trong cơ sở dữ liệu, không còn nhìn được ở dạng plain text nữa.

Lưu ý: 
- các lệnh của mysql đều phải kết thúc bằng dấu chấm phảy (;)
- các tham số in đậm và mầu đỏ ở trên là tùy biến, bạn có thể đặt tên database, và user, mật khẩu theo ý thích của mình, tuy nhiên nếu để test chúng ta nên dùng thống nhất các tên này để tránh phải sửa đổi nhiều ở các bước sau.


7. Tạo các table để quản lý domain và user ảo

Chúng ta cần tạo 4 table là domains, forwarding, transports, và users. table forwarding và transport để dùng cho các chức năng mở rộng sau này của email như forward, relay... Trong bài viết này chưa đề cập đến các chức năng đó nên có thể không cần tạo các table này. Chỉ cần có table domains và users là đủ.

mysql> CREATE TABLE domains (domain varchar(50) NOT NULL, PRIMARY KEY (domain) );
mysql> CREATE TABLE forwardings (source varchar(80) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (source) );
mysql> CREATE TABLE transport ( domain varchar(128) NOT NULL default "", transport varchar(128) NOT NULL default "", UNIQUE KEY domain (domain) );
mysql> CREATE TABLE users (email varchar(80) NOT NULL, password varchar(20) NOT NULL, PRIMARY KEY (email) );
mysql> exit

Lưu ý các lệnh trên có thể thực hiện trong phpmyadmin nếu các bạn đã cài đặt gói dịch vụ này.

8. Thiết lập địa chỉ ip cho mysql server

# vi /etc/my.cnf

thêm vào một dòng như sau:

bind-address = 127.0.0.1

Ghi lại và khởi động lại dịch vụ mysql

# service mysql restart


9. tạo các file cấu hình cho postfix 

Chúng ta cần tạo 4 file cấu hình để postfix biết cách query vào cơ sở dữ liệu, lấy ra các giá trị như domain, forwarding, email account... Các bạn download cả 4 file ở đây sau đó upload lên thư mục /etc/postfix/, mở ra và sửa các tham số user, password và dbname như vừa tạo ở trên .

Sau đó thiết lập permissions và ownership cho các file này bằng các lệnh sau

# chmod o= /etc/postfix/mysql-virtual_*.cf
# chgrp postfix /etc/postfix/mysql-virtual_*.cf


Để có thể nhận email, chúng ta cần tạo một user và group có tên là vmail. Các virtual mailboxes của các email account được tạo ra sau này, sẽ được lưu trữ trong thư mục home của user này (/home/vmail)

# groupadd -g 5000 vmail
# useradd -g vmail -u 5000 vmail -d /home/vmail –m



10. cấu hình postfix

Các bạn tải file config.sh này về, sau đó upload vào thư mục /etc/postfix/ và sửa dòng đầu tiên của file cho đúng với hostname của các bạn, chmod sang 755 và chạy file để nó tự add các dòng trong config.sh vào file main.cf của postfix. 

# vi /etc/postfix/config.sh
# chmod 755 /etc/postfix/config.sh
# /etc/postfix/config.sh 


Tiếp theo chúng ta chỉnh sửa file master.cf, thêm dòng sau vào đoạn giữa fie, mục Interfaces to non-Postfix software

dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}


Khởi động lại dịch vụ postfix

# service postfix restart


11. cấu hình dovecot

Các bạn tải file cấu hình dovecot.conf mới ở đây về, sau đó upload lên /etc. Lưu ý, nên backup lại một bản của file dovecot.conf cũ trước khi đè file mới lên. Mở file dovecot.conf ra và sửa dòng postmaster_address = postmaster@thuonghieuweb.com với tên miền của bạn.

Sau đó tạo 1 file dovecot-sql.conf  để móc vào database như sau:

# vi /etc/dovecot-sql.conf

     driver = mysql
     connect = host=127.0.0.1 dbname=mail user=mail_admin password=123#abc
     default_pass_scheme = CRYPT
     password_query = SELECT email as user, password FROM users WHERE email="%u";

Gán quyền truy cập cho file này như sau

 # chgrp dovecot /etc/dovecot-sql.conf
 # chmod o= /etc/dovecot-sql.conf


Khởi động lại dovecot

# service dovecot restart


12. kiểm tra kết quả các bước trên

Kiểm tra log để đảm bảo dịch vụ dovecot đã chạy và ko có lỗi gì

# tail -f /var/log/maillog

Nếu có 2 dòng sau là ok (xem thêm hình chụp)
: Dovecot v1.0.7 starting up
: mysql : Connected to 127.0.0.1 (mail)




Kiểm tra dịch vụ POP 3 gõ lệnh telnet localhost pop3 và nếu thấy thông báo +OK Dovecot ready là được

# telnet localhost pop3

Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is "^]".
+OK Dovecot ready.

Gõ quit để thoát.


13. tạo alias và kiểm tra sự hoạt động của postfix

Mở file aliases và thêm một dòng gán bí danh cho root như sau


# vi /etc/aliases

thêm dòng:  

root:     mail_admin

Sau đó chạy lại alias và khởi động lại postfix

# newaliases
# service postfix restart

Kiểm tra dịch vụ postfix bằng lệnh sau

# telnet localhost 25

Sau đó kiểm tra theo hình sau, nếu thấy giống như hình này là ok








14. Bắt đầu tạo các domain và email acc

Sau các bước trên có thể coi như phần ảo hóa và kết nối postfix với database đã xong chúng ta có thể tạo các domain và email gắn với domain được rồi. Bước tạo email account này có thể dùng phpmyadmin hoặc viết một script php để tạo, quản lý email cho nó chuyên nghiệp. Ở đây, với mục đích test chúng ta sẽ dùng dòng lệnh để tạo một domain tên là mailtest.com và một email tên là hai@mailtest.com

Trước tiên, chúng ta khai báo tên miền này vào file hosts để giả lập một bản ghi DNS

# vi /etc/hosts

Thêm dòng sau

127.0.0.1     mailtest.com

Sau đó bắt đầu khai báo domain này với user test trong cơ sở dữ liệu

# mysql -u root -p
mysql> USE mail;
mysql> INSERT INTO domains (domain) VALUES ("mailtest.com");
mysql> INSERT INTO users (email, password) VALUES ("hai@mailtest.com", ENCRYPT("123456"));
mysql> quit

Để account mail này có thể truy cập Imap hay Pop3 thì ta phải gởi 1 mail (welcome message) cho user đó bằng một tiện ích gửi mail sẵn có của linux, hãy gõ lệnh như sau

# mail -s "xin chao" hai@mailtest.com 

Gõ nội dung email ngay sau lệnh trên, sau đó bấm Ctrl-D 2 lần (lần thứ nhất nó hỏi cc để thêm địa chỉ cc, lần thứ 2 để kết thúc và gửi mail)

Sau đó vào thư mục /home/vmail để kiểm tra, nếu mọi thứ OK bạn sẽ nhìn thấy thư mục mailtest.com và trong mailtest.com lại có thư mục hai chứa các email của hai@mailtest.com. Tóm lại nếu bạn vào được đường dẫn này/home/vmail/mailtest.com/hai/Maildir/new và thấy một file thì dó chính là email vừa được gửi bằng tiện ích nói trên và như vậy postfix đã hoạt động tốt.



15. check mail với outlook:

Để có thể check mail từ một máy tính bất kỳ dùng outlook, bạn cần phải có một domain và có quyền trỏ bản ghi cho domain này. Giả sử bạn có domain là thuonghieuweb.com, hãy trỏ các bản ghi cần thiết cho email tới máy địa chỉ của máy chủ nói trên (bản ghi A và bản ghi MX) việc trỏ bản ghi không đề cập đến trong này. Bạn hãy làm sao để sau khi trỏ bản ghi bạn sẽ phải ping thành công đến địa chỉ mail.thuonghieuweb.com và thấy là nó đã được trỏ đến ip của máy chủ này.


Sau đó bạn lặp lại bước 14 (nhưng bỏ qua đoạn sửa file hosts vì đã trỏ tên miền từ DNS server rồi) để tạo 2 bản ghi domain = thuonghieuweb.com và user = tenban@thuonghieuweb.com.

Mở outlook trên máy của bạn và khai báo một account mới như hình sau:







Sau khi khai báo các tham số như hình trên, bấm vào test account setting nếu cả 2 bước gửi, nhận mail đều xanh là OK. còn nếu không hãy xem thông báo lỗi là gì để có thể kiểm tra lại. 

Outlook làm việc rất tốt với hệ thống mail postfix ảo hóa này tuy nhiên trong một số trường hợp, chẳng hạn đi công tác xa, chúng ta cần check mail bằng webmail thì cần cài đặt thêm một dịch vụ nữa. Hướng dẫn cài đặt webmail có trong bài viết Hướng dẫn cài đặt dịch vụ squirrel mail gắn với postfix, các bạn có thể tiếp tục tìm hiểu thêm.

Chúc các bạn thành công

0 comments:

Post a Comment