Почему проверка формы HTML5 позволяет отправлять электронные письма без точки?

113

Я пишу очень простой макет, чтобы продемонстрировать некоторую проверку формы HTML5. Однако я заметил, что проверка электронной почты не проверяет наличие точки в адресе и не проверяет наличие символов, следующих за указанной точкой.

Другими словами, «john @ doe» считается действительным, если это явно недействительный адрес электронной почты; "лань" - это не домен.

Вот как я кодирую свое поле электронной почты:

<input type="email" required />

Этого мало?

Посмотрите на эту скрипку, чтобы понять, что я имею в виду.

Примечание: я знаю, как сделать это с помощью шаблона RegEx. Мне просто интересно, как кому-то могло сойти с рук использование электронного письма.

WEFX
источник
10
In other words, "john@doe" is considered valid, when it's clearly not a valid email address; doe isn't a domain.Да, doeопределенно может быть домен (подумайте localhost), и этот адрес технически действителен согласно спецификации.
адмдрю
2
@admdrew Хех ... это будет интересный случай, если вы отправляете электронное письмо с самого почтового сервера и решаете написать "friend @ localhost"
Katana314
@ Katana314 - хех, да. Большинство (хорошо настроенных) почтовых серверов отклоняют сообщения, отправляемые на адреса, которые не соответствуют ожидаемому домену, поэтому, вообще говоря, проблем с localhostадресами нет.
адмдрю

Ответы:

84

Поскольку a @ b - действительный адрес электронной почты (например, localhost - действительный домен). См. Http://en.wikipedia.org/wiki/Email_address#Examples.

Кроме того, имейте в виду, что вы всегда должны выполнять проверку ввода на сервере. Проверка на стороне клиента должна использоваться только для обратной связи с пользователем, и на нее нельзя полагаться, поскольку ее можно легко обойти.

Али Алави
источник
7
Спасибо. Я просто не понимаю, как какая-либо компания может получить выгоду от этой встроенной проверки электронной почты. Facebook не позволял никому регистрироваться по адресу a @ b. Спасибо за информацию. (Я не отрицал ваш ответ)
WEFX
6
В случае таких веб-сайтов, как Facebook с публичным доступом, это бесполезно. Но подумайте о внутренних веб-сайтах. Вы можете написать в joe @ support. Но я также считаю, что от него мало пользы. Тем не менее, веб-браузеры должны реализовываться на основе стандартов (то есть RFC), а не на основе наиболее распространенных случаев.
Али Алави
9
Интересно, когда в последний раз кто-то действительно отправлял электронное письмо на localhost!
Мэтью Лок
2
Кстати, один из самых коротких рабочих адресов электронной почты ( recordsetter.com/world-record/shortest-email-address/4327 )au@ua
Kyborek
133

Теоретически вы можете иметь адрес без "." в.

Поскольку технически такие вещи, как:

user@com
user@localserver
user@[IPv6:2001:db8::1]

Все действительные электронные письма.

Таким образом, стандартная проверка HTML5 позволяет использовать все действительные электронные письма, включая необычные.

Для некоторых легко читаемых объяснений (вместо чтения стандартов): http://en.wikipedia.org/wiki/Email_address#Examples

DBS
источник
1
Согласен, это ответ на вопрос «почему», а не на «решение». Мне также было любопытно, почему. Теперь я знаю, что нельзя «исправлять».
Элеонора Циммерманн,
Примером первого типа является домен uz, который напрямую указывает на IP-адрес по состоянию на октябрь 2018 года. Если вы сделаете nslookup uz, он указывает на 91.212.89.8, значит, в этом домене должна быть возможность иметь электронную почту.
PulseJet 07
36

Попробуйте добавить это к вводу

pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,63}$"

Скрипка

APAD1
источник
2
При наличии большого количества новых доменов, например (бухгалтеров [11], международных [13] и т.д.) и потенциальной максимальной длины 63, значение длины шаблона регулярного выражения должно быть {2, 63}.
unasAquila
43
-1. Во-первых, вы даже не пытались объяснить, что это разрешает или ограничивает, и почему кому-то нужны эти правила. Во-вторых, он гораздо более строгий, чем позволяют стандарты (я не буду притворяться, что прочитал и изучил стандарты, но см., Например, en.wikipedia.org/wiki/Email_address#Internationalization или множество вопросов проверки электронной почты в Stack Переполнение примеров странных адресов электронной почты). Зачем это делать? Если кто-то вводит что-то необычное в качестве своего электронного письма, просто примите это - скорее всего, они знают лучше вас.
Марк Эмери
7
На самом деле, я бы сказал, что «велика вероятность», что они ошибаются. Возможно, у них очень необычный адрес электронной почты, но я бы сказал, что в большинстве случаев вы просто получите правильный адрес электронной почты вместо неправильного, если вы остановите его прохождение проверки и предложите пользователь для проверки.
Джефф Кендалл,
1
Здесь должен быть знак ^, означающий, что сопоставление должно начинаться с начала строки, а также должен приниматься верхний регистр:^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+$
Kohjah Breese
13

RFC 822 , глава 6, дает спецификацию адреса в дополненной Backus-Наура (BNF):

addr-spec   =  local-part "@" domain
local-part  =  word *("." word)
domain      =  sub-domain *("." sub-domain)

Используя эту спецификацию a@b является действительным адресом.

ОБНОВИТЬ

Чтобы ответить на комментарий Trejkaz, я добавляю следующие определения. Мы видим, что SPACE разрешены, но только в кавычках.

word          =  atom / quoted-string
atom          =  1*<any CHAR except specials, SPACE and CTLs>
quoted-string = <"> *(qtext/quoted-pair) <">
SPACE         =  <ASCII SP, space>
CTL           =  <any ASCII control character and DEL> 
qtext         =  <any CHAR excepting <">, "\" & CR, and including linear-white-space>
quoted-pair   =  "\" CHAR  
Ортомала Локни
источник
OTOH, RFC 822 также позволяет мне помещать пробелы в локальную часть, что, по крайней мере, не разрешает Chrome, поэтому я не уверен, что они используют RFC в качестве ссылки. (Хотя они должны быть!)
Trejkaz 04
8

На этой странице MDN показано, какие регулярные выражения браузеры должны использовать для проверки электронной почты:

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email#Validation

Вы можете немного изменить это регулярное выражение, чтобы в доменном имени требовалась хотя бы одна точка: измените звездочку *в конце регулярного выражения на плюс +. Затем используйте это регулярное выражение в качестве patternатрибута:

<input type="email" pattern="^[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])?)+$"></input>
gitaarik
источник
3

Вы можете настроить шаблон поля электронной почты:

input:valid {
  border-color: green
}

input:invalid {
  border-color: red
}
Email:
<input type="email" required value="a@b.c" /><br>

Non-dots Email:
<input type="email" required pattern="[^.]+@[^.]+" value="a@b.c" />

Дориан
источник
2

Вот как вы можете сделать это с html5, используя шаблон регулярного выражения. Вы также можете добавить собственное сообщение для отображения.

<form>
  <input type="email" value="paul@test" required pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,63}$" title="Hey, you are missing domain part in the email !!!"/>
  <button type="submit">Click Me</button>
</form>

Хари Дас
источник
-5

Этот паттерн всегда работает у меня.

Текст должен быть в нижнем регистре, pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$"но я думаю, что он охватывает более или менее большинство писем.

TSlegaitis
источник