为什么MailAddress不拒绝电子邮件地址someName @gmail?

时间:2018-02-20 01:12:38

标签: c# .net

我使用MailAddress尝试验证给定的电子邮件。

当我给它一个像#34; someName @ gmail"这样的字符串时,我会收到一封有效的电子邮件。

由于电子邮件最后缺少.com,我原以为它会因FormatException而失败。为什么没有在这里解析电子邮件?

public bool IsEmailValid(string emailaddress)
{
    try
    {
        MailAddress m = new MailAddress(emailaddress);
        return true;
    }
    catch (FormatException)
    {
        return false;
    }
}

2 个答案:

答案 0 :(得分:3)

x@host是一个合法格式的电子邮件地址。 MailAddress class仅查看字符串的格式,而不是地址的有效性。您必须解析主机名,向收件人发送电子邮件并等待退回邮件的缺失或存在回执以完全验证地址。

答案 1 :(得分:2)

someName@gmail实际上是完全有效的电子邮件地址,因为它符合email format specification(正式为IETF RFC2822)。但是,除非您的本地网络上有一个DNS名称为gmail的邮件服务器,否则它几乎肯定不可路由。

如果您想检查此特定问题,我建议您再次检查@符号后面是否有点。

编辑:请注意,这是您必须做出的商业决定。通过在.之后使用@使电子邮件地址无效,您违反了标准的电子邮件规范,但我觉得在99.99%的案例处理外部邮件时这是一个可以接受的权衡,以防止用户误输入myname@hotmailmyname@gmail(我打算在新的互联网用户中输入一个常见的错误)。

这个可能会阻止合法的外部电子邮件,比如我拥有TLD tt我可以拥有合法的电子邮件地址bob@tt,而像您这样的邮件处理系统应该处理我的地址没有抱怨。但是正如this answer中所指出的那样,这种情况非常罕见。

话虽如此,这里有一些代码可以达到这个目的:

public bool IsEmailValid(string emailaddress){
  if (emailaddress == null || !emailaddress.Contains("@") || !emailaddress.Split("@")[1].Contains("."))
  {
    return false; // Doesn't contain "@" or doesn't contain a "." after the "@" 
  }

  try
  {
      MailAddress m = new MailAddress(emailaddress);
      return true;
  }
  catch (FormatException)
  {
    return false;
  }
}

除非您的电子邮件地址范围非常有限,否则请勿尝试限制顶级域名。例如,仅允许.com.net.org将是一个很大的错误 - 在撰写时,有超过1500 TLDs的电子邮件地址可以想象地结束