`
cnhawkwing
  • 浏览: 67034 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java查询MX记录

阅读更多

package org.cnhawk;

import org.xbill.DNS.*;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.*;


public class LookDNSMX{ 

    private Resolver resolver;
    private Cache cache;
    private int DNSCredibility;
    private static LookDNSMX instance=null;
    private Collection DNSServers = new Vector();
   
   
    //构造函数
    public LookDNSMX() throws Exception{
     this.initialize();
    }
    
 public static LookDNSMX getInstance() throws Exception{
  if(instance==null)
   instance=new LookDNSMX();
  return instance; 
 }
   //初始化
    public void initialize() throws Exception {
        DNSServers.add("10.0.1.1");
        final String serversArray[] = (String[])DNSServers.toArray(new String[0]);
        System.out.println("Current DNS server is : "+serversArray[0].toString());
        try {
            resolver = new ExtendedResolver(serversArray );
        } catch (UnknownHostException uhe) {
            throw uhe;
        }

        cache = new Cache (DClass.IN);
       
    }

    //主方法
    public synchronized Collection findMXRecords(String hostname)throws Exception {
        Record DNSAnswers[] =null;
        Collection MXServers = new Vector();
        //调用查看DNS的记录的方法,返回一个Record记录数组
        DNSAnswers=this.rawDNSLookup(hostname,false,Type.MX);
       
        if (DNSAnswers == null) {
            MXServers.add(hostname);
            System.out.println(hostname+" MX result is "+hostname+"\r");
            return MXServers;
        }
        MXRecord MXAnswers[] = new MXRecord[DNSAnswers.length];
        for (int i = 0; i < DNSAnswers.length; i++) {
            MXAnswers[i] = (MXRecord)DNSAnswers[i];
        }
     
        Comparator prioritySort = new Comparator () {
                public int compare (Object a, Object b) {
                    MXRecord ma = (MXRecord)a;
                    MXRecord mb = (MXRecord)b;
                    return ma.getPriority () - mb.getPriority ();
                }
            };

        Arrays.sort(MXAnswers, prioritySort);
        System.out.println("\n\n"+hostname+ "  MX result is:  ");
        String mxstr="";
        for (int i = 0; i < MXAnswers.length; i++) {
         mxstr=MXAnswers[i].getTarget ().toString ().trim();
            MXServers.add(mxstr.substring(0,mxstr.length()-1));
        }
        //System.out.println(hostname+ "  MX result is  \n"+mxstr);
        return MXServers;
    }
   
   
    /**
     * 根据给定的类型和主机名去查看DNS的记录
     * 返回一个Record记录数组
     *
     * @param hostname 被查看的主机名
     * @param querysent 这个查询是否已经被发送到DNS 服务器了
     * @param type 是要得到的记录类型
     */
   
    private Record[] rawDNSLookup(String hostname, boolean querysent, int type) {
      try{
        Name  name = Name.fromString(hostname, Name.root);
        short dclass = DClass.IN;
        Record [] DNSAnswers=null;
       
        SetResponse ResponseCached = cache.lookupRecords(name, type, DNSCredibility);
  if (ResponseCached.isSuccessful()) {
         
         return getDNSAnswers(ResponseCached);
        }
        else if (ResponseCached.isNXDOMAIN() || ResponseCached.isNXRRSET() || querysent) {
            return null;
        }
        else   
        {
            Record question = Record.newRecord(name, type, dclass);
            org.xbill.DNS.Message query = org.xbill.DNS.Message.newQuery(question);
            org.xbill.DNS.Message DNSresponse;
           
            try {
                DNSresponse = resolver.send(query);
            }catch (Throwable e) {
             e.printStackTrace();
                return null;
            }
               
            int rcode = DNSresponse.getHeader().getRcode();
            if (rcode == Rcode.NOERROR || rcode == Rcode.NXDOMAIN) {
                ResponseCached = cache.addMessage(DNSresponse);
                return getDNSAnswers(ResponseCached);
            }
   
            if (rcode != Rcode.NOERROR) {
                return null;
            }
        }
        return DNSAnswers;
      }catch (Exception e){
         e.printStackTrace();
         return null;
      }
       
    }
   
    private Record[] getDNSAnswers(SetResponse responseCached)
    {
        Record [] DNSAnswers=null;
  try
  {
   int answerCount = 0;
   int n = 0;
      RRset [] rrsets = responseCached.answers();
      for (int i = 0; i < rrsets.length; i++) {
          answerCount += rrsets[i].size();
      }
     
      DNSAnswers = new Record[answerCount];
      Iterator itor = null;
      for (int i = 0; i < rrsets.length; i++) {
          itor = rrsets[i].rrs();
          while (itor.hasNext()) {
              DNSAnswers[n++]= (Record)itor.next();
          }
   }
      }catch (Exception e){
         e.printStackTrace();
         return null;
      }
      return DNSAnswers;
    }
   
    //测试方法
    public static void main(String args[]){
     try{
      LookDNSMX  client= new  LookDNSMX();
      Collection col=client.findMXRecords("sina.com");
      Iterator it=col.iterator();
      while(it.hasNext())
      {
       System.out.println(it.next());
      }
      
      col=client.findMXRecords("handuancn.com");
      it=col.iterator();
      while(it.hasNext())
      {
       System.out.println(it.next());
      }
     }catch(Exception e){
      e.printStackTrace();
     }
    }
   
}

 

分享到:
评论
1 楼 sanshizi 2013-01-19  

相关推荐

    Internet邮件MX记录介绍.pdf

    Internet邮件MX记录介绍Internet邮件MX记录介绍Internet邮件MX记录介绍

    Java解析域名

    这些库提供了丰富的API来处理各种DNS查询类型,包括A记录(IP地址)、MX记录(邮件服务器)、CNAME记录(别名)等。 例如,使用`dnsjava`库解析域名的MX记录: ```java import org.xbill.DNS.*; public class ...

    org.xbill.DNS_java工具类.

    1. **查询IP地址**:使用`Resolver`进行A记录查询,获取指定域名的IP地址。 ```java Resolver resolver = new SimpleResolver("8.8.8.8"); // 使用Google DNS服务器 Record[] records = resolver.query(Name.from...

    安卓MX Player v1.43.11 纯净版.txt打包整理.zip

    4. **.txt文件**:TXT文件是一种纯文本格式,可能包含MX Player的使用指南、修改记录、开发者日志或者用户反馈等信息,方便用户了解软件的细节或解决问题。 5. **ZIP压缩文件**:ZIP是一种常见的文件压缩格式,用于...

    用java开发的dns,这里面是源代码

    2. DNS查询类型:如A记录(IPv4地址)、AAAA记录(IPv6地址)、MX记录(邮件服务器)、CNAME记录(别名)等。 3. Java网络编程:使用Java的Socket、DatagramPacket和InetAddress等类实现网络通信,与DNS服务器交互...

    Java邮件检验库 JEmval

    3. **MX记录验证**:JEmval不仅检查邮箱地址的格式,还会通过查询DNS的MX(邮件交换)记录来验证该地址是否实际存在于某个邮件服务器上。这一步可以防止因不存在的邮件服务器导致的邮件发送失败。 4. **SMTP验证**...

    javascript验证邮件地址和MX记录的方法

    通过使用正则表达式验证基本格式,再结合DNS查询验证MX记录,可以更全面地验证电子邮件地址的有效性。不过,考虑到性能和隐私问题,实际应用中可能只在必要时(如用户注册时)进行MX记录的验证。

    用java编写的dns内含源码和测试用例

    - `update.java`:可能包含DNS动态更新协议的实现,允许修改DNS记录,如A、MX、CNAME等。 2. **辅助文件**: - `Changelog`:记录了项目的变更历史,对于理解代码的演化和修复的bug有帮助。 - `examples.html`:...

    esmtp java实现方法

    `domainName.java`可能包含对域名处理的逻辑,例如验证域名的有效性或解析MX记录以找到邮件服务器。这在确定邮件服务器地址时非常有用。 总结一下,Java实现ESMTP邮件发送涉及的关键步骤包括:配置SMTP服务器信息、...

    【BUPT】北京邮电大学 DNS relay(JAVA).zip

    2. **DNS查询类型**:A记录(IP地址)、MX记录(邮件交换器)、CNAME记录(别名)、NS记录(名称服务器)等,以及如何在JAVA代码中处理这些查询。 3. **JAVA网络编程**:使用JAVA的Socket和ServerSocket类进行TCP/...

    基于Java的源码-DNS服务器 Eagle DNS.zip

    - **域名解析**:Eagle DNS能够处理各种类型的DNS查询,如A记录(将域名映射到IPv4地址)、AAAA记录(映射到IPv6地址)、MX记录(邮件服务器)和CNAME记录(别名)等。 - **动态更新**:支持DNS记录的动态更新,...

    基于java的邮件检验库 JEmval.zip

    通过查询DNS,它会验证邮件服务器的MX记录是否存在,从而判断邮件地址是否能成功接收邮件。 4. **易于使用**:JEmval库的API设计简洁,使用直观。开发者只需要调用几个方法,就可以轻松集成到项目中进行邮件地址...

    基于Java+sql教师信息管理系统课设报告

    修改和删除功能也有对应的代码实现,如在修改教师信息时,首先查询数据库确认教师存在,然后删除旧记录,最后添加更新后的信息。 在**运行环境和开发工具**方面,系统在Windows操作系统上运行,硬件要求相对较低,...

    Java入门笔记8_JavaTools

    `Options`可以包括调试选项如`-debug`,检查源文件是否更新的`-checksource`,设置类路径的`-classpath`,以及调整内存分配的`-mx`和`-ms`等。这些选项有助于优化程序的运行和调试。 2. **Java Compiler (javac)**...

    dns.zip_DNS Java_dns _java dns_zip

    1. **基本DNS查询**:`dnsjava`库允许开发者通过简单的API调用来执行A(IP地址)、MX(邮件交换器)、CNAME(别名)、PTR(反向查找)等类型的DNS查询。例如,你可以用以下代码查询一个域名的IP地址: ```java ...

    JAVA课程设计记事本

    该项目将日历与记事本功能相结合,为用户提供了一个方便的平台来记录和管理日常生活中的事件和提醒。以下是关于这个课程设计项目的详细知识点: 1. **项目背景与目标**: - Java语言是面向对象编程的重要工具,...

    基于java的学生信息管理系统设计报告

    - **前端技术**:Dreamweaver MX用于开发关联规则采掘系统。 - **后端技术**: - 数据库:采用SQL Server 2000作为数据存储。 - 数据库连接技术:使用JDBC-ODBC桥接技术实现Java应用程序与SQL Server的交互。 - ...

    java源码:DNS服务器 Eagle DNS.zip

    在Eagle DNS中,我们可以通过源码学习到DNS查询和响应的处理流程,包括DNS记录类型(如A、CNAME、MX等)的处理和解析。 Java源码是Eagle DNS的核心部分,它展示了如何利用Java的网络编程能力实现DNS服务。Java提供...

    java源码:Java邮件检验库 JEmval.zip

    1. **全面的邮件地址验证**:JEmval库能处理各种复杂的电子邮件地址,包括本地部分、域名、MX记录验证等,确保符合电子邮件地址的官方规范。 2. **高性能**:JEmval的设计考虑了性能优化,可以在处理大量邮件地址时...

    JAVA汽车维修管理系统论文.pdf

    本系统涉及的管理功能可能包括客户信息管理、维修记录管理、配件库存管理、财务结算等功能。从标题和描述中我们可以推测,该系统采用的是Web应用的开发方式,很可能是一个B/S(Browser/Server,浏览器/服务器)架构...

Global site tag (gtag.js) - Google Analytics