Проверка идентификатора электронной почты в соответствии с RFC5322 и https://en.wikipedia.org/wiki/Email_address
Проверка идентификаторов электронной почты в соответствии с RFC5322 и последующими
https://en.wikipedia.org/wiki/Email_address
Ниже приведен пример кода с использованием Java и регулярного выражения для проверки идентификаторов электронной почты.
public void checkValid() {
List<String> emails = new ArrayList();
//Valid Email Ids
emails.add("simple@example.com");
emails.add("very.common@example.com");
emails.add("disposable.style.email.with+symbol@example.com");
emails.add("other.email-with-hyphen@example.com");
emails.add("fully-qualified-domain@example.com");
emails.add("user.name+tag+sorting@example.com");
emails.add("fully-qualified-domain@example.com");
emails.add("x@example.com");
emails.add("carlosd'intino@arnet.com.ar");
emails.add("example-indeed@strange-example.com");
emails.add("admin@mailserver1");
emails.add("example@s.example");
emails.add("\" \"@example.org");
emails.add("\"john..doe\"@example.org");
//Invalid emails Ids
emails.add("Abc.example.com");
emails.add("A@b@c@example.com");
emails.add("a\"b(c)d,e:f;g<h>i[j\\k]l@example.com");
emails.add("just\"not\"right@example.com");
emails.add("this is\"not\\allowed@example.com");
emails.add("this\\ still\"not\\allowed@example.com");
emails.add("1234567890123456789012345678901234567890123456789012345678901234+x@example.com");
emails.add("john..doe@example.com");
emails.add("john.doe@example..com");
String regex = "^[a-zA-Z0-9_!#$%&'*+/=? \\\"`{|}~^.-]+@[a-zA-Z0-9.-]+$";
Pattern pattern = Pattern.compile(regex);
int i=0;
for(String email : emails){
Matcher matcher = pattern.matcher(email);
System.out.println(++i +"."+email +" : "+ matcher.matches());
}
}
Фактический выход:
1.simple@example.com : true
2.very.common@example.com : true
3.disposable.style.email.with+symbol@example.com : true
4.other.email-with-hyphen@example.com : true
5.fully-qualified-domain@example.com : true
6.user.name+tag+sorting@example.com : true
7.fully-qualified-domain@example.com : true
8.x@example.com : true
9.carlosd'intino@arnet.com.ar : true
10.example-indeed@strange-example.com : true
11.admin@mailserver1 : true
12.example@s.example : true
13." "@example.org : true
14."john..doe"@example.org : true
15.Abc.example.com : false
16.A@b@c@example.com : false
17.a"b(c)d,e:f;g<h>i[j\k]l@example.com : false
18.just"not"right@example.com : true
19.this is"not\allowed@example.com : false
20.this\ still"not\allowed@example.com : false
21.1234567890123456789012345678901234567890123456789012345678901234+x@example.com : true
22.john..doe@example.com : true
23.john.doe@example..com : true
Ожидаемый выход:
1.simple@example.com : true
2.very.common@example.com : true
3.disposable.style.email.with+symbol@example.com : true
4.other.email-with-hyphen@example.com : true
5.fully-qualified-domain@example.com : true
6.user.name+tag+sorting@example.com : true
7.fully-qualified-domain@example.com : true
8.x@example.com : true
9.carlosd'intino@arnet.com.ar : true
10.example-indeed@strange-example.com : true
11.admin@mailserver1 : true
12.example@s.example : true
13." "@example.org : true
14."john..doe"@example.org : true
15.Abc.example.com : false
16.A@b@c@example.com : false
17.a"b(c)d,e:f;g<h>i[j\k]l@example.com : false
18.just"not"right@example.com : false
19.this is"not\allowed@example.com : false
20.this\ still"not\allowed@example.com : false
21.1234567890123456789012345678901234567890123456789012345678901234+x@example.com : false
22.john..doe@example.com : false
23.john.doe@example..com : false
Как я могу изменить свое регулярное выражение, чтобы оно лишило законной силы приведенные ниже шаблоны идентификаторов электронной почты.
1234567890123456789012345678901234567890123456789012345678901234+x@example.com
john..doe@example.com
john.doe@example..com
just"not"right@example.com
Ниже приведены критерии для регулярного выражения:
Локальная часть
Локальная часть адреса электронной почты может использовать любой из этих символов ASCII:
- прописные и строчные латинские буквы
A to Z
а такжеa to z
; - цифры
0 to 9
; - специальные символы!#$%&'*+-/=?^_`{|}~
- точка
.
при условии, что он не является первым или последним символом, если он не указан в кавычках, а также при условии, что он не появляется последовательно, если он не указан (например,John..Doe@example.com
не допускается, но"John..Doe"@example.com
позволено); space
а также"(),:;<>@[\]
символы допускаются с ограничениями (они разрешены только внутри строки в кавычках, как описано в параграфе ниже, и, кроме того, обратная косая черта или двойная кавычка должна предшествовать обратной косой черте); комментарии допускаются с круглыми скобками в любом конце локальной части; напримерjohn.smith(comment)@example.com
а также(comment)john.smith@example.com
оба эквивалентныjohn.smith@example.com
,
Домен
- прописные и строчные латинские буквы
A to Z
а такжеa to z
; - цифры
0 to 9
при условии, что доменные имена верхнего уровня не являются полностью числовыми; - дефис
-
при условии, что это не первый или последний символ. Комментарии разрешены как в домене, так и в локальной части; например,john.smith@(comment)example.com
а такжеjohn.smith@example.com(comment)
эквивалентныjohn.smith@example.com
,
3 ответа
Вы могли бы RFC5322, как это
( ссылка на регулярное выражение изменена)
"(?im)^(?=.{1,64}@)(?:(\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"@)|((?:[0-9a-z](?:\\.(?!\\.)|[-!#\\$%&'\\*\\+/=\\?\\^`\\{\\}\\|~\\w])*)?[0-9a-z]@))(?=.{1,255}$)(?:(\\[(?:\\d{1,3}\\.){3}\\d{1,3}\\])|((?:(?=.{1,63}\\.)[0-9a-z][-\\w]*[0-9a-z]*\\.)+[a-z0-9][\\-a-z0-9]{0,22}[a-z0-9])|((?=.{1,63}$)[0-9a-z][-\\w]*))$"
https://regex101.com/r/ObS3QZ/1
# (?im)^(?=.{1,64}@)(?:("[^"\\]*(?:\\.[^"\\]*)*"@)|((?:[0-9a-z](?:\.(?!\.)|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)?[0-9a-z]@))(?=.{1,255}$)(?:(\[(?:\d{1,3}\.){3}\d{1,3}\])|((?:(?=.{1,63}\.)[0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9])|((?=.{1,63}$)[0-9a-z][-\w]*))$
# Note - remove all comments '(comments)' before runninig this regex
# Find \([^)]*\) replace with nothing
(?im) # Case insensitive
^ # BOS
# Local part
(?= .{1,64} @ ) # 64 max chars
(?:
( # (1 start), Quoted
" [^"\\]*
(?: \\ . [^"\\]* )*
"
@
) # (1 end)
| # or,
( # (2 start), Non-quoted
(?:
[0-9a-z]
(?:
\.
(?! \. )
| # or,
[-!#\$%&'\*\+/=\?\^`\{\}\|~\w]
)*
)?
[0-9a-z]
@
) # (2 end)
)
# Domain part
(?= .{1,255} $ ) # 255 max chars
(?:
( # (3 start), IP
\[
(?: \d{1,3} \. ){3}
\d{1,3} \]
) # (3 end)
| # or,
( # (4 start), Others
(?: # Labels (63 max chars each)
(?= .{1,63} \. )
[0-9a-z] [-\w]* [0-9a-z]*
\.
)+
[a-z0-9] [\-a-z0-9]{0,22} [a-z0-9]
) # (4 end)
| # or,
( # (5 start), Localdomain
(?= .{1,63} $ )
[0-9a-z] [-\w]*
) # (5 end)
)
$ # EOS
Это не вопрос, который вы задали, но зачем изобретать велосипед?
У Apache commons есть класс, который уже занимается этим.
org.apache.commons.validator.routines.EmailValidator.getInstance().isValid(email)
Таким образом, вы не несете ответственности за то, чтобы быть в курсе изменений стандартов формата электронной почты.
Регулярное выражение является наиболее сложным и подверженным ошибкам способом проверки адресов электронной почты. Если вы используете реализацию javax.mail
чтобы отправить электронные письма, тогда самый простой способ определить, будет ли это работать, - использовать предоставленный синтаксический анализатор, потому что, является ли электронное письмо совместимым или нет, если библиотека не может использовать его, тогда это не имеет значения.
public static boolean validateEmail(String address) {
try {
// if this fails, the mail library can't send emails to this address
InternetAddress ia = new InternetAddress(address, true);
return ia.isGroup() && ia.getAddress().charAt(0) != '@';
}
catch (Throwable t) {
return false;
}
}
Вызывая его с false
позволяет электронную почту без @domain
часть при строгом разборе. И так как checkAddress
Функция, вызываемая внутренне, является частной, и мы не можем просто вызвать checkAddress(addr,false,true)
так как нам не нужна информация о маршрутизации (функция, предназначенная для мошенничества при перехвате серверов), мы должны проверить первую букву проверенного адреса.
Теперь вы можете заметить, что этот метод проверки на самом деле соответствует RFC 2822, а не 5822. Причина этого в том, что, если вы не реализуете свою собственную библиотеку отправителей SMTP, то вы используете тот, который зависит от этого, и если у вас есть адрес, который является 5822-действительным, но 2822-недействительным, то ваша 5822-проверка становится бесполезной. Но если вы реализуете свою собственную библиотеку SMTP 5822, то вам следует учиться на существующих и писать функцию парсера, а не регулярное выражение.