ตรวจสอบอีเมล์ด้วย PHP

เมื่อ 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 เท่านั้นนะครับ

4 Replies to “ตรวจสอบอีเมล์ด้วย PHP”

  1. patiphan :แล้ว $MXHost คืออะไรคับ

    $MXHost (array)

    จะเป็นรายการ MX Record ที่พบจาก $Domain ที่เราค้นหาครับ

  2. รบกวนแนะนำการเอาไปใช้งานด้วยครับ พอดีผมเจอปัญหาเรื่องมีคนส่งเมล์ที่ไม่ใช้รูปแบบเมล์มาที่ผมนะครับเป็นฟอร์มลงทะเบียนจองห้องพัก ถ้าผมจะนำไปใช้ ผมจะวางตรงส่วนไหนครับ

    ขอบคุณครับ

  3. @jong
    นำอีเมล์มาตรวจสอบกับฟังก์ชั่น ก่อนที่จะนำข้อมูลที่ได้นั้นไปใช้หรือบันทึกลงฐานข้อมูลนะครับ

    กล่าวคือ พอผู้ใช้ submit ฟอร์ม ก็ให้นำอีเมล์ไปตรวจสอบกับฟังก์ชั่นก่อนนะครับ

    เช่น
    [php]
    if(!checkEmail($_POST[’email’])) {
    # ถ้าอีเมล์ที่ป้อนไม่ถูกต้อง
    //แสดงข้อความ Error
    }else{
    // เช็คเงื่อนไขอื่นๆ หรือ Submit ข้อมูล
    }
    [/php]

    เป็นต้นครับ