SSD Nodes Learn
คู่มือ Matt Connorโดย Matt Connor · อัปเดตเมื่อ 2026-07-24

ติดตั้ง Mailcow บน VPS ให้ Gmail ยอมรับอีเมล

ตรวจสอบ Port 25 ก่อนติดตั้งเพื่อป้องกันอีเมลค้างใน Queue และวิธีตั้งค่า DNS เพื่อแก้ปัญหา Gmail ปฏิเสธข้อความด้วย Error 550 5.7.25 PTR rejection

สิ่งที่คุณกำลังสร้าง

ระบบ Mail Server แบบสมบูรณ์บนเครื่องเซิร์ฟเวอร์ของคุณเอง ประกอบด้วย SMTP สำหรับรับและส่งอีเมล, IMAP เพื่อให้ข้อมูลบนโทรศัพท์และแล็ปท็อปตรงกันเสมอ, Webmail client และ Spam filter ที่ทำหน้าที่ตรวจสอบคะแนนทุกข้อความทั้งขาเข้าและขาออก mailcow-dockerized ได้รวม Postfix, Dovecot, Rspamd, SOGo webmail, MariaDB, Redis และ ACME client ไว้ใน Docker Compose stack ชุดเดียว เพื่อลดความยุ่งยากในการติดตั้งซอฟต์แวร์ คุณจะสามารถใช้งานระบบได้ภายใน 30 นาที

ส่วนที่ยากที่สุดคือการตั้งค่าสภาพแวดล้อมรอบระบบ อีเมลเป็นบริการหนึ่งที่เซิร์ฟเวอร์ใหม่มักไม่ได้รับความไว้วางใจจากอินเทอร์เน็ต และช่องว่างระหว่าง "ระบบใช้งานได้" กับ "Gmail ปฏิเสธทุกข้อความ" ขึ้นอยู่กับการตั้งค่า DNS 4 รายการ และการตั้งค่า IP-reputation ซึ่งคุณอาจไม่สามารถควบคุมได้อย่างเต็มที่ โปรดอ่านข้อกำหนดเบื้องต้นด้านล่างก่อนเริ่มเช่าเซิร์ฟเวอร์ หากคุณอ่านแล้วพบว่าการจัดการเรื่อง reputation นั้นไม่คุ้มค่า นั่นคือการตัดสินใจที่สมเหตุสมผล — บทสรุปสิ่งที่ควรทำ self-hosting ในปี 2026 ได้จัดหมวดหมู่อีเมลไว้ในหัวข้อ "only if you mean it" ด้วยเหตุผลเหล่านี้เช่นกัน

ข้อกำหนดเบื้องต้นคือหัวใจสำคัญของโปรเจกต์

หากขาดข้อใดข้อหนึ่งไป อีเมลจะถูกส่งออกไปโดยไม่ถึงผู้รับ โปรดตรวจสอบตามลำดับความสำคัญดังนี้:

ต้องเปิด Outbound port 25 เซิร์ฟเวอร์ของคุณจะส่งข้อมูลไปยัง Gmail และ Microsoft ผ่าน TCP port 25 ผู้ให้บริการ VPS และ Cloud จำนวนมากมักบล็อก port 25 ขาออกไว้เป็นค่าเริ่มต้นเพื่อป้องกัน Spam ซึ่งการบล็อกนี้จะไม่มีการแจ้งเตือนข้อผิดพลาดใดๆ ระบบจะดูเหมือนทำงานปกติ แต่เมลจะค้างอยู่ใน queue ตลอดกาล ควรทดสอบก่อนเริ่มติดตั้ง หากถูกบล็อก วิธีแก้ไขเดียวคือการเปิด ticket แจ้งผู้ให้บริการเพื่อขอปลดบล็อก ซึ่งบางรายอาจอนุญาตเฉพาะบัญชีที่ใช้งานมานานแล้วเท่านั้น

IP ที่สะอาดและมี Reputation ที่ใช้งานได้ IP ของ VPS ที่ถูกนำมาใช้ซ้ำมักติด blocklists จากการส่ง spam ของผู้ใช้งานรายก่อนหน้า ควรตรวจสอบ IP ของคุณผ่านบริการอย่าง Spamhaus lookup หรือ mxtoolbox ก่อนเริ่มใช้งาน หาก IP ติด blacklist คุณจะไม่สามารถแก้ไขได้ด้วยการเขียนโปรแกรม

