c#电子邮件验证,被MailAddress行为混淆:'john @gmail。'已验证?

时间:2011-08-24 09:47:52

标签: c# email-validation

关于电子邮件验证的又一个问题,对不起。

就像一个好的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 个答案:

答案 0 :(得分:4)

我认为在这种情况下,MS实施的有效电子邮件地址不正确,至少按照RFC822。我实际上没有尝试过你的代码,所以我假设你的代码就像你说的那样。

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

答案 1 :(得分: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和邮箱检查。

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

答案 2 :(得分:1)

以某种方式固定版本,混合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;
            }
        }

答案 3 :(得分: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);
            }
        }
    }
}

答案 4 :(得分:0)

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

see DotAtomReader used by MailAddressParser

答案 5 :(得分:0)

不是免费解决方案,但Cobisi's email validation library可以判断电子邮件是否在不同的准确度范围内有效(语法,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
}

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