С# проверка электронной почты, смущенная поведением MailAddress: "john @gmail". действует?
еще один вопрос по проверке электронной почты, извините за это.
Как хороший мальчик С#, я использую объект MailAddress для проверки почтовых адресов.
Клиент мой ввел следующий адрес, который был проверен MailAddress, и сломал мой soft: "john @gmail."
Знаете ли вы, как поймать этот вид фиктивных почтовых адресов?
Изменить: проблема, о которой я говорю, заключается в том, что приведенный ниже код должен генерировать исключение с помощью ввода, такого как john @gmail., но это не так.
static void Main(string[] args)
{
string addressmail =string.Empty;
try
{
MailAddress mail = new MailAddress(@"[email protected]");
addressmail = mail.Address;
}
catch (FormatException)
{
//address is invalid
}
//address is valid
Console.WriteLine(addressmail);
}
Ответы
Ответ 1
Я думаю, что в этом случае MS-версия действительного адреса электронной почты неверна, по крайней мере, по RFC822. Я на самом деле не пробовал ваш код, поэтому я предполагаю, что он делает, как вы говорите.
Существуют другие способы проверки адресов электронной почты, например, фактическое подключение к SMTP-серверу и запрос подтверждения, что адрес действителен (как описано здесь и здесь). Если вы этого не сделаете, у вас всегда будет немного проблем. Лично я не думаю, что стоит потратить слишком много времени на проверку адреса электронной почты в соответствии с какой-либо спецификацией (за пределами быстрых проверок, которые мы имеем в нашем распоряжении, например, вашего кода) - настоящий тест заключается в том, получено ли электронное письмо по этому адресу если вы его отправите. Простая проверка по электронной почте может подтвердить это, хотя я знаю, что это может быть неуместно во всех случаях, но в этом вам не повезло.
Ответ 2
Тип MailAddress имеет очень ограниченную поддержку для проверки адресов электронной почты, а с .NET 4.0 не поддерживает большинство связанных стандартов IETF. Если вам нужно проверить синтаксис своих адресов электронной почты, возможно, без использования регулярных выражений, я предлагаю вам взглянуть на EmailVerify.NET, компонент .NET, который поддерживает все текущие стандарты по данному вопросу (RFC 1123, RFC 2821, RFC 2822, RFC 3696, RFC 4291, RFC 5321 и RFC 5322). Если вам нужно, компонент даже позволяет выполнять дополнительные тесты по адресам, включая проверки DNS, SMTP и почтового ящика.
Отказ от ответственности: я являюсь ведущим разработчиком этого продукта.
Ответ 3
Как-то фиксированная версия, смешение MailAddress и простого Regex для проверки хоста:
Статическое регулярное выражение, как советовали SLaks
private static readonly Regex hostReg = new Regex(@"(\w+)\.(\w+)");
public bool IsMailAddress(string addParam)
{
try
{
MailAddress mail = new MailAddress(addParam);
string address = mail.Address;
//not handled by MailAdress, which is a shame
return hostReg.IsMatch(mail.Host);
}
catch (FormatException)
{
//address is invalid
return false;
}
catch (Exception)
{
return false;
}
}
Ответ 4
MailboxValidator имеет бесплатный API, который вы можете использовать. Просто нужно подписаться на бесплатный план API в http://www.mailboxvalidator.com/plans#api, тогда часть интеграции довольно проста, так как у них также есть класс С# http://www.mailboxvalidator.com/dotnet, чтобы вы могли обернуть вызовы API.
Коды классов С# находятся в https://github.com/MailboxValidator/mailboxvalidator-csharp
Чтобы установить класс SingleValidator MailboxValidator через NuGet (https://www.nuget.org/packages/MailboxValidator.SingleValidation/), запустите следующую команду в консоли диспетчера пакетов:
Install-Package MailboxValidator.SingleValidation
Затем вы можете просто использовать класс, как показано ниже:
using System;
using System.Windows.Forms;
using MailboxValidator;
namespace TestMailboxValidatorCSharp
{
public class TestMailboxValidatorCSharp
{
static void Main(string[] args)
{
var mbv = new SingleValidation("PASTE_YOUR_API_KEY_HERE");
String results = "";
try
{
MBVResult rec = mbv.ValidateEmail("[email protected]");
if (rec.ErrorCode == "")
{
results += "email_address: " + rec.EmailAddress + "\n";
results += "domain: " + rec.Domain + "\n";
results += "is_free: " + rec.IsFree + "\n";
results += "is_syntax: " + rec.IsSyntax + "\n";
results += "is_domain: " + rec.IsDomain + "\n";
results += "is_smtp: " + rec.IsSMTP + "\n";
results += "is_verified: " + rec.IsVerified + "\n";
results += "is_server_down: " + rec.IsServerDown + "\n";
results += "is_greylisted: " + rec.IsGreylisted + "\n";
results += "is_disposable: " + rec.IsDisposable + "\n";
results += "is_suppressed: " + rec.IsSuppressed + "\n";
results += "is_role: " + rec.IsRole + "\n";
results += "is_high_risk: " + rec.IsHighRisk + "\n";
results += "is_catchall: " + rec.IsCatchall + "\n";
results += "mailboxvalidator_score: " + rec.MailboxValidatorScore + "\n";
results += "time_taken: " + rec.TimeTaken + "\n";
results += "status: " + rec.Status + "\n";
results += "credits_available: " + rec.CreditsAvailable + "\n";
}
else
{
results += "error_code: " + rec.ErrorCode + "\n";
results += "error_message: " + rec.ErrorMessage + "\n";
}
results += "version: " + rec.Version + "\n";
MessageBox.Show(results);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + "\n" + ex.StackTrace);
}
}
}
}
Ответ 5
MailAddress пытается быть совместимым с RFC2822, который устаревает RFC822. Когда вы читаете исходный код MailAddress, вы видите, что конечная точка, принятая только для совместимости с некоторыми почтовыми клиентами.
Проверка адреса электронной почты с помощью регулярного выражения - это неправильная вещь (см. RFC2822), лучший способ - реализовать парсер, что сделал MailAddress.
см. DotAtomReader, используемый MailAddressParser
Ответ 6
Не бесплатное решение, но Библиотека проверки подлинности электронной почты Cobisi может определить, действительно ли адрес электронной почты действителен или нет с различным уровнем точности (Синтаксис, IspSpecificSyntax, DeaDomain, Dns, DeaMailExchanger, Smtp, Mailbox, CatchAll)
var engine = new VerificationEngine();
var result = engine.Run("[email protected]",
VerificationLevel.Mailbox).Result;
if (result.LastStatus == VerificationStatus.Success)
{
// TODO: Show a message box with the great news
}
Отказ от ответственности: я не связан с компанией или проектом.