เมื่อ 2 สัปดาห์ก่อน ได้เข้าไปเดินเล่น ที่บล็อกของคุณ icez และไปเจอที่ได้เขียนไว้เกี่ยวกับ PHP Email Validation เห็นแล้วก็น่าสนใจดีครับ วันนี้จึงจะนำมาโมฯ ต่อ จากของผมที่ใช้อยู่เดิมๆ
เดิมๆ นั้น ผมจะใช้การตรวจสอบอีเมล์ ดังตัวอย่างด้านล่างนี้ครับ
[php]
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;
}
}
[/php]
ซึ่งผมก็ใช้ฟังก์ชั่นด้านบน ในการตรวจสอบอีเมล์ตลอด แต่หลังจากที่ได้ไปเห็นในบล็อกคุณ icez ดังกล่าว และก็ได้ตามไปดูถึงแหล่ง (ที่คุณ icez เจอมาอีกที) ก็เลยศึกษา(คร่าวๆ) ดู แล้วเป็นที่น้าสนใจมากครับ โดยต้นฉบับเขียนฟังก์ชั่นไว้ดังนี้
[php]
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;
}
}
}
[/php]
เป็นอย่างไรครับ เริ่มน่าสนใจแล้วสินะครับ แต่เนื่องจาก พอมารันดู ก็อาจพบข้อความผิดพลาดคือ
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) ด้วยเช่นกันครับ (เพราะรู้สึกว่าเขาตก เครื่องหมาย ! ไปหรือไม่?) แต่อย่างไรก็ดี ผมก็ได้เอาการเช็ครูปแบบอีเมล์ จากฟังก์ชั่นเดิมของผมมาแทน ที่
และแล้ว หลังจากโมฯ ก็ได้มาเป็นแบบนี้ครับ
[php]
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;
}
}
}
[/php]
ผมลองเช็คดู ยังไม่พบปัญหานะครับ ท่านสามารถเนาไปใช้หรือประยุกต์ต่อได่นะครับ 😀
💡 หมายเหตุ หากรันบน Windows จะพบปัญหาไม่มีฟังชั่นgetmxrr นะครับ เนื่องจาก ฟังก์ชั่น getmxrr สามารถใช้ได้เฉพาะ Linux เท่านั้นนะครับ
แล้ว $MXHost คืออะไรคับ
$MXHost (array)
จะเป็นรายการ MX Record ที่พบจาก $Domain ที่เราค้นหาครับ
รบกวนแนะนำการเอาไปใช้งานด้วยครับ พอดีผมเจอปัญหาเรื่องมีคนส่งเมล์ที่ไม่ใช้รูปแบบเมล์มาที่ผมนะครับเป็นฟอร์มลงทะเบียนจองห้องพัก ถ้าผมจะนำไปใช้ ผมจะวางตรงส่วนไหนครับ
ขอบคุณครับ
@jong
นำอีเมล์มาตรวจสอบกับฟังก์ชั่น ก่อนที่จะนำข้อมูลที่ได้นั้นไปใช้หรือบันทึกลงฐานข้อมูลนะครับ
กล่าวคือ พอผู้ใช้ submit ฟอร์ม ก็ให้นำอีเมล์ไปตรวจสอบกับฟังก์ชั่นก่อนนะครับ
เช่น
[php]
if(!checkEmail($_POST[’email’])) {
# ถ้าอีเมล์ที่ป้อนไม่ถูกต้อง
//แสดงข้อความ Error
}else{
// เช็คเงื่อนไขอื่นๆ หรือ Submit ข้อมูล
}
[/php]
เป็นต้นครับ