ควรใช้การตรวจสอบความถูกต้องของที่อยู่อีเมลไกลแค่ไหน


101

ฉันสงสัยว่าผู้คนควรตรวจสอบที่อยู่อีเมลได้ไกลแค่ไหน ฟิลด์ของฉันคือการพัฒนาเว็บเป็นหลัก แต่สิ่งนี้ใช้ได้กับทุกที่

ฉันเห็นบางแนวทางแล้ว:

  • เพียงตรวจสอบว่ามี "@" อยู่ซึ่งตายง่าย แต่แน่นอนว่าไม่น่าเชื่อถือ
  • การทดสอบ regex ที่ซับซ้อนมากขึ้นสำหรับรูปแบบอีเมลมาตรฐาน
  • regex เต็มรูปแบบกับRFC 2822 - มีปัญหากับเรื่องนี้ก็คือมักจะเป็นอีเมลอาจจะถูกต้อง แต่มันอาจจะไม่ได้เป็นสิ่งที่ผู้ใช้มีความหมาย
  • การตรวจสอบ DNS
  • การตรวจสอบ SMTP

ตามที่หลายคนอาจรู้ (แต่หลายคนไม่เข้าใจ) ที่อยู่อีเมลอาจมีการเปลี่ยนแปลงที่แปลกประหลาดมากมายที่คนส่วนใหญ่มักจะไม่พิจารณา (ดูRFC 2822 3.4.1 ) แต่คุณต้องคิดถึงเป้าหมายของ การตรวจสอบของคุณ: คุณเพียงแค่พยายามทำให้แน่ใจว่าข้อความอีเมลสามารถส่งไปยังที่อยู่หรือว่าเป็นสิ่งที่ผู้ใช้อาจจะใส่ (ซึ่งไม่น่าจะเป็นในกรณีที่คลุมเครือมากขึ้น) ที่อยู่ ')

ตัวเลือกที่ฉันพิจารณาคือเพียงแค่ให้คำเตือนด้วยที่อยู่ที่ลึกลับ แต่ก็ยังอนุญาตให้ดำเนินการตามคำขอได้ แต่สิ่งนี้จะเพิ่มความซับซ้อนให้กับฟอร์มและผู้ใช้ส่วนใหญ่มีแนวโน้มที่จะสับสน

ในขณะที่การตรวจสอบความถูกต้อง DNS / การตรวจสอบ SMTP ดูเหมือนไม่มีปัญหา แต่ฉันพบปัญหาที่เซิร์ฟเวอร์ DNS / เซิร์ฟเวอร์ SMTP หยุดทำงานชั่วคราวและผู้ใช้ไม่สามารถลงทะเบียนที่ไหนสักแห่งหรือเซิร์ฟเวอร์ SMTP ของผู้ใช้ไม่รองรับคุณสมบัติที่จำเป็น

นักพัฒนาที่มีประสบการณ์บางคนอาจจัดการกับสิ่งนี้ได้อย่างไร มีวิธีอื่นนอกเหนือจากวิธีที่ฉันได้ระบุไว้หรือไม่?

แก้ไข: ฉันลืมสิ่งที่ชัดเจนที่สุดโดยสิ้นเชิงแล้วส่งอีเมลยืนยัน! ขอบคุณผู้ตอบที่ชี้ให้เห็นว่า ใช่ตัวนี้ค่อนข้างจะเข้าใจผิดได้ แต่ก็ต้องมีความยุ่งยากเป็นพิเศษในส่วนของทุกคนที่เกี่ยวข้อง ผู้ใช้จะต้องดึงอีเมลบางส่วนและนักพัฒนาจำเป็นต้องจำข้อมูลผู้ใช้ก่อนที่พวกเขาจะได้รับการยืนยันว่าถูกต้อง


โดยส่วนตัวแล้วฉันจะใช้กลยุทธ์ Warn and Reject สองครั้งตามด้วยอีเมลเพื่อยืนยันความเป็นเจ้าของที่อยู่
James Snell

คำถามใหญ่คือการถามว่าคุณกำลังขอที่อยู่อะไร ตัวอย่างเช่นหากคุณกำลังจะส่งอีเมลการตรวจสอบไปยังผู้ใช้การตรวจสอบที่ง่ายมากควรจะพอเพียงเนื่องจากผู้ใช้มีแรงจูงใจที่จะให้ที่อยู่ที่ถูกต้อง
SDsolar

คำตอบ:


80

ไม่มีวิธีที่เชื่อถือได้ 100% ในการยืนยันที่อยู่อีเมลที่ถูกต้องนอกเหนือจากการส่งอีเมลไปยังผู้ใช้และรอการตอบสนองเช่นฟอรั่มส่วนใหญ่

ฉันจะใช้กฎการตรวจสอบความถูกต้อง "@" อย่างง่ายจากนั้นส่งอีเมลผู้ใช้เพื่อยืนยันที่อยู่อีเมลของพวกเขา

