На этот вопрос ответить сложнее, чем кажется на первый взгляд.
В мире было множество людей, которые искали «регулярное выражение, чтобы управлять ими всеми», но правда в том, что существуют тона поставщиков электронной почты.
В чем проблема? Ну, «a_z%@gmail.com не может существовать, но может существовать такой же адрес через другого провайдера» a__z@provider.com.
Почему?
По данным РФЦ:
https://en.wikipedia.org/wiki/Email_address#RFC_specification.
Я возьму выдержку, чтобы облегчить лекцию:
The local-part of the email address may use any of these ASCII characters:
- uppercase and lowercase Latin letters A to Z and a to z;
- digits 0 to 9;
- special characters !#$%&'*+-/=?^_`{|}~;
- dot ., provided that it is not the first or last character unless quoted, and provided also that it does not appear consecutively unless quoted (e.g. John..Doe@example.com is not allowed but "John..Doe"@example.com is allowed);[6]
Note that some mail servers wildcard local parts, typically the characters following a plus and less often the characters following a minus, so fred+bah@domain and fred+foo@domain might end up in the same inbox as fred+@domain or even as fred@domain. This can be useful for tagging emails for sorting, see below, and for spam control. Braces { and } are also used in that fashion, although less often.
- space and "(),:;<>@[\] characters are allowed with restrictions (they are only allowed inside a quoted string, as described in the paragraph below, and in addition, a backslash or double-quote must be preceded by a backslash);
- comments are allowed with parentheses at either end of the local-part; e.g. john.smith(comment)@example.com and (comment)john.smith@example.com are both equivalent to john.smith@example.com.
Итак, я могу владеть таким адресом электронной почты:
A__z/J0hn.sm{it!}h_comment@example.com.co
Если вы попробуете этот адрес, держу пари, он потерпит неудачу во всех или в большей части регулярных выражений, размещенных по всей сети. Но помните, что этот адрес следует правилам RFC, поэтому он действителен.
Вообразите мое разочарование в связи с тем, что я нигде не смог зарегистрироваться, проверенный этими регулярными выражениями !!
Единственный, кто действительно может подтвердить адрес электронной почты, является поставщиком адреса электронной почты.
Как с этим бороться, так?
Не имеет значения, добавляет ли пользователь недействительный адрес электронной почты почти во всех случаях. Вы можете положиться на HTML 5 input type = "email", который работает около в RFC, малый шанс на провал.
HTML5 input type = "email" info: https://www.w3.org/TR/2012/WD-html-markup-20121011/input.email.html
Например, это действительный адрес электронной почты RFC:
"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com
Но проверка html5 скажет вам, что текст перед @ не должен содержать, например, символы "или"), что на самом деле неверно.
В любом случае, вы должны сделать это, приняв адрес электронной почты и отправив сообщение на этот адрес электронной почты с кодом / ссылкой, которую пользователь должен посетить, чтобы подтвердить действительность.
Хорошей практикой при этом является ввод "введите свой адрес электронной почты еще раз", чтобы избежать ошибок при вводе пользователем. Если вам этого недостаточно, добавьте модальное окно предварительной отправки с заголовком «Это ваш текущий адрес электронной почты?», А затем сообщение, введенное пользователем внутри тега h2, вы знаете, чтобы четко показать, какой адрес -почту, которую они ввели, затем кнопку "да, отправить".