почтовая проверка в c# приложении winforms

Интерфейс является обещанием (или контракт).

, Поскольку это всегда с обещаниями - меньше лучше .

5
задан Ian Ringrose 30 July 2009 в 15:16
поделиться

8 ответов

Вы можете использовать регулярные выражения для проверки адресов электронной почты:

RegEx reg=new RegEx(@"^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$", RegexOptions.IgnoreCase); ///Object initialization for Regex 
if(reg.IsMatch("email string"))
    //valid email
9
ответ дан 18 December 2019 в 07:56
поделиться

Эта страница содержит правильное регулярное выражение, соответствующее адресам электронной почты.

Помните, что это только формальная проверка. Чтобы проверить, действительно ли существует адрес электронной почты, вы должны отправить фактическое письмо на этот адрес и проверить ответ почтового сервера.

И даже если это удастся, сервер SMTP может быть настроен на игнорирование неверных адресов получателей.

2
ответ дан 18 December 2019 в 07:56
поделиться

Лучшим способом было бы перенаправить эту задачу проверки на саму .NET:

public bool IsValidEmailAddress (string email)
{
    try
    {
        MailAddress ma = new MailAddress (email);

        return true;
    }
   catch
   {
        return false;
   }
}

Конечно, она будет выдавать ложные срабатывания на некоторых технически допустимых адресах электронной почты (с нелатинскими символами, например ), но поскольку он все равно не сможет отправлять на эти адреса, вы также можете отфильтровать их с самого начала.

8
ответ дан 18 December 2019 в 07:56
поделиться

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

0
ответ дан 18 December 2019 в 07:56
поделиться

Если вы хотите проверить формат адреса, вам, вероятно, следует использовать регулярное выражение. Существуют тысячи примеров, поэтому я позволю вам найти и выбрать лучший.

Если вы хотите подтвердить, что адрес существует, эта статья дает несколько советов о том, как это сделать. , без указания конкретных примеров кода.

1
ответ дан 18 December 2019 в 07:56
поделиться

Я использовал регулярное выражение из плагина JQuery, который проверяет на стороне клиента:

    public static bool ValidEmail(string email)
{
  var regex = new Regex(

@ "^ ((([az] | \ d | [! # \ $% & '* + - / = \? \ ^ {\ |} ~] | [\ u00A0- \ uD7FF \ uF900- \ uFDCF \ uFDF0- \ uFFEF]) + (\. ([Az] | \ d | [! # \ $% & '\ * \ + \ - \ / = \? \ ^ _ {\ |} ~] | [\ u00A0- \ uD7FF \ uF900- \ uFDCF \ uFDF0- \ uFFEF]) +) *) | ((\ x22) ((((\ x20 | \ x09) * (\ x0d \ x0a))? (\ x20 | \ x09) +)? (([\ x01- \ x08 \ x0b \ x0c \ x0e- \ x1f \ x7f] | \ x21 | [\ x23- \ x5b] | [\ x5d- \ x7e] | [\ u00A0- \ uD7FF \ uF900- \ uFDCF \ uFDF0- \ uFFEF]) | (\ ([\ x01- \ x09 \ x0b \ x0c \ x0d- \ x7f] | [\ u00A0- \ uD7FF \ uF900- \ uFDCF \ uFDF0- \ uFFEF])))) * (((\ x20 | \ x09) * (\ x0d \ x0a))? (\ x20 | \ x09) +)? (\ x22))) @ ((([az] | \ d | [\ u00A0- \ uD7FF \ uF900- \ uFDCF \ uFDF0- \ uFFEF]) | (([az] | \ d | [\ u00A0- \ uD7FF \ uF900- \ uFDCF \ uFDF0- \ uFFEF]) ([az] | \ d | - |. | | ~ | [ \ u00A0- \ uD7FF \ uF900- \ uFDCF \ uFDF0- \ uFFEF]) ([az] | \ d | [\ u00A0- \ uD7FF \ uF900- \ uFDCF \ uFDF0- \ uFFEF]))).) + (([az] | [\ u00A0- \ uD7FF \ uF900- \ uFDCF \ uFDF0- \ uFFEF]) | (([az] | [\ u00A0- \ uD7FF \ uF900- \ uFDCF \ uFDF0- \ uFFEF] ) ([az] | \ d | - |. | _ | ~ | [\ u00A0- \ uD7FF \ uF900- \ uFDCF \ uFDF0- \ uFFEF]) ([az] | [\ u00A0- \ uD7FF \ uF900- \ uFDCF \ uFDF0- \ uFFEF]))).? $ ", RegexOptions.Compiled);

  return regex.IsMatch(email);
}
0
ответ дан 18 December 2019 в 07:56
поделиться

