c # проверка электронной почты, смущенная поведением MailAddress: 'john @ gmail.' является действительным? - PullRequest
4 голосов
/ 24 августа 2011

еще один вопрос о проверке электронной почты, извините за это.

Как хороший мальчик на C #, я использую объект MailAddress для проверки почтовых адресов.

Клиентмой вошел в следующий адрес, который был проверен MailAddress, и сломал мой софт:'john@gmail.'

Знаете ли вы, как перехватить такие поддельные почтовые адреса?

Редактировать: Проблема, которую я заявляю, заключается в том, что приведенный ниже код должен выдавать исключение с вводом, например, john @ gmail., но это не так.

 static void Main(string[] args)
        {
            string addressmail =string.Empty;

            try
            {
                MailAddress mail = new MailAddress(@"john@gmail.");
                addressmail = mail.Address;
            }
            catch (FormatException)
            {
                //address is invalid
            }

            //address is valid
            Console.WriteLine(addressmail);
        }

Ответы [ 6 ]

4 голосов
/ 25 августа 2011

Тип MailAddress имеет очень ограниченную поддержку для проверки адресов электронной почты и, начиная с .NET 4.0, не поддерживает большинство связанных стандартов IETF.Если вам нужно проверить синтаксис ваших адресов электронной почты, возможно, без использования регулярных выражений , я предлагаю вам взглянуть на EmailVerify.NET , компонент .NET, поддерживающий все текущие стандарты о предмете (RFC 1123, RFC 2821, RFC 2822, RFC 3696, RFC 4291, RFC 5321 и RFC 5322).При необходимости компонент даже позволяет выполнять дополнительные проверки адресов, включая проверки DNS, SMTP и почтовых ящиков.

Отказ от ответственности: Я ведущий разработчик этого продукта.

4 голосов
/ 24 августа 2011

Я думаю, что в этом случае реализация действительного адреса электронной почты MS неверна, по крайней мере, согласно RFC822 . Я на самом деле не пробовал ваш код, поэтому я предполагаю, что он делает так, как вы говорите.

Существуют и другие способы проверки адресов электронной почты, такие как фактическое подключение к SMTP-серверу и запрос его подтверждения о правильности адреса (как объяснено здесь и здесь ). Если не делать этого, у вас всегда будет немного проблем. Лично я не думаю, что стоит тратить слишком много времени на проверку адреса электронной почты в соответствии с какой-либо спецификацией (помимо быстрых проверок, которые мы имеем в нашем распоряжении; например, ваш код) - реальный тест - это то, получено ли письмо на этот адрес если вы отправите это. Простая проверка по электронной почте может подтвердить это, хотя я знаю, что это может не подходить во всех случаях, но в тех случаях вам не повезло.

1 голос
/ 10 августа 2017

MailboxValidator имеет бесплатный API, который вы можете использовать.Просто нужно подписаться на бесплатный тарифный план API на http://www.mailboxvalidator.com/plans#api, тогда часть интеграции довольно проста, поскольку у них также есть класс C # http://www.mailboxvalidator.com/dotnet, чтобы вы могли обернуть вызовы API.

Коды классов C # находятся в https://github.com/MailboxValidator/mailboxvalidator-csharp

Чтобы установить класс MailboxValidator SingleValidation через 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("example@example.com");

                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);
            }
        }
    }
}
1 голос
/ 24 августа 2011

Каким-то образом исправленная версия, смешивающая MailAddress и простое регулярное выражение для проверки хоста:

Статическое регулярное выражение в соответствии с рекомендациями 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;
            }
        }
0 голосов
/ 09 августа 2017

Не бесплатное решение, но Библиотека проверки электронной почты Cobisi может определить, является ли электронная почта действительной или нет с различным уровнем точности (синтаксис, IspSpecificSyntax, DeaDomain, Dns, DeaMailExchanger, Smtp, Mailbox, CatchAll)

var engine = new VerificationEngine();
var result = engine.Run("john@example.com",
                        VerificationLevel.Mailbox).Result;

if (result.LastStatus == VerificationStatus.Success)
{
    // TODO: Show a message box with the great news
}

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

0 голосов
/ 12 августа 2016

MailAddress пытается быть совместимым с RFC2822, который устарел RFC822.Когда вы читаете исходный код MailAddress, вы видите, что конечная точка принята только для совместимости с некоторыми почтовыми клиентами.Проверка адреса электронной почты с помощью регулярных выражений не является правильным решением (см. RFC2822), лучший способ - реализовать синтаксический анализатор, что и сделал MailAddress.

см. DotAtomReader, используемый MailAddressParser

...