【问题标题】:How to check if email is valid format or not如何检查电子邮件是否为有效格式
【发布时间】:2015-08-07 23:45:15
【问题描述】:

以下电子邮件格式无效

fulya_42_@hotmail.coö

但是到目前为止我发现并尝试使用 c# 的所有验证都说这是正确的电子邮件,但不是

如何使用 c# 4.5.2 验证电子邮件是否有效?谢谢

好的更新问题

我问的原因是当您尝试通过电子邮件发送此地址时,最大的电子邮件服务之一 mandrill api 会引发内部服务器错误

所以他们必须在尝试发送电子邮件之前使用某种验证。我的目标是在尝试之前找到他们使用什么来消除此类电子邮件,谢谢

【问题讨论】:

  • 以下电子邮件格式无效 是什么让你这么说?对我来说似乎是一个有效的地址。 coö 目前没有使用,但不能保证以后也不能使用。
  • 这不是一个有效的电子邮件地址吗?域部分允许使用非 ASCII 字符以适应国际化域名。据我所知,coö 不是当前使用的 TLD,但 C# 无法知道它永远不会被用作一个。
  • 如果您想检查 TLD 列表,ICANN 提供:data.iana.org/TLD/tlds-alpha-by-domain.txt
  • 验证电子邮件的唯一可靠方法是向该电子邮件发送验证链接。以您的示例为例,格式是 100% 正确的,但“.coö”(尚)不存在,因此它最终将无处可去。但是,如果有人错误地输入了地址的第一部分(例如 fulua_42_@hotmail.com),它也可能导致无处可去,除了发送验证电子邮件之外绝对没有其他方法可以检查它......
  • @SonerGönül 我说无效,因为 mandril api 抛出 500 内部错误。这意味着他们甚至不认为这是有效的尝试

标签: c# .net email-validation mandrill


【解决方案1】:

通过使用正则表达式

string emailID = "fulya_42_@hotmail.coö";

        bool isEmail = Regex.IsMatch(emailID, @"\A(?:[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\.)+[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?)\Z");

        if (isEmail)
        {
            Response.Write("Valid");
        }

【讨论】:

  • 您不应该使用正则表达式进行电子邮件地址验证,它是框架内置的!
【解决方案2】:

https://msdn.microsoft.com/en-us/library/01escwtf(v=vs.110).aspx查看以下课程

using System;
using System.Globalization;
using System.Text.RegularExpressions;

public class RegexUtilities
{
   bool invalid = false;

   public bool IsValidEmail(string strIn)
   {
       invalid = false;
       if (String.IsNullOrEmpty(strIn))
          return false;

       // Use IdnMapping class to convert Unicode domain names. 
       try {
          strIn = Regex.Replace(strIn, @"(@)(.+)$", this.DomainMapper,
                                RegexOptions.None, TimeSpan.FromMilliseconds(200));
       }
       catch (RegexMatchTimeoutException) {
         return false;
       }

        if (invalid)
           return false;

       // Return true if strIn is in valid e-mail format. 
       try {
          return Regex.IsMatch(strIn,
                @"^(?("")("".+?(?<!\\)""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" +
                @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))$",
                RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));
       }
       catch (RegexMatchTimeoutException) {
          return false;
       }
   }

   private string DomainMapper(Match match)
   {
      // IdnMapping class with default property values.
      IdnMapping idn = new IdnMapping();

      string domainName = match.Groups[2].Value;
      try {
         domainName = idn.GetAscii(domainName);
      }
      catch (ArgumentException) {
         invalid = true;
      }
      return match.Groups[1].Value + domainName;
   }
}

或在此处查看@Cogwheel 答案C# code to validate email address

【讨论】:

  • 您不应该使用正则表达式进行电子邮件地址验证,它是框架内置的!
  • @BrainSlugs83 请告诉我们它的内置位置。尝试捕获中的 new MailAddress() 失败,因为它也接受显示名称,而我发现的另一个类是使用 System.ComponentModel.DataAnnotations 的 EmailAddressAttribute.IsValid。
