На 100% правильний спосіб перевірки адрес електронної пошти

Вітаю. C сьогоднішнього дня ви ніколи не будете витрачати час, підбираючи оптимальний регулярний вираз для перевірки адреси електронної пошти. І ви ніколи більше не відхиліть адресу, який до вашої подив виявився дійсним.

Хитрість у тому, щоб визначити значення слова «дійсний».

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


en.wikipedia.org/wiki/Email_address#Valid_email_addresses

Все, що ви знаєте, неправильно
Вищезгаданий приклад перевірки з допомогою regex у чому ігнорує реальність. Замість цього я вважаю, що нам потрібно задати два питання:

  1. чи Розуміє користувач, що від нього потрібно ввести адресу електронної пошти у поле?
  2. Правильно він ввів свою адресу в полі?
Якщо у вас добре помітна форма з підписом "email" і користувач де-то в цій формі ввів символ '@', то буде безпечно припустити, що відповідь на перше питання позитивний. Це легко.

Далі ми хочемо перевірити, що користувач правильно ввів ваш адресу електронної пошти.

Неможливо.

Важливо, щоб ви погодилися зі мною в даному тезі: це неможливо.

Я знаю, що ви думаєте. «Але це допоможе, вірно?» Ну це як швидке закриття холодильника збереже енергію і допоможе боротися з глобальним потеплінням. Звичайно допоможе, якщо ми хочемо стати рабами слова «допоможе». Але більшість людей погодиться, що вам світить багатообіцяюча кар'єра в гамівній сорочці, якщо ви грохочете консервами заради порятунку білих ведмедів.

Досліджуємо питання
Уявімо, що мою адресу електронної пошти davidgilbertson@example.com. Це 27 натискань на клавіатурі, які можуть призвести до опечатке. Помилка в будь-якому символі безумовно призведе до введення неправильного адреси, але додатково " цю адресу буде недійсним.

[прозріння]

Навіть якщо б у вікно яскраво засвітило сонце, мене здолав особливо дикий чих (я страждаю від світлового чхального рефлексуПогано вивчене аутосомно-домінантне захворювання — прим.пер.) і я помилково надрукував #!$%&'*+-/=?^_`{}|~@example.com — так от, я все одно пройду більшість перевірок на «дійсний» адресу електронної пошти. (Ще гірше, якщо система скаже, що адреса недійсний, коли він насправді існує! Заради інтересу я тільки що написав на адресу #!$%&'*+-/=?^_`{}|~@example.com — і дівчина сказала, що її страшенно бісить, коли її адресу електронної пошти вважають недійсним. Вона також шкодує про купівлю домену example.com, але не збирається здаватися, як і той хлопець, що купив milk.com. Ми почали чатитись, і виявилося, що вона живе всього в парі кварталів від мене і теж збирає вінтажні камери; на наступному тижні ми підемо грати в гольф. Я думаю, може вона і є та сама. Втім, мені потрібно закінчувати базікати і продовжити писати статтю).

Так яка ймовірність, що одна будь-яка помилка зробить адреса недійсним? Зробимо статистичну модель! Наприклад, ось літера 'g'. Я швидше допущу помилку на видимій клавіатурі без нажатого Shift (в моделі я враховую «незмінені» клавіші). Серед всіх клавіш, які можна натиснути на фізичній клавіатурі, є тільки шість символів, які в деяких випадках можуть зробити адреса недійсним: []\;, та пробіл. 6 з 48. Ймовірність 12%.

Але більш імовірна помилка на сусідню клавішу. Наприклад, натискання на 'h' замість 'g'. Так що зі списку 117 млн існуючих поштових адрес я вирахував частотність кожного символу? для кожного з них записав, які клавіші знаходяться поруч з клавіатурі, і вивів підсумкову ймовірність того, що помилка призведе до недійсного адресою (знаю, що зламувати LinkedIn заради міркування про валідації поштових адрес було трохи занадто, але будь-яка думка важливо підтвердити реальними даними).

Наприклад, символ 'e' вважається символом з низьким ризиком инвалидации, тому що всі навколишні символи залишать адресу електронної пошти раніше дійсним. Але поруч з 'p' є '[', ';' на відстані натискання! Так що хоча це більш рідкісний символ, ніж 'e', але він несе більший ризик перетворення адреси в недійсний, якщо по клавіші промахнулися.

Я також прийняв розрахунок відносну спритність кожного пальця. Ми всі знаємо, що мізинець — розумово відсталий родич в сімействі пальців, так що і це враховується.


Графічне представлення моделі, що показує зону помилки навколо P, з урахуванням недоліків мізинця

Тепер припустимо, що Силки (фокс) сидить на клавіші Shift я натискаю неправильну клавішу на клавіатурі. Тут я ризикую потрапити за однією з шести небезпечних клавіш: []\;, та пробіл. І знову, вони роблять адреса недійсним тільки при певних умовах. Більш ймовірно, що натиснута клавіша Shift буде діяти тільки для літер, з одного боку, «собачки» в адресі, так що літера 'l' з будь-якої сторони вважається особливо небезпечною.

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

Не варто говорити, що я доклав такі ж зусилля в розрахунку моделі для екранних клавіатур.

Пам'ятайте також, що якщо допустити помилку в символі @, то помилка буде врахована на самому першому етапі, коли ми перевіряємо наявність @ намір користувача ввести адресу електронної пошти.

Я також вмонтував в модель трохи здорового глузду. Відомо, що люди з адресою aol.com невміло набирають текст. Дерилы схильні всі клавіші натискати вказівним пальцем, ніби бояться, що кожна кнопка обпече руку. Люди з буквою 'z' в імені використовують механічні клавіатури і рідко роблять помилки. Відомі життєві аксіоми.

Я також врахував факт, що будь-яка кнопка перед «собачкою» в адресі ігнорується, і що 'f' і 'h' у чому одна і та ж буква, якщо гарненько подумати.

Результат
Отже, прийнявши до уваги всі фактори, я пропустив 117 мільйонів адрес через модель. І ймовірність, що некоректну адресу електронної пошти буде зафіксований програмою валідації адрес склав…

0,00000000000000000000000000000000000000625%

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

Підсумок
Безглуздо намагатися з'ясувати, чи є адреса «дійсним». Користувач з набагато більшою ймовірністю введе неправильний і дійсний адреса, ніж недійсний.

Тому краще витратити свій час буквально на будь-яку іншу справу, ніж перевіряти валідність адрес електронної пошти.

На 100% правильний спосіб
Надсилайте користувачам лист активації. (Тут жирна крапка для ефекту).

Я опублікував продовження цієї статті в першу чергу про те, як допомогти користувачам уникнути введення неправильного адреси електронної пошти. З реальним кодом! Вперед. Читайте. https://medium.com/@david.gilbertson/how-to-reduce-incorrect-email-addresses-df3b70cb15a9



Якщо вам здається, що ця стаття безглузда і безглузда, і ви хочете ще такого ж, оцініть мій подкаст «Девід читає Вікіпедію». Він саме про те, про що ви подумали.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.