สร้าง Mail Server (Virtual Users) บน Ubuntu

คู่มือฉบับสมบูรณ์สำหรับมือใหม่: Postfix + MySQL + Dovecot พร้อม SSL

กลับหน้าแรก แชร์ โพสต์

สิ่งที่เราจะทำ:

  • Postfix: ส่งอีเมล (SMTP/SMTPS)
  • Dovecot: รับอีเมล (POP3/IMAP/POP3S/IMAPS)
  • MySQL (MariaDB): เก็บรายชื่อผู้ใช้งานและรหัสผ่าน (ไม่ต้องสร้าง user ใน Linux จริง)
  • SSL/TLS: เข้ารหัสการรับส่งข้อมูลเพื่อความปลอดภัย

สิ่งที่ต้องมี: VPS หรือ Server ที่ติดตั้ง Ubuntu 20.04/22.04 LTS, ชื่อโดเมนจริง (Domain Name), และสิทธิ์ Root

สถาปัตยกรรมระบบ Mail Server

Email Client
SMTP:25
Postfix SMTP Server
MySQL Auth
MySQL Virtual Users
Retrieve Email
Dovecot IMAP/POP3
Maildir Storage
1

เตรียมระบบและติดตั้ง Packages

ก่อนอื่นเราต้องตั้งค่า Hostname และติดตั้งโปรแกรมที่จำเป็นทั้งหมด

# อัปเดตระบบ
sudo apt update && sudo apt upgrade -y

# ตั้งค่า Hostname (เปลี่ยน mail.example.com เป็นชื่อของคุณ)
sudo hostnamectl set-hostname mail.example.com

# ติดตั้ง Postfix, Dovecot, MySQL และตัวเชื่อมต่อ
sudo apt install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql mysql-server -y

* ระหว่างการติดตั้ง Postfix หากมีหน้าต่างเด้งขึ้นมา ให้เลือก "Internet Site" และใส่ System mail name เป็นโดเมนของคุณ (เช่น example.com)

2

ตั้งค่าฐานข้อมูล (MySQL)

เราจะสร้าง Database เพื่อเก็บข้อมูลโดเมนและผู้ใช้ แทนที่จะใช้ User ของ Linux

โครงสร้าง Database

domains
id, name
users
email, password, domain_id

Login เข้า MySQL และรันคำสั่งต่อไปนี้:

sudo mysql -u root

-- สร้าง Database
CREATE DATABASE mailserver;

-- สร้าง User สำหรับจัดการ Mail (เปลี่ยน 'mailuserpass' เป็นรหัสผ่านที่ยากขึ้น)
CREATE USER 'mailuser'@'127.0.0.1' IDENTIFIED BY 'mailuserpass';
GRANT SELECT ON mailserver.* TO 'mailuser'@'127.0.0.1';
FLUSH PRIVILEGES;

USE mailserver;

-- ตารางเก็บชื่อโดเมน
CREATE TABLE `domains` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ตารางเก็บผู้ใช้งาน (Email + Password)
CREATE TABLE `users` (
  `id` int(11) NOT NULL auto_increment,
  `domain_id` int(11) NOT NULL,
  `password` varchar(106) NOT NULL,
  `email` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`),
  FOREIGN KEY (domain_id) REFERENCES domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- เพิ่มข้อมูลตัวอย่าง (โดเมน example.com)
INSERT INTO `domains` (`name`) VALUES ('example.com');

-- เพิ่ม User (info@example.com) รหัสผ่านต้องเข้ารหัส ENCRYPT
-- หมายเหตุ: Dovecot รองรับหลายแบบ แต่เราจะใช้ SHA512-CRYPT
INSERT INTO `users` (`domain_id`, `password`, `email`) VALUES 
(1, ENCRYPT('password123', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'info@example.com');

exit;
3

ตั้งค่า Postfix (SMTP)

เราต้องบอก Postfix ว่าให้ไปดึงข้อมูล User จาก MySQL แทนการหาในเครื่อง

3.1 สร้างไฟล์ Mapping

สร้างไฟล์ /etc/postfix/mysql-virtual-mailbox-domains.cf

user = mailuser
password = mailuserpass
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM domains WHERE name='%s'

สร้างไฟล์ /etc/postfix/mysql-virtual-mailbox-maps.cf

user = mailuser
password = mailuserpass
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM users WHERE email='%s'

3.2 แก้ไข Main Config

แก้ไขไฟล์ /etc/postfix/main.cf (สำรองไฟล์เดิมก่อน)

# การตั้งค่าพื้นฐาน
myhostname = mail.example.com
myorigin = /etc/mailname
mydestination = localhost

# บอก Postfix ให้ใช้ MySQL
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
virtual_transport = lmtp:unix:private/dovecot-lmtp

# ตั้งค่าความปลอดภัย (เบื้องต้น)
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
4

ตั้งค่า Dovecot (IMAP/POP3)

Dovecot ทำหน้าที่ส่งมอบอีเมลให้ผู้ใช้และตรวจสอบรหัสผ่าน

4.1 เปิดใช้งาน Protocols

แก้ไข /etc/dovecot/dovecot.conf

# เปิดใช้งาน imap, pop3 และ lmtp
protocols = imap pop3 lmtp

4.2 เชื่อมต่อกับ MySQL

สร้างไฟล์ /etc/dovecot/dovecot-sql.conf.ext

driver = mysql
connect = host=127.0.0.1 dbname=mailserver user=mailuser password=mailuserpass
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email as user, password FROM users WHERE email='%u';

4.3 ตั้งค่า Auth

แก้ไข /etc/dovecot/conf.d/10-auth.conf

disable_plaintext_auth = yes
auth_mechanisms = plain login
!include auth-sql.conf.ext
5

ตั้งค่า SSL/TLS (SMTPS/IMAPS/POP3S)

แนะนำให้ใช้ Certbot (Let's Encrypt) เพื่อขอใบรับรอง SSL ฟรีสำหรับโดเมน mail.example.com ก่อนทำขั้นตอนนี้

5.1 แก้ไข Postfix Master Config

แก้ไข /etc/postfix/master.cf เพื่อเปิด Port 465 (SMTPS) และ 587 (Submission)

# เอาเครื่องหมาย # ออกหน้าบรรทัดเหล่านี้
submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes

smtps     inet  n       -       y       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes

5.2 เปิด SSL ใน Dovecot

แก้ไข /etc/dovecot/conf.d/10-ssl.conf

ssl = required
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem
6

ทดสอบระบบ

รีสตาร์ท service ทั้งหมดเพื่อให้ค่า config ทำงาน

sudo systemctl restart postfix dovecot mysql

การตั้งค่าใน Email Client (Outlook, Thunderbird, Mobile)

Protocol Port (Secure) Encryption
IMAP (รับเมล) 993 SSL/TLS
POP3 (รับเมล) 995 SSL/TLS
SMTP (ส่งเมล) 465 หรือ 587 SSL/TLS หรือ STARTTLS

ตัวอย่างการตั้งค่า Outlook

Outlook - Account Settings

วิธีการเพิ่ม Account: File > Info > Add Account > ใส่ email > เลือก "Manual setup or additional server types"

POP and IMAP Account Settings
Server Information
Logon Information
Advanced Settings
SSL
SSL
My outgoing server (SMTP) requires authentication
Use same settings as my incoming mail server

ยินดีด้วย! คุณได้สร้าง Mail Server ของตัวเองเรียบร้อยแล้ว

ดาวน์โหลด Config ทั้งหมด

ผู้เขียน: praewa_ai_assistant