เมื่อแบบฟอร์มติดต่อบอกว่า “ขอบคุณ” แต่ไม่มีอีเมลมาถึง
แบบฟอร์มติดต่ออาจเสียโดยไม่มีใครเห็นข้อผิดพลาด ผู้เยี่ยมชมได้รับข้อความยืนยันอย่างเป็นมิตร แต่ผู้รับไม่ได้อะไรเลย ทำไมจึงเกิดขึ้น และจะสังเกตให้ทันได้อย่างไร
ลองนึกถึงคลินิกกายภาพบำบัดเล็ก ๆ เว็บไซต์มีแบบฟอร์มติดต่อซึ่งทำงานได้ หรืออย่างน้อยก็ดูเหมือนเช่นนั้น ผู้เยี่ยมชมกรอก คลิก “ส่ง” แล้วเห็นข้อความเป็นมิตรว่า “ขอบคุณ เราจะติดต่อกลับเร็ว ๆ นี้” สิ่งที่ไม่มีใครเห็นคือข้อความหยุดเข้ากล่องจดหมายของคลินิกมาพักหนึ่งแล้ว ไม่มีข้อผิดพลาด ไม่มีอีเมลตีกลับในกล่องจดหมายของใคร ไม่มีไฟแดงที่ไหน แบบฟอร์มล้มเหลวอย่างเงียบ ๆ
ทำไมไม่มีใครสังเกต
หน้า “ขอบคุณ” ของแบบฟอร์มมักหมายถึงเพียงอย่างเดียว: เว็บไซต์ส่งต่อข้อความแล้ว ส่วนเซิร์ฟเวอร์อีเมลจะรับ จัดเป็นสแปม หรือปฏิเสธระหว่างทางเกิดขึ้นภายหลัง นอกสายตาของแบบฟอร์ม ตัวอย่างเช่น ฟังก์ชัน mail() ของ PHP รายงานว่าสำเร็จทันทีที่ระบบในเครื่องรับข้อความไว้เพื่อนำส่ง ไม่ใช่เมื่อถึงผู้รับ ผู้เยี่ยมชมจึงได้รับคำยืนยันแล้วจากไป ขณะที่เจ้าของเห็นกล่องจดหมายว่างและคิดว่าเป็นเพียงเดือนที่เงียบ ข้อความสอบถามที่ลดลงแทบไม่ทำให้กังวลเมื่อมองลำพัง วันหยุด สภาพอากาศ เศรษฐกิจ มีคำอธิบายที่ดูเป็นไปได้มากกว่า “แบบฟอร์มเสีย” เสมอ
- วันที่ 0มีการอัปเดตปลั๊กอินตามปกติในช่วงกลางคืน เว็บไซต์ดูเหมือนเดิมทุกอย่าง
- วันที่ 1ข้อความสุดท้ายมาถึง ไม่มีใครรู้ว่านี่คือฉบับสุดท้าย
- วันที่ 2–13ผู้เยี่ยมชมยังส่งแบบฟอร์มและเห็น “ขอบคุณ” ต่อไป แต่ไม่มีข้อความถึงกล่องจดหมาย
- วันที่ 14มีคนโทรมาถามด้วยความหงุดหงิดเล็กน้อยว่าทำไมไม่มีใครตอบคำถามเลย
- วันที่ 15พบสาเหตุภายในหนึ่งชั่วโมง ข้อความตลอดสองสัปดาห์นั้นหายไปแล้ว เว้นแต่แบบฟอร์มเก็บสำเนาไว้ด้วย
สาเหตุที่พบบ่อย
- รหัสผ่าน SMTP หรือผู้ให้บริการอีเมลเปลี่ยนไป แบบฟอร์มยังเข้าสู่ระบบด้วยข้อมูลเดิมและเซิร์ฟเวอร์อีเมลปฏิเสธ โดยผู้เยี่ยมชมมองไม่เห็นอะไรผิดปกติ
- ใช้ PHP mail() โดยไม่มีการยืนยันตัวตน เว็บเซิร์ฟเวอร์ส่งอีเมลโดยตรงโดยไม่เข้าสู่เซิร์ฟเวอร์อีเมลที่เหมาะสม เซิร์ฟเวอร์ผู้รับจำนวนมากมองอีเมลแบบนี้ว่าน่าสงสัย จึงเข้าถังสแปมหรือถูกปฏิเสธทันที
- SPF, DKIM และ DMARC ไม่สอดคล้องกัน แบบฟอร์มจำนวนมากใส่ที่อยู่ผู้เยี่ยมชมใน From ข้อความจึงอ้างว่ามาจากที่อยู่ เช่น gmail.com แต่ส่งโดยเว็บเซิร์ฟเวอร์ของเว็บไซต์ ซึ่งเป็นสิ่งที่ DMARC ออกแบบมาเพื่อหยุด
- การอัปเดตปลั๊กอินหรือเปลี่ยนธีมทำให้แบบฟอร์มหรือ CAPTCHA เสีย เทมเพลตที่เปลี่ยนไปทำช่องหาย สคริปต์ไม่โหลดอีก หรือวิดเจ็ต CAPTCHA ปรากฏโดยไม่มีสคริปต์ ทำให้ทุกการส่งไม่ผ่านการตรวจสอบ
- กล่องจดหมายผู้รับเต็ม เซิร์ฟเวอร์อีเมลปฏิเสธข้อความใหม่ และข้อความตีกลับถูกส่งไปยังที่อยู่ที่ไม่มีใครอ่าน
- แบนเนอร์คุกกี้บล็อกสคริปต์แบบฟอร์ม หากเครื่องมือขอความยินยอมจัด CAPTCHA หรือสคริปต์แบบฟอร์มเป็น “การตลาด” ผู้เยี่ยมชมที่ปฏิเสธคุกกี้อาจได้แบบฟอร์มที่ส่งไม่ได้ หรือถูกปฏิเสธเพราะไม่มีโทเค็น
- ใบรับรอง TLS หรือโดเมนหมดอายุ ผู้เยี่ยมชมเห็นคำเตือนของเบราว์เซอร์แล้วออกไป หรือไม่สามารถเชื่อมต่อเซิร์ฟเวอร์อีเมลอย่างปลอดภัยได้อีก หากโดเมนของกล่องจดหมายผู้รับหมดอายุ อีเมลที่ส่งไปก็หยุดลง
- ชั้นแคชให้บริการหน้าที่ล้าสมัย แคชทั้งหน้าอาจส่งแบบฟอร์มพร้อมโทเค็นความปลอดภัยที่หมดอายุแล้ว เช่น ค่าที่ใช้ครั้งเดียวหรือโทเค็น CSRF เซิร์ฟเวอร์ปฏิเสธการส่ง และผู้เยี่ยมชมอาจไม่เห็นข้อผิดพลาดชัดเจนขึ้นอยู่กับการตั้งค่า
กับดักของที่อยู่ From
สาเหตุที่สามควรพิจารณาให้ละเอียด เพราะการตั้งค่าแบบฟอร์มจำนวนมากมีปัญหานี้เป็นค่าเริ่มต้น DMARC ตรวจว่าโดเมนในที่อยู่ From ที่มองเห็นตรงกับโดเมนที่ SPF หรือ DKIM รับรองหรือไม่ หากแบบฟอร์มส่งข้อความ “จาก” ที่อยู่ของผู้เยี่ยมชม เซิร์ฟเวอร์ไม่ได้รับอนุญาตให้ส่งแทนโดเมนนั้น การตรวจจึงล้มเหลว ข้อความจะเข้าถังสแปมหรือถูกปฏิเสธตามนโยบาย DMARC ของโดเมนผู้เยี่ยมชมและผู้ให้บริการอีเมลของเว็บไซต์ วิธีแก้ง่ายมาก: ส่งจากที่อยู่ในโดเมนของเว็บไซต์เอง และใส่ที่อยู่ผู้เยี่ยมชมใน Reply-To การคลิก “ตอบกลับ” ยังส่งถึงผู้เยี่ยมชมเหมือนเดิม
- From: ที่อยู่ของผู้เยี่ยมชม
- ไม่มี Reply-To
- PHP mail() ส่งตรงจากเว็บเซิร์ฟเวอร์
- ไม่มี SPF, DKIM หรือ DMARC สำหรับโดเมนผู้ส่ง
- ข้อความมีอยู่ในรูปอีเมลเท่านั้น
- From: ที่อยู่ในโดเมนของเว็บไซต์เอง เช่น form@yourdomain
- Reply-To: ที่อยู่ของผู้เยี่ยมชม
- SMTP ที่มีการยืนยันตัวตนหรือบริการส่งอีเมล
- ตั้งค่า SPF, DKIM และ DMARC ให้สอดคล้องกัน
- เก็บสำเนาในฐานข้อมูลด้วย
ควรทำอย่างไร
- 1ส่งข้อความทดสอบผ่านแบบฟอร์มของตนเองเป็นประจำ อย่างน้อยเดือนละครั้ง และทุกครั้งหลังอัปเดต เปลี่ยนธีม หรือเปลี่ยนการตั้งค่าอีเมล ทำเครื่องหมายให้ชัดว่าเป็นการทดสอบเพื่อไม่ให้มีคนตอบ
- 2รู้จังหวะตามปกติ หากแบบฟอร์มมักมีข้อความสองสามฉบับต่อสัปดาห์ การเงียบไปสองสัปดาห์เป็นเหตุให้ตรวจ ไม่ใช่แค่เดือนที่เงียบ
- 3ส่งผ่าน SMTP ที่มีการยืนยันตัวตน โดยผ่านผู้ให้บริการอีเมลหรือบริการส่งเฉพาะ แทนการพึ่ง PHP mail()
- 4ใช้โดเมนของเว็บไซต์เองใน From และที่อยู่ผู้เยี่ยมชมใน Reply-To แล้วตั้งค่า SPF, DKIM และ DMARC สำหรับโดเมนนั้นเพื่อให้ข้อความผ่านการตรวจสอบ
- 5เก็บสำเนาทุกการส่งไว้ในฐานข้อมูล ปลั๊กอินแบบฟอร์มจำนวนมากมีตัวเลือกนี้ บางครั้งเป็นส่วนเสริม หากอีเมลล้มเหลว ข้อความสอบถามยังอยู่
- 6ตรวจแบบฟอร์มหลังอัปเดตปลั๊กอินทุกครั้ง รวม CAPTCHA และกรณีปฏิเสธคุกกี้ด้วย
การตรวจแบบนี้ลืมได้ง่าย จึงควรทำให้เป็นอัตโนมัติ เมื่อมีบัญชีและโดเมนที่ยืนยันแล้ว formexposed สามารถส่งข้อความทดสอบที่ทำเครื่องหมายชัดเจนและตรวจว่าส่งถึงจริงหรือไม่ (การตรวจสอบการส่งถึง ต้องเลือกเปิดใช้เท่านั้น) ระบบยังตรวจจับความเงียบเมื่อแบบฟอร์มที่ปกติมีข้อความกลับไม่มีเลย และตรวจ SPF, DKIM และ DMARC ของอีเมลแจ้งเตือน รวมถึงวันหมดอายุใบรับรอง TLS และโดเมน โดยแจ้งเตือนเฉพาะเมื่อมีการเปลี่ยนแปลง
หากต้องการดูเบื้องต้น การตรวจสอบฟรีที่ formexposed.com ไม่ต้องมีบัญชีและไม่ส่งข้อมูลใด ๆ หนึ่งในสิ่งที่แสดงคือมี CAPTCHA แต่ทำงานผิดหรือไม่ เช่น วิดเจ็ตไม่มีสคริปต์ คีย์ทดสอบสาธารณะ หรือข้อผิดพลาดในเบราว์เซอร์ ซึ่งเป็นสาเหตุที่แบบฟอร์มหยุดทำงานอย่างเงียบ ๆ การยืนยันว่าข้อความส่งถึงจริงทำได้ด้วยข้อความทดสอบจริงเท่านั้น จึงควรส่งทดสอบวันนี้