Jump to content






Photo

การตรวจสอบอีเมล (Validate email address)

Posted by Patrickz , 18 January 2010 · 6448 views

การตรวจสอบอีเมล Address
มีขั้นตอนดังนี้

1. email address format
เอกสารข้อกำหนดของอีเมลมีหลายรุ่น เช่น RFC 822 (1982), RFC 2822 (2001), RFC 5322 (2008) ดังนั้นรูปแบบอีเมลหนึ่ง จึงอาจไม่เข้าเงื่อนไขตามเอกสารข้อกำหนดบางชุดก็ได้ ดังนั้นจึงควรยึดถือตาม RFC 2822 เป็นอย่างต่ำ

รูปแบบอีกเมล  local-part@hostname.com ประกอบไปด้วย 2 ส่วน คั่นด้วยเครื่องหมาย @
ส่วนแรก (อยู่หน้าเครื่องหมาย @) เรียกว่า local-part มีความยาวไม่เกิน 64 ตัวอักษร
ส่วนหลัง (อยู่หลังเครื่องหมาย @) เรียกว่า hostname มีความยาวไม่เกิน 255 ตัวอักษร
รูปแบบอีเมลประกอบไปด้วย:
  • ตัวอักษร a-z, A-Z
  • ตัวเลข 0-9
  • อักขระ ! # {:content:} % & ' * + - / = ? ^ _ ` { | } ~
  • อักขระ . ต้องไม่ใช่ตัวแรก หรือตัวสุดท้าย และต้องไม่ใช้ติดกัน
  • domain name ต้องไม่เกิน 255 ตัวอักษร
ตัวอย่าง Regular Expression สำหรับ email address อย่างง่าย : /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i

<?php
					   $pattern = "/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i";
					   $email = 'myemail@gmail.com';
					   
					   if (preg_match($pattern, $email)) {
						   echo "A match was found.";
					   } else {
						   echo "A match was not found.";
					   }
					   ?>


2. DNS validate

คือขั้นตอนการเข้าไปดู MX record ของ Domain นั้นๆ เพื่อตรวจสอบดูว่า domain นั้นสามารถรับอีเมลได้หรือไ่ม่
หากไม่เจอ MX Record ก็หมายความว่า อีเมลนั้นไม่มีตัวตน เนื่องจาก domain นั้นๆ ไม่สามารถรับอีเมลได้

การตรวจสอบ MX Record นั้น สามารถทำได้โดยการติดต่อไปยัง DNS ด้วยคำสั่ง dig, nslookup
ตัวอย่างคำสั่ง  $dig MX gmail.com
; <<>> DiG 9.2.4 <<>> MX gmail.com
		  ;; global options:  printcmd
		  ;; Got answer:
		  ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7644
		  ;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 0
				  
		  ;; QUESTION SECTION:
		  ;gmail.com.					 IN	  MX
				  
		  ;; ANSWER SECTION:
				  gmail.com.			  2700	IN	  MX	  5 gmail-smtp-in.l.google.com.
				  gmail.com.			  2700	IN	  MX	  20 alt2.gmail-smtp-in.l.google.com.
				  gmail.com.			  2700	IN	  MX	  30 alt3.gmail-smtp-in.l.google.com.
				  gmail.com.			  2700	IN	  MX	  40 alt4.gmail-smtp-in.l.google.com.
				  gmail.com.			  2700	IN	  MX	  10 alt1.gmail-smtp-in.l.google.com.
จะเห็นว่า domain gmail.com มี mail server รองรับ 5 domain (แต่ล่ะ domain อาจจะมี server วิ่งอยู่กี่ร้อยกี่พันตัว ก็มิอาจรู้ได้)
อีกตัวอย่างจากบริการจาก mxtoolbox.com เพื่อดู MX Record ของ gmail.com

สำหรับ ภาษา PHP มี function getmxrr() ให้ใช้อยู่แล้ว :)

3. SMTP (Callback_verification, VRFY)
ตอนนี้เราทราบแล้วว่า อีเมล์ถูกรูปแบบ และ domain ก็รับอีเมลได้  แต่ยังไม่รู้ว่าที่อยู่อีเมลนั้นมีอยู่จริงหรือไม่ ดังนั้นสิ่งที่ต้องตรวจสอบต่อไปคือ
การถาม mail server ว่า มี mailbox (อีเมล) นี้มีอยู่จริงหรือเปล่า

การติดต่อทำได้โดยการเปิด socket ติดต่อไปยัง SMTP ซึ่งโดยปกติ จะเป็น port 25
เรื่องนี้เกี่ยวข้องกับ protocal ตรงๆ จึงไม่ขออธิบาย แต่สรุปว่าโดยทั่วไป มี 2 คำสั่ง

- vrfy  (verify) ใช้ถาม mail server ว่ามี mailbox หรือไม่  ทำงานได้เร็วกว่าคำสั่ง rcpt(จะอธิบายต่อไป) แต่อาจใช้ไม่ได้ เนื่องจากอาจมีนโยบายด้านความปลอดภัย