【解决方案3】:

电子邮件地址的正则表达式可以使用以下匹配:

 return Regex.IsMatch(strIn, 
              @"^(?("")(""[^""]+?""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" + 
              @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9]{2,17}))$", 
              RegexOptions.IgnoreCase);

参考MSDN

但在你的情况下:

fulya_42_@hotmail.coö

如果您正在检查来自“.coo”的电子邮件地址的有效性,根据您的观察,这是无效的,它不会显示任何错误,因为正则表达式没有验证,因此您必须手动添加一些域你接受喜欢:gmail.com、yahoo.com 等。

SonerGonul 的问题在 cmets 中说得对

谢谢

【讨论】:

  • 这个邮箱是否有效:pokemonozcan-24@hotmail.com
  • 我害怕这个问题!
  • 您不应该使用正则表达式进行电子邮件地址验证,它是框架内置的!
  • @BrainSlugs83,请尝试使用您的代码验证地址:“Abc.@example.com”、“Abc..123@example.com”、“fulya_42_@hotmail.coö”..跨度>
  • @tharif 下划线可以在电子邮件地址的local-part 中的任何位置使用(即使在末尾,甚至连续多个,甚至_._@example.com,您的代码无法识别为有效)。这是因为_ 是一个有效的atext 字符(由RFC 5322 定义);至于结尾/重复点,那些是无效的dot-atoms,因此,如果没有引号,这些地址将违反 RFC;但是,提供者需要对此进行监管(多年来,有些人没有)。 -- 我的猜测是 .NET 框架的创建者决定在这里谨慎行事。 ¯\_(ツ)_/¯
【解决方案4】:

首先,您提供的电子邮件地址是有效的格式。 -- 如果您愿意,您可以更进一步,验证域名是否有效;但无论哪种方式,您都应该验证所有权,在这种情况下,您将知道电子邮件地址和域是有效的。

其次,您真的应该使用正则表达式来验证电子邮件地址;电子邮件地址验证内置于 .NET 框架中,您不应该为这样的事情重新创建轮子。

执行两项检查的简单验证函数如下所示:

public static bool IsValidEmailAddress(string emailAddress, bool verifyDomain = true)
{
    var result = false;
    if (!string.IsNullOrWhiteSpace(emailAddress))
    {
        try
        {
            // Check Format (Offline).
            var addy = new MailAddress(emailAddress);

            if (verifyDomain)
            {
                // Check that a valid MX record exists (Online).
                result = new DnsStubResolver().Resolve<MxRecord>(addy.Host, RecordType.Mx).Any();
            }
            else
            {
                result = true;
            }
        }
        catch (SocketException)
        {
            result = false;
        }
        catch (FormatException)
        {
            result = false;
        }
    }

    return result;
}

要运行代码,您需要安装 NuGet 包 ARSoft.Tools.Net,这是 MX 记录查找*所必需的,并且您需要为使用的各种类添加适当的 using 声明(在VisualStudio 这些天)。

(*: 仅通过System.Net.Dns.GetHost* 检查有效的主机名是不够的,因为这可能会给您一些只有 MX 条目的域带来一些误报,例如admin@fubar.onmicrosoft.com 等)

【讨论】:

  • 我不知道 MX 记录验证,但是 new MailAddress("FooBar Some@thing.com") 会失败,因为它会导致 .DisplayName = FooBar 和 .Address = Some@thing。 com。我已经看到一个 return obj.Address = inputEmailAddress 作为解决方法。我正在寻找另一种.Net 方式,因为我认为自制正则表达式不是一个好方法。也许 System.ComponentModel.DataAnnotations 及其 EmailAddressAttribute.IsValid() 方法?
猜你喜欢
  • 1970-01-01
  • 2017-06-06
  • 2011-10-07
  • 2018-01-31
  • 2016-07-23
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多