Проверка адреса электронной почты

c#,.net,email,

26

Ответов: 10


21 принят

Вы можете просто разделить строку электронной почты на запятую и проверить каждый адрес электронной почты с помощью простого (или огромного) регулярного выражения электронной почты. Или попробуйте создать MailAddressобъект; он также поддерживает некоторую базовую проверку адреса.


30

Это код, который мы имеем на производстве (даже добавили запятую для вас). Обычно вы не должны использовать try / catch для проверки, но он хорошо работает здесь. Я считаю, что это лучше, чем пытаться перекодировать валидатор.

string[] allToAddresses = to.Split(";,".ToCharArray(),
                                 StringSplitOptions.RemoveEmptyEntries)
foreach (string toAddress in allToAddresses)
    {
        try
        {
            message.To.Add(toAddress);
        }
        catch (FormatException)
        {
            //do nothing, illformed address. screw it.
        }
    }

22

В настоящее время мы используем следующую функцию, и она работает достаточно хорошо для нас :)

public static bool IsValidEmail(string email)
{
    // source: http://thedailywtf.com/Articles/Validating_Email_Addresses.aspx
    Regex rx = new Regex(
    @"^[-!#$%&'*+/0-9=?A-Z^_a-z{|}~](.?[-!#$%&'*+/0-9=?A-Z^_a-z{|}~])*@[a-zA-Z](-?[a-zA-Z0-9])*(.[a-zA-Z](-?[a-zA-Z0-9])*)+$");
    return rx.IsMatch(email);
}

Пожалуйста, используйте это:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[x01-x08x0bx0cx0e-x1fx21x23-x5bx5d-x7f]|\[x01-x09x0bx0cx0e-x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[x01-x08x0bx0cx0e-x1fx21-x5ax53-x7f]|\[x01-x09x0bx0cx0e-x7f])+)])

13

Проверка на 100% RFC-совместимую электронную почту является трудной , см. Этот ответ для деталей. В .NET два относительно простых способа - использовать MailAddress

try {
    new MailAddress("invalid_email");
} catch (FormatException) {
    // invalid
}

Или более строгий подход на основе Regex из MSDN (обрабатывает тайм-аут синтаксического анализа IDN и Regex для .NET 4.5):

// NET 4.0
Boolean mappingInvalid = false;
emailString = Regex.Replace(emailString, @"(@)(.+)$", match => {
    String domainName = match.Groups[2].Value;
    try {
        domainName = new IdnMapping().GetAscii(domainName);
    } catch (ArgumentException) {
        mappingInvalid = true;
    }
    return match.Groups[1].Value + domainName;
});
if (mappingInvalid) {
    return false;
}
return Regex.IsMatch(emailString,
        @"^(?("")(""[^""]+?""@)|(([0-9a-z]((.(?!.))|[-!#$%&'*+/=?^`{}|~w])*)(?<=[0-9a-z])@))" +
        @"(?([)([(d{1,3}.){3}d{1,3}])|(([0-9a-z][-w]*[0-9a-z]*.)+[a-z0-9]{2,17}))$",
        RegexOptions.IgnoreCase);

5 ов

Следующее проверит, что адрес электронной почты имеет правильную форму (а не то, что на самом деле существует):

private bool isEmail(string inputEmail)
{
    Regex re = new Regex(@"^[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}$",
                  RegexOptions.IgnoreCase);
    return re.IsMatch(inputEmail);
}

Я обновил это с помощью более простого выражения (включая нечувствительность к регистру), чтобы, надеюсь, сделать его немного яснее.

Ниже приведены основы кода, которые подтвердят, что домен действительно существует:

private bool isRealDomain(string inputEmail)
{
    bool isReal = false;
    try
    {
        string[] host = (inputEmail.Split('@'));
        string hostname = host[1];

        IPHostEntry IPhst = Dns.GetHostEntry(hostname);
        IPEndPoint endPt = new IPEndPoint(IPhst.AddressList[0], 25);
        Socket s = new Socket(endPt.AddressFamily,
                SocketType.Stream, ProtocolType.Tcp);
        s.Connect(endPt);
        s.Close();
        isReal = true;
    }
    catch (<specific exceptions here>)
    {
    }

    return isReal;
}

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

C # ,. сети, электронная почта,
Похожие вопросы
Яндекс.Метрика