Java校验邮箱有效性

使用正则表达式验证邮箱的格式是否有效;最后,查询邮箱的 DNS 记录来判断邮箱是否存在。 

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Scanner;

public class EmailValidator {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入邮箱地址:");
        String email = scanner.nextLine();
        scanner.close();
        
        boolean isValid = email.matches("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}");
        if (!isValid) {
            System.out.println("邮箱格式无效");
            return;
        }
        
        String domain = email.substring(email.indexOf("@") + 1);
        try {
            InetAddress inetAddress = InetAddress.getByName(domain);
            if (inetAddress == null) {
                System.out.println("邮箱不存在");
            } else {
                System.out.println("邮箱存在");
            }
        } catch (UnknownHostException e) {
            System.out.println("查询失败");
        }
    }


    /**
     * <dependency>
     *             <groupId>commons-net</groupId>
     *             <artifactId>commons-net</artifactId>
     *             <version>2.2</version>
     *         </dependency>
     *
     *         <dependency>
     *             <groupId>dnsjava</groupId>
     *             <artifactId>dnsjava</artifactId>
     *             <version>2.1.1</version>
     *         </dependency>
     * 
     */
    public static void main(String[] args) {
        String email = "445087460@qq.com";
        long start = System.currentTimeMillis();
        boolean b = checkEmail(email);
        long end = System.currentTimeMillis();
        System.out.println("耗时:" + (end-start));
        System.out.println("是否有效:" + b);
    }

    public static boolean checkEmail(String email) {
        if (!email.matches("[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+")) {
            return false;
        }
        String host = "";
        String hostName = email.split("@")[1];
        Record[] result = null;
        SMTPClient client = new SMTPClient();
        try {
            // 查找MX记录
            Lookup lookup = new Lookup(hostName, Type.MX);
            lookup.run();
            if (lookup.getResult() != Lookup.SUCCESSFUL) {
                return false;
            } else {
                result = lookup.getAnswers();
            }
            // 连接到邮箱服务器
            for (int i = 0; i < result.length; i++) {
                host = result[i].getAdditionalName().toString();
                client.connect(host);
                if (!SMTPReply.isPositiveCompletion(client.getReplyCode())) {
                    client.disconnect();
                    continue;
                } else {
                    break;
                }
            }
            //以下2项自己填写快速的,有效的邮箱
            client.login("163.com");
            // 发送人
            client.setSender("shyboy_fei@163.com");
            // 接收人
            client.addRecipient(email);
            if (250 == client.getReplyCode()) {
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                client.disconnect();
            } catch (IOException e) {
            }
        }
        return false;
    }
}

// 方式二:
package org.javaboy.mailserver.receiver;
import org.apache.commons.net.smtp.SMTPClient;
import org.apache.commons.net.smtp.SMTPReply;
import org.xbill.DNS.*;

import org.xbill.DNS.Record;

import java.io.IOException;

public class CheckEmailOK {

    public static final String SENDER_EMAIL = "no-reply@domain.com";//"no-reply@domain.com";
    public static final String SENDER_EMAIL_SERVER = SENDER_EMAIL.split("@")[1];//"domain.com";

        /**
         *
         * @param email  The recipient's email address, it need to be validate if it is real exists or doesn't exists.
         * @return True if email is real exists, false if not.
         */
        public boolean checkEmailMethod(String email) {
            if (!email.matches("[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+")) {
                System.err.println("Format error");
                return false;
            }

            String log = "";
            String host = "";
            String hostName = email.split("@")[1];
            Record[] result = null;
            SMTPClient client = new SMTPClient();
            client.setConnectTimeout(8000);  //设置连接超时时间,有些服务器比较慢

            try {
                // 查找MX记录
                Lookup lookup = new Lookup(hostName, Type.MX);
                lookup.run();
                if (lookup.getResult() != Lookup.SUCCESSFUL) {
                    log += "找不到MX记录\n";
                    return false;
                } else {
                    result = lookup.getAnswers();
                }
                // 连接到邮箱服务器

                for (int i = 0; i < result.length; i++) {
                    System.out.println(result[i].getAdditionalName().toString());
                    System.out.println(((MXRecord)result[i]).getPriority());
                }
                int count=0;
                for (int i = 0; i < result.length; i++) {
                    log="";
                    host = result[i].getAdditionalName().toString();
                    try{
                        client.connect(host);   //连接到接收邮箱地址的邮箱服务器
                    }catch(Exception e){        //捕捉连接超时的抛出的异常
                        count++;
                        if(count>=result.length){   //如果由MX得到的result服务器都连接不上,则认定email无效
                            log +="Connect mail server timeout...\n";
                            return false;
                        }
                    }

                    if (!SMTPReply.isPositiveCompletion(client.getReplyCode())) {   //服务器通信不成功
                        client.disconnect();
                        continue;
                    } else {
                        log += "MX record about " + hostName + " exists.\n";
                        log += "Connection succeeded to " + host + "\n";
                        log += client.getReplyString();

                        // HELO <$SENDER_EMAIL_SERVER>   //domain.com
                        try{
                            client.login(SENDER_EMAIL_SERVER);   //这一步可能会出现空指针异常
                        }catch(Exception e){
                            return false;
                        }
                        log += ">HELO "+SENDER_EMAIL_SERVER+"\n";
                        log += "=" + client.getReplyString();

                        client.setSender(SENDER_EMAIL);
                        if(client.getReplyCode()!=250){     //为解决hotmail有的MX可能出现=550 OU-001 (SNT004-MC1F43) Unfortunately, messages from 116.246.2.245 weren't sent.
                            client.disconnect();
                            continue;                           //把client.login 和client.setSender放在循环体内,这样所有的如果某mx不行就换其他mx,但这样会对无效的邮箱进行所有mx遍历,耗时
                        }
                        log += ">MAIL FROM: <"+SENDER_EMAIL+">\n";
                        log += "=" + client.getReplyString();
                        // RCPT TO: <$email>
                        try{
                            client.addRecipient(email);
                        }catch(Exception e){
                            return false;
                        }
                        log += ">RCPT TO: <" + email + ">\n";
                        log += "=" + client.getReplyString();

                        //最后从收件邮箱服务器返回true,说明服务器中能够找到此收件地址,邮箱有效
                        if (250 == client.getReplyCode()) {
                            return true;
                        }
                        client.disconnect();

                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    client.disconnect();
                } catch (IOException e) {
                }
                // print log
                System.out.println(log);
            }
            return false;
        }

        /**
         * This method is more accurate than checkEmailMethod(String email);
         *
         * @param email  The recipient's email address, it need to be validate if it is real exists or doesn't exists.
         * @return True if email is real exists, false if not.
         */
        public boolean checkEmail(String email){
            if(email.split("@")[1].equals("qq.com")){
                if( checkEmailMethod(email) && checkEmailMethod(email) && checkEmailMethod(email)){
                    return true;
                }else{
                    return false;
                }
            }
            return checkEmailMethod(email);
        }

}

package org.javaboy.mailserver.receiver;

public class CheckEmailTest {

    public static void main(String[] args) {

        CheckEmailOK ce = new CheckEmailOK();

        long start = System.currentTimeMillis();
        boolean b = ce.checkEmail("19asdas6@163.com");
        long end = System.currentTimeMillis();
        System.out.println("耗时:" + (end-start));
        if(b){
            System.out.println("true");
        }else{
            System.out.println("false");
        }
    }
}

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值