【问题标题】:Is there any way to detect whether an email address belongs to an existing account?有什么方法可以检测电子邮件地址是否属于现有帐户?
【发布时间】:2011-10-13 11:27:06
【问题描述】:

有办法检测电子邮件 ID 是否格式正确。示例abcqs@def.com 是一个格式正确的电子邮件地址,但这可能是也可能不是有效的电子邮件帐户。

  • 案例1可能是域不存在(例如def.com这里)。
  • 案例 2 如果域有效则可能是 id 不存在 对于域(例如,def 域不存在 abcqs 用户名)。

如果它是无效的,那么如果我们发送邮件,我们会收到一些投递失败邮件,可能在发送邮件后的几个小时内。

我想实现一个类似的概念。我想验证一个email id是否属于一个有效的账户,这将找出该账户是否存在。

如何实现?

【问题讨论】:

  • 你能澄清你的问题吗?您似乎明白,虽然您可以将电子邮件地址的各个方面排除为无效,但在发送给它之前,您无法确定它是否有效。那你在问什么?如何实现邮件验证系统?
  • 如果我理解的话,他想在创建帐户时验证一封电子邮件是否有效。所以,是的,你的最后一个问题是正确的:电子邮件验证系统。
  • @T.J.Crowder,我有兴趣了解如何实施电子邮件验证系统
  • 你想制作一个像这个给定链接verify-email.org一样工作的程序吗?

标签: java email email-verification


【解决方案1】:

不幸的是,在您实际发送消息之前,您无法知道它是否有效,因为决定地址是否有效的是远程服务器。您的本地计算机只知道如何将消息路由到适当的域进行处理。

您可以根据需要检查域名是否解析,但您仍然不知道确切的电子邮件地址是否存在。

【讨论】:

  • 确实如此。有多种方法可以知道它是 invalid,但在发送给它之前你无法知道它是 valid。但我认为从问题中可以清楚地看出 OP 知道这一点(清楚的是他们希望我们帮助他们解决的问题)。
  • 详细来说,SMTP 协议有点允许这样做,但由于协议的工作方式,它与发送电子邮件相同,因为在任何消息内容发送之前尝试都会出错无论如何都流过。
【解决方案2】:

我认为更好的方法是发送电子邮件并验证用户激活帐户。

  1. 用户填写他的电子邮件
  2. 您创建一个供用户访问的链接,并将一些参数传递给他。示例:http://your.domain.com/activate?account=984239048302948203482390
  3. 您将电子邮件和所有信息保存在数据库中,并带有一个标志(一个字段),表明它尚未激活,以及您发送给他的代码
  4. 当他单击链接时,您将在您的站点中,在您编写的某些程序中收到该参数。这样你就知道参数984239048302948203482390被使用了
  5. 您验证该代码是否存在于您的数据库中并激活该帐户。

他已经验证过了。

您可以每隔x 天检查一次数据库,并删除所有旧条目,例如一个多星期前未验证的条目。

【讨论】:

    【解决方案3】:

    正如尼克发布的那样,在您发送之前您无法确定。但是,您可以通过编程方式检查给定域名的 MX 记录:http://stefanp.eu/blog/2009/09/dns-lookup-mx-records-java/。这解决了你的情况-1

    【讨论】:

      【解决方案4】:

      当您想要验证电子邮件地址时,请创建一个唯一编号并将其存储在与电子邮件地址对应的数据库中。然后向该地址发送一封电子邮件,其中包含返回您网站的链接。链接应具有唯一编号作为参数。电子邮件应该是这样的:

      单击此处验证您的电子邮件地址。

      一旦您的网站收到带有给定唯一编号的链接点击,您就知道该电子邮件地址是真实的。

      【讨论】:

      • 我无法点击该链接。请将其设为超链接
      【解决方案5】:

      验证电子邮件已在 SO 上讨论过 many, many times。简而言之,没有办法知道电子邮件地址/收件箱是否真的存在。一些服务器可能会帮助退回发往不存在的收件箱的电子邮件,但许多/大多数不会。

      此外,电子邮件格式的正则表达式验证也是一个失败的原因。这是最大化覆盖率和最小化误报之间的权衡。另外,当然还有不符合各种 RFC 的真实地址。所以我的建议是做一个简单的完整性检查:检查“@”字符是否存在。

      如果您想验证注册,请在电子邮件中包含一个包含用户 ID 和一些随机身份验证代码的链接。用户单击它来验证他的帐户。如果给他一个虚假地址,他将不会收到电子邮件,并且他的帐户也不会被验证。

      【讨论】:

        【解决方案6】:

        (投票赞成其他几个答案 - 同意用户电子邮件验证可能是最好的 - 但也想贡献 Henri 描述的这个简单版本的 DNS 验证。他发布的链接需要另一个库,但您至少可以这样做没有它的基本检查。)

        这是基本的域检查:

        public boolean isValidDomain(String domainName)
        {
            try
            {
                InetAddress.getByName(domainName);
                return true;
            }
            catch (UnknownHostException e)
            {
                return false;
            }
        }
        

        这是基本的 DNS MX 记录检查:

        public boolean isValidEmailDomain(String domainName)
        {
            try
            {
                DirContext ictx = new InitialDirContext();
                Attributes attrs = ictx.getAttributes("dns://" + dnsServer + "/" + domainName,
                                                      new String[] { "MX" });
                Attribute attr = attrs.get("MX");
                return (attr != null);
            }
            catch (NamingException e)
            {
                return false;
            }
        }
        

        在哪里dnsServerdoes not have to be used in some environments, but will have to be in others。您可能需要在那里进行试验。

        (所有引用的类都在java.netjavax.naming。)

        【讨论】:

          猜你喜欢
          • 2016-03-20
          • 2013-08-21
          • 2014-07-15
          • 1970-01-01
          • 2014-08-10
          • 2011-06-08
          • 1970-01-01
          • 2016-12-01
          • 2016-08-20
          相关资源
          最近更新 更多