ผลต่างระหว่างรุ่นของ "คู่มือการพัฒนา EAI Mail Server บน Ubuntu 24"
Titipong (คุย | มีส่วนร่วม) |
Titipong (คุย | มีส่วนร่วม) ล |
||
(ไม่แสดง 29 รุ่นระหว่างกลางโดยผู้ใช้คนเดียวกัน) | |||
แถว 34: | แถว 34: | ||
* Passphase for SSL Key | * Passphase for SSL Key | ||
Key: mailthai.key, mailthai.crt | Key: mailthai.key, mailthai.crt | ||
− | * | + | * MariaDB |
DB: eaimail | DB: eaimail | ||
User: dbuser | User: dbuser | ||
แถว 126: | แถว 126: | ||
* Starting IMAP/POP3 mail server dovecot [ OK ] | * Starting IMAP/POP3 mail server dovecot [ OK ] | ||
− | == ตั้งค่า | + | == ตั้งค่า MariaDB == <!--T:45--> |
− | === ตั้งค่า UTF8 ให้กับ | + | === ตั้งค่า UTF8 ให้กับ MariaDB เพื่อให้รองรับภาษาไทย โดยเพิ่มคำสั่งด้านล่างลงในไฟล์ mysqld.cnf ใต้ [mysqld] === |
'''nano /etc/mysql/mariadb.conf.d/50-server.cnf''' | '''nano /etc/mysql/mariadb.conf.d/50-server.cnf''' | ||
'' ตัวอย่าง ไฟล์ 50-server.cnf'' | '' ตัวอย่าง ไฟล์ 50-server.cnf'' | ||
แถว 137: | แถว 137: | ||
[mysqld] | [mysqld] | ||
<span style='color:green'>character-set-server = utf8mb4</span> | <span style='color:green'>character-set-server = utf8mb4</span> | ||
− | <span style='color:green'>collation-server = | + | <span style='color:green'>collation-server = utf8mb4_unicode_ci</span> |
<span style='color:green'>skip-character-set-client-handshake</span> | <span style='color:green'>skip-character-set-client-handshake</span> | ||
# | # | ||
แถว 143: | แถว 143: | ||
# | # | ||
− | === สั่ง restart | + | === สั่ง restart MariaDB === |
'''service mariadb restart''' | '''service mariadb restart''' | ||
แถว 151: | แถว 151: | ||
=== สร้าง Database เพื่อใช้เก็บข้อมูลของการใช้งาน Email Server === | === สร้าง Database เพื่อใช้เก็บข้อมูลของการใช้งาน Email Server === | ||
− | *สร้าง Database | + | <span style='color:green'>*สร้าง Database </span> |
'''CREATE DATABASE eaimail CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;''' | '''CREATE DATABASE eaimail CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;''' | ||
''ตัวอย่าง'' | ''ตัวอย่าง'' | ||
แถว 161: | แถว 161: | ||
Database changed | Database changed | ||
− | === สร้าง user พร้อมกำหนดสิทธิ์การใช้งานให้กับ eaimail database ที่สร้างขึ้นมา === | + | === <span style='color:green'>สร้าง user พร้อมกำหนดสิทธิ์การใช้งานให้กับ eaimail database ที่สร้างขึ้นมา</span> === |
'''CREATE USER dbuser@localhost IDENTIFIED BY 'dbuserpass';''' | '''CREATE USER dbuser@localhost IDENTIFIED BY 'dbuserpass';''' | ||
'''GRANT SELECT, INSERT, UPDATE, DELETE ON eaimail.* TO dbuser@localhost;''' | '''GRANT SELECT, INSERT, UPDATE, DELETE ON eaimail.* TO dbuser@localhost;''' | ||
'''FLUSH PRIVILEGES;''' | '''FLUSH PRIVILEGES;''' | ||
− | |||
=== ตรวจสอบ user ที่สร้างขึ้นใหม่โดย === | === ตรวจสอบ user ที่สร้างขึ้นใหม่โดย === | ||
'''SHOW GRANTS FOR dbuser@localhost;''' | '''SHOW GRANTS FOR dbuser@localhost;''' | ||
แถว 179: | แถว 178: | ||
<!--T:53--> | <!--T:53--> | ||
− | === สร้างตารางใช้เก็บค่า domains, forwardings สำหรับ forward อีเมลภาษาไทยไปภาษาอังกฤษ, users เพื่อใช้สร้าง mailbox === | + | === <span style='color:green'>สร้างตารางใช้เก็บค่า domains, forwardings สำหรับ forward อีเมลภาษาไทยไปภาษาอังกฤษ, users เพื่อใช้สร้าง mailbox</span> === |
'''CREATE TABLE domains (domain varchar(256) NOT NULL, PRIMARY KEY (domain));''' | '''CREATE TABLE domains (domain varchar(256) NOT NULL, PRIMARY KEY (domain));''' | ||
'''CREATE TABLE forwardings (source varchar(256) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (source));''' | '''CREATE TABLE forwardings (source varchar(256) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (source));''' | ||
แถว 204: | แถว 203: | ||
== ตั้งค่า postfix == <!--T:56--> | == ตั้งค่า postfix == <!--T:56--> | ||
− | === | + | === สร้างไฟล์เชื่อมต่อระหว่าง Postfix และ MariaDB === |
'''cd /etc/postfix/mysql''' | '''cd /etc/postfix/mysql''' | ||
* สร้างไฟล์ script เพื่อใช้สำหรับเรียกค่า domain จาก Database | * สร้างไฟล์ script เพื่อใช้สำหรับเรียกค่า domain จาก Database | ||
แถว 270: | แถว 269: | ||
'''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 "virtual_alias_domains=จดหมาย<span style='color:green;'>XX</span>.ไทย" && \ | ||
'''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" && \ | ||
แถว 311: | แถว 311: | ||
inet_protocols = ipv4 | inet_protocols = ipv4 | ||
mailbox_size_limit = 0 | mailbox_size_limit = 0 | ||
− | mydestination = | + | maillog_file = /var/log/mail.log |
+ | mydestination = mail.$mydomain | ||
mydomain = mailthai99.in.th | mydomain = mailthai99.in.th | ||
myhostname = mail.mailthai99.in.th | myhostname = mail.mailthai99.in.th | ||
แถว 338: | แถว 339: | ||
smtpd_use_tls = yes | smtpd_use_tls = yes | ||
smtputf8_enable = yes | smtputf8_enable = yes | ||
+ | virtual_alias_domains = จดหมาย99.ไทย | ||
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql/mysql-virtual_email2email.cf | virtual_alias_maps = proxy:mysql:/etc/postfix/mysql/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql/mysql-virtual_email2email.cf | ||
virtual_gid_maps = static:5000 | virtual_gid_maps = static:5000 | ||
แถว 370: | แถว 372: | ||
dovecot unix - n n - - pipe | dovecot unix - n n - - pipe | ||
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}''' | flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}''' | ||
− | |||
− | |||
− | |||
− | |||
− | |||
=== <span style='color:green'>สั่ง restart postfix</span> === <!--T:70--> | === <span style='color:green'>สั่ง restart postfix</span> === <!--T:70--> | ||
− | ''' | + | '''service postfix restart''' |
== ตั้งค่า dovecot == <!--T:71--> | == ตั้งค่า dovecot == <!--T:71--> | ||
− | === <span style='color:green'>สร้างไฟล์เชื่อมต่อระหว่าง dovecot และ | + | === <span style='color:green'>สร้างไฟล์เชื่อมต่อระหว่าง dovecot และ MariaDB</span> === |
'''cd /etc/dovecot/''' | '''cd /etc/dovecot/''' | ||
* สร้าง script เพื่อให้ dovecot ใช้งานกับ SQL ที่เราได้กำหนดก่อนหน้านี้ | * สร้าง script เพื่อให้ dovecot ใช้งานกับ SQL ที่เราได้กำหนดก่อนหน้านี้ | ||
แถว 410: | แถว 407: | ||
<!--T:76--> | <!--T:76--> | ||
protocols = imap pop3 lmtp | protocols = imap pop3 lmtp | ||
+ | log_path = /var/log/dovecot.log | ||
log_timestamp = "%Y-%m-%d %H:%M:%S" | log_timestamp = "%Y-%m-%d %H:%M:%S" | ||
mail_location = maildir:/home/vmail/%d/%n/Maildir | mail_location = maildir:/home/vmail/%d/%n/Maildir | ||
แถว 438: | แถว 436: | ||
} | } | ||
protocol lda { | protocol lda { | ||
− | log_path = / | + | log_path = /var/log/dovecot-deliver.log |
auth_socket_path = /var/run/dovecot/auth-master | auth_socket_path = /var/run/dovecot/auth-master | ||
postmaster_address = postmaster@mailthai<span style='color:green;'>XX</span>.in.th | postmaster_address = postmaster@mailthai<span style='color:green;'>XX</span>.in.th | ||
แถว 467: | แถว 465: | ||
} | } | ||
− | === <span style='color:green'> | + | === <span style='color:green'>แก้ไข permission ไฟล์ </span> === |
− | ''' | + | ''' touch /var/log/dovecot-deliver.log |
+ | ''' chown vmail:vmail /var/log/dovecot-deliver.log | ||
+ | |||
+ | === <span style='color:green'>สั่ง restart dovecot</span> === | ||
+ | '''service dovecot restart''' | ||
== ทดสอบการทำงานของ Email Server == <!--T:78--> | == ทดสอบการทำงานของ Email Server == <!--T:78--> | ||
แถว 569: | แถว 571: | ||
* ใช้คำสั่ง start service apache และ php | * ใช้คำสั่ง start service apache และ php | ||
− | ''' | + | '''service apache2 start''' |
<!--T:97--> | <!--T:97--> | ||
* ตรวจสอบสถานะการทำงานของ apache | * ตรวจสอบสถานะการทำงานของ apache | ||
− | ''' | + | '''service apache2 status''' |
=== ตั้งค่า php (เราจะตั้งค่าเฉพาะส่วนที่จำเป็นต่อการใช้งาน roundcube) === <!--T:98--> | === ตั้งค่า php (เราจะตั้งค่าเฉพาะส่วนที่จำเป็นต่อการใช้งาน roundcube) === <!--T:98--> | ||
* ตั้งค่า timezone | * ตั้งค่า timezone | ||
− | '''nano /etc/php/8. | + | '''nano /etc/php/8.3/apache2/php.ini''' |
<!--T:99--> | <!--T:99--> | ||
แถว 586: | แถว 588: | ||
date.timezone = Asia/Bangkok | date.timezone = Asia/Bangkok | ||
− | === ตั้งค่า | + | === ตั้งค่า MariaDB Database === <!--T:100--> |
* สร้าง database roundcubemail โดยกำหนด username=rcmail, password=rcmailpass | * สร้าง database roundcubemail โดยกำหนด username=rcmail, password=rcmailpass | ||
'''mysql -u root -p''' | '''mysql -u root -p''' | ||
<!--T:101--> | <!--T:101--> | ||
− | CREATE DATABASE roundcubemail CHARACTER SET utf8mb4 COLLATE | + | CREATE DATABASE roundcubemail CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_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; | ||
แถว 599: | แถว 601: | ||
=== ตั้งค่า 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.9/roundcubemail-1.6.9-complete.tar.gz |
− | '''tar zvfx /var/www/html/roundcubemail-1.6. | + | '''tar zvfx /var/www/html/roundcubemail-1.6.9-complete.tar.gz |
− | '''mv /var/www/html/roundcubemail-1.6. | + | '''mv /var/www/html/roundcubemail-1.6.9 /var/www/html/roundcubemail |
'''ll /var/www/html/roundcubemail/config/ | '''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 | ||
แถว 624: | แถว 626: | ||
<!--T:105--> | <!--T:105--> | ||
'''a2ensite rcmail.conf''' | '''a2ensite rcmail.conf''' | ||
− | ''' | + | '''a2dissite 000-default.conf''' |
+ | '''a2dissite default-ssl.conf''' | ||
+ | |||
+ | '''service apache2 reload''' | ||
=== <span style='color:green'>ทดสอบเข้าเว็บโซต์</span> === <!--T:106--> | === <span style='color:green'>ทดสอบเข้าเว็บโซต์</span> === <!--T:106--> | ||
− | '''https:// | + | '''https://workshop.kon.in.th/mailXX/''' |
''ตัวอย่าง'' | ''ตัวอย่าง'' | ||
− | + | Oops... something went wrong! | |
− | + | An internal error has occurred. Your request cannot be processed at this time. | |
− | Please | + | For administrators: Please check the application and/or server error logs for more information. |
=== <span style='color:green'>เข้าหน้า config roundcube</span> === <!--T:106--> | === <span style='color:green'>เข้าหน้า config roundcube</span> === <!--T:106--> | ||
*เข้าหน้าเว็บ config | *เข้าหน้าเว็บ config | ||
− | '''https:// | + | '''https://workshop.kon.in.th/mailXX/installer/''' |
=== <span style='color:green'>ตั้งค่าเชื่อมต่อ database</span> === <!--T:107--> | === <span style='color:green'>ตั้งค่าเชื่อมต่อ database</span> === <!--T:107--> | ||
แถว 657: | แถว 662: | ||
'''nano /var/www/html/roundcubemail/config/config.inc.php''' | '''nano /var/www/html/roundcubemail/config/config.inc.php''' | ||
''ตัวอย่าง'' | ''ตัวอย่าง'' | ||
− | $config['request_path'] = 'https:// | + | $config['request_path'] = 'https://workshop.kon.in.th/mailXX/'; |
*การใช้ ssl แบบ self-sign อาจจะทำให้ roundcube ไม่สามารถเชื่อมต่อ mail server ได้ แก้ปัญหาโดยการ config เพิ่มเติม ดังนี้ | *การใช้ ssl แบบ self-sign อาจจะทำให้ roundcube ไม่สามารถเชื่อมต่อ mail server ได้ แก้ปัญหาโดยการ config เพิ่มเติม ดังนี้ |
รุ่นแก้ไขปัจจุบันเมื่อ 13:03, 13 พฤศจิกายน 2567
เนื้อหา
- 1 EAI Email Server
- 2 การติดตั้ง EAI Email Server
- 2.1 ตั้งค่า hostname
- 2.2 สร้าง SSL Cert
- 2.3 ติดตั้ง MariaDB, Postfix, Dovecot
- 2.4 ตั้งค่า MariaDB
- 2.4.1 ตั้งค่า UTF8 ให้กับ MariaDB เพื่อให้รองรับภาษาไทย โดยเพิ่มคำสั่งด้านล่างลงในไฟล์ mysqld.cnf ใต้ [mysqld]
- 2.4.2 สั่ง restart MariaDB
- 2.4.3 Login เข้าใช้งาน MariaDB โดย user root
- 2.4.4 สร้าง Database เพื่อใช้เก็บข้อมูลของการใช้งาน Email Server
- 2.4.5 สร้าง user พร้อมกำหนดสิทธิ์การใช้งานให้กับ eaimail database ที่สร้างขึ้นมา
- 2.4.6 ตรวจสอบ user ที่สร้างขึ้นใหม่โดย
- 2.4.7 สร้างตารางใช้เก็บค่า domains, forwardings สำหรับ forward อีเมลภาษาไทยไปภาษาอังกฤษ, users เพื่อใช้สร้าง mailbox
- 2.4.8 เพิ่มข้อมูล Domain และ Email Account ทั้งภาษาอังกฤษ และภาษาไทย เพื่อเริ่มใช้งาน
- 2.4.9 กำหนด Email ที่เข้ามายัง Email Account ภาษาไทย ให้ forward เข้า Email-Account ภาษาอังกฤษ เนื่องจากระบบไม่สามารถสร้าง mailbox เป็น ภาษาไทยได้
- 2.5 ตั้งค่า postfix
- 2.5.1 สร้างไฟล์เชื่อมต่อระหว่าง Postfix และ MariaDB
- 2.5.2 สร้าง user vmail สำหรับอ่าน/เขียน mailbox
- 2.5.3 config การทำงานของ postfix ด้วยคำสั่ง postconf (คำสั่งนี้จะไปแก้ไขไฟล์ "/etc/postfix/main.cf")
- 2.5.4 ตรวจสอบการ config postfix ด้วยคำสั่ง
- 2.5.5 config การทำงานของ postfix ด้วยคำสั่ง postconf (คำสั่งนี้จะไปแก้ไขไฟล์ "/etc/postfix/master.cf")
- 2.5.6 ตรวจสอบการ config postfix ด้วยคำสั่ง
- 2.5.7 สั่ง restart postfix
- 2.6 ตั้งค่า dovecot
- 2.7 ทดสอบการทำงานของ Email Server
- 2.7.1 ติดตั้งโปรแกรม telnet เพื่อทดสอบอีเมลเซิร์ฟเวอร์
- 2.7.2 ทดสอบ imap ด้วยคำสั่ง telnet
- 2.7.3 ทดสอบ smtp ด้วยคำสั่ง telnet
- 2.7.4 ทดสอบการส่ง email ด้วย telnet
- 2.7.5 ตรวจสอบ log ของการส่ง Email : /var/log/mail.log ซึ้งจะได้ผลตามด้านล่าง
- 2.7.6 ตรวจสอบ log ของ dovecot : /home/vmail/dovecot-deliver.log ซึ่งจะได้ผลตามด้านล่าง
- 2.7.7 ตรวจสอบ mailbox เมื่อมีการรับส่ง-ส่ง Email จะสร้างขึ้นโดย dovecot ซึ่งจะได้ผลตามตัวอย่าง
- 2.8 ติดตั้ง roundcube webmail
EAI Email Server
คู่มือนี้ได้จัดทำขึ้นมาเพื่อทดสอบและเป็นแนวทางการติดตั้ง Email Server ให้สามารถรับส่ง email address ภาษาไทย หรือ Email Address Internationalization (EAI) โดยใช้ Opensource Software เพื่อหาวิธีการที่สามารถใช้งานได้ และสามารถนำไปพัฒนาต่อยอดได้
Software ที่นำมาทดสอบ
- Ubuntu 24.04.1 LTS
- Docker 27.3.1
- Postfix 3.8.6
- Dovecot 2.3.21
- Mariadb 10.11.8
- Roundcube 1.6.9 [ดาวน์โหลด] [tar]
เอกสารที่เกี่ยวข้อง
EAI Workshop Authentication
user: eai pass: eaiws@2024
- โดเมนที่ใช้เป็นตัวอย่างใน workshop
English : mailthaiXX.in.th ภาษาไทย : จดหมายXX.ไทย (Punycode) : xn--XX-6qi0c9cg5dxc.xn--o3cw4h
เว็บไซต์สำหรับแปลงโดเมนไทยเป็น punycode https://www.punycoder.com/
- Ubuntu Server:
User: userXX
Pass: userpass
- Passphase for SSL Key
Key: mailthai.key, mailthai.crt
- MariaDB
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
เข้าใช้งาน container
docker exec -it hostXX bash
ตัวอย่าง docker exec -it host99 bash
กำหนดชื่อ hostname และตรวจสอบด้วยคำสั่ง
- กำหนดชื่อ hostname
nano /etc/hostname
mail.mailthaiXX.in.th
ตัวอย่าง เช่น mail.mailthai99.in.th
- ตรวจสอบ hostname
hostname
ตัวอย่าง
mail.mailthai99.in.th
เพิ่มค่า hostname ชื่อเดียวกับชื่อที่กำหนดข้างต้นในไฟล์ hosts
nano /etc/hosts
ตัวอย่าง เช่น mail.mailthai99.in.th
ตัวอย่างไฟล์ hosts
10.0.0.199 localhost mail.mailthai99.in.th
กด crtl+X และกด y เพื่อ save และออกจาก nano
ตั้งค่าเวลาของ Mail Server และตรวจสอบ
- ตั้งค่าเวลาของ Mail Server
tzselect
ตัวอย่าง เลือก 4) Asia / 51) Thailand / 1) Yes
- ตรวจสอบเวลาของ Mail Server
date
ตัวอย่าง
อ. 12 พ.ย. 2567 02:30:29 +07
สร้าง 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
ติดตั้ง MariaDB, Postfix, Dovecot
1. ติดตั้ง MariaDB, Postfix , Dovecot และ packet ที่จำเป็นสำหรับ email sever ด้วยคำสั่ง
apt -y install postfix postfix-mysql dovecot-core dovecot-mysql dovecot-imapd dovecot-pop3d dovecot-lmtpd mariadb-server
3. สั่ง start service ของ MariaDB, Postfix, Dovecot ด้วยคำสั่ง
service mariadb start service postfix start service dovecot start
4. ดูสถานะการทำงานของ MariaDB, Postfix, Dovecot
service mariadb status service postfix status service dovecot status
ตัวอย่าง
* Starting MariaDB database server mariadbd [ OK ]
postfix/postfix-script: starting the Postfix mail system ...done.
* Starting IMAP/POP3 mail server dovecot [ OK ]
ตั้งค่า MariaDB
ตั้งค่า UTF8 ให้กับ MariaDB เพื่อให้รองรับภาษาไทย โดยเพิ่มคำสั่งด้านล่างลงในไฟล์ mysqld.cnf ใต้ [mysqld]
nano /etc/mysql/mariadb.conf.d/50-server.cnf
ตัวอย่าง ไฟล์ 50-server.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_unicode_ci skip-character-set-client-handshake # # * Basic Settings #
สั่ง restart MariaDB
service mariadb restart
Login เข้าใช้งาน MariaDB โดย user root
mysql -u root -p # enter
สร้าง Database เพื่อใช้เก็บข้อมูลของการใช้งาน Email Server
*สร้าง Database
CREATE DATABASE eaimail CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_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(256) NOT NULL, PRIMARY KEY (domain)); CREATE TABLE forwardings (source varchar(256) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (source)); CREATE TABLE users (email varchar(256) 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 และ MariaDB
cd /etc/postfix/mysql
- สร้างไฟล์ script เพื่อใช้สำหรับเรียกค่า domain จาก Database
nano /etc/postfix/mysql/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/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/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/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/mysql-virtual_*.cf && chgrp postfix /etc/postfix/mysql/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=mail.\$mydomain" && \ postconf "mynetworks=10.0.0.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/mysql-virtual_mailboxes.cf" && \ postconf "virtual_mailbox_domains=mysql:/etc/postfix/mysql/mysql-virtual_domains.cf" && \ postconf "virtual_alias_maps=mysql:/etc/postfix/mysql/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql/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 maillog_file = /var/log/mail.log mydestination = mail.$mydomain mydomain = mailthai99.in.th myhostname = mail.mailthai99.in.th mynetworks = 10.0.0.0/24, 127.0.0.0/8 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_domains = จดหมาย99.ไทย virtual_alias_maps = proxy:mysql:/etc/postfix/mysql/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql/mysql-virtual_email2email.cf virtual_gid_maps = static:5000 virtual_mailbox_base = /home/vmail virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql/mysql-virtual_domains.cf virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql/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}
สั่ง restart postfix
service postfix restart
ตั้งค่า dovecot
สร้างไฟล์เชื่อมต่อระหว่าง dovecot และ MariaDB
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_path = /var/log/dovecot.log 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 = /var/log/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 } }
แก้ไข permission ไฟล์
touch /var/log/dovecot-deliver.log chown vmail:vmail /var/log/dovecot-deliver.log
สั่ง restart dovecot
service dovecot restart
ทดสอบการทำงานของ 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
service apache2 start
- ตรวจสอบสถานะการทำงานของ apache
service apache2 status
ตั้งค่า php (เราจะตั้งค่าเฉพาะส่วนที่จำเป็นต่อการใช้งาน roundcube)
- ตั้งค่า timezone
nano /etc/php/8.3/apache2/php.ini
ตัวอย่าง [Date]
; Defines the default timezone used by the date functions ; http://php.net/date.timezone date.timezone = Asia/Bangkok
ตั้งค่า MariaDB Database
- สร้าง database roundcubemail โดยกำหนด username=rcmail, password=rcmailpass
mysql -u root -p
CREATE DATABASE roundcubemail CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_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.9/roundcubemail-1.6.9-complete.tar.gz tar zvfx /var/www/html/roundcubemail-1.6.9-complete.tar.gz mv /var/www/html/roundcubemail-1.6.9 /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 a2dissite 000-default.conf a2dissite default-ssl.conf
service apache2 reload
ทดสอบเข้าเว็บโซต์
https://workshop.kon.in.th/mailXX/
ตัวอย่าง
Oops... something went wrong! An internal error has occurred. Your request cannot be processed at this time. For administrators: Please check the application and/or server error logs for more information.
เข้าหน้า config roundcube
- เข้าหน้าเว็บ config
https://workshop.kon.in.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://workshop.kon.in.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, ), );