แม้ว่านี่เป็นความเห็นส่วนตัวของฉัน ... ฉันรอคำแนะนำอื่น ๆ


6
เห็นด้วยอย่างสิ้นเชิง. ไม่ว่าคุณจะสนใจที่อยู่นั้นจริงหรือไม่ ฉันไม่เห็นเหตุผลใด ๆ สำหรับการใส่ใจครึ่งหนึ่ง
Benjol

3
โดยคำตอบที่ดีที่สุด ตรวจสอบความถูกต้องของ @ จากนั้นยืนยันที่อยู่ (พร้อมอีเมล) - ความแตกต่างเล็กน้อยนั้น
billy.bob

... ซึ่งเป็นเหตุผลว่าทำไมฟอรัมส่วนใหญ่ทำ
Dan Ray

ฉันเห็นด้วยกับ @Billy Bob ว่าการตรวจสอบความถูกต้องที่ตามมาด้วยอีเมลยืนยันเป็นวิธีที่มีประสิทธิภาพที่สุดในการพิสูจน์ว่าอีเมลนั้นถูกต้อง
SDsolar

ที่อยู่อีเมล“ ที่ถูกต้อง” นั้นอาจจะผิดไปด้วยดังนั้นอีเมลยืนยันจึงเป็นวิธีเดียวที่จะตรวจสอบให้แน่ใจ ฉันได้รับไม่กี่คนในแต่ละปีเมื่อมีคนพิมพ์อีเมลของตัวเองผิดสำหรับฉัน
axl

57

หนึ่งข้อเสนอแนะ: อย่าปฏิเสธที่อยู่ด้วยเครื่องหมาย + ในที่อยู่ เป็นเรื่องธรรมดาที่จะปฏิเสธพวกเขา แต่เป็นอักขระที่ถูกต้องและผู้ใช้ gmail สามารถใช้ address+label@gmail.com เพื่อติดป้ายกำกับและเรียงลำดับจดหมายขาเข้าได้ง่ายขึ้น


8
+1 !!! ดูเหมือนเป็นไปไม่ได้ที่จะกรองอีเมลจาก Facebook ของทุกไซต์!
jnylen

สามารถกรองได้โดยไม่ต้องใช้ข้อมูลผู้ใช้
Casebash

1
GMail หยิบมันขึ้นมาจากเมลเซิร์ฟเวอร์อื่น ฉันเชื่อว่า qmail และ postfix เป็นที่นิยม

23
ในขณะที่ฉันเห็นด้วยกับความเชื่อมั่นนี้ไม่ได้เริ่มตอบคำถาม
ไบรอัน Oakley

29

ในโพสต์ของคุณดูเหมือนว่าเมื่อคุณพูดว่า "การตรวจสอบความถูกต้องของ SMTP" คุณหมายถึงการเชื่อมต่อกับเซิร์ฟเวอร์และลอง RCPT TO เพื่อดูว่าได้รับการยอมรับหรือไม่ เนื่องจากคุณแยกความแตกต่างจากการส่งอีเมลยืนยันจริงฉันคิดว่าคุณต้องการทำแบบเดียวกันกับการกระทำของผู้ใช้ นอกเหนือจากปัญหาเช่นปัญหาเครือข่าย, DNS ล้มเหลว, ฯลฯ รายการสีเทาสามารถทำลายความเสียหายด้วยวิธีนี้ วิธีการนั้นแตกต่างกันไป แต่โดยทั่วไปแล้วการระบุสีเทาจะเป็นตัวกำหนดความพยายามครั้งแรกที่จะส่งไปยังผู้รับต่อการเชื่อมต่อ IP ดังที่ฉันได้กล่าวไปแล้วสิ่งนี้อาจแตกต่างกันไปโฮสต์บางแห่งอาจปฏิเสธที่อยู่ที่ไม่ถูกต้องในครั้งแรกและเลื่อนที่อยู่ที่ถูกต้องเท่านั้น

วิธีเดียวที่คุณจะมั่นใจได้ว่าที่อยู่นั้นถูกต้องและถูกส่งมาโดยเจ้าของที่ต้องการให้มันใช้สำหรับแอปพลิเคชันของคุณคือส่งอีเมลยืนยัน ตราบใดที่ยังไม่ได้กรองสแปมฉันเดา =)


25

จุดอ่อนอีกประการหนึ่งของการใช้ regex สำหรับการตรวจสอบความถูกต้องของอีเมลคือเกือบจะเป็นไปไม่ได้เลยที่จะจับโดเมนระดับบนสุดที่ถูกต้องทั้งหมดในขณะที่ปฏิเสธโดเมนที่ไม่ถูกต้องทั้งหมด

ตัวอย่างเช่น regex อีเมลพื้นฐานในการตอบของ Jeff Atwood:

\ ข [A-Z0-9 ._% + -]. + @ [A-Z0-9 .-] + [AZ] {2,4} \ ข

จะยอมรับอักขระ TLD สองถึงสี่ตัว ตัวอย่างเช่น. สแปมจะได้รับการยอมรับ แต่. พิพิธภัณฑ์และ. trvel (ทั้ง TLD ที่ถูกต้อง) จะถูกปฏิเสธ

