Як далеко потрібно пройти перевірку електронної адреси?


101

Мені цікаво, як далеко люди повинні зайняти перевірку електронної адреси. Моя сфера - це насамперед веб-розробка, але це стосується будь-де.

Я бачив кілька підходів:

  • просто перевірити, чи є подарунок "@", який мертвий простий, але, звичайно, не такий надійний.
  • більш складний тест на регулярний вимір для стандартних форматів електронної пошти
  • повне регулярний вираз проти RFC 2822 - проблема з цим полягає в тому , що часто електронної пошти може бути дійсним , але це, ймовірно , не те , що мав в виду користувач
  • Перевірка DNS
  • Перевірка SMTP

Як багато хто може знати (але багато хто з них не знає), адреси електронної пошти можуть мати дуже багато дивних варіантів, які більшість людей зазвичай не вважають (див. RFC 2822 3.4.1 ), але ви повинні думати про цілі ваша перевірка: чи просто ви намагаєтеся переконатися, що повідомлення електронної пошти може бути надіслано на адресу, чи це те, що користувач, ймовірно, мав намір ввести (що навряд чи в багатьох більш незрозумілих випадках інакше "дійсне" 'адреси).

Я розглядав варіант - просто подати попередження з більш езотеричною адресою, але все-таки дозволяти проханню пройти, але це додасть форми більше складності, і більшість користувачів, ймовірно, будуть заплутані.

Незважаючи на те, що перевірка DNS / перевірка SMTP здається нереалістичною, я передбачаю проблеми, коли DNS-сервер / SMTP-сервер тимчасово не працює, а користувач не може десь зареєструватися, або SMTP-сервер користувача не підтримує необхідні функції.

Як деякі досвідчені розробники тут можуть впоратися з цим? Чи є інші підходи, ніж ті, які я перерахував?

Редагувати: Я повністю забув найочевидніше з усіх, надсилаючи підтвердження електронною поштою! Дякуємо відповідачам за те, що вказали на це. Так, цей досить дурний, але для всіх, хто бере участь, потрібні додаткові клопоти. Користувачеві потрібно отримати електронну пошту, і розробник повинен запам'ятати дані користувачів, перш ніж вони навіть будуть підтверджені як дійсні.


Особисто я б пішов із стратегією подвійного повторного попередження та попередження, а потім електронним листом, щоб підтвердити право власності на адресу
Джеймс Снелл

Велике питання - запитати, з якою метою ви звертаєтесь за адресою. Наприклад, якщо ви збираєтеся надіслати користувачеві електронну пошту для перевірки, то достатньо простої перевірки, оскільки, імовірно, користувача мотивують дати дійсну адресу.
SDsolar

Відповіді:


80

Немає стовідсоткового надійного способу підтвердження дійсної адреси електронної пошти, окрім того, як надіслати електронний лист користувачеві та чекати відповіді, як на більшості форумів.

Я б перейшов з простим правилом перевірки "@", а потім надішле електронному листу користувачеві підтвердження своєї електронної адреси.

Хоча, це моя особиста думка ... Я чекаю інших пропозицій.


6
Повністю згоден. Або ти справді небайдужий до цієї адреси, або тебе немає. Я не бачу жодного обґрунтування для напівбожого.
Бенжол

3
На сьогодні найкраща відповідь. Перевірте @, а потім підтвердіть адресу (електронною поштою) - тонка різниця там.
billy.bob

... ось чому саме це робить більшість форумів.
Ден Рей

Я погоджуюся з @Billy Bob, що просте підтвердження, яке супроводжується підтвердженням електронного листа, є найефективнішим способом довести електронну адресу.
SDsolar

"Дійсна" адреса електронної пошти також може перейти до іншої особи, тому електронний лист дійсно є єдиним способом бути впевненим Я отримую декілька таких щороку, коли хтось вводить власну адресу електронної пошти для моєї.
axl

57

Одна пропозиція: не відхиляйте адреси з позначкою +. Прикро їх звичайно відхиляти, але це дійсний символ, і користувачі gmail можуть використовувати адресу+label@gmail.com для позначення та сортування вхідної пошти простіше.


8
+1 !!! Здається, неможливо фільтрувати електронні листи з усіх сайтів у Facebook!
jnylen

Можна фільтрувати без цього - просто користувач інформація про відправника
Casebash

1
GMail взяв його з інших поштових серверів. Я вважаю, що qmail та postfix популяризували його.

23
Хоча я згоден з настроями, це навіть не починає відповідати на запитання.
Брайан Оуклі

29

У твоєму дописі здається, що, коли ти кажеш "Перевірка SMTP", ти маєш на увазі підключення до сервера та намагання RCPT TO, щоб перевірити, чи прийнято це. Оскільки ви відрізняєте його від фактичного надсилання підтвердження електронною поштою, я вважаю, що ви хочете зробити це в порядку дій користувача. На додаток до таких проблем, як проблеми з мережею, збої в DNS тощо, сірий список може спричинити загрозу цим методом. Різний, але по суті сірий перелік методу завжди відрізняє першу спробу доставки одержувачу за підключення IP. Як я вже говорив, це може відрізнятись, деякі хости можуть відхилити недійсні адреси з першої спроби і лише відкласти дійсні адреси, але немає надійного способу програмно розібрати різні реалізації.

Єдиний спосіб, коли ви будете впевнені, що адреса є дійсною та подається її власником, який дійсно хоче, щоб її використовували для вашої заявки, - це надіслати електронний лист для підтвердження. Ну, доки він не фільтрується спамом, я думаю =).


