Перевірка електронної пошти HTML5


102

Кажуть, що "За допомогою HTML5 нам не потрібно більше js або коду на стороні сервера, щоб перевірити, чи є вхід користувача правильною електронною адресою або URL-адресою".

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

<input type="email" pattern="[^ @]*@[^ @]*" placeholder="Enter your email">
<input type="submit" value="Submit">

50
Завжди потрібно перевірити на сервері. Розумний клієнт може обійти будь-який захід безпеки на стороні клієнта.
Бенджамін Грюнбаум

Ця відповідь може допомогти при спробі налаштування HTML5 перевірки форми. Звичайно, вам, мабуть, все ще знадобиться перевірка на сервері.
Joeytje50

2
Перевірка електронної пошти ніколи не повинна використовуватися ні за яких обставин. Перевірки Regex мають занадто багато недоліків. Найкращий спосіб "перевірити" адреси електронної пошти - це просто змусити їх ввести двічі та запустити перевірку Regex, яка дає ПОПЕРЕДЖЕННЯ користувачеві, що він не схожий на дійсну адресу електронної пошти, якщо вона не відповідає шаблону, і просить користувача повторно перевірити. Таким чином, якщо він дійсно дійсний, але регулярний вираз не працює (як це часто робиться), користувач може просто визнати, що він знає, що він дійсний, і продовжувати. Занадто багато сайтів використовують перевірку регулярних виразів, і це неприємно для багатьох користувачів.
Soundfx4

Рекомендую переглянути цю статтю: debounce.io/blog/articles/email-validation-for-html5-forms
Іман Хеджазі

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

Відповіді:


120

У HTML5 ви можете зробити так:

<form>
<input type="email" placeholder="Enter your email">
<input type="submit" value="Submit">
</form>

І коли користувач натискає кнопку "Надіслати", воно автоматично показує повідомлення про помилку, наприклад:

Повідомлення про помилку


3
Яка тут користь? Визначення типу електронної пошти вже включає вбудований шаблон для визначення цього.
Річ Бредшоу

3
@RichBradshaw: Так, ти прав. Не потрібно вказувати шаблон (я просто скопіював код з ОП, я зараз виправив :))
Мідхун MP

6
@MichaelDeMutis: Ви можете використовувати requiredатрибут
Midhun MP

29
лист не перевіряється .comв електронній пошті. Він перевіряє лише знак @. Вих. Я можу ввести example@gmailта зберегти форму. хоча це неправдива адреса електронної пошти. Чи є рішення, щоб правильно перевірити example@gmail.com?
Ручіка

9
@Liz. example@gmailможе бути неправдивим повідомленням електронної пошти, але це дійсний формат адреси електронної пошти.
піжая

47

input type=emailСторінка www.w3.org приміток сайту , що адреса електронної пошти є будь-рядком , яка відповідає наступному регулярному виразу:

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

Використовуйте requiredатрибут та patternатрибут, щоб вимагати, щоб значення відповідало шаблону регулярних виразів.

<input
    type="text"
    pattern="/^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/"
    required
>