Лучший способ - разделить его на две части с помощью '@' и отдельно проверить часть почтового ящика и часть домена. Я знаю, что существуют рег-экс, но они могут довольно быстро усложниться.

Раздел 3.4 RFC2822 полностью определяет действительный адрес электронной почты: ищите спецификацию для addr-spec ] и dot-atom .

По сути, часть почтового ящика представляет собой строку из одного или нескольких буквенно-цифровых символов или одного из!, #, $,%, &, ', *, + , -, /, =?, ^, _, `, {, |,}, ~ и точка '.'. Доменная часть подчиняется аналогичным правилам.

Учитывая гибкость, самым простым способом может быть простая проверка строки, чтобы узнать, есть ли в ней один '@', затем по отдельности проверьте почтовый ящик и домен, чтобы убедиться, что они содержат символы , а не в указанном выше наборе. Будет ли это выполнено с помощью регулярного выражения или каким-либо другим способом - это ваш выбор.

0
ответ дан 18 December 2019 в 07:56
поделиться

Используя статью Криса , я создал метод расширения для строк, который связывает воедино библиотеку DNSLookup (благодарность Биллу Андреоззи, billandr@towncompass.com в источнике ), реализация минимального Telnet Тома Янссенса ( http://www.corebvba.be ) и мой собственный RegEx для проверки адресов электронной почты:

/// <summary>
/// The regular expression to test the string against.
/// </summary>
private static readonly Regex validEmailRegex = new Regex(
    @"^(([^<>()[\]\\.,;:\s@\""]+"
    + @"(\.[^<>()[\]\\.,;:\s@\""]+)*)|(\"".+\""))@"
    + @"((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
    + @"\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+"
    + @"[a-zA-Z]{2,}))$",
    RegexOptions.Compiled);

/// <summary>
/// Determines whether the specified string is a valid email address.
/// </summary>
/// <param name="value">
/// The string to validate.
/// </param>
/// <returns>
/// <c>true</c> if the specified string is a valid email address;
/// otherwise, <c>false</c>.
/// </returns>
public static bool IsValidEmailAddress(this string value)
{
    if (!validEmailRegex.IsMatch(value))
    {
        return false;
    }

    var mailServer = new DNS().LookupMX(value.Split('@')[1]);

    if (!mailServer.MoveNext())
    {
        return false;
    }

    var telnet = new TelnetConnection(((DNS_MX_DATA)((DNS_WRAPPER)mailServer.Current).dnsData).pNameExchange, 25);

    try
    {
        if (!TelnetCompare(telnet.Read(), "220"))
        {
            return false;
        }

        telnet.WriteLine("helo hi");
        if (!TelnetCompare(telnet.Read(), "250"))
        {
            return false;
        }

        telnet.WriteLine("mail from: " + value);
        if (!TelnetCompare(telnet.Read(), "250"))
        {
            return false;
        }

        telnet.WriteLine("rcpt to: " + value);
        if (!TelnetCompare(telnet.Read(), "250"))
        {
            return false;
        }
    }
    finally
    {
        telnet.WriteLine("quit");
    }

    return true;
}

/// <summary>
/// Compares two strings for length and content from the Telnet stream.
/// </summary>
/// <param name="input">The input string.</param>
/// <param name="response">The desired response.</param>
/// <returns>true if the response is the first characters if the input,
/// false otherwise</returns>
private static bool TelnetCompare(string input, string response)
{
    if (string.IsNullOrEmpty(input) || string.IsNullOrEmpty(response))
    {
        return false;
    }

    if (input.Length < response.Length)
    {
        return false;
    }

    return string.CompareOrdinal(input.Substring(0, response.Length), response) == 0;
}
0
ответ дан 18 December 2019 в 07:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: