ฉันได้เจอนี้โค้ด PHP ในการตรวจสอบที่อยู่อีเมลโดยใช้ SMTP โดยไม่ต้องส่งอีเมล
มีใครลองอะไรที่คล้ายกันหรือได้ผลกับคุณบ้าง? คุณสามารถบอกได้ว่าอีเมลที่ลูกค้า / ผู้ใช้ป้อนนั้นถูกต้องและมีอยู่จริงหรือไม่?
ฉันได้เจอนี้โค้ด PHP ในการตรวจสอบที่อยู่อีเมลโดยใช้ SMTP โดยไม่ต้องส่งอีเมล
มีใครลองอะไรที่คล้ายกันหรือได้ผลกับคุณบ้าง? คุณสามารถบอกได้ว่าอีเมลที่ลูกค้า / ผู้ใช้ป้อนนั้นถูกต้องและมีอยู่จริงหรือไม่?
คำตอบ:
มีสองวิธีที่บางครั้งคุณสามารถใช้เพื่อตรวจสอบว่ามีผู้รับอยู่จริงหรือไม่:
คุณสามารถเชื่อมต่อกับเซิร์ฟเวอร์และออกVRFY
คำสั่ง เซิร์ฟเวอร์น้อยมากที่รองรับคำสั่งนี้ แต่มีไว้สำหรับสิ่งนี้ หากเซิร์ฟเวอร์ตอบสนองด้วย 2.0.0 DSN แสดงว่ามีผู้ใช้อยู่
VRFY user
คุณสามารถออก a RCPT
และดูว่าอีเมลถูกปฏิเสธหรือไม่
MAIL FROM:<>
RCPT TO:<user@domain>
หากไม่มีผู้ใช้คุณจะได้รับ 5.1.1 DSN อย่างไรก็ตามเนื่องจากอีเมลไม่ถูกปฏิเสธไม่ได้หมายความว่ามีผู้ใช้อยู่ เซิร์ฟเวอร์บางเครื่องจะทิ้งคำขอเช่นนี้โดยไม่แจ้งให้ทราบเพื่อป้องกันการแจงนับผู้ใช้ เซิร์ฟเวอร์อื่นไม่สามารถตรวจสอบผู้ใช้และต้องยอมรับข้อความโดยไม่คำนึงถึง
นอกจากนี้ยังมีเทคนิคการป้องกันสแปมที่เรียกว่า greylisting ซึ่งจะทำให้เซิร์ฟเวอร์ปฏิเสธที่อยู่ในตอนแรกโดยคาดว่าเซิร์ฟเวอร์ SMTP จริงจะพยายามจัดส่งใหม่ในภายหลัง สิ่งนี้จะทำให้เกิดความสับสนในการตรวจสอบที่อยู่
โดยสุจริตหากคุณกำลังพยายามตรวจสอบที่อยู่แนวทางที่ดีที่สุดคือใช้นิพจน์ทั่วไปเพื่อบล็อกที่อยู่ที่ไม่ถูกต้องอย่างเห็นได้ชัดจากนั้นส่งอีเมลจริงพร้อมลิงก์กลับไปยังระบบของคุณเพื่อตรวจสอบความถูกต้องของอีเมลที่ได้รับ นอกจากนี้ยังช่วยให้มั่นใจได้ว่าผู้ใช้ป้อนอีเมลจริงไม่ใช่การพิมพ์ผิดเล็กน้อยที่เกิดขึ้นกับคนอื่น
คำตอบอื่น ๆ ที่นี่จะกล่าวถึงปัญหาต่างๆเกี่ยวกับการพยายามทำสิ่งนี้ ฉันคิดว่าฉันจะแสดงให้เห็นว่าคุณจะลองทำอย่างไรในกรณีที่คุณต้องการเรียนรู้ด้วยการลงมือทำด้วยตัวเอง
คุณสามารถเชื่อมต่อกับเซิร์ฟเวอร์อีเมลผ่านทาง telnet เพื่อถามว่ามีที่อยู่อีเมลหรือไม่ นี่คือตัวอย่างของการทดสอบที่อยู่อีเมลสำหรับstackoverflow.com
:
C: \> nslookup -q = mx stackoverflow.com คำตอบที่ไม่น่าเชื่อถือ: stackoverflow.com MX การตั้งค่า = 40, ตัวแลกเปลี่ยนเมล = STACKOVERFLOW.COM.S9B2.PSMTP.com stackoverflow.com MX การตั้งค่า = 10, ตัวแลกเปลี่ยนเมล = STACKOVERFLOW.COM.S9A1.PSMTP.com stackoverflow.com MX การตั้งค่า = 20, ตัวแลกเปลี่ยนเมล = STACKOVERFLOW.COM.S9A2.PSMTP.com stackoverflow.com MX การตั้งค่า = 30, ตัวแลกเปลี่ยนเมล = STACKOVERFLOW.COM.S9B1.PSMTP.com C: \> telnet STACKOVERFLOW.COM.S9A1.PSMTP.com 25 220 Postini ESMTP 213 y6_35_0c4 พร้อมแล้ว รหัสธุรกิจและวิชาชีพของ CA มาตรา 17538.45 ห้ามใช้ระบบนี้สำหรับการโฆษณาทางไปรษณีย์อิเล็กทรอนิกส์ที่ไม่ได้ร้องขอ สวัสดีสวัสดี 250 Postini กล่าวสวัสดีกลับมา จดหมายจาก: <me@myhost.com> 250 โอเค rcpt ไปที่: <fake@stackoverflow.com> 550-5.1.1 ไม่มีบัญชีอีเมลที่คุณพยายามเข้าถึง โปรดลอง 550-5.1.1 ตรวจสอบที่อยู่อีเมลของผู้รับอีกครั้งว่าพิมพ์ผิดหรือ 550-5.1.1 ช่องว่างที่ไม่จำเป็น เรียนรู้เพิ่มเติมที่ 550 5.1.1 http://mail.google.com/support/bin/answer.py?answer=6596 w41si3198459wfd.71
บรรทัดที่ขึ้นต้นด้วยรหัสตัวเลขเป็นการตอบสนองจากเซิร์ฟเวอร์ SMTP ฉันเพิ่มบรรทัดว่างเพื่อให้อ่านง่ายขึ้น
เซิร์ฟเวอร์อีเมลจำนวนมากจะไม่ส่งคืนข้อมูลนี้เพื่อป้องกันไม่ให้ผู้ส่งอีเมลขยะมาเก็บข้อมูลที่อยู่อีเมลดังนั้นคุณจึงไม่สามารถพึ่งพาเทคนิคนี้ได้ อย่างไรก็ตามคุณอาจประสบความสำเร็จในการล้างที่อยู่อีเมลที่ไม่ถูกต้องอย่างเห็นได้ชัดโดยการตรวจพบเซิร์ฟเวอร์อีเมลที่ไม่ถูกต้องหรือมีที่อยู่ของผู้รับถูกปฏิเสธดังที่กล่าวมา
โปรดทราบด้วยว่าเซิร์ฟเวอร์อีเมลอาจขึ้นบัญชีดำคุณหากคุณส่งคำขอมากเกินไป
ใน PHP ผมเชื่อว่าคุณสามารถใช้fsockopen
, fwrite
และfread
ที่จะดำเนินการตามขั้นตอนดังกล่าวข้างต้นโปรแกรม:
$smtp_server = fsockopen("STACKOVERFLOW.COM.S9A1.PSMTP.com", 25, $errno, $errstr, 30);
fwrite($smtp_server, "helo hi\r\n");
fwrite($smtp_server, "mail from: <me@myhost.com>\r\n");
fwrite($smtp_server, "rcpt to: <fake@stackoverflow.com>\r\n");
คำตอบทั่วไปคือคุณไม่สามารถตรวจสอบได้ว่าที่อยู่อีเมลมีเหตุการณ์อยู่หรือไม่หากคุณส่งอีเมลไปที่นั่นมันอาจจะเข้าไปในหลุมดำ
วิธีการที่กล่าวมานั้นมีประสิทธิภาพมากทีเดียว ใช้ในรหัสการผลิตในZoneCheckยกเว้นว่าจะใช้ RSET แทน QUIT
ในกรณีที่การโต้ตอบของผู้ใช้กับกล่องจดหมายของเขาไม่ได้มีค่าใช้จ่ายมากเกินไปในหลาย ๆ ไซต์ที่ทดสอบว่าอีเมลนั้นมาถึงที่ไหนสักแห่งโดยการส่งหมายเลขลับที่ต้องส่งกลับไปยังผู้ส่ง (ไม่ว่าจะโดยไปที่ URL ลับหรือส่งหมายเลขลับนี้ทางอีเมล) รายชื่ออีเมลส่วนใหญ่ทำงานเช่นนั้น
ไม่จริง ..... บางเซิร์ฟเวอร์อาจไม่ตรวจสอบ "rcpt to:"
http://www.freesoft.org/CIE/RFC/1123/92.htm
การทำเช่นนั้นมีความเสี่ยงด้านความปลอดภัย .....
หากเซิร์ฟเวอร์ทำคุณสามารถเขียนบอทเพื่อค้นหาที่อยู่ทั้งหมดบนเซิร์ฟเวอร์ได้ ....
สิ่งนี้จะล้มเหลว (ในกรณีอื่น ๆ ) เมื่อเซิร์ฟเวอร์อีเมลเป้าหมายใช้รายการสีเทา
รายการสีเทา : เซิร์ฟเวอร์ SMTP ปฏิเสธการส่งมอบในครั้งแรกที่ไคลเอนต์ที่ไม่รู้จักก่อนหน้านี้เชื่อมต่ออนุญาตให้ใช้ครั้งต่อไป ซึ่งจะช่วยป้องกันไม่ให้สแปมบอทบางส่วนหลุดออกไปในขณะที่อนุญาตให้ใช้งานได้อย่างถูกกฎหมายเนื่องจากคาดว่าผู้ส่งอีเมลที่ถูกต้องจะลองอีกครั้งซึ่งเป็นสิ่งที่ตัวแทนการโอนอีเมลปกติจะทำ
อย่างไรก็ตามหากรหัสของคุณตรวจสอบบนเซิร์ฟเวอร์เพียงครั้งเดียวเซิร์ฟเวอร์ที่มีรายการสีเทาจะปฏิเสธการส่ง (เนื่องจากไคลเอ็นต์ของคุณกำลังเชื่อมต่อเป็นครั้งแรก) เว้นแต่คุณจะตรวจสอบอีกครั้งในอีกสักครู่คุณอาจปฏิเสธที่อยู่อีเมลที่ถูกต้องอย่างไม่ถูกต้อง
บางประเด็น:
แม้ว่าคำถามนี้จะดูเก่าไปหน่อย แต่เคล็ดลับบริการนี้อาจช่วยให้ผู้ใช้ค้นหาโซลูชันที่คล้ายกันในการตรวจสอบที่อยู่อีเมลนอกเหนือจากการตรวจสอบความถูกต้องของไวยากรณ์ก่อนที่จะส่ง
ฉันใช้บริการโอเพนซอร์สนี้เพื่อตรวจสอบความถูกต้องของอีเมลในเชิงลึกมากขึ้น (การตรวจสอบระเบียน mx บนโดเมนที่อยู่อีเมล ฯลฯ ) สำหรับโครงการสองสามโครงการที่มีผลลัพธ์ที่ดี นอกจากนี้ยังตรวจสอบแม่มดพิมพ์ผิดที่พบบ่อยมีประโยชน์มาก สาธิตที่นี่
"คุณทราบได้ไหมว่าอีเมลที่ลูกค้า / ผู้ใช้ป้อนถูกต้องและมีอยู่จริง"
จริงๆแล้วนี่เป็นสองสิ่งที่แยกจากกัน อาจมีอยู่แต่อาจไม่ถูกต้อง
บางครั้งคุณต้องรับปัจจัยการผลิตของผู้ใช้ตามมูลค่าที่ตราไว้ มีหลายวิธีที่จะเอาชนะระบบอย่างอื่น
สิ่งที่คุณทำได้คือค้นหา DNS และตรวจสอบให้แน่ใจว่าโดเมนที่อยู่ในที่อยู่อีเมลมีระเบียน MX นอกเหนือจากนั้นไม่มีวิธีที่เชื่อถือได้ในการจัดการกับสิ่งนี้
เซิร์ฟเวอร์บางตัวอาจทำงานด้วยวิธี rcpt-to ที่คุณคุยกับเซิร์ฟเวอร์ SMTP แต่ขึ้นอยู่กับการกำหนดค่าของเซิร์ฟเวอร์ทั้งหมด ปัญหาอื่นอาจเป็นเซิร์ฟเวอร์ที่โอเวอร์โหลดอาจส่งคืนรหัส 550 โดยบอกว่าผู้ใช้ไม่รู้จัก แต่นี่เป็นข้อผิดพลาดชั่วคราวมีข้อผิดพลาดถาวร (451 ฉันคิดว่า?) ที่สามารถส่งคืนได้ นี้ขึ้นอยู่อย่างสิ้นเชิงกับการกำหนดค่าของเซิร์ฟเวอร์
ฉันจะตรวจสอบระเบียน DNS MX เป็นการส่วนตัวจากนั้นส่งการยืนยันอีเมลหากมีระเบียน MX อยู่
function EmailValidation($email)
{
$email = htmlspecialchars(stripslashes(strip_tags($email))); //parse unnecessary characters to prevent exploits
if (eregi('[a-z||0-9]@[a-z||0-9].[a-z]', $email)) {
//checks to make sure the email address is in a valid format
$domain = explode( "@", $email ); //get the domain name
if (@fsockopen ($domain[1],80,$errno,$errstr,3)) {
//if the connection can be established, the email address is probably valid
echo "Domain Name is valid ";
return true;
} else {
echo "Con not a email domian";
return false; //if a connection cannot be established return false
}
return false; //if email address is an invalid format return false
}
}
สมมติว่าเป็นที่อยู่ของผู้ใช้เซิร์ฟเวอร์อีเมลบางแห่งอนุญาตให้คำสั่ง SMTP VRFY ยืนยันที่อยู่อีเมลกับกล่องจดหมายได้ เว็บไซต์หลักส่วนใหญ่จะไม่ให้ข้อมูลแก่คุณมากนัก คำตอบของ gmail คือ "ถ้าคุณพยายามส่งเมลเราจะพยายามส่งให้" หรืออะไรที่ฉลาด ๆ แบบนั้น
ฉันคิดว่าคุณทำไม่ได้มีหลายสถานการณ์ที่แม้แต่การส่งอีเมลก็อาจล้มเหลวได้ เช่น. เมลเซิร์ฟเวอร์ฝั่งผู้ใช้หยุดทำงานชั่วคราวมีเมลบ็อกซ์อยู่ แต่เต็มจึงไม่สามารถส่งข้อความได้ ฯลฯ
นั่นอาจเป็นเหตุผลว่าทำไมไซต์จำนวนมากจึงตรวจสอบการลงทะเบียนหลังจากที่ผู้ใช้ยืนยันว่าพวกเขาได้รับอีเมลยืนยันแล้ว
ฉันสามารถยืนยันคำตอบของโจเซฟและดรูว์ที่จะใช้ได้ RCTP TO: <address_to_check>
ใช้ได้ ฉันต้องการเพิ่มส่วนเสริมเล็ก ๆ น้อย ๆ ที่ด้านบนของคำตอบเหล่านั้น
ผู้ให้บริการอีเมลบางรายใช้นโยบายรับทั้งหมดซึ่งหมายความว่า*@mydomain.com
จะส่งผลบวกต่อไฟล์RCTP TO:
คำสั่ง แต่นี่ไม่จำเป็นต้องหมายความว่ากล่องจดหมาย "มีอยู่จริง" เช่นเดียวกับ "เป็นของมนุษย์" ที่นี่ไม่มีอะไรสามารถทำได้มากเพียงแค่รับทราบ
Greylisting: การเชื่อมต่อครั้งแรกจาก IP ที่ไม่รู้จักถูกบล็อก วิธีแก้ไข: ลองใหม่อย่างน้อย 2 ครั้ง
บัญชีดำ: หากคุณส่งคำขอจาก IP เดียวกันมากเกินไป IP นี้จะถูกบล็อก วิธีแก้ไข: ใช้การหมุน IP Reacherใช้ Tor.
นี่เป็นเรื่องเฉพาะของผู้ให้บริการ แต่บางครั้งคุณสามารถใช้คำขอ HTTP ที่ออกแบบมาอย่างดีและแยกวิเคราะห์การตอบสนองของคำขอเหล่านี้เพื่อดูว่าชื่อผู้ใช้ที่ลงชื่อสมัครใช้แล้วหรือไม่กับผู้ให้บริการรายนี้
นี่คือฟังก์ชันที่เกี่ยวข้องจากไลบรารีโอเพนซอร์สที่ฉันเขียนเพื่อตรวจสอบ*@yahoo.com
ที่อยู่โดยใช้คำขอ HTTP: check-if-email-มีอยู่เช็คอินถ้า-อีเมลที่มีอยู่ฉันรู้ว่ารหัสของฉันคือ Rust และเธรดนี้ติดแท็ก PHP แต่ก็ใช้แนวคิดเดียวกันนี้
กรณีนี้อาจเป็นขอบ แต่เมื่อผู้ใช้มีกล่องจดหมายเต็มRCTP TO:
จะส่งกลับ5.1.1 DSN
ข้อความแสดงข้อผิดพลาดว่าเต็ม นั่นหมายความว่าบัญชีนั้นมีอยู่จริง!
ฉันเรียกใช้Reacherซึ่งเป็น API การยืนยันอีเมลแบบเรียลไทม์ รหัสของฉันเขียนด้วย Rust และเป็นโอเพนซอร์ส 100% ตรวจสอบว่าคุณต้องการโซลูชันที่มีประสิทธิภาพมากขึ้นหรือไม่:
Github: https://github.com/amaurymartiny/check-if-email-exists
ด้วยการผสมผสานเทคนิคต่างๆในการกระโดดข้ามห่วงฉันสามารถตรวจสอบอีเมลที่ลูกค้าตรวจสอบได้ประมาณ 80%
<?php
$email = "someone@exa mple.com";
if(!filter_var($email, FILTER_VALIDATE_EMAIL))
echo "E-mail is not valid";
else
echo "E-mail is valid";
?>