การควบคุม DNS และการตั้งค่า PTR record ที่ถูกต้อง คุณต้องเพิ่ม record ใน DNS zone ของโดเมน และต้องตั้งค่า reverse DNS (PTR) ให้ IP ของเซิร์ฟเวอร์ชี้กลับมาที่ mail hostname ของคุณ โดยปกติแล้ว PTR จะไม่ได้ตั้งค่าใน DNS panel ของโดเมน แต่จะถูกจัดการโดยผู้ถือครอง IP ดังนั้นคุณต้องตั้งค่าผ่าน control panel ของผู้ให้บริการ VPS หรือแจ้งผ่าน ticket

สเปกขั้นต่ำที่แนะนำคือ 6 GiB RAM และ 2 vCPU ค่าขั้นต่ำสำหรับ mailcow สำหรับการติดตั้งแบบส่วนตัวคือ 6 GiB RAM และ 1 GiB swap และแนะนำให้ใช้ 8 GiB เมื่อมีผู้ใช้งานจำนวนหนึ่ง หากมี RAM ต่ำกว่า 2.5 GiB generate_config.sh จะมีตัวเลือกให้ปิดการทำงานของ ClamAV virus scanner เพื่อป้องกันไม่ให้ kernel สั่งปิด container และควรเตรียมพื้นที่ SSD ไว้เริ่มต้นที่ 20 GB

ต้องมี DNS name ไม่ใช่เพียงแค่ IP ควรเลือก hostname เช่น mail.example.com โดยชื่อนี้จะถูกใช้เป็นทั้ง MAILCOW_HOSTNAME, subject ของ TLS certificate, เป้าหมายของ PTR และ SMTP banner โปรดใช้ชื่อเดียวกันนี้ให้สอดคล้องกันในทุกส่วน

Step 1 — ตรวจสอบว่า outbound port 25 เปิดใช้งานอยู่หรือไม่

ให้ดำเนินการขั้นตอนนี้เป็นอันดับแรก หากขั้นตอนนี้ล้มเหลว การดำเนินการอื่น ๆ จะไม่มีประโยชน์ ให้ลองเชื่อมต่อ SMTP กับ mail server จริงจาก VPS ที่เพิ่งติดตั้งใหม่:

sudo apt update && sudo apt install -y netcat-openbsd
nc -vz -w 5 gmail-smtp-in.l.google.com 25

หากเชื่อมต่อสำเร็จ ผลลัพธ์จะปรากฏขึ้นทันที:

Connection to gmail-smtp-in.l.google.com (142.250.x.x) 25 port [tcp/smtp] succeeded!

หากพอร์ตถูกบล็อก ระบบจะค้างเป็นเวลา 5 วินาทีแล้วจึงแจ้งข้อผิดพลาด:

nc: connect to gmail-smtp-in.l.google.com port 25 (tcp) timed out: Operation now in progress

อาการ timeout คือสัญญาณว่าพอร์ตถูกบล็อก ปัญหานี้เกิดจาก network filter ของผู้ให้บริการ ไม่ใช่ firewall ของคุณ ดังนั้นการตั้งค่าภายในเครื่องจึงไม่สามารถแก้ไขได้ ให้เปิด ticket แจ้งผู้ให้บริการว่า: "Please enable outbound TCP port 25 for my VPS at <IP>; I am running a legitimate mail server." ห้ามติดตั้ง mailcow จนกว่าผลลัพธ์จะแสดงว่า "succeeded" ทั้งนี้ inbound 25 (การที่เซิร์ฟเวอร์อื่นเชื่อมต่อมายังคุณ) เป็นคนละส่วนกันและมักจะเปิดใช้งานอยู่ โดยปกติผู้ให้บริการจะจำกัดเฉพาะขาออก (outbound) เท่านั้น

Step 2 — ตั้งค่า DNS records ในตอนนี้

