Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在asp.net中是否有验证电子邮件地址的功能?_Asp.net_Email - Fatal编程技术网

在asp.net中是否有验证电子邮件地址的功能?

在asp.net中是否有验证电子邮件地址的功能?,asp.net,email,Asp.net,Email,我注意到,如果您尝试向无效地址发送电子邮件,则会引发异常: MailAddress To=new MailAddress("invalidemailaddress","recipientname"); 抛出: "The specified string is not in the form required for an e-mail address" 这意味着必须有一个在MailAddress中执行的.Net函数来检查电子邮件地址是否有效。有没有办法直接调用这个“验证”函数?这样,我就不

我注意到,如果您尝试向无效地址发送电子邮件,则会引发异常:

MailAddress To=new MailAddress("invalidemailaddress","recipientname");
抛出:

 "The specified string is not in the form required for an e-mail address"

这意味着必须有一个在MailAddress中执行的.Net函数来检查电子邮件地址是否有效。有没有办法直接调用这个“验证”函数?这样,我就不需要创建自己的IsValid函数。

不,但您可以创建一个:

public bool ValidateEmailAddress (string email)
{
   if (string.IsNullOrEmpty (email)) return false;

    try
    {
        MailAddress to = new MailAddress (email);

        return true;
    }
    catch (WhateverException e)
    {
        return false;
    }
}

回答评论。我知道这种技术被认为是不好的,而且是有道理的。我想指出的是,这种方法将100%保证.NET邮件库最近能够发送到经过验证的地址。正则表达式(其中有很多)的问题是,根据规范,每个正则表达式都会处理一组技术正确的地址中的一个子集。一个比.NET内部定义的子集更窄,另一个比.NET内部定义的子集更宽。如果要使用正则表达式验证,那么在第一种情况下,正则表达式将切断一部分有效地址(如.NET所示),在后一种情况下,validation将允许通过.NET邮件库根据其自身的内部验证不会视为无效的地址。确保有效集100%匹配.NET集(或您将使用的任何其他第三方库)的一个真正方法是采用try/catch方法,当然,除非该第三方库已经提供了一些验证方法。

不幸的是,遗憾的是,如果不对其进行反向工程或使用特定的异常,就无法获得该功能

验证电子邮件地址的传统方法始终是使用正则表达式,但如果您愿意,您可以使用更长的时间来进一步验证电子邮件:


有一个电子邮件验证的好例子

原始源代码由以下人员编写:


您可以编写自己的类:

class EmailAddress
{
  private MailAddress _email;

  public string Address
  {
    get
    {
      return _email == null ? string.Empty : _email.Address;
    }
  }

  public string DisplayName
  {
    get
    {
      return _email == null ? string.Empty : _email.DisplayName;
    }
  }

  public string Host
  {
    get
    {
      return _email == null ? string.Empty : _email.Host;
    }
  }

  public string User
  {
    get
    {
      return _email == null ? string.Empty : _email.User;
    }
  }

  public EmailAddress(string email)
  {
    try {
      _email = new MailAddress(email);
    }
    catch (Exception) {
      _email = null;
    }
  }

  public EmailAddress(string email, string displayName)
  {
    try {
      _email = new MailAddress(email, displayName);
    }
    catch (Exception) {
      _email = null;
    }
  }

  public EmailAddress(string email, string displayName, Encoding displayNameEncoding)
  {
    try {
      _email = new MailAddress(email, displayName, displayNameEncoding);
    }
    catch (Exception) {
      _email = null;
    }
  }

  public bool IsValid()
  {
    return _email == null ? false : true;
  }

  public override string ToString()
  {
    return this.Address;
  }
}
现在,您可以将其用作
邮件地址
,但如果电子邮件地址无效,则不会出现例外情况。而是调用
IsValid
方法:

var email = new EmailAddress("user@host.com");
if (email.IsValid()) {
  ...
}
else {
  ...
}

是的,有这样一个.Net函数,但它的功能是无法通过“标准”方式访问的:MailAddress使用私有的
ParseAddress
方法,该方法反过来使用
System.Net.Mime.MailBnfHelper
。后者是一个
内部
类,因此在框架之外不容易访问


因此,使用这些函数的唯一方法是使用反射,我强烈建议不要使用反射。由于这些函数没有文档记录,并且在没有反射的情况下不可访问,因此它们的实现可能会更改,并且您的代码可能会在未来版本的框架中中断。

Ouch。作为流控制的异常处理:(其中一件事是你不应该做的,但它在实践中从来不会引起任何问题。到目前为止,这是最可接受的答案。在这种情况下,为了处理的准确性,可以忽略糟糕的编码实践。在.Net根据其规则打开面向公众的验证方法之前,我将使用这种方法即使只是为了方便。在我的书中有一个有效的折衷方案不幸的是,这些正则表达式验证在某些情况下没有什么意义。如果您打算使用.NET邮件库发送邮件,您需要确保您的验证与库中的验证完全相同。否则,您的验证会切断一部分格式良好的邮件地址,或者它将允许通过.NET邮件程序无法处理的地址。请记住。
var email = new EmailAddress("user@host.com");
if (email.IsValid()) {
  ...
}
else {
  ...
}