有没有办法检测电子邮件地址是否属于现有帐户?

时间:2011-07-26 14:22:59

标签: java email email-verification

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

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

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

我想实现一个类似的概念。我想验证电子邮件ID是否属于有效帐户,以确定该帐户是否存在。

如何实现它?

6 个答案:

答案 0 :(得分:4)

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

如果您愿意,可以查看域名是否已解析,但您仍然不知道确切的电子邮件地址是否存在。

答案 1 :(得分:4)

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

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

    您可以每隔x天检查一次数据库,并删除所有旧条目,例如超过一周前未经过验证的条目。

答案 2 :(得分:3)

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

答案 3 :(得分:2)

在SO上讨论了many, many times验证电子邮件。简而言之,没有办法知道电子邮件地址/收件箱是否确实存在。某些服务器可能会有助于将发送到不存在的收件箱的电子邮件退回,但很多/大多数服务器都不会。

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

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

答案 4 :(得分:1)

如果您想要查找电子邮件地址,请创建一个唯一的号码,并将其存储在数据库中,并将其存储在电子邮件地址中。然后发送电子邮件到该地址,并返回您网站的链接。链接应具有唯一编号作为参数。电子邮件应该说像;

  

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

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

答案 5 :(得分:0)

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

这是基本的域名检查:

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

dnsServer does not have to be used in some environments, but will have to be in others的位置。你可能需要在那里试验。

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