อีกเหตุผลหนึ่งที่ดีกว่าคือเพียงค้นหา @ และส่งอีเมลยืนยัน


24

ด้วยชื่อโดเมนระหว่างประเทศเกือบทุกอย่างเป็นไปได้:

  • Håkan.Söderström@malmö.se
  • punnycode@XN--0ZWM56D.XN--HGBK6AJ7F53BBA
  • 试 @ 例子. 测试.مثال.آزمایشی

หากคุณต้องการทำการทดสอบใด ๆ คุณควรแปลงเป็น Punycode ก่อน

หากไม่มี punycode สิ่งที่คุณควรทำคือทดสอบว่า:

  • อย่างน้อยหนึ่ง @
  • มีอักขระอย่างน้อยหนึ่งตัวในส่วนท้องถิ่น
  • มีจุดอย่างน้อยหนึ่งจุดในส่วนโดเมน
  • อย่างน้อยสี่ตัวอักษรในโดเมน (สมมติว่าไม่มีใครมีที่อยู่ที่ tld ว่า tld เป็นอย่างน้อย 2 ตัวอักษร)
function isEmail(address) {
    var pos = address.lastIndexOf("@");
    return pos > 0 && (address.lastIndexOf(".") > pos) && (address.length - pos > 4);
}

1
หากคุณต้องการใช้จาวาสคริปต์ในการแปลงเป็น Punycode คุณสามารถใช้รหัสในคำตอบต่อไปนี้: stackoverflow.com/questions/183485/…

จริงพอ - จากนั้นตรวจสอบให้แน่ใจว่าเครื่องหมาย @ อาจเป็นวิธีเดียวที่จะทำให้แน่ใจว่า "ดู" เหมือนที่อยู่อีเมล
SDsolar

19

คุณดีที่สุดเพียงตรวจสอบสิ่งที่ง่ายเช่น @ และ ใน JavaScript แล้วส่งการยืนยันไปยังอีเมลจริง หากพวกเขายืนยันบัญชีคุณมีที่อยู่อีเมลที่ถูกต้อง ด้วยวิธีนี้คุณจะทราบได้อย่างแน่นอนว่าคุณมีที่อยู่ที่ใช้งานได้และคุณไม่จำเป็นต้องมีความเชี่ยวชาญในแบบฟอร์ม


นี่เป็นทางออกที่ดี นี่คือ regexp ที่จะมองหา @ ตามด้วยจุด:/.+@.+\..+/
อีวานโมแรน

11

ใช้เครื่องมือตรวจสอบโอเพนซอร์สซึ่งไม่ได้ให้ผลเชิงลบที่ผิดพลาด ไม่มีความพยายามสำหรับคุณและการตรวจสอบที่มีประสิทธิภาพสำหรับแอปของคุณ

ตอนนี้ฉันได้รวบรวมกรณีทดสอบจาก Cal Henderson, Dave Child, Phil Haack, Doug Lovell และ RFC 3696 158 ที่อยู่การทดสอบทั้งหมด

ฉันใช้การทดสอบทั้งหมดกับผู้ตรวจสอบความถูกต้องที่ฉันพบ การเปรียบเทียบอยู่ที่นี่: http://www.dominicsayers.com/isemail

ฉันจะพยายามปรับปรุงหน้านี้ให้ทันสมัยอยู่เสมอเมื่อผู้คนปรับปรุงเครื่องมือตรวจสอบความถูกต้อง ขอขอบคุณที่แคลเดฟและฟิลเพื่อขอความช่วยเหลือและความร่วมมือของพวกเขาในการรวบรวมการทดสอบเหล่านี้และการวิจารณ์ที่สร้างสรรค์ของตรวจสอบของตัวเอง

ผู้คนควรตระหนักถึงความผิดพลาดต่อ RFC 3696 เป็นพิเศษ ตัวอย่างที่ยอมรับได้สามตัวอย่างนั้นเป็นที่อยู่ที่ไม่ถูกต้อง และความยาวสูงสุดของที่อยู่คือ 254 หรือ 256 ตัวอักษรไม่ใช่ 320


