6

像一个优秀的 C# 用户一样,我使用该MailAddress对象来验证电子邮件地址。

我的一个客户输入john@gmail.了他的电子邮件,该电子邮件由 验证MailAddress,并破坏了我的软件。我希望下面的代码会引发异常,但事实并非如此。

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

你知道如何捕捉这种虚假的邮件地址吗?

4

6 回答 6

4

我认为在这种情况下,MS 对有效电子邮件地址的实现是不正确的,至少按照RFC822。我还没有真正尝试过你的代码,所以我假设它按照你说的那样做。

还有其他验证电子邮件地址的方法,例如实际连接到 SMTP 服务器并要求它确认地址有效(如此此处所述)。如果不这样做,您总会遇到一些麻烦。就个人而言,我认为根据某些规范(除了我们可以使用的快速检查;例如您的代码)花太多时间验证电子邮件地址是不值得的 - 真正的测试是该地址是否收到电子邮件如果你发送它。一个简单的电子邮件验证可以确认这一点,虽然我知道它可能不适用于所有情况,但在那些情况下,你不走运。

于 2011-08-24T11:29:40.137 回答
4

MailAddress 类型对验证电子邮件地址的支持非常有限,并且从 .NET 4.0 开始,不支持大多数相关的 IETF 标准。如果您需要验证您的电子邮件地址的语法,可能不使用正则表达式,我建议您查看EmailVerify.NET,这是一个 .NET 组件,它支持有关该主题的所有当前标准(RFC 1123、RFC 2821 、RFC 2822、RFC 3696、RFC 4291、RFC 5321 和 RFC 5322)。如果您需要,该组件甚至允许对地址执行额外的测试,包括 DNS、SMTP 和邮箱检查。

免责声明:我是该产品的首席开发人员。

于 2011-08-24T22:01:37.883 回答
1

Somehow fixed version, mixing MailAddress and a simple Regex to validate the host:

Static regex, as advised by 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;
            }
        }
于 2011-08-24T14:14:32.737 回答
1

MailboxValidator 有一个免费的 API,您可以使用它。只需在http://www.mailboxvalidator.com/plans#api注册免费的 API 计划,集成部分就非常简单,因为它们还有一个 C#类http://www.mailboxvalidator.com/dotnet你来包装 API 调用。

C# 类代码在https://github.com/MailboxValidator/mailboxvalidator-csharp

要通过 NuGet ( https://www.nuget.org/packages/MailboxValidator.SingleValidation/ )安装 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);
            }
        }
    }
}
于 2017-08-10T01:09:15.417 回答
0

不是免费的解决方案,但Cobisi 的电子邮件验证库可以在不同的准确度级别(语法、IspSpecificSyntax、DeaDomain、Dns、DeaMailExchanger、Smtp、邮箱、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
}

免责声明:我与公司或项目无关。

于 2017-08-09T18:00:37.763 回答
0

MailAddress 尝试与淘汰 RFC822 的 RFC2822 兼容。当您阅读 MailAddress 的源代码时,您会看到它被接受的结束点只是为了与某些电子邮件客户端兼容。使用正则表达式验证电子邮件地址不是正确的做法(请参阅 RFC2822),最好的方法是实现解析器,就像 MailAddress 所做的那样。

请参阅 MailAddressParser 使用的 DotAtomReader

于 2016-08-12T15:55:42.993 回答