25

Ще однією слабкістю використання регулярного виразу для перевірки електронної пошти є те, що майже неможливо зловити всі дійсні домени верхнього рівня , відкинувши всі недійсні.

Наприклад, основний регрес електронної пошти у відповіді Джеффа Етвуда:

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

прийме будь-який TLD з двох до чотирьох символів. Так, наприклад, .spam буде прийнятий, але .museum і .travel (обидва дійсні TLD) будуть відхилені.

Ще одна причина - краще просто шукати @ і надсилати підтвердження електронною поштою.


24

З міжнародними доменними іменами практично все можливо:

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

Якщо ви хочете зробити будь-які тести, спершу слід перетворити його на пунктод.

Без пунктоду все, що вам потрібно зробити, - це перевірити, що там:

  • принаймні один @
  • є хоча б одним символом у місцевій частині
  • - принаймні одна крапка в доменній частині
  • містить принаймні чотири символи в домені (якщо припустити, що ніхто не має адреси в tld, що tld принаймні 2 знаки)
function isEmail(address) {
    var pos = address.lastIndexOf("@");
    return pos > 0 && (address.lastIndexOf(".") > pos) && (address.length - pos > 4);
}

1
Якщо ви хочете використовувати javascript для перетворення в punycode, ви можете використовувати код у такій відповіді: stackoverflow.com/questions/183485/…

Правда - тоді забезпечення знаку @ може бути єдиним способом переконатися, що він виглядає як електронна адреса.
SDsolar

19

Вам найкраще просто перевірити прості речі, такі як @ і. в JavaScript, а потім надіслати їм підтвердження на свій електронний лист. Якщо вони підтвердять свій рахунок, у вас є дійсна електронна адреса. Таким чином ви точно знаєте, що у вас є робоча адреса, і вам не потрібно бути занадто нахабною у формі.


Це чудове рішення. Ось повторний пошук, який слід шукати @, а за ним крапка:/.+@.+\..+/
Еван Моран,

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. Використовуйте регулярне вираження, щоб перевірити, чи адреса електронної пошти виглядає дійсною, і подайте попередження, якщо вона є більш неясною, але уникайте прямої відхилення.
  2. Використовуйте перевірку SMTP, щоб переконатися, що адреса електронної пошти є дійсною.
  3. Якщо перевірка SMTP не вдається , то - і тільки тоді - використовувати підтвердження по електронній пошті в якості останнього засобу. Електронні листи для підтвердження вимагають занадто великої взаємодії поза вашою програмою, щоб вони вважалися низькими тертями, але вони є ідеальним резервом.

1
Як можна перевірити, що користувач має власну адресу електронної пошти, не надсилаючи підтвердження? Наприклад, скажімо, що вони ввели вашу адресу електронної пошти. Чи не будете роздратовані тим, що розробник вирішив не надавати підтвердження електронною поштою, а тому дозволив усім, хто знає вашу адресу, зареєструвати вас на своєму сайті?
Руперт Мадден-Абботт

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.
непітонічний

Навіщо відхиляти великі літери (з другим регулярним виразом)? Чи не має бути валідація локальної частини до MTA, що приймає? За винятком пробілів та лапок.
Дірк Яцкель

@dirk, як відмічено, ви застосували прапорець "нечутливий до регістру" до цього регулярного виразу під час його запуску.
Джефф Етвуд

Основна не є хорошою, оскільки є кілька знаків TLD> 4. Я просто зробив би це хв 2, не максимум{2,}
EkriirkE

4

Я працював у чотирьох різних компаніях, де хтось за службою довідки кричав хтось на ім’я О'Маллі, О'Брайен чи інша адреса електронної пошти з апострофом. Як було запропоновано раніше, не всі генетичні засоби зловживають всім, але збережіть собі клопоту і прийміть апостроф, не створюючи попередження.

