คู่มือการพัฒนา EAI Mail Server บน Ubuntu 22
เนื้อหา
- 1 EAI Email Server
- 2 การติดตั้ง EAI Email Server
- 2.1 ตั้งค่า hostname
- 2.2 ตั้งค่า firewall
- 2.3 สร้าง SSL Cert
- 2.4 ติดตั้ง MySQL, Postfix, Dovecot
- 2.5 ตั้งค่า MySQL
- 2.5.1 ตั้งค่า UTF8 ให้กับ mysql เพื่อให้รองรับภาษาไทย โดยเพิ่มคำสั่งด้านล่างลงในไฟล์ mysqld.cnf ใต้ [mysqld]
- 2.5.2 สั่ง restart MySQL
- 2.5.3 ตั้งค่าความปลอดภัยการเข้าใช้งาน MySQL โดยจะมีการตั้งค่า password ของ user root เพื่อ login เข้าใช้งาน (* กำหนดเพียง password ใหม่ ในส่วนอื่นๆ ให้ enter ผ่านได้เลย)
- 2.5.4 Login เข้าใช้งาน MySQL โดยใช้ password ของ user root ที่ได้ตั้งค่าไว้
- 2.5.5 สร้าง Database เพื่อใช้เก็บข้อมูลของการใช้งาน Email Server
- 2.5.6 สร้าง user พร้อมกำหนดสิทธิ์การใช้งานให้กับ eaimail database ที่สร้างขึ้นมา
- 2.5.7 ตรวจสอบ user ที่สร้างขึ้นใหม่โดย
- 2.5.8 สร้างตารางใช้เก็บค่า domains, forwardings สำหรับ forward อีเมลภาษาไทยไปภาษาอังกฤษ, users เพื่อใช้สร้าง mailbox
- 2.5.9 เพิ่มข้อมูล Domain และ Email Account ทั้งภาษาอังกฤษ และภาษาไทย เพื่อเริ่มใช้งาน
- 2.5.10 กำหนด Email ที่เข้ามายัง Email Account ภาษาไทย ให้ forward เข้า Email-Account ภาษาอังกฤษ เนื่องจากระบบไม่สามารถสร้าง mailbox เป็น ภาษาไทยได้
- 2.6 ตั้งค่า postfix
- 2.6.1 สร้างไฟล์เชื่อมต่อระหว่าง Postfix และ MySQL
- 2.6.2 สร้าง user vmail สำหรับอ่าน/เขียน mailbox
- 2.6.3 config การทำงานของ postfix ด้วยคำสั่ง postconf (คำสั่งนี้จะไปแก้ไขไฟล์ "/etc/postfix/main.cf")
- 2.6.4 ตรวจสอบการ config postfix ด้วยคำสั่ง
- 2.6.5 config การทำงานของ postfix ด้วยคำสั่ง postconf (คำสั่งนี้จะไปแก้ไขไฟล์ "/etc/postfix/master.cf")
- 2.6.6 ตรวจสอบการ config postfix ด้วยคำสั่ง
- 2.6.7 ตั้งค่า mysql postfix driver
- 2.6.8 สั่ง restart postfix
- 2.7 ตั้งค่า dovecot
- 2.8 ทดสอบการทำงานของ Email Server
- 2.8.1 ทดสอบ imap ด้วยคำสั่ง telnet
- 2.8.2 ทดสอบ smtp ด้วยคำสั่ง telnet
- 2.8.3 ทดสอบการส่ง email ด้วย telnet
- 2.8.4 ตรวจสอบ log ของการส่ง Email : /var/log/mail.log ซึ้งจะได้ผลตามด้านล่าง
- 2.8.5 ตรวจสอบ log ของ dovecot : /home/vmail/dovecot-deliver.log ซึ่งจะได้ผลตามด้านล่าง
- 2.8.6 ตรวจสอบ mailbox เมื่อมีการรับส่ง-ส่ง Email จะสร้างขึ้นโดย dovecot ซึ่งจะได้ผลตามตัวอย่าง
- 2.9 ติดตั้ง roundcube webmail
EAI Email Server
คู่มือนี้ได้จัดทำขึ้นมาเพื่อทดสอบและเป็นแนวทางการติดตั้ง Email Server ให้สามารถรับส่ง email address ภาษาไทย หรือ Email Address Internationalization (EAI) โดยใช้ Opensource Software เพื่อหาวิธีการที่สามารถใช้งานได้ และสามารถนำไปพัฒนาต่อยอดได้
Software ที่นำมาทดสอบ
- Ubuntu 22.04.1 LTS [workshop virtualbox image ]
- Postfix 3.4.13
- Dovecot 2.3.7.2
- MySQL 8.0.27
- Roundcube 1.4.4 [ดาวน์โหลด] [tar]
Workshop Slide [ดาวน์โหลด]
EAI Workshop Authentication
user: eai pass: eai+ws@thnic
- โดเมนที่ใช้เป็นตัวอย่างใน workshop
English : mailthai99.in.th ภาษาไทย : จดหมาย99.ไทย (Punycode) : xn--15-6qi0c9cg5dxc.xn--o3cw4h
- Ubuntu Server:
User: user Pass: userpass
- Passphase for SSL Key
Key: mailthai.key, mailthai.crt, mailthai.csr Pass: mailpass
- MySQL
DB: eaimail User: dbuser Pass: dbuserpass DB: roundcubemail User: rcmail Pass: rcmailpass
- Roundcube
User: thai@mailthaiXX.in.th Pass: thaipass User: ไทย@จดหมายXX.ไทย Pass: thaipass
การติดตั้ง EAI Email Server
ตั้งค่า hostname
เข้าใช้งานเครื่องด้วย สิทธิ์ root
sudo su
รหัสผ่าน : userpass
อัพเดตแพคเกจของ mail serverให้เป็นเวอร์ชั่นล่าสุด ด้วยคำสั่ง
apt update && apt -y upgrade
กำหนดชื่อ hostname และตรวจสอบด้วยคำสั่ง
- กำหนดชื่อ hostname
hostnamectl set-hostname mail.mailthai99.in.th
ตัวอย่าง เช่น mail.mailthai99.in.th
- ตรวจสอบ hostname
hostnamectl
ตัวอย่าง
Static hostname: mail.mailthai99.in.th
ติดตั้งโปรแกรม nano
apt -y install nano
เพิ่มค่า hostname ชื่อเดียวกับชื่อที่กำหนดข้างต้นในไฟล์ hosts
nano /etc/hosts
ตัวอย่าง เช่น mail.mailthai99.in.th
ตัวอย่างไฟล์ hosts
127.0.0.1 localhost mail.mailthai99.in.th
กด crtl+X และกด y เพื่อ save และออกจาก nano
ตั้งค่าเวลาของ Mail Server และตรวจสอบ
- ตั้งค่าเวลาของ Mail Server
timedatectl set-timezone "Asia/Bangkok"
- ตรวจสอบเวลาของ Mail Server
timedatectl status
ตัวอย่าง
Local time: Fri 2022-01-14 12:06:03 +07 Universal time: Fri 2022-01-14 05:06:03 UTC RTC time: Fri 2022-01-14 05:06:03 Time zone: Asia/Bangkok (+07, +0700) System clock synchronized: yes NTP service: active RTC in local TZ: no
ตั้งค่า firewall
1. เปิด firewall service และตรวจสอบสถานะ ด้วยคำสั่ง
- ติดตั้งโปรแกรม ufw
apt -y install ufw
- เปิด firewall service
ufw enable
ตัวอย่าง
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y # ให้ตอบ y
Firewall is active and enabled on system startup
2. เปิด firewall services ของ email server
ufw allow in ssh ufw allow http ufw allow https ufw allow smtp ufw allow smtps ufw allow imap ufw allow imaps ufw allow mysql
ตัวอย่าง
Rule added Rule added (v6)
3. ตรวจสอบ firewall services ที่เปิดอยู่
ufw status
ตัวอย่าง
Status: active To Action From -- ------ ---- 22/tcp ALLOW Anywhere 80/tcp ALLOW Anywhere 443/tcp ALLOW Anywhere 25/tcp ALLOW Anywhere 465/tcp ALLOW Anywhere 143/tcp ALLOW Anywhere 993/tcp ALLOW Anywhere 3306/tcp ALLOW Anywhere 22/tcp (v6) ALLOW Anywhere (v6) 80/tcp (v6) ALLOW Anywhere (v6) 443/tcp (v6) ALLOW Anywhere (v6) 25/tcp (v6) ALLOW Anywhere (v6) 465/tcp (v6) ALLOW Anywhere (v6) 143/tcp (v6) ALLOW Anywhere (v6) 993/tcp (v6) ALLOW Anywhere (v6) 3306/tcp (v6) ALLOW Anywhere (v6)
สร้าง SSL Cert
- เป็นขั้นตอนการสร้าง SSL cert/key เตรียมไว้ใช้งานกับ postfix และ dovecot
- ในเครื่อง workshop ได้เตรียม cert mailthai.crt, mailthai.key, mailthai.csr ไว้แล้ว
1. สร้าง private key
cd /etc/ssl/private openssl req -new -x509 -days 365 -nodes -newkey rsa:2048 -keyout mailthaiXX.key -out mailthai99.crt -subj "/C=TH/ST=BKK/L=DUSIT/CN=mail.mailthaiXX.in.th"
openssl genrsa -aes128 2048 > mailthaiXX.key
ตัวอย่าง เช่น mailthai99.key
Generating RSA private key, 2048 bit long modulus (2 primes) ........+++++ ..+++++ e is 65537 (0x010001) Enter pass phrase: # mailpass Verifying - Enter pass phrase: # mailpass
2. ถอด Passphase ออกจาก private key ที่สร้างขึ้น
openssl rsa -in mailthaiXX.key -out mailthaiXX.key
ตัวอย่าง เช่น mailthai99.key
Enter pass phrase for mailthai99.key: # mailpass
writing RSA key
3. สร้าง csr
openssl req -utf8 -new -key mailthaiXX.key -out mailthaiXX.csr
ตัวอย่างเช่น mailthai99.key, mailthai99.csr
Country Name (2 letter code) [AU]:TH State or Province Name (full name) [Some-State]:Bangkok Locality Name (eg, city) []:Dusit Organization Name (eg, company) [Internet Widgits Pty Ltd]:EAI Organizational Unit Name (eg, section) []:IT Common Name (e.g. server FQDN or YOUR name) []:mail.mailthai99.in.th Email Address []:postmaster@mailthai99.in.th Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: # Enter An optional company name []: # Enter
4. ทำการ generate key
openssl x509 -in mailthaiXX.csr -out mailthaiXX.crt -req -signkey mailthaiXX.key -days 365
ตัวอย่างเช่น mailthai99.key, mailthai99.csr, mailthai99.crt
Signature ok subject=C = TH, ST = Bangkok, L = Dusit, O = EAI, OU = IT, CN = mail.mailthaiXX.in.th, emailAddress = postmaster@mailthai99.in.th Getting Private key
5. ตรวจสอบ key ที่สร้างขึ้น
ls
ตัวอย่าง
mailthai99.crt mailthai99.csr mailthai99.key
ติดตั้ง MySQL, Postfix, Dovecot
1. ติดตั้ง MySQL, Postfix , Dovecot และ packet ที่จำเป็นสำหรับ email sever ด้วยคำสั่ง
apt -y install postfix postfix-mysql dovecot-core dovecot-mysql dovecot-imapd dovecot-pop3d dovecot-lmtpd mysql-server
2. ตัวเลือกระหว่างติดตั้ง Postfix ให้เลือก Internet Site พิมพ์ 2 และ พิมพ์ชื่อโดเมนเนม mailthai99.in.th
General mail configuration type: 2 System mail name: mailthaiXX.in.th
3. สั่ง start service ของ MySQL, Postfix, Dovecot ด้วยคำสั่ง
systemctl start mysql && systemctl start postfix && systemctl start dovecot
4. ดูสถานะการทำงานของ MySQL, Postfix, Dovecot
systemctl status mysql systemctl status postfix systemctl status dovecot
ตัวอย่าง
Active: active (running) since Wed 2022-01-05 14:42:29 +07; 33min ago
ตั้งค่า MySQL
ตั้งค่า UTF8 ให้กับ mysql เพื่อให้รองรับภาษาไทย โดยเพิ่มคำสั่งด้านล่างลงในไฟล์ mysqld.cnf ใต้ [mysqld]
nano /etc/mysql/mysql.conf.d/mysqld.cnf
ตัวอย่าง ไฟล์ mysqld.cnf
# Here is entries for some specific programs # The following values assume you have at least 32M ram [mysqld] character-set-server = utf8 collation-server = utf8_general_ci skip-character-set-client-handshake bind-address=127.0.0.1 # # * Basic Settings # user = mysql
สั่ง restart MySQL
systemctl restart mysql
ตั้งค่าความปลอดภัยการเข้าใช้งาน MySQL โดยจะมีการตั้งค่า password ของ user root เพื่อ login เข้าใช้งาน (* กำหนดเพียง password ใหม่ ในส่วนอื่นๆ ให้ enter ผ่านได้เลย)
mysql_secure_installation
ตัวอย่าง
Please set the password for root here. New password: # rootpass Re-enter new password: # rootpass
Login เข้าใช้งาน MySQL โดยใช้ password ของ user root ที่ได้ตั้งค่าไว้
mysql -u root -p # enter
สร้าง Database เพื่อใช้เก็บข้อมูลของการใช้งาน Email Server
- สร้าง Database
CREATE DATABASE eaimail;
ตัวอย่าง
Query OK, 1 row affected (0.02 sec)
*เลือกใช้งาน Database eaimail
USE eaimail;
ตัวอย่าง
Database changed
สร้าง user พร้อมกำหนดสิทธิ์การใช้งานให้กับ eaimail database ที่สร้างขึ้นมา
CREATE USER dbuser@localhost IDENTIFIED BY 'dbuserpass'; GRANT SELECT, INSERT, UPDATE, DELETE ON eaimail.* TO dbuser@localhost; FLUSH PRIVILEGES;
ตรวจสอบ user ที่สร้างขึ้นใหม่โดย
SHOW GRANTS FOR dbuser@localhost;
ตัวอย่าง
+----------------------------------------------------------------------------------------------------------------+ | Grants for dbuser@localhost | +----------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO `dbuser`@`localhost` | | GRANT SELECT, INSERT, UPDATE, DELETE ON `eaimail`.* TO `dbuser`@`localhost` | +----------------------------------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec)
สร้างตารางใช้เก็บค่า domains, forwardings สำหรับ forward อีเมลภาษาไทยไปภาษาอังกฤษ, users เพื่อใช้สร้าง mailbox
CREATE TABLE domains (domain varchar(50) NOT NULL, PRIMARY KEY (domain)); CREATE TABLE forwardings (source varchar(80) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (source)); CREATE TABLE users (email varchar(80) NOT NULL, password varchar(256) NOT NULL, PRIMARY KEY (email));
เพิ่มข้อมูล Domain และ Email Account ทั้งภาษาอังกฤษ และภาษาไทย เพื่อเริ่มใช้งาน
INSERT INTO domains (domain) VALUES ('mailthaiXX.in.th'); INSERT INTO domains (domain) VALUES ('จดหมายXX.ไทย'); INSERT INTO users (email, password) VALUES ('thai@mailthaiXX.in.th', '$6$7GQtdsDwSjzB7EAm$0.W6ZBcGEylrQMHKv1j7PZd/6EPoXAYClNhxxs3V2mG/NrHKDsycOTWwETniwI9O/OUeQkqBT5KPfNkDUb8hk/'); INSERT INTO users (email, password) VALUES ('ไทย@จดหมายXX.ไทย', '$6$7GQtdsDwSjzB7EAm$0.W6ZBcGEylrQMHKv1j7PZd/6EPoXAYClNhxxs3V2mG/NrHKDsycOTWwETniwI9O/OUeQkqBT5KPfNkDUb8hk/');
ตัวอย่าง เช่น mailthai99.in.th, จดหมาย99.ไทย, thai@mailthai99.in.th, ไทย@จดหมาย99.ไทย
หมายเหตุ สร้างรหัสผ่านด้วยคำสั่ง doveadm pw -s SHA512-CRYPT
กำหนด Email ที่เข้ามายัง Email Account ภาษาไทย ให้ forward เข้า Email-Account ภาษาอังกฤษ เนื่องจากระบบไม่สามารถสร้าง mailbox เป็น ภาษาไทยได้
INSERT INTO forwardings (source,destination) VALUES ('ไทย@จดหมายXX.ไทย','thai@mailthaiXX.in.th'); quit;
ตั้งค่า postfix
สร้างไฟล์เชื่อมต่อระหว่าง Postfix และ MySQL
cd /etc/postfix/
- สร้างไฟล์ script เพื่อใช้สำหรับเรียกค่า domain จาก Database
nano /etc/postfix/mysql-virtual_domains.cf
ตัวอย่างไฟล์
user = dbuser password = dbuserpass dbname = eaimail query = SELECT domain FROM domains WHERE domain='%s' hosts = 127.0.0.1
- สร้างไฟล์ script เพื่อใช้สำหรับ forward email
nano /etc/postfix/mysql-virtual_forwardings.cf
ตัวอย่างไฟล์
user = dbuser password = dbuserpass dbname = eaimail query = SELECT destination FROM forwardings WHERE source='%s' hosts = 127.0.0.1
- สร้างไฟล์ script เพื่อใช้สำหรับ สร้าง mailbox และใช้ login
nano /etc/postfix/mysql-virtual_mailboxes.cf
ตัวอย่างไฟล์
user = dbuser password = dbuserpass dbname = eaimail query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s' hosts = 127.0.0.1
- สร้างไฟล์ script เพื่อใช้สำหรับ ส่งต่อ email ทั้งหมด ไปยัง smtp server อื่น ซึ่งใช้ในกรณีที่ host เป็น IP Address
nano /etc/postfix/mysql-virtual_email2email.cf
ตัวอย่างไฟล์
user = dbuser password = dbuserpass dbname = eaimail query = SELECT email FROM users WHERE email='%s' hosts = 127.0.0.1
- กำหนดสิทธิ์ให้กับ script ที่สร้างขึ้น
chmod 640 /etc/postfix/mysql-virtual_*.cf && chgrp postfix /etc/postfix/mysql-virtual_*.cf
ตัวอย่าง
-rw-r----- 1 root postfix 124 Jan 7 23:36 mysql-virtual_domains.cf -rw-r----- 1 root postfix 120 Jan 7 23:39 mysql-virtual_email2email.cf -rw-r----- 1 root postfix 133 Jan 7 23:37 mysql-virtual_forwardings.cf -rw-r----- 1 root postfix 190 Jan 7 23:38 mysql-virtual_mailboxes.cf
สร้าง user vmail สำหรับอ่าน/เขียน mailbox
- สร้าง group เพื่อใช้กับ mailbox
groupadd -g 5000 vmail useradd -g vmail -u 5000 vmail -d /home/vmail -m
config การทำงานของ postfix ด้วยคำสั่ง postconf (คำสั่งนี้จะไปแก้ไขไฟล์ "/etc/postfix/main.cf")
postconf "myhostname=mail.mailthaiXX.in.th" && \ postconf "mydomain=mailthaiXX.in.th" && \ postconf "virtual_alias_domains=จดหมายXX.ไทย" && \ postconf "smtpd_tls_cert_file=/etc/ssl/private/mailthaiXX.crt" && \ postconf "smtpd_tls_key_file=/etc/ssl/private/mailthaiXX.key" && \ postconf "myorigin=\$mydomain" && \ postconf "inet_interfaces=all" && \ postconf "inet_protocols=ipv4" && \ postconf "mydestination=localhost, localhost.localdomain" && \ postconf "mynetworks=127.0.0.1" && \ postconf "readme_directory=no" && \ postconf "shlib_directory=no" && \ postconf "smtpd_sasl_auth_enable=yes" && \ postconf "smtpd_sasl_type=dovecot" && \ postconf "smtpd_sasl_path=private/auth" && \ postconf "smtpd_sasl_authenticated_header=yes" && \ postconf "broken_sasl_auth_clients=yes" && \ postconf "smtpd_use_tls=yes" && \ postconf "smtpd_recipient_restrictions=permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination" && \ postconf "smtpd_tls_auth_only=yes" && \ postconf "smtpd_tls_loglevel=1" && \ postconf "virtual_mailbox_base=/home/vmail" && \ postconf "virtual_mailbox_maps=proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf" && \ postconf "virtual_mailbox_domains=proxy:mysql:/etc/postfix/mysql-virtual_domains.cf" && \ postconf "virtual_alias_maps=proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf" && \ postconf "virtual_uid_maps=static:5000" && \ postconf "virtual_gid_maps=static:5000" && \ postconf "virtual_transport=dovecot" && \ postconf "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" && \ postconf "smtputf8_enable=yes" && \ postconf "newaliases_path=null" && \ postconf "mailq_path=null" && \ postconf "setgid_group=postdrop" && \ postconf "html_directory=null" && \ postconf "manpage_directory = null" && \ postconf "sample_directory = null" && \ postconf "sendmail_path=null"
ตรวจสอบการ config postfix ด้วยคำสั่ง
postconf -n
- ตัวอย่างไฟล์
broken_sasl_auth_clients = yes command_directory = /usr/sbin compatibility_level = 2 daemon_directory = /usr/lib/postfix/sbin data_directory = /var/lib/postfix debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5 html_directory = null inet_interfaces = all inet_protocols = ipv4 mailq_path = null manpage_directory = null mydestination = localhost, localhost.localdomain mydomain = mailthai99.in.th myhostname = mail.mailthai99.in.th mynetworks = 127.0.0.1 myorigin = $mydomain newaliases_path = null 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 readme_directory = no sample_directory = null sendmail_path = null setgid_group = postdrop shlib_directory = no smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu) smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination smtpd_sasl_auth_enable = yes smtpd_sasl_authenticated_header = yes smtpd_sasl_path = private/auth smtpd_sasl_type = dovecot smtpd_tls_auth_only = yes smtpd_tls_cert_file = /etc/ssl/private/mailthai99.crt smtpd_tls_key_file = /etc/ssl/private/mailthai99.key smtpd_tls_loglevel = 1 smtpd_use_tls = yes smtputf8_enable = yes unknown_local_recipient_reject_code = 550 virtual_alias_domains = จดหมาย99.ไทย virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf virtual_gid_maps = static:5000 virtual_mailbox_base = /home/vmail virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf virtual_transport = dovecot virtual_uid_maps = static:5000
config การทำงานของ postfix ด้วยคำสั่ง postconf (คำสั่งนี้จะไปแก้ไขไฟล์ "/etc/postfix/master.cf")
postconf -M smtps/inet="smtps inet n - - - - smtpd" && \ postconf -P "smtps/inet/syslog_name=postfix/smtps" && \ postconf -P "smtps/inet/smtpd_tls_wrappermode=yes" && \ postconf -P "smtps/inet/smtpd_sasl_auth_enable=yes" && \ postconf -P "smtps/inet/smtpd_client_restrictions=permit_sasl_authenticated,reject" && \ postconf -P "smtps/inet/smtpd_relay_restrictions=permit_sasl_authenticated,reject" && \ postconf -P "smtps/inet/milter_macro_daemon_name=ORIGINATING" && \ postconf -vM dovecot/unix="dovecot unix - n n - - pipe flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f \${sender} -d \${recipient}"
ตรวจสอบการ config postfix ด้วยคำสั่ง
postconf -M
- ตัวอย่างไฟล์
smtps inet n - - - - smtpd -o syslog_name=postfix/smtps -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject -o smtpd_relay_restrictions=permit_sasl_authenticated,reject -o milter_macro_daemon_name=ORIGINATING dovecot unix - n n - - pipe flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}
ตั้งค่า mysql postfix driver
nano /etc/postfix/dynamicmaps.cf
ตัวอย่าง
mysql /usr/lib/postfix/postfix-mysql.so dict_mysql_open
สั่ง restart postfix
systemctl restart postfix
ตั้งค่า dovecot
สร้างไฟล์เชื่อมต่อระหว่าง dovecot และ MySQL
- สร้าง script เพื่อให้ dovecot ใช้งานกับ SQL ที่เราได้กำหนดก่อนหน้านี้
nano /etc/dovecot/dovecot-sql.conf.ext
ตัวอย่างไฟล์
driver = mysql connect = host=127.0.0.1 dbname=eaimail user=dbuser password=dbuserpass default_pass_scheme = SHA512-CRYPT password_query = SELECT email as user, password FROM users WHERE email='%u';
- กำหนดสิทธิ์อนุญาตให้ user ที่อยู่ใน dovecot group ใช้งาน
chmod 640 /etc/dovecot/dovecot-sql.conf.ext && chgrp dovecot /etc/dovecot/dovecot-sql.conf.ext
ตัวอย่าง
-rw-r----- 1 root dovecot 6023 Jan 7 23:54 dovecot-sql.conf.ext
Backup ไฟล์ dovecot.conf เดิมไว้ก่อน
mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf-backup
ตัวอย่าง
-rw-r--r-- 1 root root 4401 Apr 12 2021 dovecot.conf-backup
สร้างไฟล์ "/etc/dovecot/dovecot.conf” และแก้ไขไฟล์ "/etc/dovecot/dovecot.conf" ด้วยการใส่คำสั่งตามด้านล่าง
nano /etc/dovecot/dovecot.conf
ตัวอย่าง
protocols = imap pop3 lmtp log_timestamp = "%Y-%m-%d %H:%M:%S" mail_location = maildir:/home/vmail/%d/%n/Maildir ssl_cert = </etc/ssl/private/mailthaiXX.crt ssl_key = </etc/ssl/private/mailthaiXX.key ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL auth_mechanisms = plain login namespace { type = private separator = . prefix = INBOX. inbox = yes } service auth { unix_listener auth-master { mode = 0600 user = vmail } unix_listener /var/spool/postfix/private/auth { mode = 0666 user = postfix group = postfix } user = root } service auth-worker { user = root } protocol lda { log_path = /home/vmail/dovecot-deliver.log auth_socket_path = /var/run/dovecot/auth-master postmaster_address = postmaster@mailthaiXX.in.th } protocol pop3 { pop3_uidl_format = %08Xu%08Xv pop3_client_workarounds = outlook-no-nuls oe-ns-eoh } passdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext } userdb { driver = static args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes } service stats { unix_listener stats-reader { user = vmail group = vmail mode = 0660 } unix_listener stats-writer { user = vmail group = vmail mode = 0660 } }
สั่ง restart dovecot
systemctl restart dovecot
ทดสอบการทำงานของ Email Server
ทดสอบ imap ด้วยคำสั่ง telnet
telnet localhost imap
ตัวอย่าง
Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. * OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE LITERAL+ STARTTLS AUTH=PLAIN AUTH=LOGIN] Dovecot (Ubuntu) ready.
หมายเหตุ กด Ctrl+] และตามด้วย q เพื่อออก
ทดสอบ smtp ด้วยคำสั่ง telnet
telnet localhost smtp ehlo localhost
ตัวอย่าง
250-mail.mailthai99.in.th 250-PIPELINING 250-SIZE 30720000 250-VRFY 250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250-8BITMIME 250-DSN 250 SMTPUTF8
หมายเหตุ กด Ctrl+] และตามด้วย q เพื่อออก
ทดสอบการส่ง email ด้วย telnet
telnet localhost smtp ehlo localhost MAIL FROM: thai@mailthaiXX.in.th RCPT TO: thai@mailthai99.in.th data Subject: test mailthaiXX.in.th to mailthai99.in.th test . ใช้เครื่องหมาย “.” เพื่อจบข้อความและส่งข้อความ
หมายเหตุ กด Ctrl+] และตามด้วย q เพื่อออก
telnet localhost smtp ehlo localhost MAIL FROM: ไทย@จดหมายXX.ไทย SMTPUTF8 RCPT TO: ไทย@จดหมาย99.ไทย data Subject: test mailthaiXX.in.th to mailthai99.in.th test . ใช้เครื่องหมาย “.” เพื่อจบข้อความและส่งข้อความ
หมายเหตุ กด Ctrl+] และตามด้วย q เพื่อออก
ตรวจสอบ log ของการส่ง Email : /var/log/mail.log ซึ้งจะได้ผลตามด้านล่าง
Nov 13 15:19:07 mail postfix/pickup[31954]: E9AB020199E5: uid=0 from=<root> Nov 13 15:19:07 mail postfix/cleanup[1938]: E9AB020199E5: message-id=<20171113081907.E9AB020199E5@mail.mailthai99.in.th> Nov 13 15:19:07 mail postfix/qmgr[21141]: E9AB020199E5: from=<root@mailthai99.in.th>, size=434, nrcpt=1 (queue active) Nov 13 15:19:08 mail postfix/pipe[1946]: E9AB020199E5: to=<thai@mailthai99.in.th>, relay=dovecot, delay=0.09, delays=0.04/0.01/0/0.03, dsn=2.0.0, status=sent (delivered via dovecot service) Nov 13 15:19:08 mail postfix/qmgr[21141]: E9AB020199E5: removed
ตรวจสอบ log ของ dovecot : /home/vmail/dovecot-deliver.log ซึ่งจะได้ผลตามด้านล่าง
2017-11-13 15:19:08 lda(thai@mailthai99.in.th): Info: msgid=<20171113081907.E9AB020199E5@mail.eai.in.th>: saved mail to INBOX
ตรวจสอบ mailbox เมื่อมีการรับส่ง-ส่ง Email จะสร้างขึ้นโดย dovecot ซึ่งจะได้ผลตามตัวอย่าง
cd /home/vmail/mailthaiXX.in.th/Maildir
find
ตัวอย่างเช่น mailthai99.in.th"
. ./dovecot-uidlist ./cur ./new ./new/1285609582.P6115Q0M368794.li172-137 ./dovecot.index ./dovecot.index.log ./tmp
ติดตั้ง roundcube webmail
ติดตั้ง apache php
- ใช้คำสั่ง apt ติดตั้ง php, php library และ apache web server
apt -y install apache2 php php-imap php-imagick php-json php-xml php-mbstring php-pear php-intl php-ldap php-gd php-zip php-mysql php-curl php-bz2 php-gmp phpmyadmin
- ใช้คำสั่ง start service apache และ php
systemctl start apache2
- ตรวจสอบสถานะการทำงานของ apache
systemctl status apache2
ตั้งค่า php (เราจะตั้งค่าเฉพาะส่วนที่จำเป็นต่อการใช้งาน roundcube)
- ตั้งค่า timezone
nano /etc/php/7.4/apache2/php.ini
ตัวอย่าง [Date]
; Defines the default timezone used by the date functions ; http://php.net/date.timezone date.timezone = Asia/Bangkok
ตั้งค่า MySQL Database
- สร้าง database roundcubemail โดยกำหนด username=rcmail, password=rcmailpass
mysql -u root -p
CREATE DATABASE roundcubemail CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE USER rcmail@localhost IDENTIFIED BY 'rcmailpass' ; GRANT ALL PRIVILEGES ON roundcubemail.* TO rcmail@localhost; FLUSH PRIVILEGES; quit;
ตั้งค่า roundcube
cd /var/www/html/ wget https://github.com/roundcube/roundcubemail/releases/download/1.4.4/roundcubemail-1.4.4-complete.tar.gz tar zvfx /var/www/html/roundcubemail-1.4.4-complete.tar.gz mv /var/www/html/roundcubemail-1.4.4 /var/www/html/roundcubemail cp /var/www/html/roundcubemail/config/config.inc.php.sample /var/www/html/roundcubemail/config/config.inc.php chown -R www-data:www-data /var/www/html/roundcubemail
สร้าง virtualhost
rm /etc/apache2/sites-enabled/000-default.conf nano /etc/apache2/sites-available/rcmail.conf
<VirtualHost *:80> ServerName mail.mailthai99.in.th ServerAdmin webmaster@mailtha99.in.th DocumentRoot /var/www/html/roundcubemail <Directory /var/www/html/roundcubemail> Options -Indexes +FollowSymLinks AllowOverride All </Directory> ErrorLog /var/log/apache2/mail.mailthai01.th-error.log CustomLog /var/log/apache2/mail.mailthai01.th-access.log combined </VirtualHost>
ln -s /etc/apache2/sites-available/rcmail.conf /etc/apache2/sites-enabled/rcmail.conf systemctl restart apache2
ทดสอบเข้าเว็บโซต์
https://eai-lab.bknix.co.th/mailXX/
ตัวอย่าง
DATABASE ERROR: CONNECTION FAILED! Unable to connect to the database! Please contact your server-administrator.
เข้าหน้า config roundcube
- แก้ไขไฟล์ config.inc.php
nano /var/www/html/roundcubemail/config/config.inc.php
ตัวอย่าง
$config['enable_installer'] = true;
- การใช้ ssl แบบ self-sign อาจจะทำให้ roundcube ไม่สามารถเชื่อมต่อ mail server ได้ แก้ปัญหาโดยการ config เพิ่มเติม ดังนี้
nano /var/www/html/roundcubemail/config/defaults.inc.php
ตัวอย่าง
$config['imap_conn_options'] = array( 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false, ), ); $config['smtp_conn_options'] = array( 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false, ), );
- เข้าหน้าเว็บ config
https://eai-lab.bknix.co.th/mailXX/installer/
ตั้งค่าเชื่อมต่อ database
host = localhost dbname =roundcubemail user = rcmail password = rcmailpass db_prefix = rc_
ตั้งค่า IMAP/SMTP
- ตั้งค่า IMAP
ssl://mail.mailthaiXX.in.th 993
- ตั้งค่า SMTP
ssl://mail.mailthaiXX.in.th 465
หมายเหตุ user: thai@mailthaiXX.in.th และ ไทย@จดหมายXX.ไทย, pass: thaipass