С# проверка электронной почты, смущенная поведением 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
}

Отказ от ответственности: я не связан с компанией или проектом.