ลิงก์ไปยังการเปรียบเทียบไม่ทำงาน :(
Zero3

10

เมื่อพิจารณาจากคำตอบ (เนื่องจากฉันลืมอีเมลยืนยันไปอย่างสมบูรณ์) ดูเหมือนว่าฉันชอบการประนีประนอมที่เหมาะสมสำหรับโซลูชันที่มีแรงเสียดทานต่ำคือ:

  1. ใช้ regex เพื่อตรวจสอบว่าที่อยู่อีเมลมีลักษณะที่ถูกต้องและให้คำเตือนหากมีความชัดเจนมากขึ้น แต่หลีกเลี่ยงการปฏิเสธทันที
  2. ใช้การตรวจสอบความถูกต้องของ SMTP เพื่อให้แน่ใจว่าที่อยู่อีเมลนั้นถูกต้อง
  3. หากการตรวจสอบความถูกต้องของ SMTP ล้มเหลว - และเท่านั้น - ใช้อีเมลยืนยันเป็นทางเลือกสุดท้าย อีเมลยืนยันต้องการการโต้ตอบที่มากเกินไปนอกแอปพลิเคชันของคุณเพื่อให้พวกเขาได้รับการพิจารณาว่ามีความเสียดทานต่ำ แต่เป็นทางเลือกที่สมบูรณ์แบบ

1
คุณจะตรวจสอบได้อย่างไรว่าผู้ใช้เป็นเจ้าของที่อยู่อีเมลโดยไม่ต้องส่งการยืนยัน? ตัวอย่างเช่นสมมติว่าพวกเขาพิมพ์ที่อยู่อีเมลของคุณ คุณจะไม่รำคาญที่นักพัฒนาตัดสินใจที่จะไม่ให้อีเมลยืนยันและอนุญาตให้ใครก็ตามที่รู้ที่อยู่ของคุณลงทะเบียนคุณในเว็บไซต์ของพวกเขา
Rupert Madden-Abbott

1
การตรวจสอบ SMTP ถามเซิร์ฟเวอร์ว่ามีที่อยู่หรือไม่ จดหมายขยะได้ถูกกำจัดไปนานแล้ว

6

RegexBuddyเสนอนิพจน์ทั่วไปที่เกี่ยวข้องกับอีเมลต่อไปนี้จากไลบรารี:

ที่อยู่อีเมล (ขั้นพื้นฐาน)

\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b

ที่อยู่อีเมล (RFC 2822, ลดความซับซ้อน)

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

แต่ฉันมักจะเห็นด้วยกับคำตอบของปีเตอร์และซูเปอร์โจ "การทดสอบ" ของจริงเท่านั้นที่จริงแล้วกำลังส่งอีเมลตรวจสอบความถูกต้อง


1
bob@mydivision.mycompany.comเช็คอีเมลขั้นพื้นฐานของคุณล้มเหลวกับสิ่งที่ชอบ คุณควรระบุว่าจำเป็นต้องใช้การจับคู่แบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่เนื่องจากคุณใช้ตัวพิมพ์ใหญ่ ASCII เท่านั้น
unpythonic

ทำไมปฏิเสธตัวอักษรตัวพิมพ์ใหญ่ (ด้วย regex ตัวที่สอง) ไม่ควรตรวจสอบความถูกต้องของส่วนภายในถึง MTA ที่ได้รับ ด้วยข้อยกเว้นของ white space และเครื่องหมายคำพูด
Dirk Jäckel

@dirk ตามที่ระบุไว้ในเครื่องหมายคุณจะต้องใช้การตั้งค่าสถานะ "ไม่ต้องตรงตามตัวพิมพ์ใหญ่ - เล็ก" กับ regex นี้เมื่อเรียกใช้
Jeff Atwood

พื้นฐานไม่ดีเพราะมี TLD> 4 ตัวอักษรหลายตัว ฉันจะทำให้มันขั้นต่ำ 2 ไม่สูงสุด{2,}
EkriirkE

4

ฉันทำงานที่ 4 บริษัท ที่แตกต่างกันซึ่งมีคนที่แผนกช่วยเหลือตะโกนใส่ใครบางคนชื่อ O'Malley หรือ O'Brien หรือที่อยู่อีเมลอื่นที่มีเครื่องหมายอะโพสโทรฟี ตามที่แนะนำไว้ก่อนหน้านี้ไม่ทุก regex จะจับทุกอย่าง แต่ช่วยตัวเองไม่ยุ่งยากและยอมรับเครื่องหมายอัญประกาศเดี่ยวโดยไม่สร้างคำเตือน

-
bmb


สาธุกับสิ่งนั้น เช่นเดียวกับสัญญาณแฮช (#) โดยวิธี
Tomalak

2
เพียงเพราะชื่อของคนไม่มีเครื่องหมายแฮชไม่ได้หมายความว่าพวกเขาไม่ถูกต้องในที่อยู่อีเมล
Dave Sherohman

3

คุณสามารถทำการตรวจสอบความถูกต้องทางอีเมลได้อีกเพื่อทดสอบว่ามีกล่องจดหมายหรือไม่ เทคนิคนี้มีข้อเสีย (เวลาในการพัฒนาและความเป็นไปได้ในการขึ้นบัญชีดำสำหรับการใช้ผิดประเภท) http://www.webdigi.co.uk/blog/2009/how-to-check-if-an-email-address-exists-without-sending-an-email/


3

หากคุณต้องการตรวจสอบอีเมล (เช่นให้แน่ใจว่าผู้ใช้เป็นเจ้าของที่อยู่อีเมล) อีเมลยืนยันเป็นสิ่งเดียวที่คุณทำได้ จากนั้นอีกหลายคนมีที่อยู่สแปมโดยเฉพาะหรือใช้บริการเช่นOneWayMailและหากพวกเขาไม่ต้องการให้ที่อยู่อีเมลที่แท้จริงของพวกเขาพวกเขาจะไม่ โดยพื้นฐานแล้วคุณกำลังสร้างสิ่งกีดขวางผู้ใช้

เมื่อมันมาถึงการตรวจสอบเพื่อให้แน่ใจว่าผู้ใช้ไม่ได้ป้อนที่อยู่อีเมลผิดโดยไม่ได้ตั้งใจมันเป็นแรงจูงใจที่ถูกต้องอย่างแน่นอน อย่างไรก็ตามอย่างน้อยสำหรับรูปแบบ HTML (ซึ่งเป็นวิธีที่พบได้บ่อยที่สุดในการรวบรวมที่อยู่อีเมล) มันเป็นเครื่องมือที่เหมาะสม

สำหรับหนึ่งคุณจะไม่สามารถรับรู้การพิมพ์ผิดใน "คำ" ที่แท้จริงของที่อยู่อีเมล คุณไม่มีทางทราบว่าback2dso@example.comผิดโดยอิงตามรูปแบบเท่านั้น
แต่ที่สำคัญกว่านั้นจากมุมมองของผู้ใช้มีที่อยู่อีเมลเพียงหนึ่ง (หรือเต็มมือ) ที่คุณอาจต้องการป้อน และคุณอาจจะป้อนแล้ว
ดังนั้นแทนที่จะพยายามตรวจสอบที่อยู่คุณควรมุ่งเน้นไปที่การทำให้แน่ใจว่าเบราว์เซอร์ทั้งหมดรู้จักฟิลด์อีเมลและไม่จำเป็นต้องพิมพ์ที่อยู่อีเมลตั้งแต่แรก แน่นอนว่าสิ่งนี้จะไม่ถูกนำมาใช้หากคุณกำลังสร้างเว็บไซต์ที่น่าจะโดนผู้ใช้ที่ไม่เคยใส่ที่อยู่อีเมลของพวกเขาในเบราว์เซอร์มาก่อน แต่ฉันคิดว่าอย่างน้อยพวกเราก็อยู่ในตำแหน่งเช่นนี้


2

ฉันคิดว่ามันขึ้นอยู่กับบริบทที่คุณใช้อีเมล โครงการที่ร้ายแรงกว่านั้นต้องมีการตรวจสอบที่เข้มงวด แต่ฉันคิดว่าสิ่งที่ส่งอีเมลไปยังที่อยู่ที่ระบุพร้อมลิงก์โครงสร้างจะทำให้แน่ใจว่าที่อยู่อีเมลนั้นถูกต้อง


2

@ Mike - ฉันคิดว่าเหตุผลส่วนหนึ่งที่ทำให้มีการส่งอีเมลยืนยันไม่เพียงเพื่อให้แน่ใจว่าที่อยู่อีเมลนั้นถูกต้อง แต่มันสามารถเข้าถึงได้โดยผู้ใช้ที่ส่งไป บุคคลหนึ่งสามารถพิมพ์ตัวอักษรหนึ่งตัวในที่อยู่อีเมลได้อย่างง่ายดายซึ่งจะนำไปสู่ที่อยู่อีเมลอื่นที่ถูกต้อง แต่ก็ยังคงเป็นข้อผิดพลาดเนื่องจากเป็นที่อยู่ผิด


2

regex ที่สมบูรณ์ที่สุดและถูกต้องผมเคยพบสำหรับการตรวจสอบอีเมลเป็นหนึ่งในเอกสารที่นี่ มันไม่ได้มีไว้สำหรับลมแห่งใจ มันซับซ้อนพอที่แบ่งออกเป็นส่วน ๆ เพื่อให้มนุษย์แยกวิเคราะห์ได้ง่ายขึ้น (โค้ดตัวอย่างอยู่ใน Java) แต่ในกรณีที่มีการตรวจสอบความถูกต้องฉันไม่คิดว่ามันจะดีขึ้นมาก

ไม่ว่าในกรณีใดผมขอแนะนำให้คุณใช้การทดสอบหน่วยเพื่อยืนยันว่านิพจน์ของคุณครอบคลุมกรณีที่คุณรู้สึกว่ามีความสำคัญ ด้วยวิธีนี้ในขณะที่คุณคิดไปรอบ ๆ คุณสามารถมั่นใจได้ว่าคุณไม่ได้หักบางกรณีที่เคยทำมาก่อน


2

อะไรก็ตามที่คุณเลือกฉันคิดว่าคุณต้องทำผิดพลาดโดยเชื่อว่า 99% ของเวลาผู้ใช้ไม่ทราบว่าที่อยู่อีเมลของพวกเขาคืออะไร ในฐานะที่เป็นคนจากออสเตรเลียฉันยังคงพบว่ามีการตรวจสอบอีเมลที่ชาญฉลาดที่บอกฉันว่าฉันไม่สามารถมีโดเมน. com.au ได้ มันเคยเกิดขึ้นมากขึ้นในวันแรก ๆ ของอินเทอร์เน็ตใจคุณ

การส่งอีเมลยืนยันวันนี้เป็นที่ยอมรับของผู้ใช้และยังมีประโยชน์ในแง่ของการเลือกใช้รวมทั้งการยืนยันที่อยู่ที่ให้มาด้วย


2

ในบางเว็บไซต์ที่พัฒนาขึ้นในสถานที่ที่ฉันเคยทำงานเรามักจะใช้อีเมลยืนยัน อย่างไรก็ตามเป็นเรื่องธรรมดาที่ผู้ใช้จะต้องพิมพ์ที่อยู่อีเมลของพวกเขาในรูปแบบที่ไม่สามารถใช้งานได้และจากนั้นรออีเมลยืนยันที่ไม่มา การเพิ่มโค้ด ad-hoc (หรือสำหรับส่วนของชื่อโดเมนการตรวจสอบ DNS) เพื่อเตือนผู้ใช้ในกรณีเหล่านี้อาจเป็นความคิดที่ดี

กรณีทั่วไปที่ฉันได้เห็น:

  • วางตัวอักษรที่อยู่ตรงกลางของชื่อโดเมนหรือตัวแปรที่พิมพ์ผิดง่ายอื่น ๆ
  • ความสับสน TLD (เช่นเพิ่ม.brไปยัง.comโดเมนหรือทิ้ง.brจาก.com.brโดเมน)
  • เพิ่มwww.ที่จุดเริ่มต้นของการมีส่วนร่วมของท้องถิ่นที่อยู่อีเมล (ผมไม่ได้ทำให้เรื่องนี้ขึ้นผมเห็นหลายที่อยู่อีเมลของรูปแบบwww.username@example.com)

มีกรณีที่แปลกประหลาดมากยิ่งขึ้น; สิ่งที่ต้องการชื่อโดเมนที่สมบูรณ์เป็นส่วนท้องถิ่นที่อยู่กับสอง@(คล้ายusername@domain.tld@example.com) และอื่น ๆ

แน่นอนว่าพวกเขาส่วนใหญ่ยังคงเป็นที่อยู่ RFC-822 ที่ถูกต้องดังนั้นในทางเทคนิคคุณสามารถปล่อยให้ MTA จัดการกับพวกเขาได้ อย่างไรก็ตามเตือนผู้ใช้ว่าที่อยู่อีเมลที่ป้อนอาจเป็นของปลอมได้โดยเฉพาะอย่างยิ่งหากกลุ่มเป้าหมายของคุณไม่ได้ใช้คอมพิวเตอร์มาก


ดูเหมือนว่าปัญหาของไซต์เหล่านั้นคือผู้ใช้ถูกบังคับให้ป้อนข้อมูลที่ไม่เข้าใจจริงๆ ไม่ใช่ทุกเว็บไซต์ที่ต้องมีการติดต่อทางอีเมลกับผู้ใช้แม้ว่ามันจะทำให้สิ่งต่าง ๆ ง่ายขึ้นสำหรับเว็บไซต์
bzlm

2

การตรวจสอบ regex ทั้งหมดในโลกจะไม่ป้องกันไม่ให้ใครบางคนป้อนที่อยู่อีเมลที่ไม่ถูกต้องหรือปลอม มันน่ารำคาญจริงๆ


คุณเคยลองใช้เครื่องมือตรวจสอบอีเมล DeBounce หรือไม่? ฉันขอแนะนำให้ดูที่บริการนี้
Iman Hejazi

2

ขึ้นอยู่กับเป้าหมาย หากคุณเป็น ISP และคุณต้องตรวจสอบว่าผู้ใช้กำลังสร้างที่อยู่อีเมลที่ถูกต้องไปที่ Regex ที่ตรวจสอบกับทุกสิ่งที่เป็นไปได้ หากคุณต้องการตรวจจับข้อผิดพลาดของผู้ใช้วิธีการเกี่ยวกับรูปแบบต่อไปนี้:

[ตัวละครทั้งหมดไม่มีช่องว่าง] @ [ตัวอักษรและตัวเลข] (. [ตัวอักษรและตัวเลข]) ที่กลุ่มสุดท้ายปรากฏขึ้นอย่างน้อยหนึ่งครั้ง

RegEx สำหรับสิ่งนี้จะปรากฏดังนี้:

[\S]+@[\w]+(.[\w-]+)+

จากนั้นส่งอีเมลยืนยันเพื่อความแน่ใจ


2
มีการพิมพ์ผิด (นอกเสียจากว่าคุณต้องการอนุญาตให้ "w" เป็น TLD เท่านั้น) และจะไม่ตรงกับโดเมนที่มีเครื่องหมายยัติภังค์ (-) สิ่งนี้ทำงานได้ดีกว่า: [\ S] + @ [\ w -] + (. [\ w -] +) +

1

@ Yaakov (สามารถตอบได้ด้วย 'ตอบกลับ' ที่นี่)

ฉันคิดว่าเหตุผลส่วนหนึ่งที่ทำให้มีการส่งอีเมลยืนยันไม่เพียงเพื่อให้แน่ใจว่าที่อยู่อีเมลนั้นถูกต้อง แต่ผู้ใช้ที่ส่งนั้นสามารถเข้าถึงได้ บุคคลหนึ่งสามารถพิมพ์ตัวอักษรหนึ่งตัวในที่อยู่อีเมลได้อย่างง่ายดายซึ่งจะนำไปสู่ที่อยู่อีเมลอื่นที่ถูกต้อง แต่ก็ยังคงเป็นข้อผิดพลาดเนื่องจากเป็นที่อยู่ผิด

ฉันเห็นด้วย แต่ฉันไม่แน่ใจว่ามันคุ้มค่า นอกจากนี้เรายังมีช่องยืนยันเพื่อจุดประสงค์นั้น (ทำซ้ำที่อยู่อีเมลของคุณอีกครั้ง) สถานการณ์อื่นที่ประเภทของไซต์อาจรับประกันวิธีการที่แตกต่างกัน

นอกจากนี้การส่งอีเมลยืนยันยังไม่สามารถบ่งบอกถึงผู้ใช้เดิมว่าที่อยู่ที่พวกเขาป้อนนั้นผิด หลังจากไม่ได้รับอีเมลยืนยันพวกเขาอาจคิดว่าแอป / ไซต์ของคุณมีข้อบกพร่อง อย่างน้อยที่สุดโดยอนุญาตให้ผู้ใช้เริ่มใช้งานบัญชีของพวกเขาในทันทีพวกเขาสามารถแก้ไขที่อยู่อีเมลของพวกเขาโดยเฉพาะอย่างยิ่งถ้ามันปรากฏในที่ที่เหมาะสม


1

ม้าสำหรับหลักสูตร

ทั้งหมดนี้เป็นระบบตรวจสอบอีเมลที่สมบูรณ์และด้วยตนเองและสำหรับเว็บไซต์ที่ระบุจะมีความเหมาะสมมากกว่า ในหลายกรณีการยืนยันหลายขั้นตอนอาจมีประโยชน์

หากคุณกำลังพัฒนาเว็บไซต์สำหรับธนาคารคุณจะต้องมีหอยทากอีเมลหรือการยืนยันทางโทรศัพท์เหนือสิ่งอื่นใด

หากคุณกำลังพัฒนาเว็บไซต์สำหรับการแข่งขันคุณอาจไม่ต้องการใครเลย - ยืนยันอีเมลในการประมวลผลโพสต์และหากล้มเหลวมันเลวร้ายเกินไปสำหรับคนที่เข้าร่วม - คุณอาจให้ความสำคัญกับประสิทธิภาพของเซิร์ฟเวอร์เนื่องจากมีคนจำนวนมาก ( ตัวอย่างเช่นการประกวดทางทีวี) ทำให้แน่ใจได้ว่าทุกคนได้รับการตรวจสอบความถูกต้องแบบอินไลน์

ไกลแค่ไหนที่ควรใช้การตรวจสอบอีเมล?

เท่าที่จำเป็นและรับประกัน

และไม่มีอะไรเพิ่มเติม (จูบ)


1

ฉันเคยเห็นไซต์ที่ป้องกันผู้คนที่ใช้ไซต์ฝากข้อมูลขยะชั่วคราวเช่นMailinatorหรือMyTrashMailซึ่งได้รับอีเมลยืนยัน ฉันไม่ได้บอกว่าคุณควรจะกรองพวกนี้ออกไปฉันแค่พูด


"รับรอบ" การยืนยันอีเมลในทางใด ทั้ง Mailinator และ MyTrashMail จะยอมรับเมลที่ตามมาไปยังที่อยู่เดียวกัน หากผู้ใช้ไม่ใส่ใจที่จะตรวจสอบพวกเขานั่นเป็นอีกเรื่องหนึ่ง
bzlm

1

คุณพยายามตรวจสอบอีเมลของคุณอย่างไร

การตรวจสอบที่อยู่อีเมล Regex สามารถตรวจสอบได้ว่าที่อยู่นั้นถูกต้องตามหลักไวยากรณ์และมีความน่าเชื่อถือ นอกจากนี้ยังมีอันตราย (ตามที่ได้กล่าวไปแล้วหลายครั้ง) ที่อาจปฏิเสธที่อยู่ที่ส่งมอบจริงหาก regex ไม่ถูกต้อง

การตรวจสอบ SMTP สามารถระบุได้ว่าที่อยู่นั้นสามารถส่งมอบได้ทั้งนี้ขึ้นอยู่กับข้อ จำกัด ที่กำหนดโดย greylisting หรือเซิร์ฟเวอร์ที่กำหนดค่าเพื่อให้ข้อมูลน้อยที่สุดเท่าที่จะเป็นไปได้เกี่ยวกับผู้ใช้ คุณไม่มีทางรู้ได้เลยว่า MTA อ้างว่ารับอีเมลสำหรับที่อยู่ปลอมจากนั้นเพียงแค่ทิ้งอีเมลไว้บนพื้นซึ่งเป็นส่วนหนึ่งของกลยุทธ์ต่อต้านสแปม

อย่างไรก็ตามการส่งข้อความยืนยันเป็นวิธีเดียวที่จะตรวจสอบว่าที่อยู่เป็นของผู้ใช้ที่ป้อน president@whitehouse.govถ้าฉันกรอกแบบฟอร์มของคุณผมค่อนข้างง่ายสามารถบอกคุณได้ว่าที่อยู่อีเมลของฉันคือ regex จะบอกคุณว่าถูกต้องทาง syntactically, SMTP RCPT ที่จะบอกคุณว่ามันเป็นที่อยู่ที่ส่งมอบ แต่มันแน่ใจว่าเป็นนรกที่อยู่ของฉันไม่ได้อยู่


1

ด้วยการเพิ่มขึ้นของ HTML5 อย่างน้อยหนึ่งวิธีการใหม่จะถูกเพิ่มเข้าไปในความเป็นไปได้: การใช้อินพุตของ ' อีเมล ' ประเภทที่ช่วยให้การตรวจสอบในฝั่งไคลเอ็นต์ Firefox รุ่นปัจจุบัน, Chrome, Safari และ Opera รองรับสิ่งนี้ (และเบราว์เซอร์อื่น ๆ ที่ใช้งานเหมือนกับ type = text ดังนั้นจึงสามารถใช้งานได้โดยไม่มีปัญหาดังนั้นคุณจึงไม่มีการตรวจสอบความถูกต้อง)

ไม่สามารถ (ตามที่ระบุไว้สองสามครั้ง) รับประกันที่อยู่ที่ใช้การได้ แต่อาจเป็นประโยชน์มาก (และในที่สุดก็แทนที่การตรวจสอบฝั่งเซิร์ฟเวอร์) ในสถานที่ที่คุณเพียงแค่ต้องจับข้อผิดพลาดของผู้ใช้


การดำเนินการของ Firefox สำหรับ<input type="email">HtmlElement: dxr.mozilla.org/mozilla-central/source/dom/html/...
tiffon

0

การตรวจสอบอีเมลหลักสามระดับ:

1) การตรวจสอบการแสดงออกปกติสำหรับที่อยู่อีเมลในรูปแบบที่เหมาะสม email@email.com

2) ตรวจสอบโดเมนอีเมลกับระเบียน MX เพื่อดูว่าชื่อโดเมนมีบริการอีเมลหรือไม่