การเปลี่ยนแปลง DNS ต้องใช้เวลาในการ propagate ดังนั้นควรเผยแพร่ข้อมูลทั้งหมดที่ทำได้ก่อนเริ่มการติดตั้ง สมมติว่าโดเมนของคุณคือ example.com, mail host คือ mail.example.com และ IP คือ 10.0.0.10 ให้สร้างรายการต่อไปนี้ใน zone ของคุณ:

mail.example.com.        A      10.0.0.10
mail.example.com.        AAAA   2001:db8::10          ; only if you have IPv6
example.com.             MX  10 mail.example.com.
example.com.             TXT    "v=spf1 mx -all"
_dmarc.example.com.      TXT    "v=DMARC1; p=none; rua=mailto:postmaster@example.com"

SPF record ระบุว่า "อนุญาตให้เฉพาะ MX ของฉันเท่านั้นที่ส่งอีเมลในนามโดเมนนี้ได้ และให้ปฏิเสธรายการอื่นทั้งหมด" เริ่มต้นใช้งาน DMARC ที่ระดับ p=none เพื่อให้คุณสามารถตรวจสอบรายงานได้โดยไม่ทำให้เมลของตนเองถูกตีกลับ จากนั้นจึงปรับให้เข้มงวดขึ้นเป็น p=quarantine และ p=reject เมื่อยืนยันความถูกต้องของการ alignment ได้แล้ว ยังมีอีก 2 record ที่ยังไม่ได้ระบุไว้โดยตั้งใจ ได้แก่ DKIM ซึ่ง mailcow จะสร้างให้คุณใน Step 6 และ PTR ซึ่งคุณต้องตั้งค่าในแผงควบคุมของผู้ให้บริการในตอนนี้

ตั้งค่า PTR (reverse DNS) สำหรับ 10.0.0.10 ให้เป็น mail.example.com ซึ่งเป็นค่าเดียวกับ MAILCOW_HOSTNAME นี่คือ record เพียงหนึ่งเดียวที่คนส่วนใหญ่มักลืม และผู้ให้บริการรายใหญ่จะปฏิเสธการส่งหากไม่มีค่านี้ หากแผงควบคุมของคุณไม่มีช่องสำหรับ rDNS ให้เปิด ticket เพื่อแจ้งเจ้าหน้าที่

Step 3 — Install Docker

mailcow จำเป็นต้องใช้ Docker Engine พร้อมกับ Compose v2 plugin แนะนำให้ใช้ official convenience script ของ Docker แทนการใช้ package docker.io ของ Ubuntu เนื่องจาก package ดังกล่าวไม่มี Compose plugin มาให้:

curl -fsSL https://get.docker.com | sudo sh
sudo docker compose version

คุณควรเห็นบรรทัด Docker Compose version v2.x หาก docker compose version แสดงผลเป็น docker: 'compose' is not a docker command แสดงว่าติดตั้ง Docker Engine แล้วแต่ยังไม่ได้ติดตั้ง Compose plugin ให้ติดตั้ง plugin จาก repository ของ Docker โดยการรัน script ด้านบนอีกครั้ง หรือทำตาม คู่มือพื้นฐาน Docker Compose ของเรา ซึ่งจะติดตั้งทั้งสองอย่างจาก apt repository ของ Docker เอง

Step 4 — Clone mailcow and generate the config

cd /opt
sudo git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
umask
sudo ./generate_config.sh

ตรวจสอบให้แน่ใจว่า umask แสดงผลเป็น 0022 เนื่องจาก mailcow จะไม่สามารถ build ได้หาก file mask ไม่ถูกต้อง โดย Ubuntu 24.04 root shell ที่ติดตั้งใหม่จะมีค่าเป็น 0022 จากนั้นสคริปต์จะถามข้อมูลที่สำคัญที่สุดคือ fully qualified hostname ให้กรอก mail.example.com โดยค่าที่กรอกต้องตรงกับ A record และ PTR ทุกประการ สคริปต์จะสร้างไฟล์ mailcow.conf ซึ่งเป็น environment file เพียงไฟล์เดียวที่ใช้ควบคุมทั้ง stack หากต้องการเปลี่ยน web ports (HTTP_PORT, HTTPS_PORT) หรือปิดการใช้งาน ClamAV สำหรับเครื่องที่มีทรัพยากรจำกัด ให้เปิดไฟล์นี้เพื่อแก้ไข:

MAILCOW_HOSTNAME=mail.example.com
HTTP_PORT=80
HTTPS_PORT=443
SKIP_CLAMD=n          # set to y to drop the virus scanner on a <2.5 GiB box

SKIP_FTS=y เป็นอีกหนึ่งตัวเลือกสำหรับเครื่องที่มี RAM น้อย เนื่องจาก full-text search เป็นส่วนที่ใช้หน่วยความจำสูงเป็นอันดับสองตามเอกสารของ mailcow การปิดฟังก์ชันนี้จะทำให้ไม่สามารถค้นหาเนื้อหาใน body-text ผ่าน webmail ได้

ไม่ต้องแก้ไข HTTP_PORT=80 และ HTTPS_PORT=443 เว้นแต่จะมีบริการอื่นบน host ที่ใช้งานพอร์ตเหล่านี้อยู่แล้ว เนื่องจาก ACME client ของ mailcow จำเป็นต้องเข้าถึงพอร์ต 80 จากอินเทอร์เน็ตเพื่อขอใบรับรอง (certificate) ด้วยเหตุนี้จึงไม่ควรติดตั้ง a separate nginx-plus-Certbot setup ไว้บนเครื่องเดียวกัน เพราะ mailcow จะจัดการออกและต่ออายุ TLS ด้วยตนเองภายใน และการมีบริการอื่นใช้งานพอร์ต 80/443 จะทำให้ระบบดังกล่าวทำงานผิดพลาด

Step 5 — Start the stack and log in

sudo docker compose pull
sudo docker compose up -d
sudo docker compose ps

การ pull จะมีการดาวน์โหลด image ประมาณ 24 รายการ โปรดรอสักครู่ เมื่อ docker compose ps แสดงสถานะ container ทุกตัวเป็น running (หรือ healthy) ให้เปิด https://mail.example.com ผ่าน browser ข้อมูลการเข้าสู่ระบบ admin เริ่มต้นคือ username admin และ password moohoo โปรดเปลี่ยน password ทันทีในหน้า admin UI ที่เมนู Access → Administrators หาก browser แจ้งเตือน NET::ERR_CERT_AUTHORITY_INVALID แสดงว่า ACME certificate ยังไม่ถูกออกให้ โปรดตรวจสอบสาเหตุ ACME failure ด้านล่างก่อนสรุปว่าระบบเสีย การใช้ self-signed placeholder ถือเป็นเรื่องปกติในช่วง 1-2 นาทีแรก

Step 6 — เพิ่ม domain, mailbox และเผยแพร่ DKIM

ในหน้า admin UI ให้เปิดหน้า Mail Setup (Configuration → Mail Setup) จากนั้นไปที่แท็บ Domains คลิก Add domain และระบุ example.com ต่อไปนี้ในส่วน Mailboxes ให้คลิก Add mailbox เพื่อสร้าง you@example.com พร้อมกำหนดรหัสผ่าน เพียงเท่านี้คุณจะได้ mailbox ที่พร้อมใช้งานผ่านโปรโตคอล IMAP

ขั้นตอนต่อไปคือการตั้งค่า DKIM key ให้ไปที่ Configuration → ARC/DKIM keys โดย mailcow อาจสร้าง key ไว้ให้แล้วเมื่อคุณเพิ่ม domain หากยังไม่มีให้ทำการสร้างใหม่โดยเลือก domain ที่ต้องการ ใช้ selector เป็น dkim เลือกขนาด 2048-bit แล้วคลิก Add จากนั้นให้คัดลอกค่า TXT ที่ปรากฏเพื่อนำไปเผยแพร่ในรูปแบบ:

dkim._domainkey.example.com.  TXT  "v=DKIM1;k=rsa;t=s;s=email;p=MIIBIjANBgkqh...long-key...QAB"

