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

кодек

$ritit = new RecursiveIteratorIterator(new RecursiveArrayIterator($myArray));
$result = array();
foreach ($ritit as $leafValue) {
    $keys = array();
    foreach (range(0, $ritit->getDepth()) as $depth) {
        $keys[] = $ritit->getSubIterator($depth)->key();
    }
    $result[ join('.', $keys) ] = $leafValue;
}

выход

Array
(
    [key1] => value1
    [key2.subkey] => subkeyval
    [key3] => value3
    [key4.subkey4.subsubkey4] => subsubkeyval4
    [key4.subkey4.subsubkey5] => subsubkeyval5
    [key4.subkey5] => subkeyval5
)

демо: http://codepad.org/YiygqxTM

Мне нужно иди, но если тебе понадобится объяснение этого завтра, спроси меня.

28
задан Uwe Keim 20 February 2018 в 06:01
поделиться

5 ответов

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

22
ответ дан 28 November 2019 в 02:17
поделиться

Это код, который у нас есть на производстве (для вас даже добавлена ​​запятая). Обычно вы не должны использовать 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.
        }
    }
31
ответ дан 28 November 2019 в 02:17
поделиться

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

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-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\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-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
24
ответ дан 28 November 2019 в 02:17
поделиться

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

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;
}

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

5
ответ дан 28 November 2019 в 02:17
поделиться

Да, разделите строку электронных писем по разделителю, а затем подтвердите каждый адрес электронной почты. вот пример, он не будет работать на втором адресе электронной почты (foo # bar.com). Я использовал регулярное выражение из элемента управления регулярным выражением asp.net для проверки адресов.

String email = "bar@foo.com;foo#bar.com";

String expression = @"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*";

Regex regex = new Regex(expression);

String[] emails = email.Split(new Char[] { ';' });

foreach (String s in emails)
{

    Match m = regex.Match(s);

    if (!m.Success)
     {
        // Validation fails.

     }
}
0
ответ дан 28 November 2019 в 02:17
поделиться
Другие вопросы по тегам:

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