为什么MailAddress认为'john@gmail.'是有效的电子邮件地址

本文关键字:有效 电子邮件地址 john@gmail MailAddress 为什么 认为 | 更新日期: 2023-09-27 18:06:26

像一个优秀的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);
}

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

为什么MailAddress认为'john@gmail.'是有效的电子邮件地址

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

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

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

  • EmailVerify。. NET网站:http://cobisi.com/email-validation/.net-component
  • 在线演示:http://cobisi.com/email-validation/validate-address

免责声明:我是这个产品的主要开发人员。

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

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

参见MailAddressParser使用的DotAtomReader

不是一个免费的解决方案,但Cobisi的电子邮件验证库可以在不同的精度级别(语法,IspSpecificSyntax, deaddomain, Dns, deamailexchange, 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
}

免责声明:本人与公司或项目无关

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类,请在Package Manager Console中运行以下命令:

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