คำตอบสั้น ๆ: ตั้ง Split Delivery ให้โดเมนเดียวใช้ทั้ง Microsoft 365 และ Mail Server เดิม: เลือกฝั่ง MX, ตั้ง Internal relay, สร้าง Connector, รวม SPF และทดสอบทุกเส้นทาง
คู่มือนี้อธิบาย Split Delivery ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
Split Delivery คือการให้อีเมลของโดเมนเดียวกัน เช่น @example.com ส่งถึงกล่องจดหมายที่อยู่คนละระบบ บางคนอยู่บน Microsoft 365 บางคนยังอยู่บน Mail Server เดิมของบริษัท เช่น Zimbra หรือ Postfix บน Cloud Server โดยผู้ส่งภายนอกไม่ต้องรู้ว่าใครอยู่ระบบไหน รูปแบบนี้ใช้ได้ทั้งช่วงย้ายระบบทีละแผนก และแบบถาวรเมื่อบริษัทให้ผู้บริหารใช้ Microsoft 365 แต่พนักงานส่วนใหญ่อยู่บนเมลเซิร์ฟเวอร์เดิม
คู่มือนี้เหมาะกับผู้ดูแลระบบที่ต้องตั้งค่า Split Delivery ทั้งสองฝั่งเอง เมื่อทำครบ คุณจะเลือกได้ว่า MX ควรชี้ไปที่ระบบไหน ตั้งโดเมนใน Exchange Online เป็น Internal relay สร้าง Connector ส่งอีเมลไปเซิร์ฟเวอร์เดิม ตั้งเส้นทางย้อนกลับฝั่งเซิร์ฟเวอร์เดิม รวม SPF ของสองระบบไว้ในระเบียนเดียว และทดสอบครบทุกทิศทางก่อนใช้งานจริง ถ้าองค์กรใช้ Google Workspace แทน ให้ดู Dual Delivery บน Gmail ซึ่งใช้หลักการคล้ายกัน
สิ่งที่ต้องเตรียม
- บทบาท Exchange Administrator หรือ Global Administrator ใน Microsoft 365 และโดเมนที่ยืนยันแล้วใน Microsoft 365 admin center
- สิทธิ์ root หรือผู้ดูแลบน Mail Server เดิม ชื่อโฮสต์ที่รับอีเมลจากภายนอกได้ เช่น
mail.example.com(IP 203.0.113.10) พร้อมใบรับรอง TLS ที่ออกโดย CA ไม่ใช่ self-signed - สิทธิ์แก้ DNS ของโดเมน ทั้ง MX, TXT (SPF) และ CNAME (Autodiscover)
- รายชื่อผู้ใช้ทั้งหมดที่ระบุว่าใครอยู่ระบบไหน รวม alias, Shared Mailbox และ Distribution list เพราะระบบหลักต้องรู้ที่อยู่ทุกตัวของโดเมน
- ไฟร์วอลล์ของเซิร์ฟเวอร์เดิมเปิดพอร์ต 25 ให้ช่วง IP ของ Exchange Online ตามที่ Microsoft ประกาศในหน้า Microsoft 365 URLs and IP address ranges
ขั้นตอนที่ 1: เลือกระบบหลักที่รับ MX ของ Split Delivery
ในการทำ Split Delivery จะมีระบบเดียวที่รับอีเมลจากอินเทอร์เน็ต (ระบบที่ MX ชี้ไป) เรียกว่าระบบหลัก ระบบหลักต้องรู้จักทุกที่อยู่ของโดเมนและส่งต่ออีเมลของผู้ใช้ที่อยู่อีกฝั่งไปให้ ส่วนระบบรองรู้จักเฉพาะผู้ใช้ของตัวเอง
- MX ชี้ Microsoft 365: เหมาะเมื่อผู้ใช้ส่วนใหญ่ย้ายแล้วหรือกำลังจะย้าย อีเมลทุกฉบับผ่าน Exchange Online Protection ก่อน ส่วนอีเมลถึงผู้ใช้บนเซิร์ฟเวอร์เดิมจะผ่าน Microsoft 365 หนึ่งทอด
- MX ชี้ Mail Server เดิม: เหมาะเมื่อมีผู้ใช้ Microsoft 365 ไม่กี่คน เช่น เฉพาะผู้บริหาร ไม่ต้องแตะ MX แต่ระบบกรองของเซิร์ฟเวอร์เดิมเป็นด่านแรก และต้องตั้งเส้นทางรายคนทุกครั้งที่ย้ายผู้ใช้
ไม่ว่าเลือกแบบไหน Split Delivery มีกฎข้อเดียวที่ห้ามพลาด คือที่อยู่ที่ไม่มีอยู่จริงต้องถูกปฏิเสธที่ระบบปลายทางสุดท้าย ห้ามตั้งให้ทั้งสองฝั่งส่งต่อ "ผู้รับที่ไม่รู้จัก" ไปหากัน เพราะอีเมลที่พิมพ์ที่อยู่ผิดจะวนไปมาจนเกิด loop และกินคิวทั้งสองระบบ ตัวอย่างในคู่มือนี้ใช้ MX ชี้ Microsoft 365 และให้เซิร์ฟเวอร์เดิมเป็นฝั่งที่ปฏิเสธที่อยู่ที่ไม่มีจริง
ขั้นตอนที่ 2: ตั้งโดเมนเป็น Internal relay ใน Exchange Online
ค่าเริ่มต้นของโดเมนใน Exchange Online คือ Authoritative ซึ่งปฏิเสธผู้รับที่ไม่มีกล่องจดหมายใน Microsoft 365 ตั้งแต่ขอบเครือข่าย (Directory-Based Edge Blocking) ถ้าจะทำ Split Delivery ต้องเปลี่ยนเป็น Internal relay เพื่อให้อีเมลของผู้รับที่ Exchange Online ไม่รู้จักถูกส่งต่อไปเซิร์ฟเวอร์เดิม
- เปิด Exchange admin center ที่
https://admin.exchange.microsoft.com - ไปที่ Mail flow > Accepted domains แล้วคลิกชื่อโดเมน
- ในส่วน This accepted domain is เลือก Internal relay แล้วคลิก Save
ทำขั้นตอนนี้กับขั้นตอนที่ 3 ในรอบเดียวกัน เพราะถ้าโดเมนเป็น Internal relay แต่ยังไม่มี Connector อีเมลถึงผู้ใช้บนเซิร์ฟเวอร์เดิมจะไม่มีเส้นทางส่งต่อ และ Microsoft ระบุชัดว่าไม่ควรใช้ Internal relay เมื่อผู้ใช้ทุกคนอยู่บน Microsoft 365 แล้ว ให้เปลี่ยนกลับเป็น Authoritative ทันทีที่ย้ายครบ รายละเอียดอยู่ในเอกสาร Manage accepted domains in Exchange Online
ขั้นตอนที่ 3: สร้าง Connector สำหรับ Split Delivery ไปเซิร์ฟเวอร์เดิม
- ใน Exchange admin center ไปที่ Mail flow > Connectors แล้วคลิก + Add a connector
- ช่อง Connection from เลือก Office 365 และช่อง Connection to เลือก Your organization's email server
- ตั้งชื่อที่บอกว่าเป็น Connector ของ Split Delivery เช่น
To legacy mail serverที่หน้า Use of connector เลือก Only when email messages are sent to these domains แล้วใส่example.com - หน้า Routing ใส่
mail.example.comแล้วคลิก + ก่อนคลิก Next - หน้า Security restrictions เลือก Always use Transport Layer Security (TLS) to secure the connection (recommended) และ Issued by a trusted certificate authority (CA)
- หน้า Validation email ใส่ที่อยู่ของผู้ใช้ที่อยู่บนเซิร์ฟเวอร์เดิม คลิก + แล้วคลิก Validate เมื่อผ่านแล้วคลิก Create connector
อีเมลถึงผู้รับที่มีกล่องจดหมายใน Microsoft 365 ยังส่งภายในระบบตามปกติ Connector นี้ถูกใช้กับผู้รับที่ Exchange Online ไม่รู้จักเท่านั้น ฝั่งเซิร์ฟเวอร์เดิมต้องยอมรับการเชื่อมต่อจากช่วง IP ของ Exchange Online ถ้ามีกฎกันอีเมลที่อ้างว่ามาจากโดเมนตัวเองแต่เข้ามาจาก IP ภายนอก (anti-spoofing) หรือกฎตรวจ SPF ของผู้ส่งต้นทาง ให้ยกเว้นช่วง IP นี้ ไม่เช่นนั้นการ Validate จะผ่าน แต่อีเมลจริงจากคนนอกที่ถูกส่งต่อผ่าน Microsoft 365 จะโดนปฏิเสธหรือเข้า Spam
ผู้ที่ถนัด PowerShell ทำขั้นตอนที่ 2 และ 3 ได้ด้วยคำสั่งด้านล่าง
Connect-ExchangeOnline -UserPrincipalName [email protected]
Set-AcceptedDomain -Identity example.com -DomainType InternalRelay
New-OutboundConnector -Name "To legacy mail server" -ConnectorType OnPremises `
-RecipientDomains example.com -SmartHosts mail.example.com -UseMXRecord $false `
-TlsSettings CertificateValidation
Get-OutboundConnector "To legacy mail server" | Format-List RecipientDomains,SmartHosts,TlsSettings,Enabled
ขั้นตอนที่ 4: ตั้งเส้นทาง Split Delivery ฝั่ง Mail Server เดิม
เซิร์ฟเวอร์เดิมยังถือว่าตัวเองเป็นเจ้าของ example.com เมื่อพนักงานบนเซิร์ฟเวอร์เดิมส่งอีเมลถึงเพื่อนที่ย้ายไป Microsoft 365 แล้ว เซิร์ฟเวอร์จะหาผู้รับในเครื่องไม่เจอและตีกลับ หัวใจของ Split Delivery ฝั่งนี้คือเก็บบัญชีของผู้ใช้ที่ย้ายไว้เป็นตัวแทน (ไม่ลบ) แล้วตั้งเส้นทางส่งของบัญชีนั้นไป Microsoft 365 แบบรายคน ไม่ใช้ catch-all เพื่อไม่ให้เกิด loop ตามขั้นตอนที่ 1 ปลายทางคือค่า MX ที่ Microsoft 365 กำหนดให้โดเมน ซึ่งคัดลอกได้จาก Settings > Domains ใน Microsoft 365 admin center เช่น example-com.mail.protection.outlook.com
Zimbra
su - zimbra
zmprov ca [email protected] "$(openssl rand -base64 24)"
zmprov ma [email protected] zimbraMailTransport smtp:example-com.mail.protection.outlook.com:25
zmprov ga [email protected] zimbraMailTransport
ถ้าบัญชีมีอยู่แล้วและย้ายข้อมูลเสร็จแล้ว ใช้เฉพาะคำสั่ง zmprov ma ถ้าต้องการย้ายกลับ ให้ตั้ง zimbraMailTransport กลับเป็นค่า lmtp: เดิมของเซิร์ฟเวอร์ (ดูจากบัญชีอื่นด้วย zmprov ga ก่อนแก้)
Postfix ทั่วไป
# /etc/postfix/transport
[email protected] smtp:[example-com.mail.protection.outlook.com]:25
[email protected] smtp:[example-com.mail.protection.outlook.com]:25
postmap /etc/postfix/transport
postconf -e 'transport_maps = hash:/etc/postfix/transport'
systemctl reload postfix
ผู้ใช้ต้องยังอยู่ในตารางผู้รับของ Postfix (เช่น virtual_mailbox_maps) เพื่อให้ผ่านการตรวจผู้รับ ส่วนที่อยู่ที่ไม่มีในตารางจะถูกปฏิเสธเหมือนเดิม ซึ่งเป็นสิ่งที่ต้องการ