ผลต่างระหว่างรุ่นของ "คู่มือการพัฒนา EAI Mail Server บน Ubuntu 24"

จาก Wiki_EAI
ไปยังการนำทาง ไปยังการค้นหา
 
(ไม่แสดง 22 รุ่นระหว่างกลางโดยผู้ใช้คนเดียวกัน)
แถว 34: แถว 34:
 
* Passphase for SSL Key
 
* Passphase for SSL Key
 
  Key: mailthai.key, mailthai.crt
 
  Key: mailthai.key, mailthai.crt
* MySQL
+
* MariaDB
 
  DB: eaimail
 
  DB: eaimail
 
  User: dbuser
 
  User: dbuser
แถว 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;'''
  
<!--T:52-->
 
 
=== ตรวจสอบ 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-->
=== <span style='color:green'>สร้างไฟล์เชื่อมต่อระหว่าง Postfix และ MySQL</span> ===
+
=== สร้างไฟล์เชื่อมต่อระหว่าง Postfix และ MariaDB  ===
 
  '''cd /etc/postfix/mysql'''
 
  '''cd /etc/postfix/mysql'''
 
* สร้างไฟล์ script เพื่อใช้สำหรับเรียกค่า domain จาก Database
 
* สร้างไฟล์ script เพื่อใช้สำหรับเรียกค่า domain จาก Database
แถว 378: แถว 377:
  
 
== ตั้งค่า dovecot == <!--T:71-->
 
== ตั้งค่า dovecot == <!--T:71-->
=== <span style='color:green'>สร้างไฟล์เชื่อมต่อระหว่าง dovecot และ MySQL</span> ===
+
=== <span style='color:green'>สร้างไฟล์เชื่อมต่อระหว่าง dovecot และ MariaDB</span> ===
 
  '''cd /etc/dovecot/'''
 
  '''cd /etc/dovecot/'''
 
* สร้าง script เพื่อให้ dovecot ใช้งานกับ SQL ที่เราได้กำหนดก่อนหน้านี้
 
* สร้าง script เพื่อให้ dovecot ใช้งานกับ SQL ที่เราได้กำหนดก่อนหน้านี้
แถว 388: แถว 387:
 
  connect = host=127.0.0.1 dbname=eaimail user=dbuser password=dbuserpass
 
  connect = host=127.0.0.1 dbname=eaimail user=dbuser password=dbuserpass
 
  default_pass_scheme = SHA512-CRYPT
 
  default_pass_scheme = SHA512-CRYPT
  password_query = SELECT email as user, password FROM users WHERE email='%u';
+
  password_query = SELECT u.email as user, u.password from users u left join forwardings f on u.email = f.source WHERE u.email = '%u' AND source is NULL UNION SELECT f.destination as user, u.password from users u join forwardings f on u.email = f.source WHERE f.source = '%u'
  
 
<!--T:73-->
 
<!--T:73-->
แถว 415: แถว 414:
 
  ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL
 
  ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL
 
  auth_mechanisms = plain login
 
  auth_mechanisms = plain login
 +
auth_username_chars = กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@
 
  namespace {
 
  namespace {
 
  type = private
 
  type = private
แถว 466: แถว 466:
 
  }
 
  }
  
=== <span style='color:green'>สั่ง restart dovecot</span> ===<!--T:77-->
+
=== <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'''
 
  '''service dovecot restart'''
  
แถว 568: แถว 572:
  
 
* ใช้คำสั่ง start service apache และ php  
 
* ใช้คำสั่ง start service apache และ php  
  '''systemctl start apache2'''
+
  '''service apache2 start'''
  
 
<!--T:97-->
 
<!--T:97-->
 
* ตรวจสอบสถานะการทำงานของ apache  
 
* ตรวจสอบสถานะการทำงานของ apache  
  '''systemctl status apache2'''
+
  '''service apache2 status'''
  
 
=== ตั้งค่า php (เราจะตั้งค่าเฉพาะส่วนที่จำเป็นต่อการใช้งาน roundcube) === <!--T:98-->
 
=== ตั้งค่า php (เราจะตั้งค่าเฉพาะส่วนที่จำเป็นต่อการใช้งาน roundcube) === <!--T:98-->
 
* ตั้งค่า timezone
 
* ตั้งค่า timezone
  '''nano /etc/php/8.1/apache2/php.ini'''