ในหน้า Domains ของ mailcow จะมีปุ่ม DNS ซึ่งจะแสดงรายการ record ทั้งหมดที่ระบบต้องการ พร้อมเครื่องหมายถูกสีเขียวหรือกากบาทสีแดงเพื่อระบุสถานะการเผยแพร่จริง ให้ใช้หน้านี้เป็นรายการตรวจสอบ (checklist) โดยต้องทำให้ทุกแถวเป็นสีเขียวก่อนเริ่มทดสอบการส่งอีเมล หากแถว DKIM แสดงผลเป็นสีแดงหลังจากเผยแพร่แล้ว มักเกิดจากการแบ่ง TXT chunks ไม่ถูกต้อง เนื่องจาก key ขนาด 2048-bit มีความยาวเกินขีดจำกัด 255 ตัวอักษรต่อหนึ่ง string ของ TXT ดังนั้นควรวางค่าทั้งหมดเป็นค่าเดียวเพื่อให้ DNS host จัดการแบ่ง chunks ให้โดยอัตโนมัติ

Step 7 — Test deliverability and chase 10/10

ไปที่ mail-tester.com คัดลอกที่อยู่สุ่มที่ระบบแสดงขึ้นมา จากนั้นส่งข้อความจาก Mailbox ใหม่ของคุณ โดยการ log in เข้าสู่ SOGo webmail ที่ https://mail.example.com/SOGo แล้วส่งจากที่นั่น จากนั้นคลิก "Then check your score"

เป้าหมายคือคะแนน 10/10 สาเหตุที่ทำให้คะแนนลดลงที่พบบ่อยมีดังนี้:

  • SPF not aligned — บันทึก MX/SPF ขาดหายไป หรือ IP ที่ใช้ส่งไม่ได้ถูกระบุไว้ในบันทึก ให้ตรวจสอบ SPF TXT อีกครั้ง
  • DKIM signature does not verify — บันทึก dkim._domainkey TXT ขาดหายไป อยู่ในระหว่างการ propagate หรือข้อมูลผิดเพี้ยน นี่คือสาเหตุที่พบบ่อยที่สุด
  • No PTR / PTR mismatch — Reverse DNS ไม่ได้ชี้ไปยัง mail.example.com ให้แก้ไขที่ผู้ให้บริการ
  • Listed on a blocklist — เกิดจากชื่อเสียงเดิมของ IP ของคุณ ให้ส่งคำร้องขอ delist หรือขอเปลี่ยนไปใช้ IP ที่สะอาดกว่า

ห้ามส่งอีเมลจริงไปยัง Gmail หรือ Outlook จนกว่าคะแนนจะแสดงผลเป็น 10/10 การมีคะแนนต่ำร่วมกับ IP ใหม่ จะทำให้โดเมนของคุณถูก flagged ตั้งแต่วันแรกที่เริ่มใช้งาน

Step 8 — เชื่อมต่อด้วย mail client จริง

ตั้งค่า Thunderbird, Apple Mail หรือโทรศัพท์ของคุณโดยใช้การตั้งค่าเหล่านี้ โดยใช้ server host คือ mail.example.com สำหรับทุกบริการ:

  • IMAP: port 993, SSL/TLS (หรือ 143 พร้อม STARTTLS)
  • SMTP submission: port 465, SSL/TLS (หรือ 587 พร้อม STARTTLS)
  • Username: ที่อยู่อีเมลฉบับเต็ม you@example.com
  • Password: รหัสผ่านของ mailbox ที่คุณตั้งไว้

ห้ามส่งอีเมลผ่าน port 25 เนื่องจาก port นี้ใช้สำหรับการสื่อสารระหว่าง server เท่านั้น mailcow ไม่รองรับการส่งแบบ authenticated ผ่าน port นี้ และจะปฏิเสธการเชื่อมต่อจาก client หากพบข้อผิดพลาด Relay access denied แสดงว่า client กำลังพยายามส่งผ่าน port 25 หรือไม่ได้ใช้การยืนยันตัวตน ให้เปลี่ยนไปใช้ port 465 หรือ 587 พร้อมข้อมูลยืนยันตัวตนของ mailbox ของคุณ

Step 9 — Back up what actually matters

mailcow มีสคริปต์สำรองข้อมูลที่ทำ snapshot ทุก stateful volume ให้ใช้งาน โดยให้รันสคริปต์ไปยัง disk ภายนอกหรือ remote ที่ mount ไว้:

sudo MAILCOW_BACKUP_LOCATION=/opt/mailcow-backups \
  ./helper-scripts/backup_and_restore.sh backup all