ตัวอย่าง

Quote

SMTP client: VRFY mike
SMTP server: 250 mike@abc.com
แสดงว่า mike@abc.com มีอยู่จริง

แล้วถ้าไปดึง mailing-list ล่ะ

Quote

SMTP client:  VRFY users-hackers
SMTP server:  250-carol@abc.com
              250-greg@abc.com
              250-marsha@abc.com
              250 peter@abc.com
เริ่มน่ากลัวล่ะ...เหตุผลที่คำสั่งนี้มักใช้ไม่ได้ :D

- rcpt เป็นคำสั่งกำหนด mailbox ที่จะส่งเมล (แ่ต่เราจะไม่ส่งจริง แค่ถามเฉยๆ) ลองดูตัวอย่างจาก บทความ How to check if an email address exists without sending an email?

Quote

COMMAND:
telnet mail.reddit.com 25

COMMAND:
helo hi
RESPONSE:
250 mail.reddit.com

COMMAND:
mail from: youremail@gmail.com
RESPONSE:
250 2.1.0 Ok

COMMAND:
rcpt to: mailbox.does.not.exist@reddit.com
RESPONSE:
550 5.1.1 <mailbox.does.not.exist@reddit.com>: Recipient address rejected: User unknown in local recipient table


COMMAND:
quit
RESPONSE:
221 2.0.0 Bye

ดังนั้น หาก mailbox นี้มีอยู่จริง   mail server จะคืนค่า 250 กลับมาให้  

คุณ Gabe ได้เขียน SMTP_validateEmail class (PHP) แจกจ่าย ผมยังไม่ได้ลอง (ถ้าลองแล้วไม่ work จะ update และแก้ไขให้)


สรุป
1. email address format - ตรวจสอบรูปแบบอีเมล
2. DNS validate - ถาม domain ว่ารับเมลได้ไหม
3. SMTP (Callback_verification, VRFY) ถาม mail server ว่า มี email address นี้อยู่จริงหรือไม่



Links

  




ขอบคุณครับ สำหรับเทคนิคดีๆ ที่มีมาฝากเป็นประจำ จะติดตามต่อไปครับ
  • Report
ลองแล้วครับ
ใช้งานได้ดีเลยทีเดียวครับ work มากครับ ขอบคุณครับ
SMTP_validateEmail class
  • Report
มา update เพิ่มหน่อยครับ
ทำงานได้ดีบน linux ครับ

ส่วนบน windows นั้นยังไม่ work
ที่ไม่ work นั้นเพราะมันไม่มีคำสั่ง getmxrr()  แล้วมันจึงไปเรียกพวก libralies DNS.php อีกที ซึ่งทำงานนานมาก และผลผลลัพธ์ที่ได้ก็ยังไม่ถูกต้อง ครับ
  • Report
เราได้รวบรวม คาสิโนออนไลน์ และเกมส์ยอดฮิตแห่งปีอย่างบาคาร่าออนไลน์ที่ได้รับความนิยมสำหรับลูกค้า และได้รับมาตรฐานระดับโลกอาทิ จีคลับ,Holiday Palace, Genting Casino, royal1688 รวมถึงตอบสนองลูกค้าที่นิยมและชื่นชอบการกีฬา โดยจีคลับนำเกมส์กีฬาต่างๆที่ได้มาตรฐานมาไว้ให้ท่านถึงบ้านอาทิ เว็บฟุตบอลและกีฬาระดับโลกมาตรฐานสากลรวมถึงได้รับความนิยมอันดับ 1 คือ Sbobet และยังมีเว็บพนันบอลและ กีฬาอื่นๆนอกจากSbobetอีกมากมายที่เปิดให้ท่านเข้ามาเล่นเกมส์กีฬา สะดวกถึงบ้านท่าน ด้วยบริการที่มีคุณภาพตลอด 24 ชั่วโมง รวดเร็วทั้ง การเติมเงิน-ถอนเงิน ภายใน 10 นาที ท่านสามารถมั่นใจได้ในความปลอดภัยของระบบการเงิน เข้า-ออก ด้วยการบริหารงานที่มีความปลอดภัยสูง จัดตั้งออฟฟิตในฝั่งปอยเปตนเก็นติ้งคาสิโน ประเทศกัมพูชา พร้อมให้คำแนะนำในทุกเกมส์บาคาร่าปอยเปตการ เล่นรวมถึงวิธีการเข้าเล่น โดยทีมงานที่มีประสบการณ์ด้านคาสิโนและเกมส์กีฬาโดยตรงทั้งนี้เรายังรับจัด เพื่อมาผักผ่อนที่ คาสิโนโดยบริการ รถรับ ส่งท่านถึงหน้าบ้านอย่ารอช้ารีบมาร่วมสนุกกับเรา วันนี้โทรเลยครับ
  • Report