3) ส่งอีเมลยืนยันพร้อมลิงก์หรือรหัสยืนยัน

ระดับ 1:

ใน Visual Studio คุณสามารถใช้ "ตัวตรวจสอบนิพจน์ปกติ" และในคุณสมบัติ "Validation Expression" คุณสามารถคลิกที่ปุ่ม "... " ที่มีตัวช่วยสร้างเพื่อเพิ่มในรูปแบบนิพจน์ปกติสำหรับที่อยู่อีเมล

ระดับ 2:

นี่คือรหัส C # ของฉันด้านล่างเพื่อใช้ nslookup เพื่อตรวจสอบว่าโดเมนอีเมลมีระเบียน MX ที่ถูกต้องหรือไม่ ทำงานได้อย่างรวดเร็วและตกลงบน Win 2008 R2 และ Win 7

using System.Net.Mail;
using System.Diagnostics;

public static bool checkMXRecords(string email) 
    {
        MailAddress addr = new MailAddress(email);
        string domain = addr.Host;

        string command = "nslookup -querytype=mx " + domain;
        ProcessStartInfo procStartInfo = new ProcessStartInfo("cmd", "/c " + command);

        procStartInfo.RedirectStandardOutput = true;
        procStartInfo.UseShellExecute = false;

        procStartInfo.CreateNoWindow = true;

        Process proc = new Process();
        proc.StartInfo = procStartInfo;
        proc.Start();
        string result = proc.StandardOutput.ReadToEnd();

        if (result.ToLower().Contains("mail exchanger"))
        {
            return true;
        }
        else return false;

     } // checkMXRecords

อีกตัวเลือกหนึ่งคือใช้แพ็คเกจ Arsofttools nuget แต่อาจช้าใน Windows Server 2008 R2 เนื่องจากฉันเคยมีประสบการณ์ แต่ทำงานได้อย่างรวดเร็วใน Win 7

ระดับ 3:

สำหรับการยืนยันทางอีเมลคุณสามารถสร้าง URL ฐานสิบหกเฉพาะอีเมล (โดยใช้ฟังก์ชั่นการเข้ารหัส) ฯลฯhttp://domain.com/validateEmail?code=abcd1234เพื่อตรวจสอบความถูกต้องของที่อยู่อีเมลเมื่อผู้ใช้คลิกที่มัน ไม่จำเป็นต้องเก็บ URL นี้ไว้ในหน่วยความจำ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.