all จะเก็บข้อมูล 6 ส่วน หากข้อมูลส่วนใดส่วนหนึ่งสูญหายจะทำให้ข้อมูลไม่สมบูรณ์: vmail (กล่องจดหมาย), crypt (กุญแจสำหรับถอดรหัส vmail ซึ่งจำเป็นต้องใช้คู่กัน), mysql (MariaDB ที่เก็บข้อมูล domains, users, aliases และ settings), redis (สถานะของ queue และ cache), rspamd (ข้อมูล spam/ham ที่เรียนรู้แล้ว), และ postfix (mail queue) สคริปต์นี้ทำงานภายใน helper container และเขียนไฟล์เป็น archive แบบบีบอัด ทำให้ข้อมูลสำรองมีความถูกต้องแม้ในขณะที่ stack กำลังทำงานอยู่ ควรตั้งค่าให้ทำงานอัตโนมัติด้วย nightly cron job และเพิ่ม --delete-days 14 เพื่อลบชุดข้อมูลเก่าออก การกู้คืนข้อมูลใช้สคริปต์เดิมแต่เพิ่ม flag restore เพื่อแสดงรายการ snapshot และเลือกข้อมูลที่ต้องการกู้คืน การสำรองข้อมูลที่ยังไม่เคยทดสอบการกู้คืนถือเป็นเพียงความคาดหวัง ไม่ใช่การสำรองข้อมูลที่ใช้งานได้จริง ควรทดสอบการกู้คืนแบบ dry run บน VPS เครื่องอื่นเพื่อความมั่นใจ

Step 10 — Update on a schedule

mailcow ทำการอัปเดตผ่าน script ของตนเอง โดยจะทำการดึง code ใหม่, ทำการ migrate mailcow.conf, prefetch images และ restart container ตามลำดับดังนี้:

cd /opt/mailcow-dockerized
sudo ./update.sh --check   # reports whether an update exists, changes nothing
sudo ./update.sh           # applies it

ควรทำการสำรองข้อมูลก่อน (Step 9) เนื่องจากกระบวนการ schema migration ไม่สามารถย้อนกลับได้ง่าย หากมีการอัปเดตที่ทำให้ container มีสถานะ unhealthy ตัว sudo docker compose logs --tail=50 <service>-mailcow จะระบุชื่อ daemon ที่ไม่สามารถกลับมาทำงานได้ ปกติแล้วจะมีการอัปเดตบ่อยครั้งเพื่อแก้ไขช่องโหว่ด้านความปลอดภัยของ daemon ที่เชื่อมต่อกับอินเทอร์เน็ต ดังนั้นจึงไม่ควรปล่อยให้ mail server ขาดการอัปเดตเป็นเวลานานหลายเดือน

ข้อควรระวังในการทำ hardening

mailcow ใช้บริการ netfilter (netfilter-mailcow) ของตนเองเพื่อแบน IP ที่พยายามโจมตีพอร์ต mail และ webmail ดังนั้นระบบ mail จึงได้รับการป้องกันมาตั้งแต่เริ่มต้น อย่างไรก็ตาม วิธีนี้ไม่ครอบคลุมถึง SSH บน host ซึ่งยังคงเปิดเผยต่อสาธารณะและเสี่ยงต่อการถูก brute-force ควรใช้งานร่วมกับ Fail2ban เพื่อเฝ้าดู SSH auth log และตั้งค่าให้เข้าสู่ระบบด้วย key เท่านั้น นอกจากนี้ ควรตั้งรหัสผ่านที่คาดเดายากสำหรับ mailcow admin UI และหากเป็นไปได้ ควรจำกัดการเข้าถึงไม่ให้ผ่าน internet สาธารณะ หรือใช้งานผ่าน VPN แทน

Failure modes, with the exact strings

Mail queues and never delivers. รันคำสั่ง sudo docker compose exec postfix-mailcow postqueue -p หรือตรวจสอบ mail queue ใน admin UI; รายการที่ค้างอยู่จะแสดงสถานะ deferred พร้อมข้อความ:

status=deferred (connect to gmail-smtp-in.l.google.com[142.250.x.x]:25: Connection timed out)

