메일박스의 DNS 및 MX 툴 클래스 가져오기

30855 단어

1. Maven DNS 패키지 가져오기

<dependency>
    <groupId>dnsjavagroupId>
    <artifactId>dnsjavaartifactId>
    <version>2.1.7version>
dependency>
<dependency>
    <groupId>commons-netgroupId>
    <artifactId>commons-netartifactId>
   <version>2.0version>
dependency>

 

2. DNS 도구 클래스: DNSUtil.java

import com.google.common.collect.Lists;
import org.xbill.DNS.*;
import java.util.ArrayList;
import java.util.List;
public class DNSUtil {
    class DNSType{
        public static final int MX=1;
        public static final int A=2;
    }
    public static List dnsALookup(final String adr)
    {
        List list= Lists.newArrayList();
        try {
            final Lookup lookup = new Lookup(adr, Type.A);
            lookup.setResolver(new SimpleResolver());
            lookup.setCache(null);
            final Record[] records = lookup.run();
            if (lookup.getResult() == Lookup.SUCCESSFUL)
                for (final Record record : records) {
                    if (record instanceof ARecord) {
                        final ARecord ptr = (ARecord) record;
                            list.add(ptr.getAddress().getHostAddress().toString());
                    }
                }
        }catch (Exception e){
            e.printStackTrace();
        }
        return list;
    }

    public static List mxByDomain(String host){
        try {

            DnsThread dnsThread=new DnsThread(host,DNSType.MX);
            dnsThread.start();
            dnsThread.join(5000);
            List dnsList=dnsThread.getDnsList();
            return dnsList;
        } catch (Exception e) {
            return new ArrayList();
        }
    }

    public static List reverseDNSLookup(final String adr)
    {
        List list= Lists.newArrayList();
        try {
            final Lookup lookup = new Lookup(adr, Type.MX);
            lookup.setResolver(new SimpleResolver());
            lookup.setCache(null);
            final Record[] records = lookup.run();
            if (lookup.getResult() == Lookup.SUCCESSFUL)
                for (final Record record : records) {
                    if (record instanceof MXRecord) {
                        final MXRecord ptr = (MXRecord) record;
                        list.add(ptr.getTarget().toString());
                    }
                }
        }catch (Exception e){
            e.printStackTrace();
        }
        return list;
    }

    public static class DnsThread extends Thread {

        private List dnsList = new ArrayList();
        private String host = "";
        private int type=0;

        DnsThread(String host,int type) {
            this.host = host;
            this.type=type;
        }


        @Override
        public void run() {
            lookup(host);
        }

        public void lookup(String host) {
            try {
                if(type==DNSType.MX)
                    this.dnsList = reverseDNSLookup(host);
                if(type==DNSType.A)
                    this.dnsList = dnsALookup(host);
            } catch (Exception e) {
            }
        }

        public List getDnsList() {
            return dnsList;
        }

        public void setDnsList(List dnsList) {
            this.dnsList = dnsList;
        }
    }

    public static void main(String[] args) {
        System.out.println(DNSUtil.dnsALookup("qq.com"));
        System.out.println(DNSUtil.mxByDomain("qq.com"));
    }

}

 

 

2. DNS 도구 클래스(개정): DNSUtils.java

package com.lyn.util;

import org.xbill.DNS.*;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.InitialDirContext;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;

public class DNSUtils{
    public static final Long TIMEOUT=3000l;
    class DNSType{
        public static final int MX=1;
        public static final int A=2;
    }

    public static List mxByDomain(String host){
        try {
            long a=System.currentTimeMillis();
            DnsThread dnsThread=new DnsThread(host,DNSType.MX);
            dnsThread.start();
            dnsThread.join(TIMEOUT);
            long b=System.currentTimeMillis();
            List dnsList=dnsThread.getDnsList();
            System.out.println(host+" "+Double.valueOf((b-a)/1000)+"s");
            return dnsList;
        } catch (Exception e) {
           return new ArrayList<>();
        }
    }

    public static List aByDomain(String host){
        try {
            long a=System.currentTimeMillis();
            DnsThread dnsThread=new DnsThread(host,DNSType.A);
            dnsThread.start();
            dnsThread.join(TIMEOUT);
            long b=System.currentTimeMillis();
            List dnsList=dnsThread.getDnsList();
//            System.out.println(host+"DNS "+Double.valueOf((b-a)/1000)+"s");
            return dnsList;
        } catch (Exception e) {
            return new ArrayList<>();
        }
    }

