2

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

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

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

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

如何实现?

4

6 回答 6

4

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

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

于 2011-07-26T14:25:54.360 回答
4

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

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

他已经验证了他们。

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

于 2011-07-26T14:28:08.557 回答
3

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

于 2011-07-26T14:28:16.803 回答
2

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

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

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

于 2011-07-26T14:31:47.170 回答
1

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

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

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

于 2011-07-26T14:28:30.983 回答
0

(投票赞成其他几个答案 - 同意用户电子邮件验证可能是最好的 - 但也想贡献 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;
    }
}

WherednsServer 不必在某些环境中使用,但必须在其他环境中使用。您可能需要在那里进行实验。

(所有引用的类都在java.net或中javax.naming。)

于 2011-07-26T19:02:06.080 回答