Какой самый элегантный код для проверки того, что строка является действительным адресом электронной почты?
c#
email
email-validation
Лиора
источник
источник
Ответы:
Что насчет этого?
Чтобы уточнить, вопрос заключается в том, является ли конкретная строка действительным представлением адреса электронной почты, а не является ли адрес электронной почты допустимым местом назначения для отправки сообщения. Для этого единственный реальный способ - отправить сообщение для подтверждения.
Обратите внимание, что адреса электронной почты более простительны, чем вы можете себе представить. Это все совершенно правильные формы:
В большинстве случаев ложное «недействительное» гораздо хуже для ваших пользователей и проверки в будущем, чем ложное «действительное». Вот статья, которая раньше была принятым ответом на этот вопрос (этот ответ с тех пор был удален). В нем есть гораздо больше деталей и некоторые другие идеи о том, как решить проблему.
Обеспечение проверок работоспособности - все еще хорошая идея для пользовательского опыта. Предполагая, что адрес электронной почты действителен, вы можете искать известные домены верхнего уровня, проверять домен на наличие записи MX, проверять орфографические ошибки из общих доменных имен (gmail.cmo) и т. Д. Затем представить предупреждение, дающее пользователю возможность сказать «да, мой почтовый сервер действительно позволяет 🌮🍳🎁 в качестве адреса электронной почты».
Что касается использования обработки исключений для бизнес-логики, я согласен, что этого следует избегать. Но это один из тех случаев, когда удобство и ясность могут перевесить догму.
Кроме того, если вы делаете что-либо еще с адресом электронной почты, возможно, потребуется включить его в адрес электронной почты. Даже если вы не используете эту точную функцию, вы, вероятно, захотите использовать тот же шаблон. Вы также можете проверить наличие определенных типов сбоев, перехватывая различные исключения : пустой, пустой или неверный формат.
Согласно комментарию Стюарта, это сравнивает конечный адрес с исходной строкой, а не всегда возвращает true. MailAddress пытается проанализировать строку с пробелами в части «Отображаемое имя» и «Адрес», поэтому исходная версия возвращала ложные срабатывания.
--- Дальнейшее чтение ---
Документация для System.Net.Mail.MailAddress
Объяснение того, что составляет действительный адрес электронной почты
источник
System.Net.Mail
классы для отправки почты, что вы, вероятно, используете, если вы используете .NET. Мы приняли решение использовать этот тип проверки просто потому, что нет смысла принимать адреса электронной почты, даже действительные, на которые мы не можем отправлять почту.IsValidEmail("this is not valid@email$com");
Это старый вопрос, но все ответы, которые я нашел на SO, включая более недавние, отвечают аналогично этому. Однако в .Net 4.5 / MVC 4 вы можете добавить проверку формы электронного адреса в форму, добавив аннотацию [EmailAddress] из System.ComponentModel.DataAnnotations, поэтому мне было интересно, почему я не могу просто использовать встроенную функциональность из. Чистая в общем.
Это, кажется, работает, и мне кажется довольно элегантным:
источник
EmailAddressAttribute
это менее разрешительно, чемSystem.Net.Mail.MailAddress
- например,MailAddress
принимает адрес для TLD. Просто что-то, что нужно иметь в виду, если вам нужно быть максимально разрешающим.foo.IsValid(null);
возвращаетсяtrue
.Я использую этот метод с одним вкладышем, который делает работу для меня
Согласно комментариям, это «не получится», если
source
(адрес электронной почты) является нулевым.источник
public static Boolean IsValidMailAddress(this String pThis) => pThis == null ? false : new EmailAddressAttribute().IsValid(pThis);
public static bool IsValidEmailAddress(this string address) => address != null && new EmailAddressAttribute().IsValid(address);
false
для нулевых строк. Вот почему я предлагаю (еще лучше) версию ++public static bool IsValidEmailAddress(this string address) => new EmailAddressAttribute().IsValid(address ?? throw new ArgumentNullException());
. Теперь я пойду и найду реформатскую церковь еще более лучших версионистов..net 4.5 добавил System.ComponentModel.DataAnnotations.EmailAddressAttribute
Вы можете просмотреть источник EmailAddressAttribute , это Regex, который он использует внутри:
источник
RegexOptions.IgnoreCase
потому что этот шаблон не позволяет заглавные буквы явно!Я взял ответ Фила из # 1 и создал этот класс. Назовите это так:
bool isValid = Validator.EmailIsValid(emailString);
Вот класс:
источник
Лично я бы сказал, что вы должны убедиться, что там есть символ @, возможно, с. персонаж. Есть много регулярных выражений, которые вы можете использовать с разной корректностью, но я думаю, что большинство из них оставляют действительные адреса электронной почты или пропускают недействительные. Если люди хотят ввести поддельный адрес электронной почты, они введут поддельный. Если вам необходимо убедиться, что адрес электронной почты является законным и этот человек контролирует этот адрес электронной почты, вам необходимо отправить ему письмо со специальной кодированной ссылкой, чтобы они могли убедиться, что это действительно реальный адрес.
источник
Я думаю, что лучший способ заключается в следующем:
Вы можете иметь эту статическую функцию в общем классе.
источник
Короткий и точный код
источник
Самый элегантный способ - использовать встроенные методы .Net.
Эти методы:
Испытаны и проверены. Эти методы используются в моих собственных профессиональных проектах.
Используйте регулярные выражения внутри, которые являются надежными и быстрыми.
Сделано в Microsoft для C #. Нет необходимости изобретать велосипед.
Вернуть результат bool. True означает, что электронная почта действительна.
Для пользователей .Net 4.5 и выше
Добавьте эту ссылку в ваш проект:
Теперь вы можете использовать следующий код:
Пример использования
Вот несколько способов объявить:
... и код, демонстрирующий их в действии:
Кроме того, этот пример:
;
.Альтернатива, для пользователей версии .Net менее 4,5
Для ситуаций, когда .Net 4.5 недоступен, я использую следующее решение:
В частности, я использую:
источник
EmailAddressAttribute
чуть менее чем за четыре месяца, хотя этот действительно уловилnull
проблему.Если честно, в производственном коде лучшее, что я делаю, это проверяю
@
символ.Я никогда не в состоянии полностью проверять электронную почту. Вы знаете, как я вижу, было ли это действительно верно? Если это было отправлено. Если это не так, это плохо, если это так, жизнь хороша. Это все, что мне нужно знать.
источник
Я нахожу это регулярное выражение хорошим компромиссом между проверкой чего-то большего, чем просто знак @, и принятием странных крайних случаев:
Это, по крайней мере, заставит вас поместить что-то вокруг знака @, и, по крайней мере, поместит домен, который выглядит нормально.
источник
bob@companyinternal
?Проверка адреса электронной почты не так проста, как может показаться. На самом деле теоретически невозможно полностью проверить адрес электронной почты, используя только регулярное выражение.
Прочтите об этом в моем блоге для обсуждения этой темы и реализации F # с использованием FParsec. [/ shameless_plug]
источник
Вот мой ответ - решение Фила не подходит для однобуквенных доменов, таких как "somebody@q.com". Верьте или нет, это используется =) (идет к Centurylink, например).
Ответ Фила также будет работать только со стандартом PCRE ... поэтому C # примет его, но javascript будет бомбить. Это слишком сложно для JavaScript. Таким образом, вы не можете использовать решение Фила для атрибутов проверки mvc.
Вот мое регулярное выражение. Это будет хорошо работать с атрибутами валидации MVC.
- Все до @ упрощено, так что по крайней мере javascript будет работать. Я в порядке, расслабляющая проверка здесь, пока сервер обмена не дает мне 5.1.3. - Все после @ - это решение Фила, измененное для однобуквенных доменов.
Для людей, предлагающих использовать system.net.mail MailMessage (), эта возможность ПУТЬ гибкая. Конечно, C # примет электронное письмо, но затем сервер обмена взорвется с ошибкой во время выполнения 5.1.3, как только вы попытаетесь отправить электронное письмо.
источник
basket@ball
в качестве действительного адреса электронной почты, получило правильный ответ, а также все эти отрицательные отзывы. Спасибо, в любом случае!Если вы действительно, и я имею в виду, действительно хотите знать, является ли адрес электронной почты действительным ... попросите почтовый обменник доказать это, никаких регулярных выражений не требуется. Я могу предоставить код, если требуется.
Основные шаги следующие: 1. есть ли в адресе электронной почты часть имени домена? (индекс @> 0) 2. с помощью DNS-запроса спросить, есть ли у домена почтовый обменник 3. открыть tcp-соединение с почтовым обменником 4. с помощью протокола smtp открыть сообщение на сервер, используя адрес электронной почты в качестве получателя 5. разобрать ответ сервера. 6. Закройте сообщение, если вы сделали это далеко, все хорошо.
Это, как вы можете себе представить, очень дорогое время и требует SMTP, но это работает.
источник
Вообще говоря, регулярное выражение для проверки адресов электронной почты не так легко придумать; на момент написания этой статьи синтаксис адреса электронной почты должен соответствовать относительно большому количеству стандартов, и реализация всех из них в регулярном выражении практически неосуществима!
Я настоятельно рекомендую вам попробовать нашу EmailVerify.NET , зрелую библиотеку .NET, которая может проверять адреса электронной почты после всех текущими стандартами IETF (RFC 1123, RFC 2821, RFC 2822, RFC 3696, RFC 4291, RFC 5321 и RFC 5322). проверяет соответствующие записи DNS, проверяет, могут ли целевые почтовые ящики принимать сообщения и даже может сказать, является ли данный адрес доступным или нет.
Отказ от ответственности: я ведущий разработчик для этого компонента.
источник
источник
Если вы используете FluentValidation, вы можете написать что-то простое:
источник
небольшая модификация ответа @Cogwheel
источник
Console.WriteLine(MailAddress("asdf@asdf.").Address);
выводит "asdf @ asdf.", Что недопустимо .Здесь много сильных ответов. Однако я рекомендую сделать шаг назад. @Cogwheel отвечает на вопрос https://stackoverflow.com/a/1374644/388267 . Тем не менее, это может быть дорогостоящим в сценарии массовой проверки, если многие из проверяемых адресов электронной почты являются недействительными. Я предлагаю использовать немного логики, прежде чем мы войдем в его блок try-catch. Я знаю, что следующий код может быть написан с использованием RegEx, но это может быть дорого для новых разработчиков. Это моя двойная стоимость:
источник
Ответ с наибольшим количеством голосов от @Cogwheel - лучший ответ, однако я попытался реализовать
trim()
строковый метод, чтобы он урезал все пробелы пользователя от начала и до конца строки. Проверьте код ниже для полного примера-источник
SanitizeEmail(string email)
, используя результат этого метода для проверки и отправки электронного письма.источник
Проверьте правильность или неправильность формата электронной почты
System.Text.RegularExpressions
:источник
/ Использование внутреннего регулярного выражения, используемого при создании «new EmailAddressAttribute ();»; компонент в .Net4.5 >>> используя System.ComponentModel.DataAnnotations; // Для проверки адреса электронной почты ...... Проверено и работает.
Также Вы можете использовать это:
http://msdn.microsoft.com/en-us/library/01escwtf(v=vs.110).aspx
источник
Я обобщил ответ Пойсона 1 так:
источник
Простой способ идентифицировать emailid действителен или нет.
источник
Существует проблема культуры в регулярных выражениях в C #, а не в js. Поэтому нам нужно использовать регулярные выражения в режиме США для проверки электронной почты. Если вы не используете режим ECMAScript, ваши специальные языковые символы обозначаются в AZ с регулярным выражением.
источник
В итоге я использовал это регулярное выражение, поскольку оно успешно проверяет запятые, комментарии, символы Юникода и доменные адреса IP (v4).
Действительные адреса будут:
источник
Простой без использования Regex (который мне не нравится из-за плохой читаемости):
Примеры:
IsValidEmail("@b.com") // false
IsValidEmail("a@.com") // false
IsValidEmail("a@bcom") // false
IsValidEmail("a.b@com") // false
IsValidEmail("a@b.") // false
IsValidEmail("a b@c.com") // false
IsValidEmail("a@b c.com") // false
IsValidEmail("a@b.com") // true
IsValidEmail("a@b.c.com") // true
IsValidEmail("a+b@c.com") // true
IsValidEmail("a@123.45.67.89") // true
Он должен быть простым и поэтому не касается редких случаев, таких как электронные письма с доменами в квадратных скобках, которые содержат пробелы (как правило, разрешены), электронные письма с адресами IPv6 и т. Д.
источник
Вот ответ на ваш вопрос для вас, чтобы проверить.
источник
Основываясь на ответе @Cogwheel, я хочу поделиться модифицированным решением, которое работает для SSIS и «Компонент скрипта»:
Поместите этот код в правильный метод:
Затем вы можете использовать условное разделение, чтобы отфильтровать все недействительные записи или все, что вы хотите сделать.
источник