    public static List reverseDNSLookup(final String adr) throws Exception
    {
        List resultList=searchDNSList(adr);
        if(resultList.size()>0){
            return resultList;
        }

        List list= new ArrayList<>();
        final Lookup lookup = new Lookup(adr, Type.MX);
        lookup.setResolver(new SimpleResolver());
        lookup.setCache(null);
        final Record[] records = lookup.run();
        if (lookup.getResult() == Lookup.SUCCESSFUL)
            for (final Record record : records) {
                if (record instanceof MXRecord) {
                    final MXRecord ptr = (MXRecord) record;
                    list.add(ptr.getTarget().toString());
                }
            }
        return list;
    }

    /**

     * @param address  

     * @return

     */

    public static List searchDNSList(String address) {
        InitialDirContext context = null;
        String serverAddr="202.106.0.20";
        List resultList = new ArrayList();
        try {
            Hashtable env = new Hashtable();
            env.put("java.naming.factory.initial",
                    "com.sun.jndi.dns.DnsContextFactory");
            env.put("java.naming.provider.url", "dns://" + serverAddr + "/");
            env.put("com.sun.jndi.ldap.read.timeout", "5000");
            context = new InitialDirContext(env);
            String dns_attrs[] = { "MX" };
            Attributes attrs = context.getAttributes(address, dns_attrs);
            Attribute attr = attrs.get("MX");
            if (attr != null) {
                for (int i = 0; i < attr.size(); i++) {
                    String str=(String) attr.get(i);
                    if(str.indexOf(" ")!=-1)
                    resultList.add(str.split(" ")[1]);
                    else
                     resultList.add(str);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(context!=null){
                try {
                    context.close();
                } catch (NamingException e) {
                }
            }
        }
        return resultList;
    }

    public static List dnsALookup(final String adr) throws Exception
    {
        List list= new ArrayList<>();
        final Lookup lookup = new Lookup(adr, Type.A);
        lookup.setResolver(new SimpleResolver());
        lookup.setCache(null);
        final Record[] records = lookup.run();
        if (lookup.getResult() == Lookup.SUCCESSFUL) {
            for (final Record record : records) {
                if (record instanceof ARecord) {
                    final ARecord ptr = (ARecord) record;
                   list.add(ptr.getAddress().getHostAddress().toString());
                }
            }
        }
        return list;
    }

    public static class DnsThread extends Thread {
        private List dnsList = new ArrayList<>();
        private String host = "";
        private int type=0;
         DnsThread(String host,int type) {
            this.host = host;
            this.type=type;
        }

        @Override
        public void run() {
            lookup(host);
        }

        public void lookup(String host) {
            try {
                if(type==DNSType.MX)
                    this.dnsList = reverseDNSLookup(host);
                if(type==DNSType.A)
                    this.dnsList = dnsALookup(host);
            } catch (Exception e) {
            }
        }

        public List getDnsList() {
            return dnsList;
        }

        public void setDnsList(List dnsList) {
            this.dnsList = dnsList;
        }
    }

 
    public static void main(String[] args){
          String[] domain=new String[]{"gmail.com","xinnet.com","wo.cn","138.com"};
          for(String ss: domain) {
              List list = DNSUtils.mxByDomain(ss);
              System.out.println(" Mx length:"+list.size());
              System.out.println(" Mx:"+ JSONUtils.obj2json(list));
          }

//        long a=System.currentTimeMillis();
//         System.out.println(DNSUtils.mxByDomain("gmail.com"));
//        long b=System.currentTimeMillis();
//        System.out.println(b-a);
//        String domain=DNSUtils.mxByDomain("gmail.com").get(0);
//        System.out.println(DNSUtils.mxByDomain("xinnet.com"));
//        long c=System.currentTimeMillis();
//        System.out.println(c-b);
//        System.out.println(DNSUtils.aByDomain(domain));
//        long d=System.currentTimeMillis();
//        System.out.println(d-c);
//        long a=System.currentTimeMillis();
//        try {
//            System.out.println(DNSUtils.reverseDNSLookup("189.cn"));
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        System.out.println(System.currentTimeMillis()-a);
//        try {
//           List ip= DNSUtils.mxByDomain("qq");
//            System.out.println(ip);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
    }
}

좋은 웹페이지 즐겨찾기