如何检查电子邮件是否为有效格式

本文关键字:是否 有效 格式 电子邮件 何检查 检查 | 更新日期: 2023-09-27 17:50:52

以下邮件格式无效

fulya_42_@hotmail.coö
但是到目前为止,我用c#找到和尝试的所有验证都说这是正确的电子邮件,而不是

我如何验证电子邮件是有效的或不与c# 4.5.2?谢谢你

Ok更新问题

我问的原因是一个最大的电子邮件服务mandrill api抛出内部服务器错误当你试图发送这个地址

所以他们在试图发送电子邮件之前一定使用了某种验证。我的目的是找出他们是用什么来消除这些邮件之前,谢谢你

如何检查电子邮件是否为有效格式

使用Regex

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

从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#代码验证电子邮件地址

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

 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在评论中正确地回答了这个问题

谢谢

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

其次,你真的应该而不是使用Regex来验证电子邮件地址;电子邮件地址验证是。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等)