ผลต่างระหว่างรุ่นของ "คู่มือการพัฒนา EAI Mail Server บน Ubuntu 22"
Titipong (คุย | มีส่วนร่วม) ล |
Titipong (คุย | มีส่วนร่วม) |
||
(ไม่แสดง 15 รุ่นระหว่างกลางโดยผู้ใช้คนเดียวกัน) | |||
แถว 11: | แถว 11: | ||
# Dovecot 2.3.16 | # Dovecot 2.3.16 | ||
# MySQL 8.0.30 | # MySQL 8.0.30 | ||
− | # Roundcube 1.6. | + | # Roundcube 1.6.5 [[https://roundcube.net/download/ ดาวน์โหลด]] [[https://github.com/roundcube/roundcubemail/releases/download/1.6.5/roundcubemail-1.6.5-complete.tar.gz tar]] |
== เอกสารที่เกี่ยวข้อง == | == เอกสารที่เกี่ยวข้อง == | ||
แถว 193: | แถว 193: | ||
[mysqld] | [mysqld] | ||
− | <span style='color:green'>character-set-server = | + | <span style='color:green'>character-set-server = utf8mb4</span> |
− | <span style='color:green'>collation-server = | + | <span style='color:green'>collation-server = utf8mb4_0900_ai_ci</span> |
<span style='color:green'>skip-character-set-client-handshake</span> | <span style='color:green'>skip-character-set-client-handshake</span> | ||
− | |||
# | # | ||
# * Basic Settings | # * Basic Settings | ||
แถว 202: | แถว 201: | ||
user = mysql | user = mysql | ||
− | |||
=== สั่ง restart MySQL === | === สั่ง restart MySQL === | ||
'''systemctl restart mysql''' | '''systemctl restart mysql''' | ||
แถว 212: | แถว 210: | ||
=== สร้าง Database เพื่อใช้เก็บข้อมูลของการใช้งาน Email Server === | === สร้าง Database เพื่อใช้เก็บข้อมูลของการใช้งาน Email Server === | ||
*สร้าง Database | *สร้าง Database | ||
− | '''CREATE DATABASE eaimail;''' | + | '''CREATE DATABASE eaimail CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;''' |
''ตัวอย่าง'' | ''ตัวอย่าง'' | ||
Query OK, 1 row affected (0.02 sec) | Query OK, 1 row affected (0.02 sec) | ||
แถว 248: | แถว 246: | ||
'''INSERT INTO domains (domain) VALUES ('mailthai<span style='color:green'>XX</span>.in.th');''' | '''INSERT INTO domains (domain) VALUES ('mailthai<span style='color:green'>XX</span>.in.th');''' | ||
'''INSERT INTO domains (domain) VALUES ('จดหมาย<span style='color:green'>XX</span>.ไทย');''' | '''INSERT INTO domains (domain) VALUES ('จดหมาย<span style='color:green'>XX</span>.ไทย');''' | ||
+ | '''INSERT INTO domains (domain) VALUES ('xn--<span style='color:green'>XX</span>-6qi0c9cg5dxc.xn--o3cw4h');''' | ||
+ | |||
'''INSERT INTO users (email, password) VALUES ('thai@mailthai<span style='color:green'>XX</span>.in.th', '$6$7GQtdsDwSjzB7EAm$0.W6ZBcGEylrQMHKv1j7PZd/6EPoXAYClNhxxs3V2mG/NrHKDsycOTWwETniwI9O/OUeQkqBT5KPfNkDUb8hk/');''' | '''INSERT INTO users (email, password) VALUES ('thai@mailthai<span style='color:green'>XX</span>.in.th', '$6$7GQtdsDwSjzB7EAm$0.W6ZBcGEylrQMHKv1j7PZd/6EPoXAYClNhxxs3V2mG/NrHKDsycOTWwETniwI9O/OUeQkqBT5KPfNkDUb8hk/');''' | ||
'''INSERT INTO users (email, password) VALUES ('ไทย@จดหมาย<span style='color:green'>XX</span>.ไทย', '$6$7GQtdsDwSjzB7EAm$0.W6ZBcGEylrQMHKv1j7PZd/6EPoXAYClNhxxs3V2mG/NrHKDsycOTWwETniwI9O/OUeQkqBT5KPfNkDUb8hk/');''' | '''INSERT INTO users (email, password) VALUES ('ไทย@จดหมาย<span style='color:green'>XX</span>.ไทย', '$6$7GQtdsDwSjzB7EAm$0.W6ZBcGEylrQMHKv1j7PZd/6EPoXAYClNhxxs3V2mG/NrHKDsycOTWwETniwI9O/OUeQkqBT5KPfNkDUb8hk/');''' | ||
+ | '''INSERT INTO users (email, password) VALUES ('ไทย@xn--<span style='color:green'>XX</span>-6qi0c9cg5dxc.xn--o3cw4h', '$6$7GQtdsDwSjzB7EAm$0.W6ZBcGEylrQMHKv1j7PZd/6EPoXAYClNhxxs3V2mG/NrHKDsycOTWwETniwI9O/OUeQkqBT5KPfNkDUb8hk/');''' | ||
+ | |||
''ตัวอย่าง เช่น mailthai99.in.th, จดหมาย99.ไทย, thai@mailthai99.in.th, ไทย@จดหมาย99.ไทย'' | ''ตัวอย่าง เช่น mailthai99.in.th, จดหมาย99.ไทย, thai@mailthai99.in.th, ไทย@จดหมาย99.ไทย'' | ||
''หมายเหตุ สร้างรหัสผ่านด้วยคำสั่ง doveadm pw -s SHA512-CRYPT '' | ''หมายเหตุ สร้างรหัสผ่านด้วยคำสั่ง doveadm pw -s SHA512-CRYPT '' | ||
− | |||
=== <span style='color:green'> กำหนด Email ที่เข้ามายัง Email Account ภาษาไทย ให้ forward เข้า Email-Account ภาษาอังกฤษ เนื่องจากระบบไม่สามารถสร้าง mailbox เป็น ภาษาไทยได้</span> === | === <span style='color:green'> กำหนด Email ที่เข้ามายัง Email Account ภาษาไทย ให้ forward เข้า Email-Account ภาษาอังกฤษ เนื่องจากระบบไม่สามารถสร้าง mailbox เป็น ภาษาไทยได้</span> === | ||
'''INSERT INTO forwardings (source,destination) VALUES ('ไทย@จดหมาย<span style='color:green'>XX</span>.ไทย','thai@mailthai<span style='color:green'>XX</span>.in.th');''' | '''INSERT INTO forwardings (source,destination) VALUES ('ไทย@จดหมาย<span style='color:green'>XX</span>.ไทย','thai@mailthai<span style='color:green'>XX</span>.in.th');''' | ||
+ | '''INSERT INTO forwardings (source,destination) VALUES ('ไทย@xn--<span style='color:green'>XX</span>-6qi0c9cg5dxc.xn--o3cw4h','thai@mailthai<span style='color:green'>XX</span>.in.th');''' | ||
+ | |||
'''quit;''' | '''quit;''' | ||
แถว 326: | แถว 329: | ||
'''postconf "myhostname=mail.mailthai<span style='color:green;'>XX</span>.in.th" && \ | '''postconf "myhostname=mail.mailthai<span style='color:green;'>XX</span>.in.th" && \ | ||
'''postconf "mydomain=mailthai<span style='color:green;'>XX</span>.in.th" && \ | '''postconf "mydomain=mailthai<span style='color:green;'>XX</span>.in.th" && \ | ||
− | |||
'''postconf "smtpd_tls_cert_file=/etc/ssl/private/mailthai<span style='color:green;'>XX</span>.crt" && \ | '''postconf "smtpd_tls_cert_file=/etc/ssl/private/mailthai<span style='color:green;'>XX</span>.crt" && \ | ||
'''postconf "smtpd_tls_key_file=/etc/ssl/private/mailthai<span style='color:green;'>XX</span>.key" && \ | '''postconf "smtpd_tls_key_file=/etc/ssl/private/mailthai<span style='color:green;'>XX</span>.key" && \ | ||
แถว 395: | แถว 397: | ||
smtpd_use_tls = yes | smtpd_use_tls = yes | ||
smtputf8_enable = yes | smtputf8_enable = yes | ||
− | |||
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf | virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf | ||
virtual_gid_maps = static:5000 | virtual_gid_maps = static:5000 | ||
แถว 649: | แถว 650: | ||
<!--T:101--> | <!--T:101--> | ||
− | CREATE DATABASE roundcubemail CHARACTER SET | + | CREATE DATABASE roundcubemail CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; |
CREATE USER rcmail@localhost IDENTIFIED BY 'rcmailpass' ; | CREATE USER rcmail@localhost IDENTIFIED BY 'rcmailpass' ; | ||
GRANT ALL PRIVILEGES ON roundcubemail.* TO rcmail@localhost; | GRANT ALL PRIVILEGES ON roundcubemail.* TO rcmail@localhost; | ||
แถว 657: | แถว 658: | ||
=== ตั้งค่า roundcube === <!--T:102--> | === ตั้งค่า roundcube === <!--T:102--> | ||
'''cd /var/www/html/ | '''cd /var/www/html/ | ||
− | '''wget https://github.com/roundcube/roundcubemail/releases/download/1.6. | + | '''wget https://github.com/roundcube/roundcubemail/releases/download/1.6.5/roundcubemail-1.6.5-complete.tar.gz |
− | '''tar zvfx /var/www/html/roundcubemail-1.6. | + | '''tar zvfx /var/www/html/roundcubemail-1.6.5-complete.tar.gz |
− | '''mv /var/www/html/roundcubemail-1.6. | + | '''mv /var/www/html/roundcubemail-1.6.5 /var/www/html/roundcubemail |
− | ''' | + | '''ll /var/www/html/roundcubemail/config/ |
'''chown -R www-data:www-data /var/www/html/roundcubemail | '''chown -R www-data:www-data /var/www/html/roundcubemail | ||
=== สร้าง virtualhost === <!--T:103--> | === สร้าง virtualhost === <!--T:103--> | ||
− | ''' | + | '''cd /etc/apache2/sites-available/''' |
'''nano /etc/apache2/sites-available/rcmail.conf''' | '''nano /etc/apache2/sites-available/rcmail.conf''' | ||
แถว 681: | แถว 682: | ||
<!--T:105--> | <!--T:105--> | ||
− | ''' | + | '''a2ensite rcmail.conf''' |
'''systemctl restart apache2''' | '''systemctl restart apache2''' | ||
แถว 692: | แถว 693: | ||
=== <span style='color:green'>เข้าหน้า config roundcube</span> === <!--T:106--> | === <span style='color:green'>เข้าหน้า config roundcube</span> === <!--T:106--> | ||
+ | *เข้าหน้าเว็บ config | ||
+ | '''https://eai-lab.bknix.co.th/mailXX/installer/''' | ||
+ | |||
+ | === <span style='color:green'>ตั้งค่าเชื่อมต่อ database</span> === <!--T:107--> | ||
+ | host = localhost | ||
+ | dbname = roundcubemail | ||
+ | user = rcmail | ||
+ | password = rcmailpass | ||
+ | db_prefix = rc_ | ||
+ | |||
+ | === <span style='color:green'>ตั้งค่า IMAP/SMTP</span> === <!--T:109--> | ||
+ | * ตั้งค่า IMAP | ||
+ | '''ssl://mail.mailthaiXX.in.th:993''' | ||
+ | |||
+ | <!--T:110--> | ||
+ | * ตั้งค่า SMTP | ||
+ | '''ssl://mail.mailthaiXX.in.th:465''' | ||
+ | ''หมายเหตุ user: thai@mailthaiXX.in.th และ ไทย@จดหมายXX.ไทย, pass: thaipass | ||
+ | |||
+ | |||
*แก้ไขไฟล์ config.inc.php | *แก้ไขไฟล์ config.inc.php | ||
'''nano /var/www/html/roundcubemail/config/config.inc.php''' | '''nano /var/www/html/roundcubemail/config/config.inc.php''' | ||
แถว 715: | แถว 736: | ||
), | ), | ||
); | ); | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</translate> | </translate> | ||
[[Category: EAI]] | [[Category: EAI]] |
รุ่นแก้ไขปัจจุบันเมื่อ 23:21, 22 เมษายน 2567
เนื้อหา
- 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 Login เข้าใช้งาน MySQL โดยใช้ password ของ user root ที่ได้ตั้งค่าไว้
- 2.5.4 สร้าง Database เพื่อใช้เก็บข้อมูลของการใช้งาน Email Server
- 2.5.5 สร้าง user พร้อมกำหนดสิทธิ์การใช้งานให้กับ eaimail database ที่สร้างขึ้นมา
- 2.5.6 ตรวจสอบ user ที่สร้างขึ้นใหม่โดย
- 2.5.7 สร้างตารางใช้เก็บค่า domains, forwardings สำหรับ forward อีเมลภาษาไทยไปภาษาอังกฤษ, users เพื่อใช้สร้าง mailbox
- 2.5.8 เพิ่มข้อมูล Domain และ Email Account ทั้งภาษาอังกฤษ และภาษาไทย เพื่อเริ่มใช้งาน
- 2.5.9 กำหนด 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 ติดตั้งโปรแกรม telnet เพื่อทดสอบอีเมลเซิร์ฟเวอร์
- 2.8.2 ทดสอบ imap ด้วยคำสั่ง telnet
- 2.8.3 ทดสอบ smtp ด้วยคำสั่ง telnet
- 2.8.4 ทดสอบการส่ง email ด้วย telnet
- 2.8.5 ตรวจสอบ log ของการส่ง Email : /var/log/mail.log ซึ้งจะได้ผลตามด้านล่าง
- 2.8.6 ตรวจสอบ log ของ dovecot : /home/vmail/dovecot-deliver.log ซึ่งจะได้ผลตามด้านล่าง
- 2.8.7 ตรวจสอบ mailbox เมื่อมีการรับส่ง-ส่ง Email จะสร้างขึ้นโดย dovecot ซึ่งจะได้ผลตามตัวอย่าง
- 2.9 ติดตั้ง roundcube webmail
EAI Email Server
คู่มือนี้ได้จัดทำขึ้นมาเพื่อทดสอบและเป็นแนวทางการติดตั้ง Email Server ให้สามารถรับส่ง email address ภาษาไทย หรือ Email Address Internationalization (EAI) โดยใช้ Opensource Software เพื่อหาวิธีการที่สามารถใช้งานได้ และสามารถนำไปพัฒนาต่อยอดได้
Software ที่นำมาทดสอบ
- Ubuntu 22.04.3 LTS [workshop virtualbox image ]
- Postfix 3.6.4
- Dovecot 2.3.16
- MySQL 8.0.30
- Roundcube 1.6.5 [ดาวน์โหลด] [tar]
เอกสารที่เกี่ยวข้อง
EAI Workshop Authentication
user: eai pass: eaiws@2022
- โดเมนที่ใช้เป็นตัวอย่างใน 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
- 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.mailthaiXX.in.th
ตัวอย่าง เช่น mail.mailthai99.in.th
- ตรวจสอบ hostname
hostnamectl
ตัวอย่าง
Static hostname: mail.mailthai99.in.th
เพิ่มค่า hostname ชื่อเดียวกับชื่อที่กำหนดข้างต้นในไฟล์ hosts
nano /etc/hosts
ตัวอย่าง เช่น mail.mailthai99.in.th
ตัวอย่างไฟล์ hosts
100.64.10.99 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 ssh ufw allow http ufw allow https ufw allow smtp ufw allow smtps ufw allow imap ufw allow imaps
ตัวอย่าง
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 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)
สร้าง SSL Cert
- เป็นขั้นตอนการสร้าง SSL cert/key เตรียมไว้ใช้งานกับ postfix และ dovecot
- ในเครื่อง workshop ได้เตรียม cert mailthai.crt, mailthai.key ไว้แล้ว
1. สร้าง private key
cd /etc/ssl/private openssl req -new -x509 -days 365 -nodes -newkey rsa:2048 -keyout mailthaiXX.key -out mailthaiXX.crt -subj "/C=TH/ST=Bangkok/L=Dusit/O=EAI/OU=IT/CN=mail.mailthaiXX.in.th"
2. ตรวจสอบ key ที่สร้างขึ้น
ls
ตัวอย่าง
mailthai99.crt 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 = utf8mb4 collation-server = utf8mb4_0900_ai_ci skip-character-set-client-handshake # # * Basic Settings # user = mysql
สั่ง restart MySQL
systemctl restart mysql
Login เข้าใช้งาน MySQL โดยใช้ password ของ user root ที่ได้ตั้งค่าไว้
mysql -u root -p # enter
สร้าง Database เพื่อใช้เก็บข้อมูลของการใช้งาน Email Server
- สร้าง Database
CREATE DATABASE eaimail CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ตัวอย่าง
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 domains (domain) VALUES ('xn--XX-6qi0c9cg5dxc.xn--o3cw4h');
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/'); INSERT INTO users (email, password) VALUES ('ไทย@xn--XX-6qi0c9cg5dxc.xn--o3cw4h', '$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'); INSERT INTO forwardings (source,destination) VALUES ('ไทย@xn--XX-6qi0c9cg5dxc.xn--o3cw4h','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 "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=mail.\$mydomain" && \ postconf "mynetworks=100.64.10.0/24 127.0.0.0/8" && \ 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=mysql:/etc/postfix/mysql-virtual_mailboxes.cf" && \ postconf "virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual_domains.cf" && \ postconf "virtual_alias_maps=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 "maillog_file=/var/log/mail.log"
ตรวจสอบการ config postfix ด้วยคำสั่ง
postconf -n
- ตัวอย่างไฟล์
alias_database = hash:/etc/aliases alias_maps = hash:/etc/aliases append_dot_mydomain = no biff = no broken_sasl_auth_clients = yes compatibility_level = 3.6 inet_interfaces = all inet_protocols = ipv4 mailbox_size_limit = 0 mydestination = localhost, localhost.localdomain mydomain = mailthai99.in.th myhostname = mail.mailthai99.in.th mynetworks = 127.0.0.1 myorigin = $mydomain 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 recipient_delimiter = + relayhost = smtp_tls_CApath = /etc/ssl/certs smtp_tls_security_level = may smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu) smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_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_tls_security_level = may smtpd_use_tls = yes smtputf8_enable = yes 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 -M 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
cd /etc/dovecot/
- สร้าง 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
ติดตั้งโปรแกรม telnet เพื่อทดสอบอีเมลเซิร์ฟเวอร์
apt -y install telnet
ทดสอบ 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
- config phpmyadmin
Configure database for phpmyadmin with dbconfig-common? [yes/no] yes MySQL application password for phpmyadmin: # enter Web server to reconfigure automatically: 1
- ใช้คำสั่ง start service apache และ php
systemctl start apache2
- ตรวจสอบสถานะการทำงานของ apache
systemctl status apache2
ตั้งค่า php (เราจะตั้งค่าเฉพาะส่วนที่จำเป็นต่อการใช้งาน roundcube)
- ตั้งค่า timezone
nano /etc/php/8.1/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 utf8mb4 COLLATE utf8mb4_0900_ai_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.6.5/roundcubemail-1.6.5-complete.tar.gz tar zvfx /var/www/html/roundcubemail-1.6.5-complete.tar.gz mv /var/www/html/roundcubemail-1.6.5 /var/www/html/roundcubemail ll /var/www/html/roundcubemail/config/ chown -R www-data:www-data /var/www/html/roundcubemail
สร้าง virtualhost
cd /etc/apache2/sites-available/ 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/mailthai99-in-th-th-error.log CustomLog /var/log/apache2/mailthai99-in-th-th-access.log combined </VirtualHost>
a2ensite 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
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
- แก้ไขไฟล์ config.inc.php
nano /var/www/html/roundcubemail/config/config.inc.php
ตัวอย่าง
$config['request_path'] = 'https://eai-lab.bknix.co.th/mailXX/';
- การใช้ ssl แบบ self-sign อาจจะทำให้ roundcube ไม่สามารถเชื่อมต่อ mail server ได้ แก้ปัญหาโดยการ config เพิ่มเติม ดังนี้
nano /var/www/html/roundcubemail/config/defaults.inc.php
ตัวอย่าง
$config['enable_installer'] = true; $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, ), );