+
  '''nano /etc/php/8.3/apache2/php.ini'''
  
 
<!--T:99-->
 
<!--T:99-->
แถว 585: แถว 589:
 
  date.timezone = Asia/Bangkok
 
  date.timezone = Asia/Bangkok
  
=== ตั้งค่า MySQL Database === <!--T:100-->
+
=== ตั้งค่า 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 utf8mb4_0900_ai_ci;
+
  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;
แถว 598: แถว 602:
 
=== ตั้งค่า roundcube === <!--T:102-->
 
=== ตั้งค่า roundcube === <!--T:102-->
 
  '''cd /var/www/html/
 
  '''cd /var/www/html/
  '''wget https://github.com/roundcube/roundcubemail/releases/download/1.6.5/roundcubemail-1.6.5-complete.tar.gz
+
  '''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.5-complete.tar.gz  
+
  '''tar zvfx /var/www/html/roundcubemail-1.6.9-complete.tar.gz  
  '''mv /var/www/html/roundcubemail-1.6.5 /var/www/html/roundcubemail
+
  '''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
แถว 623: แถว 627:
 
<!--T:105-->
 
<!--T:105-->
 
  '''a2ensite rcmail.conf'''
 
  '''a2ensite rcmail.conf'''
  '''systemctl restart apache2'''
+
  '''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://eai-lab.bknix.co.th/mailXX/'''
+
  '''https://workshop.kon.in.th/mailXX/'''
 
''ตัวอย่าง''
 
''ตัวอย่าง''
  DATABASE ERROR: CONNECTION FAILED!
+
  Oops... something went wrong!
  Unable to connect to the database!
+
  An internal error has occurred. Your request cannot be processed at this time.
  Please contact your server-administrator.
+
  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://eai-lab.bknix.co.th/mailXX/installer/'''
+
  '''https://workshop.kon.in.th/mailXX/installer/'''
  
 
=== <span style='color:green'>ตั้งค่าเชื่อมต่อ database</span>  === <!--T:107-->
 
=== <span style='color:green'>ตั้งค่าเชื่อมต่อ database</span>  === <!--T:107-->
แถว 656: แถว 663:
 
  '''nano /var/www/html/roundcubemail/config/config.inc.php'''
 
  '''nano /var/www/html/roundcubemail/config/config.inc.php'''
 
''ตัวอย่าง''
 
''ตัวอย่าง''
  $config['request_path'] = 'https://eai-lab.bknix.co.th/mailXX/';
+
  $config['request_path'] = 'https://workshop.kon.in.th/mailXX/';
  
 
*การใช้ ssl แบบ self-sign อาจจะทำให้ roundcube ไม่สามารถเชื่อมต่อ mail server ได้ แก้ปัญหาโดยการ config เพิ่มเติม ดังนี้
 
*การใช้ ssl แบบ self-sign อาจจะทำให้ roundcube ไม่สามารถเชื่อมต่อ mail server ได้ แก้ปัญหาโดยการ config เพิ่มเติม ดังนี้

รุ่นแก้ไขปัจจุบันเมื่อ 10:43, 15 พฤศจิกายน 2567

เนื้อหา

EAI Email Server

คู่มือนี้ได้จัดทำขึ้นมาเพื่อทดสอบและเป็นแนวทางการติดตั้ง Email Server ให้สามารถรับส่ง email address ภาษาไทย หรือ Email Address Internationalization (EAI) โดยใช้ Opensource Software เพื่อหาวิธีการที่สามารถใช้งานได้ และสามารถนำไปพัฒนาต่อยอดได้

Software ที่นำมาทดสอบ

  1. Ubuntu 24.04.1 LTS
  2. Docker 27.3.1
  3. Postfix 3.8.6
  4. Dovecot 2.3.21
  5. Mariadb 10.11.8
  6. Roundcube 1.6.9 [ดาวน์โหลด] [tar]

เอกสารที่เกี่ยวข้อง

  1. Workshop Slide [ดาวน์โหลด]
  2. แบบสอบถาม [แบบสอบถาม]

แบบสอบถาม.jpeg

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 u.email as user, u.password from users u left join forwardings f on u.email = f.source WHERE u.email = '%u' AND source is NULL UNION SELECT f.destination as user, u.password from users u join forwardings f on u.email = f.source WHERE f.source = '%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
auth_username_chars = กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@
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,
  ),
);