14
Ви повинні вставити шаблон без двох символів '/' та початку '^' та кінця '$'. Ось такі[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*
Віктор

4
@Victor Вибачте, але ви частково помиляєтесь. Ці символи важливі, без них візерунок почне збігатися скрізь у рядку і зробить його марним. Там, де ви правильні, випускаєте косої риси.
Гексод

@Victor ваша відповідь працювала на мене. Зворотна таблиця ОП дала мені хибну позитивну приказку, щоб відповідати вимогам форми, навіть якщо це дійсна адреса електронної пошти. Можливо, я не використовую звичайний HTML, але використовую React JS для надання форми HTML.
Ка Мок

Я майже вниз проголосував за це, тому що правильна відповідь - це використовувати type="email"та перевіряти validбулеву властивість на DOMNode - не потрібно повторювати основний регулярний вираз
Домінік

Дякую, що згадали про це.
Стефан Кіпріан Хотоляну

17

Використання [a-zA-Z0-9.-_]{1,}@[a-zA-Z.-]{2,}[.]{1}[a-zA-Z]{2,}для somemail@email.com/somemail@email.com.vn


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

Відредаговано. Дякую @duskwuff
Van Nguyen

Досі відхиляє однобуквені доменні імена
duskwuff -inactive-

Це дозволяє 1 домен букв / цифр: [a-zA-Z0-9.-_] {1,} @ [a-zA-Z0-9 .-] {1,} [.] {1} [a-zA -Z0-9] {2,}
Руль

Також зауважте, що, наприклад, postmaster@aiє дійсною адресою електронної пошти, і ця регулярна посилання також заборонила б це. (Джерело: serverfault.com/q/154991/104798 )
Мікко Ранталайнен

12
document.getElementById("email").validity.valid

Здається, це правда, коли поле порожнє або дійсне. Тут також є деякі інші цікаві прапори:

введіть тут опис зображення

Тестували в Chrome.


8

Ось приклад, який я використовую для всіх моїх електронних вводів форми. Цей приклад - ASP.NET, але стосується будь-якого:

<asp:TextBox runat="server" class="form-control" placeholder="Contact's email" 
    name="contact_email" ID="contact_email" title="Contact's email (format: xxx@xxx.xxx)" 
    type="email" TextMode="Email" validate="required:true"
    pattern="[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*" >
</asp:TextBox>

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

Це відображається у вигляді наступного HTML:

<input class="form-control" placeholder="Contact's email" 
    name="contact_email" id="contact_email" type="email" 
    title="Contact's email (format: xxx@xxx.xxx)" 
    pattern="[a-zA-Z0-9!#$%&amp;'*+\/=?^_`{|}~.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*">

7

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

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

var validations ={
    email: [/^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/, 'Please enter a valid email address']
};
$(document).ready(function(){
    // Check all the input fields of type email. This function will handle all the email addresses validations
    $("input[type=email]").change( function(){
        // Set the regular expression to validate the email 
        validation = new RegExp(validations['email'][0]);
        // validate the email value against the regular expression
        if (!validation.test(this.value)){
            // If the validation fails then we show the custom error message
            this.setCustomValidity(validations['email'][1]);
            return false;
        } else {
            // This is really important. If the validation is successful you need to reset the custom error message
            this.setCustomValidity('');
        }
    });
})

Будь ласка, не публікуйте лише відповіді на посилання. Просто поставте у своїй відповіді основні частини посилання
Rizier123,

4

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

<input type="email" pattern="^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$">

Ви можете знайти більш регулярний вираз всіх видів тут .


4

TL; DR: Єдиним на 100% правильним методом є перевірка @ -sign десь із введеної адреси електронної пошти, а потім розміщення повідомлення про підтвердження вказаної адреси електронної пошти. Якщо вони можуть слідувати інструкціям щодо перевірки в електронному повідомленні , введена адреса електронної пошти правильна.

Довга відповідь:

Девід Гілбертсон писав про це років тому:

Ми повинні задати два питання:

  1. Чи зрозумів користувач, що він повинен ввести адресу електронної пошти в це поле?
  2. Чи правильно користувач ввів у це поле власну електронну адресу ?

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

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

Неможливо.

[...]

Будь-які друкуватимуть з помилками , безумовно , приведуть до неправильного адресою електронної пошти, але тільки можливо привести до неприпустимого адресою електронної пошти.

[...]

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

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

Крім того, деякі адреси електронної пошти, які можуть бути синтаксично чи політично недійсними, діють. Наприклад, postmaster@aiчи технічно це працює, навіть якщо TLD не повинні мати записи MX . Також дивіться дискусію щодо перевірки електронної пошти у списку розсилки WHATWG (де в першу чергу розроблений HTML5).


2

Використовуючи HTML 5, просто зробіть вхідну електронну пошту таким чином:

<input type="email"/>

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


Але це не може визнати недійсними випадки типу "abc @ gmail".
nbsamar

так, я думаю, що так, я хотів би перевірити, якщо користувач поставив gmail або hotmail, наприклад, якщо мій користувач поставив інше, то не дозволяйте їм продовжувати мій логін, чи знаєте ви, як я можу це зробити?
simon

2

Ви також можете слідувати цій схемі

<form action="/action_page.php">
  E-mail: <input type="email" name="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$">
  <input type="submit">
</form>

Посилання: У W3Schools


1
<input type="email" name="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$" title="please enter valid email [test@test.com].">ви можете додати заголовок також, щоб відобразити повідомлення про дійсність.
imdzeeshan

1

Згідно з MDN , цей RegExp нормальний для перевірки електронних листів, оскільки електронні листи, що відповідають специфікаціям, повинні відповідати йому.

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

0

Дуже складно правильно перевірити електронну пошту, просто використовуючи атрибут HTML5 "шаблон". Якщо ви не використовуєте "шаблон", хтось @ буде оброблений. що НЕ дійсний електронний лист.

Однак для використання pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}"потрібен формат, someone@email.comякщо відправник має такий формат, як someone@email.net.au(або подібний), не буде підтверджений, щоб виправити це, ви можете встановити, що pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}"це буде підтверджено ".com.au або .net.au або подібним.

Однак, використовуючи це, це не дозволить netko@email.com перевірити. Тож, якщо просто використовувати HTML5 для перевірки адрес електронної пошти, ми все ще не повністю. Щоб завершити це, ви використовуєте щось подібне:

<form>
<input id="email" type="text" name="email" pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}" required placeholder="Enter you Email">
<br>
<input type="submit" value="Submit The Form">
</form>

або:

<form>
<input id="email" type="text" name="email" pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}" required placeholder="Enter you Email">
<br>
<input type="submit" value="Submit The Form">
</form>

Однак я не знаю, як перевірити обидві або всі версії електронних адрес за допомогою атрибута шаблону HTML5.


1
перевірки регулярного вираження ніколи не слід застосовувати ні за яких обставин. Занадто багато моделей, і вони мають занадто багато недоліків. Наприклад, хтось +customwordhere@email.com вважається недійсним для багатьох перевірок регулярних виразів, коли він фактично є 100% дійсним. Regex - це шип у моїх та багатьох інших користувачів, і це має йти. Необхідно використовувати альтернативний метод, щоб переконатися, що користувач вводить дійсну адресу електронної пошти.
Soundfx4

Також зауважте, що, наприклад, postmaster@aiє дійсною адресою електронної пошти, і ця регулярна посилання також заборонила б це. (Джерело: serverfault.com/q/154991/104798 )
Мікко Ранталайнен

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