ในบทความนี้จะแนะนำการติดตั้งและใช้งาน Virtual Mail Server ด้วย Postfix, Courier, MySQL โดยเราจะใช้ MySQL ในการเก็บรายชื่ออีเมลทั้งหมดของระบบ และสามารถใช้งานได้หลายโดเมนภายในเซอร์เวอร์เครื่องเดียว ซึ่งจะสะดวกมากสำหรับผู้ที่ต้องดูแลและจัดการกับอีเมลของลูกค้าจำนวนมากๆ เพราะเราไม่ต้องสร้างยูเซอร์จริงขึ้นมาในระบบ แค่สร้างรายชื่อของอีเมลไว้ที่ MySQL ก็สามารถใช้งานได้ทันที พร้อมแล้วเริ่มลุยกันเลย
ขั้นแรกทำการติดตั้งเครื่องมือต่างๆพวกนี้กันก่อน nano , wget , lynx , telnet , mailx
1 | # yum install nano wget lynx telnet mailx |
เพิ่ม Additional Repositories และติดตั้งโปรแกรมเพิ่มเติม
1 2 3 4 5 6 7 8 9 10 11 12 | # rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY* # rpm --import http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt # cd /tmp # wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm # rpm -ivh rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm # rpm --import http://fedoraproject.org/static/0608B895.txt # wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm # rpm -ivh epel-release-6-8.noarch.rpm # yum install yum-priorities |
เข้าไปแก้ไขไฟล์ epel.repo
// เพิ่ม enpriority=10 หลังบรรทัด enabled=1
1 | # nano /etc/yum.repos.d/epel.repo |
จากนั้นทำการติดตั้ง Development Tools
1 2 | # yum update # yum groupinstall 'Development Tools' |
ติดตั้ง Apache, MySQL และ Library ต่างๆ
1 | # yum install ntp httpd mysql-server php php-mysql php-mbstring rpm-build gcc mysql-devel openssl-devel cyrus-sasl-devel pkgconfig zlib-devel pcre-devel openldap-devel postgresql-devel expect libtool-ltdl-devel openldap-servers libtool gdbm-devel pam-devel gamin-devel libidn-devel db4-devel mod_ssl |
คอนฟิก MySQL และตั้งค่ารหัสผ่านของ MySQL ด้วยคำสั่ง mysql_secure_installation
1 | # mysql_secure_installation |
# ตั้งค่าให้ httpd และ mysql เริ่ม start service ทุกครั้งที่เปิดเครื่อง
1 2 3 4 5 | # chkconfig httpd on # chkconfig mysqld on # service httpd start # service mysqld start |
จากนั้นทำการโหลด phpMyAdmin มาติดตั้งที่โฟลเดอร์ /var/www/html/ และทดสอบเปิดดูผ่าน Web Browser ว่าสามารถใช้งาน
1 2 | http://192.168.8.104/ http://192.168.8.104/phpmyadmin |
สร้าง user ที่จะใช้จัดการกับระบบอีเมล ในทีนี้ตั้งชื่อว่า mailadmin
1 2 | # useradd -m -s /bin/bash mailadmin # passwd mailadmin |
เปลี่ยนสิทธการทำงานจาก root ในตอนนี้ไปเป็น mailadmin สังเกตว่า shell จะเปลียนจาก # เป็น $
1 | # su mailadmin |
ทำการสร้าง folder ต่างๆ ด้วยคำสั่งต่อไปนี้
1 2 3 4 5 6 7 8 9 10 11 | $ mkdir $HOME/rpm $ mkdir $HOME/rpm/SOURCES $ mkdir $HOME/rpm/SPECS $ mkdir $HOME/rpm/BUILD $ mkdir $HOME/rpm/BUILDROOT $ mkdir $HOME/rpm/SRPMS $ mkdir $HOME/rpm/RPMS $ mkdir $HOME/rpm/RPMS/i386 $ mkdir $HOME/rpm/RPMS/x86_64 $ echo "%_topdir $HOME/rpm" >> $HOME/.rpmmacros |
ดาวโหลดซอสไฟล์ของ Courier-IMAP, Courier-Authlib, Maildrop
1 2 3 4 5 6 | $ mkdir $HOME/downloads $ cd $HOME/downloads $ wget http://sourceforge.net/projects/courier/files/authlib/0.63.0/courier-authlib-0.63.0.tar.bz2/download $ wget http://sourceforge.net/projects/courier/files/imap/4.9.3/courier-imap-4.9.3.tar.bz2/download $ wget http://sourceforge.net/projects/courier/files/maildrop/2.5.5/maildrop-2.5.5.tar.bz2/download |
ออกจากการเป็น user mailadmin กลับมาเป็น root ด้วยคำสั่ง exit หรือกด CTRL + D
1 | $ exit |
จากนั้นสั่ง rpmbuil
1 2 3 4 5 6 7 8 9 | # rpmbuild -ta /home/mailadmin/downloads/courier-authlib-0.63.0.tar.bz2 # cd /root/rpmbuild/RPMS/i686/ # rpm -ivh courier-authlib-* # mkdir -p /var/cache/ccache/tmp # chmod o+rwx /var/cache/ccache/ # chmod 777 /var/cache/ccache/tmp |
เปลี่ยนกลับไปเป็น user mailadmin อีกครั้ง
1 2 3 4 | # su mailadmin $ cd /home/mailadmin/downloads $ rpmbuild -ta courier-imap-4.9.3.tar.bz2 |
ออกจากการเป็น user mailadmin กลับมาเป็น root ด้วยคำสั่ง exit หรือกด CTRL + D
1 | $ exit |
ทำการติดตั้งโปรแกรม courier-imap, maildrop
1 2 3 4 5 6 7 8 | # cd /home/mailadmin/rpm/RPMS/i686/ # rpm -ivh courier-imap-4.9.3-1.i686.rpm # cd /home/mailadmin/downloads/ # rpmbuild -ta maildrop-2.5.5.tar.bz2 # cd /root/rpmbuild/RPMS/i686/ # rpm -ivh maildrop-2.5.5-1.i686.rpm |
ทำการติดตั้งโปรแกรม Postfix
1 | # yum install postfix |
ต่อไปทำการสร้าง user และ database บน MySQL (ในทีนีเราจะใช้ database ชื่อว่า mail)
1 | # mysqladmin -u root -p create mail |
เข้า MySQL Shell ด้วยคำสั่ง mysql -u root -p สังเกตว่า # จะเปลี่ยนเป็น > (หรือจะไปใช้ phpMyAdmin ทำก็ได้นะ ไม่ว่ากัน)
1 | # mysql -u root -p |
จากนั้นสั่งรันคำสั่ง SQL ต่อไปนี้ โดยเราจะสร้าง user บน MySQL ชื่อ mail_admin และรหัสผ่าน mail_admin_password (กำหนดเป็นอย่างอื่นก็ได้นะ) เพื่อไว้ใช้จัดการกับ database mail และในส่วนสุดท้ายจะเป็นการสร้าง virtual domain และ virtual user เพื่อใช้ทดสอบระบบ โดยเราจะใช้ domain ว่า example.com และสร้าง email user ชื่อว่า [email protected] โดยในส่วนของ password คือ 123456 จะถูก ENCRYPT
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password'; GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password'; FLUSH PRIVILEGES; USE mail; CREATE TABLE domains ( domain varchar(50) NOT NULL, PRIMARY KEY (domain) ) ENGINE=MyISAM; CREATE TABLE forwardings ( source varchar(80) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (source) ) ENGINE=MyISAM; CREATE TABLE users ( email varchar(80) NOT NULL, password varchar(20) NOT NULL, quota bigint(20) DEFAULT '10485760', PRIMARY KEY (email) ) ENGINE=MyISAM; CREATE TABLE transport ( domain varchar(128) NOT NULL default '', transport varchar(128) NOT NULL default '', UNIQUE KEY domain (domain) ) ENGINE=MyISAM; INSERT INTO `domains` (`domain`) VALUES ('example.com'); INSERT INTO `users` (`email`, `password`, `quota`) VALUES ('[email protected]', ENCRYPT( '123456' ) , '10485760'); quit; |
ถ้าเปิดดูจาก phpMyAdmin ก็จะได้ประมาณนี้
ขั้นตอนถัดไปทำการคอนฟิก Postfix ให้ใช้ข้อมูลจาก MySQL
1 | # nano /etc/postfix/mysql-virtual_domains.cf |
เพิ่มคำสั่งต่อไปนี้ลงในไฟล์ /etc/postfix/mysql-virtual_domains.cf
1 2 3 4 5 | user = mail_admin password = mail_admin_password dbname = mail query = SELECT domain AS virtual FROM domains WHERE domain='%s' hosts = localhost |
1 | # nano /etc/postfix/mysql-virtual_forwardings.cf |
เพิ่มคำสั่งต่อไปนี้ลงในไฟล์ /etc/postfix/mysql-virtual_forwardings.cf
1 2 3 4 5 | user = mail_admin password = mail_admin_password dbname = mail query = SELECT destination FROM forwardings WHERE source='%s' hosts = localhost |
1 | # nano /etc/postfix/mysql-virtual_mailboxes.cf |
เพิ่มคำสั่งต่อไปนี้ลงในไฟล์ /etc/postfix/mysql-virtual_mailboxes.cf
1 2 3 4 5 | user = mail_admin password = mail_admin_password dbname = mail query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s' hosts = localhost |
1 | # nano /etc/postfix/mysql-virtual_email2email.cf |
เพิ่มคำสั่งต่อไปนี้ลงในไฟล์ /etc/postfix/mysql-virtual_email2email.cf
1 2 3 4 5 | user = mail_admin password = mail_admin_password dbname = mail query = SELECT email FROM users WHERE email='%s' hosts = localhost |
1 | # nano /etc/postfix/mysql-virtual_transports.cf |
เพิ่มคำสั่งต่อไปนี้ลงในไฟล์ /etc/postfix/mysql-virtual_transports.cf
1 2 3 4 5 | user = mail_admin password = mail_admin_password dbname = mail query = SELECT transport FROM transport WHERE domain='%s' hosts = localhost |
1 | # nano /etc/postfix/mysql-virtual_mailbox_limit_maps.cf |
เพิ่มคำสั่งต่อไปนี้ลงในไฟล์ /etc/postfix/mysql-virtual_mailbox_limit_maps.cf
1 2 3 4 5 | user = mail_admin password = mail_admin_password dbname = mail query = SELECT quota FROM users WHERE email='%s' hosts = localhost |
จากนั้นทำการเปลียน permission และ group ของไฟล์คอนฟิก
1 2 | # chmod o= /etc/postfix/mysql-virtual_*.cf # chgrp postfix /etc/postfix/mysql-virtual_*.cf |
สร้าง user vmail เพื่อใช้เก็บข้อมูลของอีเมล์ (อีเมลที่เข้ามาทั้งหมดจะเก็บลง folder นี้ mysql จะใช้เก็บแค่ชื่อกับรหัสผ่านเท่านั้น)
1 2 | # groupadd -g 5000 vmail # useradd -g vmail -u 5000 vmail -d /home/vmail -m |
แก้ไขไฟล์คอนฟิกของ postfix
1 | # nano /etc/postfix/main.cf |
แก้ไขไฟล์ /etc/postfix/main.cf ตามค่าต่างๆ ดังนี้
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | # แก้ไขตามค่าต่อไปนี้ โดย server1.example.com คือชื่อของเซอเวอร์เครื่องนี้ myhostname = server1.example.com mydomain = localhost myorigin = $mydomain inet_interfaces = all mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain mynetworks = 127.0.0.0/8 relay_domains = home_mailbox = Maildir/ inet_protocols = ipv4 # และที่บรรทัดสุดท้าย ให้เพิ่มค่าต่างๆ ดังนี้ virtual_alias_domains = virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf virtual_mailbox_base = /home/vmail virtual_uid_maps = static:5000 virtual_gid_maps = static:5000 transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf virtual_create_maildirsize = yes virtual_maildir_extended = yes virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf virtual_mailbox_limit_override = yes virtual_maildir_limit_message = "The user you are trying to reach is over quota." virtual_overquota_bounce = yes proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps |
จากนั้นคอนฟิก Saslauthd
1 | # nano /etc/sasl2/smtpd.conf |
//แก้ไข /etc/sasl2/smtpd.conf ให้เป็นแบบนี้
1 2 3 4 | pwcheck_method: authdaemond log_level: 3 mech_list: PLAIN LOGIN authdaemond_path:/var/spool/authdaemon/socket |
# ตั้งค่าให้ courier-authlib , postfix , saslauthd เริ่ม start service ทุกครั้งที่เปิดเครื่อง
1 2 3 4 5 6 7 8 | # chmod 755 /var/spool/authdaemon # chkconfig courier-authlib on # chkconfig postfix on # chkconfig saslauthd on # service courier-authlib start # service postfix start # service saslauthd start |
แก้ไขคอนฟิกของ Courier ให้เรียกใช้ข้อมูลจาก MySQL
1 | # nano /etc/authlib/authdaemonrc |
ในไฟล์ /etc/authlib/authdaemonrc ให้แก้ไขค่า authmodulelist ให้เป็น authmodulelist=”authmysql”
1 | authmodulelist="authmysql" |
ทำการแก้ไขไฟล์ /etc/authlib/authmysqlrc
1 2 3 | # cp /etc/authlib/authmysqlrc /etc/authlib/authmysqlrc_orig # cat /dev/null > /etc/authlib/authmysqlrc # nano /etc/authlib/authmysqlrc |
โดยเพิ่มคำสั่งต่อไปนี้ลงไปในไฟล์ /etc/authlib/authmysqlrc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | MYSQL_SERVER localhost MYSQL_USERNAME mail_admin MYSQL_PASSWORD mail_admin_password MYSQL_PORT 0 MYSQL_DATABASE mail MYSQL_USER_TABLE users MYSQL_CRYPT_PWFIELD password #MYSQL_CLEAR_PWFIELD password MYSQL_UID_FIELD 5000 MYSQL_GID_FIELD 5000 MYSQL_LOGIN_FIELD email MYSQL_HOME_FIELD "/home/vmail" MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') #MYSQL_NAME_FIELD MYSQL_QUOTA_FIELD quota |
กำหนดให้ service ของ courier-imap ทำงานตอนเปิดเครื่องทุกครั้ง
1 | # chkconfig courier-imap on |
และแล้วก็มาถึงขั้นตอนสุดท้าย ให้ทำการ restart service ของ courier-authlib , courier-imap , postfix ก็เป็นอันเรียบร้อย
1 2 3 | # service courier-authlib restart # service courier-imap restart # service postfix restart |
ทดสอบการส่งอีเมลเข้า [email protected] (ทุกครั้งที่เราสร้าง email account ขึ้นมาใหม่ เราต้องทำการส่งอีเมลหาอีเมลนั้นในครั้งแรกเพื่อให้ระบบได้สร้าง mailbox ก่อนเสมอ)
1 | # mail hin@example.com |
ต่อไปให้เข้าไปดูที่โฟลเดอร์ /home/vmail/ ซึ่งถ้าไม่มีอะไรผิดพลาด เราก็จะเห็นว่ามีการสร้าง folder ใหม่ชื่อ example.com ขึ้นมาในนี้ และจะมี foler hin อยู่ข้างใน example.com อีกชั้นหนึ่ง ซึ่งถ้าเห็นโฟลเดอร์นี้อยู่ก็แสดงว่ามีอีเมลเข้ามาในระบบของเราแล้ว จากนั้นเราจะใช้ outlook หรือติดตั้ง webmail เพื่อใช้เช็คอีเมลก็ย่อมได้
1 2 | # cd /home/vmail/ # ls -al |
ไหนๆ ก็ไหนๆ แล้ว เรามาติดตั้ง webmail อีกสักหน่อยแล้วกัน โดยเราจะใช้ SquirrelMail ซึ่งไปหาโหลดได้จาก http://squirrelmail.org/download.php webmail ตัวนี้หน้าตาอาจจะไม่สวยนัก แต่ก็ติดตั้งได้ง่าย (วันหลังเราจะลองติดตั้ง webmail ตัวอื่นดูบ้าง เดี๋ยวไปหาข้อมูลก่อน) เมื่อโหลดมาแล้วให้เอาไปติดตั้งไว้ที่โฟลเดอร์ /var/www/html/webmail/
ในโฟลเดอร์ config ให้เปลี่ยนชื่อไฟล์จาก config_default.php เป็น config.php และแก้ไขค่าต่างๆดังนี้
1 2 3 | $imap_server_type = 'courier'; $data_dir = '/var/www/html/webmail/data/'; $attachment_dir = '/var/www/html/webmail/attach/'; |
ทำการเปลียน permission ของ /var/www/html/webmail/data และ /var/www/html/webmail/data/attach ให้เป็น 777
1 2 3 | # mkdir /var/www/html/webmail/data/attach # chmod -R 777 /var/www/html/webmail/data # chmod -R 777 /var/www/html/webmail/attach |
เรียบร้อยทดสอบทดสอบดูได้ ^^
1 | http://192.168.8.104/webmail |
หมายเหตุตัวใหญ่ๆ ไว้อีกที : ทุกครั้งที่เราสร้าง email account ขึ้นมาใหม่ เราต้องทำการส่งอีเมลหาอีเมลนั้นในครั้งแรกเพื่อให้ระบบได้สร้าง mailbox ก่อนเสมอ ไม่อย่างนั้นเราจะไม่สามารถเข้าใช้งานได้