-
bmb


Амін тому. Те саме стосується і хеш-знаку (#).
Томалак

2
Тільки тому, що імена людей не містять хеш-позначок, не означає, що вони не дійсні в електронних адресах.
Дейв Шерохман

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

@ Майк - Я вважаю, що частина причини, по якій надсилаються повідомлення про підтвердження, полягає не тільки в тому, щоб електронна адреса була дійсною, але і щоб вона була доступною користувачеві, який її подав. Людина могла легко вписати помилкову помилку на одну літеру в електронній адресі, що призведе до іншої, дійсної адреси електронної пошти, але це все одно буде помилкою, оскільки це буде неправильна адреса.


2

Найповніший і точний регулярний вираз, з яким я коли-небудь стикався під час перевірки електронної пошти, - це документ, зафіксований тут . Це не для слабкого серця; це досить складно, що його розбивають на частини, щоб людям було простіше розібратися (зразок коду знаходиться на Java). Але у випадках, коли заслуговує ця перевірка, я не думаю, що це стає набагато кращим.

У будь-якому випадку, я б запропонував використовувати тестування для підтвердження того, що ваше вираження охоплює випадки, які ви вважаєте важливими. Таким чином, коли ви обміряєтесь із цим, ви можете бути впевнені, що ви не порушили якусь справу, яка працювала раніше.


2

Що б ви не вибрали, я думаю , що вам треба плекати ілюзій на стороні , вважаючи , що 99% часу, користувач робить на насправді знає , що їх адресу електронної пошти. Як хтось із Австралії, я все ще дуже часто знаходжу надзвичайно розумну перевірку електронної пошти, яка говорить про те, що я не можу мати домен .com.au. Раніше це траплялося набагато більше в перші дні Інтернету.

Надсилання підтвердження електронною поштою в ці дні є прийнятним для користувачів, а також корисно з точки зору відмови, а також перевірки наданої адреси.


2

На деяких сайтах, розроблених у місцях, де я працював, ми завжди використовували електронні листи підтвердження. Однак на диво часто користувачі вводили неправильну адресу своєї електронної адреси таким чином, який не міг би працювати, а потім продовжували чекати електронного листа з підтвердженням, який не надійде. Додавання спеціального коду (або, для частини доменного імені, перевірка DNS) для попередження користувача у цих випадках може бути хорошою ідеєю.

Поширені мені випадки:

  • Видалення літери на середину доменного імені або декілька інших простих варіантів друку.
  • Плутанина TLD (наприклад, додавання .brдо .comдомену або випадання .brз .com.brдомену).
  • Додавання www.на початку локальної частини адреси електронної пошти (я це не складаю; я побачив кілька електронних адрес форми www.username@example.com).

Були ще більш химерні випадки; такі речі, як повне доменне ім'я як локальна частина, адреси з двома @(щось на зразок username@domain.tld@example.com) тощо.

Звичайно, більшість з них все-таки були дійсними адресами RFC-822, тому технічно ви могли просто дозволити MTA мати справу з ними. Однак попередження користувача про те, що введена електронна адреса є цілком неправдивою, може бути корисним, особливо якщо ваша цільова аудиторія не дуже грамотна на комп’ютері.


Начебто проблема цих сайтів полягала в тому, що користувачі змушені були вводити інформацію, яку вони насправді не розуміли. Не всі сайти потребують контакту електронною поштою зі своїми користувачами, навіть якщо це полегшить роботу сайту.
bzlm

2

Усі перевірки регулярних виразів у світі не завадять комусь ввести неправильну або підроблену електронну адресу. Це дійсно просто дратує.


Ви коли-небудь пробували інструмент перевірки електронної пошти DeBounce ? Я пропоную переглянути цю послугу.
Іман Хеджазі

2

Залежить від мети. Якщо ви Інтернет-провайдер і вам потрібно перевірити, що користувачі створюють дійсні адреси електронної пошти, перейдіть до Regex, який підтверджує все можливе. Якщо ви просто хочете виявити помилки користувачів, як щодо наступної схеми:

[Усі символи, без пробілів] @ [літери та цифри] (. [Літери та цифри]), де кінцева група з'являється принаймні один раз.

RegEx для цього виглядає приблизно так:

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

А потім надішліть підтвердження електронною поштою.


2
Існує помилка друку (якщо тільки ви не хочете дозволити "w" як TLD), і вона не відповідає домену з дефісом (-). Це краще працює: [\ S] + @ [\ w -] + (. [\ W -] +) +

1

@ Yaakov (міг би відповісти як-небудь "відповідь" тут)

Я думаю, що частина причини, по якій надсилаються електронні листи з підтвердженням, полягає не тільки в тому, щоб адреса електронної пошти була дійсною, але і щоб вона була доступною користувачеві, який її подав. Людина могла легко вписати помилкову помилку на одну букву на адресу електронної пошти, що призведе до іншої, дійсної адреси електронної пошти, але це все одно буде помилкою, оскільки це буде неправильна адреса.

Я погоджуюся, але не впевнений, що того варто. Для цього ми також маємо поля підтвердження (повторення вашої електронної адреси ще раз). Інша ситуація, коли тип сайту може вимагати різних підходів.

Крім того, відправлення підтвердження електронною поштою само по собі не дає змоги вказувати початковому користувачеві, що вказана ним адреса була неправильною. Після отримання електронної пошти для підтвердження вони можуть просто вважати, що ваш додаток / сайт несправний; принаймні, дозволяючи користувачеві негайно почати користуватися своїм обліковим записом, вони могли б виправити свою адресу електронної пошти, особливо якщо він відображається у належно очевидному місці.


1

Коні на курси.

Усі ці дійсні, повні системи перевірки електронної пошти самі по собі, і для даного веб-сайту одна буде більш підходящою (або настільки ж хорошою, наскільки це гарантовано), ніж інші. У багатьох випадках може бути корисним кілька етапів перевірки.

Якщо ви розробляєте веб-сайт для банку, вам потрібно буде отримати пошту від равлика чи підтвердження по телефону понад усе.

Якщо ви розробляєте веб-сайт для проведення конкурсу, ви, можливо, не захочете жодного з них - перевірити електронні листи при обробці після публікації, і якщо одна не вдасться, це занадто погано для людини, який її ввійшов, - ви можете оцінити продуктивність сервера, враховуючи величезну кількість людей ( Наприклад, телевізійний конкурс) з приводу того, щоб переконатися, що всі перевірені правильно.

Як далеко потрібно пройти підтвердження електронною поштою?

Наскільки це необхідно та гарантовано.

І не більше (KISS)


1

Я бачив сайти, які також охороняють людей, які використовують тимчасові сайти із відрізком спаму, як Mailinator або MyTrashMail , які містять повідомлення про підтвердження електронною поштою. Я не кажу, що ви повинні відфільтрувати це, я просто кажу.


Яким чином "обходить" підтвердження електронної пошти? Як Mailinator, так і MyTrashMail прийматимуть наступні листи на ту саму адресу. Якщо користувач не намагається перевірити їх, це вже інша історія.
bzlm

1

Що ви намагаєтеся зафіксувати під час перевірки електронної пошти?

Перевірка електронних адрес Regex може в кращому випадку підтвердити, що адреса синтаксично правильна та відносно правдоподібна. Він також має небезпеку (як уже згадувалося багато разів), можливо, відхилення фактичних, доставлених адрес, якщо регулярний вираз не зовсім правильний.

Перевірка SMTP може визначити, що адреса доставлена, за умови обмежень, накладених грайлістом або серверами, налаштованими видавати якомога менше інформації про своїх користувачів. Ви не можете дізнатися, чи MTA претендує лише на прийняття пошти за неправдиву адресу, а потім просто скинув її на підлогу як частину стратегії проти спаму.

Однак надіслати повідомлення-підтвердження - це єдиний спосіб підтвердити, що адреса належить користувачеві, який її ввів. Якщо я заповнюю вашу форму, я можу досить легко сказати вам, що моя адреса електронної пошти president@whitehouse.gov. Регекс підкаже вам, що це синтаксично справедливо, SMTP RCPT TO скаже вам, що це адреса, яка доставляється, але, звичайно, це не моя адреса.


1

З появою HTML5 до можливостей додається щонайменше один новий підхід: використання вводу типу ' email ', який дозволяє перевірити клієнтську сторону. Поточні версії 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 ви можете використовувати «Валідатор регулярних виразів». А у властивості "ValidationExpression" ви можете натиснути кнопку "...", яка має майстра для додавання у звичайний формат виразів для адрес електронної пошти.

Рівень 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

інший варіант - використовувати пакет Argettools nuget, але він може бути повільним на Windows Server 2008 R2, як я вже відчував, але швидко працює на Win 7.

3 рівень:

Для підтвердження електронної пошти ви можете генерувати певний шестигранний URL-адресу електронної пошти (використовуючи функції шифрування) тощо http://domain.com/validateEmail?code=abcd1234, щоб перевірити електронну адресу, коли користувач натискає на неї. Не потрібно зберігати цю URL-адресу в пам'яті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.