首页 > 解决方案 > 如何检测电子邮件地址是否真实

问题描述

重要的

我被hotmail服务屏蔽了。有一种叫做 spamhaus 的控制机制把我踢了出去。我现在被困住了。

我正在尝试检测一个电子邮件地址是否有效,如果它有效,然后检查该电子邮件地址是否可能被使用(我知道它不确定)。例如,假设有一个带有 domain 的网站myimaginarydomain.com。如果我在下面运行代码,我想它不会失败,因为域地址是有效的。但是没有人可以使用该域的电子邮件地址。

有什么方法可以查出该电子邮件地址是否有效?(在这种情况下无效)

    public class Application {
        private static EmailValidator validator = EmailValidator.getInstance();
        
        public static void main(String[] args) {
            while (true) {
                Scanner scn = new Scanner(System.in);
                String email = scn.nextLine();
                boolean isValid = validateEmail(email);
                System.out.println("Syntax is : " + isValid);
    
                if (isValid) {
                    String domain = email.split("@")[1];
                    try {
                        int test = doLookup(domain);
                        System.out.println(domain + " has " + test + " mail servers");
                    } catch (NamingException e) {
                        System.out.println(domain + " has 0 mail servers");
                    }
                }
            }
        }
    
        private static boolean validateEmail(String email) {
            return validator.isValid(email);
        }
    
        static int doLookup(String hostName) throws NamingException {
            Hashtable env = new Hashtable();
            env.put("java.naming.factory.initial",
                    "com.sun.jndi.dns.DnsContextFactory");
            DirContext ictx = new InitialDirContext(env);
            Attributes attrs =
                    ictx.getAttributes(hostName, new String[]{"MX"});
            Attribute attr = attrs.get("MX");
            if (attr == null) return (0);
            return (attr.size());
        }
    }

标签: javaemail

解决方案


在所有情况下都没有故障安全的方法来做到这一点,但是,假设服务器使用 SMTP,那么https://www.labnol.org/software/verify-email-address/18220/就一种方法提供了一个很好的教程,可能工作。

本教程中使用的方法依赖于操作系统工具,因此您需要在使用它们之前确保它们存在。可能会有所ProcessBuilder帮助。或者,您可以直接在代码中打开套接字,避免使用依赖于操作系统的工具。

本质上,您找出邮件服务器是什么(使用 nslookup),然后 telnet 到其中一个邮件服务器并开始编写电子邮件:

3a:连接邮件服务器:

telnet gmail-smtp-in.l.google.com 25

3b:向其他服务器问好

HELO

3c:用一些虚构的电子邮件地址来表明自己的身份

mail from:<labnol@labnol.org>

3d:输入您要验证的收件人的电子邮件地址:

rcpt to:<billgates@gmail.com>

命令的服务器响应rcpt to将使您了解电子邮件地址是否有效。如果地址存在,您会得到“OK”,否则会出现 550 错误


推荐阅读