สาเหตุเกิดจากผู้ให้บริการของคุณบล็อก outbound port 25 (Step 1) การแก้ไขที่การตั้งค่าไม่สามารถช่วยได้ — โปรดเปิด ticket แจ้งปัญหา กรณีนี้ไม่ใช่ปัญหาจาก DNS หรือ TLS; ข้อสังเกตคือคำว่า timed out เมื่อเทียบกับ remote MX บน port 25

Gmail marks everything spam, or bounces it. เปิดข้อความใน Gmail เลือก "Show original" และอ่านผลลัพธ์ในส่วน auth results หากพบ dkim=fail หรือ dkim=none แสดงว่า dkim._domainkey TXT ของคุณขาดหายไป, รูปแบบผิดพลาด หรือยังไม่ถูกเผยแพร่ (not yet propagated) — ให้เผยแพร่ค่าตามที่หน้า ARC/DKIM ระบุไว้ และรอจนกว่า TTL จะครบกำหนด หากพบ spf=fail แสดงว่า SPF/MX records ไม่ครอบคลุม IP ของคุณ การทำ Alignment ให้ถูกต้องเป็นสิ่งสำคัญ; การตรวจสอบที่ล้มเหลวเพียงจุดเดียวก็เพียงพอที่จะทำให้ข้อความถูกส่งไปยัง spam

Rejected by large providers on connect. ข้อความตีกลับ (Bounces) หรือ Postfix logs จะแสดงข้อความปฏิเสธ PTR จาก Gmail ดังนี้:

550-5.7.25 [10.0.0.10] The IP address sending this message does not have a PTR
550-5.7.25 record setup, or the corresponding forward DNS entry does not match
550 5.7.25 the sending IP. As a policy, Gmail does not accept messages from IPs
550 5.7.25 with missing PTR records.

รหัส 550 5.7.25 หมายถึง reverse DNS หายไปหรือข้อมูลไม่ตรงกัน ให้ตั้งค่า PTR สำหรับ IP ของคุณเป็น mail.example.com ที่ผู้ให้บริการ (Step 2) ทั้ง Forward (A) และ reverse (PTR) ต้องตรงกัน และทั้งคู่ต้องระบุชื่อ host เดียวกันกับที่ mailcow ใช้ในการติดต่อกับ server อื่นๆ

Browser shows a certificate warning that never clears. container acme-mailcow ไม่สามารถรับ certificate ที่ถูกต้องได้ ให้ตรวจสอบ log ของ container ดังนี้:

sudo docker compose logs acme-mailcow | tail -n 40

บรรทัดลักษณะ Cannot validate any hostnames, skipping Let's Encrypt for 1 hour. หรือความล้มเหลวในการทำ challenge หมายถึง port 80 ไม่สามารถเข้าถึงได้จากอินเทอร์เน็ต หรือ A record ไม่ได้ชี้มาที่ server นี้ ให้ตรวจสอบว่า mail.example.com resolve มาที่เครื่องนี้หรือไม่, เปิด port 80 และ 443 ผ่าน firewall ของ host และตรวจสอบให้แน่ใจว่าไม่มีบริการอื่นใช้งาน port เหล่านั้นอยู่ หลังจากแก้ไขสาเหตุแล้ว ให้ restart client ด้วยคำสั่ง sudo docker compose restart acme-mailcow แทนการรอระบบ back-off นานถึงหนึ่งชั่วโมง

FAQ

การทำ self-hosting email คุ้มค่าจริงหรือไม่?

หากคุณต้องการเป็นเจ้าของข้อมูล สามารถสร้าง alias ได้ไม่จำกัด และต้องการควบคุมทุกอย่างอย่างเต็มรูปแบบ คำตอบคือคุ้มค่า เพราะ mailcow มอบระบบระดับมืออาชีพให้ในราคาเท่ากับ VPS แต่คุณต้องรับผิดชอบเรื่องการส่งอีเมล (deliverability) อย่างต่อเนื่อง ทั้งการดูแล IP reputation, การตั้งค่า DNS alignment และการตรวจสอบ blocklist หากเป็นอีเมลสำหรับธุรกิจที่สำคัญมากซึ่งความผิดพลาดเพียงวันเดียวอาจสร้างความเสียหายได้ การใช้ผู้ให้บริการแบบ managed provider เป็นทางเลือกที่เหมาะสมกว่า จงเลือก self-host เมื่อคุณให้ความสำคัญกับการควบคุมมากกว่าความสะดวก และพร้อมที่จะดูแลระบบด้วยตนเอง

