ตั้ง Email Server บน VPS ด้วย Mailcow ควบคุม Email ได้เต็มที่
การตั้ง email server เองบน VPS ให้ความเป็นส่วนตัวและควบคุมได้เต็มที่ แต่ก็มีความรับผิดชอบที่ตามมาด้วย บทความนี้ใช้ Mailcow ซึ่งเป็น stack สำเร็จรูปที่ทำงานผ่าน Docker
ทำไมถึงใช้ Mailcow
Mailcow รวม Postfix (MTA), Dovecot (IMAP), Rspamd (spam filter), SOGo (webmail), Nginx และ MariaDB เข้าด้วยกัน ทั้งหมดรันผ่าน Docker Compose ไม่ต้องติดตั้งและ configure ทีละตัว
ความต้องการของระบบ
- RAM อย่างน้อย 2 GB (แนะนำ 4 GB)
- Disk อย่างน้อย 20 GB
- Ubuntu 22.04 หรือ Debian 11/12
- Docker และ Docker Compose ติดตั้งแล้ว
- โดเมนที่ตั้งค่า DNS ได้
ขั้นตอนติดตั้ง Mailcow
cd /opt
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
./generate_config.sh # จะถาม FQDN เช่น mail.example.com
docker compose pull
docker compose up -d
หลังจากนี้เปิด https://mail.example.com จะเห็น admin panel ค่าเริ่มต้น: user admin password moohoo เปลี่ยนทันที
DNS Records ที่ต้องตั้ง
# A Record สำหรับ mail server
mail.example.com A 1.2.3.4
# MX Record ชี้มาที่ mail server
example.com MX 10 mail.example.com.
# SPF: อนุญาตให้ mail server ส่ง email
example.com TXT "v=spf1 mx ~all"
# DKIM: Mailcow จะ generate key ให้ copy จาก admin panel
mail._domainkey TXT "v=DKIM1; k=rsa; p=..."
# DMARC
_dmarc.example.com TXT "v=DMARC1; p=quarantine; rua=mailto:[email protected]"
# Autoconfig สำหรับ email client
autoconfig CNAME mail.example.com.
autodiscover CNAME mail.example.com.
PTR Record: สำคัญมากสำหรับ Mail Server
ต้องตั้งผ่าน VPS provider ไม่ใช่ DNS panel ให้ IP ของ VPS มี reverse DNS ชี้กลับมาที่ mail.example.com ถ้าไม่มี PTR email ส่วนใหญ่จะ reject ทันที
ทดสอบหลังตั้งค่า
- ส่ง email ทดสอบไปที่ Gmail หรือ Outlook แล้วดูว่าตกกอง Spam ไหม
- ตรวจ DKIM signature ใน header ของ email ที่ได้รับ
- ใช้ mail-tester.com เช็คคะแนน email ควรได้ 9/10 ขึ้นไป
ทางเลือก: ใช้ Email Hosting แทน
การตั้ง email server เองต้องดูแลอย่างต่อเนื่อง อัปเดต, ตรวจสอบ blacklist, และ troubleshoot deliverability ถ้าไม่ต้องการรับผิดชอบเองทั้งหมด บริการ email hosting ก็เป็นทางเลือกที่สมเหตุสมผล
สำหรับธุรกิจในไทย บริการ hosting ของ asiagb มาพร้อม email hosting, spam filter และ support ภาษาไทย เหมาะกับทีมที่ไม่ต้องการดูแล mail server เอง
ก่อนตั้งค่าหรือย้าย email server อย่าลืมตรวจสอบสุขภาพโดเมนและ DNS records ด้วยเครื่องมืออย่าง dnsxray.com ซึ่งตรวจ MX, SPF, DKIM และ Security Headers ได้ฟรีในหน้าเดียว
สรุป
Mailcow ทำให้การตั้ง email server บน VPS ง่ายขึ้นมาก แต่ความซับซ้อนหลักอยู่ที่ DNS และ deliverability ไม่ใช่การติดตั้ง ถ้าพร้อมรับผิดชอบดูแลระบบเองก็คุ้มที่จะลอง แต่ถ้าต้องการความสะดวกกว่านี้ email hosting ก็เป็นทางเลือกที่ดี
ตรวจสอบว่าระบบทำงานถูกต้อง
# ตรวจ container ทั้งหมดกำลังรัน
cd /opt/mailcow-dockerized
docker compose ps
# ดู mail log
docker compose logs postfix-mailcow --tail=50
# ตรวจ DKIM ที่ได้ตั้งไว้
dig TXT mail._domainkey.example.com +short
[email protected] จะได้รับ reply พร้อมผล SPF/DKIM/DMARC check อัตโนมัติแก้ปัญหาที่พบบ่อย
Error: Port 25 connection refused / email ส่งไม่ออก
VPS provider หลายรายบล็อก port 25 โดยค่าเริ่มต้น ต้องขอเปิดหรือใช้ relay:
# ทดสอบว่า port 25 เปิดได้ไหม
telnet mail.example.com 25
# ถ้า "connection refused" แปลว่าถูก block ที่ network level
# ทางเลือก: ส่งผ่าน port 587 (submission) แทน
# หรือใช้ relay ผ่าน SendGrid/Mailgun สำหรับ outbound
Email ตก Spam ที่ Gmail / Outlook
สาเหตุหลักคือ IP อยู่ใน blacklist หรือ PTR ไม่ถูกต้อง:
# ตรวจ PTR record
dig -x YOUR_VPS_IP +short
# ต้องได้ mail.example.com. กลับมา
# ตรวจ IP ว่าอยู่ใน blacklist
# ใช้เว็บ mxtoolbox.com/blacklists.aspx
Error: DKIM signature fail ใน email header
DKIM key ใน DNS ยังไม่อัพเดทหรือ copy ผิด:
# ดู DKIM key จาก Mailcow admin panel
# Email → Configuration → Domain → DKIM
# ตรวจว่า DNS propagate แล้ว
dig TXT mail._domainkey.example.com
# ต้องเห็น p=MIIBIj... (RSA public key)
Error: Docker container restart loop
# ดู log ของ container ที่มีปัญหา
docker compose logs dovecot-mailcow --tail=100
# Restart container เดียว
docker compose restart dovecot-mailcow
# Pull image ใหม่
docker compose pull && docker compose up -d
Webmail เข้าไม่ได้ / SSL error
# รัน Let's Encrypt renewal
docker compose exec acme-mailcow /root/start.sh
# ตรวจ cert expiry
echo | openssl s_client -connect mail.example.com:443 2>/dev/null | openssl x509 -noout -dates
คำถามที่พบบ่อย
ตั้ง email server เองได้หลาย domain ไหม?
ได้ Mailcow รองรับ multi-domain ได้ไม่จำกัด เพิ่ม domain ใหม่ใน admin panel แล้วตั้ง DNS records แยกต่างหากสำหรับแต่ละ domain
Mailcow ต้องการ resource เท่าไร?
ขั้นต่ำ RAM 2 GB แต่แนะนำ 4 GB สำหรับการใช้งานจริง disk ขึ้นอยู่กับ email volume แนะนำ 40 GB+ และ backup ตาม retention ที่ต้องการ
Backup email ทำได้ยังไง?
cd /opt/mailcow-dockerized
./helper-scripts/backup_and_restore.sh backup all
# ไฟล์จะถูกเก็บใน /opt/mailcow-dockerized/backups/
อัปเดต Mailcow ทำยังไง?
cd /opt/mailcow-dockerized
./update.sh
ควร backup ก่อน update ทุกครั้ง และอ่าน changelog ว่ามี breaking change ไหม