เมื่อ 2 สัปดาห์ก่อน ได้เข้าไปเดินเล่น ที่บล็อกของคุณ icez และไปเจอที่ได้เขียนไว้เกี่ยวกับ PHP Email Validation เห็นแล้วก็น่าสนใจดีครับ วันนี้จึงจะนำมาโมฯ ต่อ จากของผมที่ใช้อยู่เดิมๆ
เดิมๆ นั้น ผมจะใช้การตรวจสอบอีเมล์ ดังตัวอย่างด้านล่างนี้ครับ
1 2 3 4 5 6 7 |
function checkEmail($email){ if(!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$", $email)) { return false; }else{ return true; } } |
ซึ่งผมก็ใช้ฟังก์ชั่นด้านบน ในการตรวจสอบอีเมล์ตลอด แต่หลังจากที่ได้ไปเห็นในบล็อกคุณ icez ดังกล่าว และก็ได้ตามไปดูถึงแหล่ง (ที่คุณ icez เจอมาอีกที) ก็เลยศึกษา(คร่าวๆ) ดู แล้วเป็นที่น้าสนใจมากครับ โดยต้นฉบับเขียนฟังก์ชั่นไว้ดังนี้
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function checkEmail($email){ if(eregi("^[a-zA-Z0-9_]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$]", $email)) { return FALSE; } list($Username, $Domain) = split("@",$email); if(getmxrr($Domain, $MXHost)) { return TRUE; }else{ if(fsockopen($Domain, 25, $errno, $errstr, 30)) { return TRUE; }else{ return FALSE; } } } |
เป็นอย่างไรครับ เริ่มน่าสนใจแล้วสินะครับ แต่เนื่องจาก พอมารันดู ก็อาจพบข้อความผิดพลาดคือ
Warning: fsockopen() [function.fsockopen]: php_network_getaddresses: getaddrinfo failed: Name or service not known
Warning: fsockopen() [function.fsockopen]: unable to connect to :25 (Unknown error)
ข้อความนี้ผมเจอกับตัว และก็มีคนโพสไว้ที่บล็อกคุณ icez ด้วยเช่นกัน? แต่จากข้อสันนิษฐานของผมคือ ถ้าเรากรอกอีเมล์ ที่ไม่มีโดเมนอยู่จริง มันจะขึ้นเตือนดังกล่าว เช่น heem@e.com
ดังนั้นเพื่อแก้ปัญหา(เฉพาะหน้า) ผมก็เลยจัดแจงใส่ @ ไว้หน้า fsockopen (บรรทัด 16) เพื่อไม่ให้แจ้งข้อผิดพลาด หากเกิดกรณีดังกล่าว และผมก็ได้เปลี่ยนการเช็ครูปแบบอีเมล์ใหม่ (บรรทัดที่ 2) ด้วยเช่นกันครับ (เพราะรู้สึกว่าเขาตก เครื่องหมาย ! ไปหรือไม่?) แต่อย่างไรก็ดี ผมก็ได้เอาการเช็ครูปแบบอีเมล์ จากฟังก์ชั่นเดิมของผมมาแทน ที่
และแล้ว หลังจากโมฯ ก็ได้มาเป็นแบบนี้ครับ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function checkEmail($email) { if(!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$", $email)){ return false; } list($Username, $Domain) = split("@",$email); if(getmxrr($Domain, $MXHost)){ return TRUE; }else{ if(@fsockopen($Domain, 25, $errno, $errstr, 30)){ return TRUE; }else { return FALSE; } } } |
ผมลองเช็คดู ยังไม่พบปัญหานะครับ ท่านสามารถเนาไปใช้หรือประยุกต์ต่อได่นะครับ 😀
💡 หมายเหตุ หากรันบน Windows จะพบปัญหาไม่มีฟังชั่นgetmxrr นะครับ เนื่องจาก ฟังก์ชั่น getmxrr สามารถใช้ได้เฉพาะ Linux เท่านั้นนะครับ
แล้ว $MXHost คืออะไรคับ
$MXHost (array)
จะเป็นรายการ MX Record ที่พบจาก $Domain ที่เราค้นหาครับ
รบกวนแนะนำการเอาไปใช้งานด้วยครับ พอดีผมเจอปัญหาเรื่องมีคนส่งเมล์ที่ไม่ใช้รูปแบบเมล์มาที่ผมนะครับเป็นฟอร์มลงทะเบียนจองห้องพัก ถ้าผมจะนำไปใช้ ผมจะวางตรงส่วนไหนครับ
ขอบคุณครับ
@jong
นำอีเมล์มาตรวจสอบกับฟังก์ชั่น ก่อนที่จะนำข้อมูลที่ได้นั้นไปใช้หรือบันทึกลงฐานข้อมูลนะครับ
กล่าวคือ พอผู้ใช้ submit ฟอร์ม ก็ให้นำอีเมล์ไปตรวจสอบกับฟังก์ชั่นก่อนนะครับ
เช่น
เป็นต้นครับ