ฉันจะทราบได้อย่างไรว่า outbound port 25 ถูกบล็อกอยู่หรือไม่?

ให้รันคำสั่ง nc -vz -w 5 gmail-smtp-in.l.google.com 25 จาก server หากขึ้นข้อความ "succeeded!" แสดงว่าพอร์ตเปิดอยู่ แต่หากขึ้น timed out หลังจากรอสักครู่ แสดงว่าผู้ให้บริการของคุณบล็อกพอร์ตนี้ นี่คือสาเหตุที่พบบ่อยที่สุดที่ทำให้ server แบบ self-hosted สามารถรับอีเมลได้แต่ไม่สามารถส่งอีเมลออกไปได้ และวิธีแก้ไขเดียวคือต้องให้ผู้ให้บริการเปิดพอร์ตนี้ให้เท่านั้น การเปลี่ยนการตั้งค่าภายในเครื่องไม่สามารถแก้ไขปัญหานี้ได้

ทำไมอีเมลของฉันยังถูกส่งไปยังโฟลเดอร์ spam ของ Gmail?

สาเหตุเกือบทั้งหมดเกิดจากระบบ authentication ที่ไม่สมบูรณ์ ให้ใช้ฟังก์ชัน "Show original" ใน Gmail เพื่อตรวจสอบ spf=pass, dkim=pass และ dmarc=pass หากพบ dkim=fail แสดงว่ามีปัญหาที่ dkim._domainkey TXT record ไม่ถูกต้องหรือขาดหายไป นอกจากนี้ การที่ PTR mismatch หรือการใช้ IP ใหม่ที่ไม่มีประวัติการส่งอีเมล (sending history) ก็ส่งผลเสียเช่นกัน ควรทำให้ mail-tester.com ได้คะแนน 10/10 ก่อน จากนั้นจึงเริ่มทำ IP warming อย่างช้าๆ โดยเริ่มจากไม่กี่ข้อความต่อวันแล้วค่อยๆ เพิ่มขึ้น แทนที่จะส่งอีเมลจำนวนมากในวันแรก

ฉันจำเป็นต้องสำรองข้อมูล (back up) ส่วนใดบ้าง?

ให้รันคำสั่ง backup_and_restore.sh backup all และเก็บไฟล์ทั้งหมดไว้ภายนอก server คำสั่งนี้จะสำรองข้อมูล vmail (กล่องจดหมาย), crypt (กุญแจสำหรับถอดรหัส), ฐานข้อมูล MariaDB (โดเมน, ผู้ใช้, alias, การตั้งค่า), Redis, ข้อมูลการเรียนรู้ของ Rspamd และ Postfix queue ข้อมูลใน volume crypt เป็นส่วนที่คนมักมองข้าม หากไม่มีส่วนนี้ ข้อมูล vmail ที่สำรองไว้จะไม่สามารถอ่านได้เนื่องจากเป็น ciphertext ควรทดสอบการ restore ข้อมูลลงในเครื่องทดลองอย่างน้อยหนึ่งครั้ง

ฉันสามารถรัน mailcow บน VPS ขนาด 2 GB ได้หรือไม่?

ไม่สามารถรันได้อย่างราบรื่น generate_config.sh จะเสนอให้ปิดการใช้งาน ClamAV หากพื้นที่ต่ำกว่าประมาณ 2.5 GiB และถึงแม้จะทำเช่นนั้น Rspamd, ClamAV, Dovecot และ MariaDB ก็ยังต้องแย่งชิงหน่วยความจำกัน ซึ่งจะทำให้เกิดการใช้ swap และเกิด OOM kills เมื่อมีการใช้งานจริง สำหรับการติดตั้งเพื่อใช้งานคนเดียวให้เสถียร ควรใช้ทรัพยากรขั้นต่ำที่ 6 GiB พร้อม swap 1 GiB และควรขยับไปใช้ 8 GiB ทันทีที่มีผู้ใช้งานมากกว่าสองคนขึ้นไป

#mailcow#email#self-hosting#docker#dns