2013-03-06 7 views
3

Я создаю программу, чтобы перечислить всю запись MX домена. Сначала он работал нормально, но по сравнению с онлайн-инструментом http://mxtoolbox.com/. Есть домен, в котором программа не может получить запись MX, пока MXToolbox может.Список записей DNS DNSLookup MX. Как MXToolBox

Я не уверен, в чем причина или какая-либо конфигурация, которая требуется.

Большое спасибо;

Вот мой код.

import javax.naming.directory.Attribute; 
import javax.naming.directory.Attributes; 
import javax.naming.directory.InitialDirContext; 
import javax.naming.Context; 
import javax.naming.NamingEnumeration; 
import javax.naming.NamingException; 
import java.net.InetAddress; 
import java.net.UnknownHostException; 
import java.util.Hashtable; 

public class DNSLookup 
{ 
    private InitialDirContext iDirC; 

    public DNSLookup() 
    { 
     Hashtable<String, String> env = new Hashtable<String, String>(); 
     //env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); 
     //env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=JNDITutorial"); 
     env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.dns.DnsContextFactory"); 
     //env.put(Context.PROVIDER_URL, "dns://google.com"); 
     // get the default initial Directory Context 
     try { 
      iDirC = new InitialDirContext(env); 
     } catch (NamingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    private void lookup (String host, String record) 
    { 
     InetAddress inetAddress; 
     try { 
      inetAddress = InetAddress.getByName(host); 
      // show the Internet Address as name/address 
      System.out.println(inetAddress.getHostName() + " " + inetAddress.getHostAddress()); 

      // get the DNS records for inetAddress 
      Attributes attributes = iDirC.getAttributes("dns:\\"+inetAddress.getHostName()); 
      // get an enumeration of the attributes and print them out 
      //NamingEnumeration<?> attributeEnumeration = attributes.getAll(); 
/*   while (attributeEnumeration.hasMore()) 
      { 
       System.out.println("" + attributeEnumeration.next()); 
      } 
      attributeEnumeration.close();*/ 
      Attribute mxRecord = attributes.get(record); 
      for (int i=0; i<mxRecord.size();i++) 
       System.out.println(mxRecord.get(i)); 

     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (NamingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args){ 
     DNSLookup looker = new DNSLookup(); 
     looker.lookup("truetech.com", "MX"); 
    } 
} 

Вышеуказанный домен будет выдавать NullPointer, если нет записи MX. Пока MXToolBox выдаст один.

ответ

7

Я знаю, что это поздний ответ (но я надеюсь, что это поможет вам или кому-то еще).

Here's рабочее решение о том, как вы можете найти записи MX. Решение зависает с IntialDirContext и продолжает использовать атрибуты для определения того, какой тип атрибута требуется.

// Print out a sorted list of mail exchange servers for a network domain name 
import javax.naming.directory.Attribute; 
import javax.naming.directory.Attributes; 
import javax.naming.directory.InitialDirContext; 
import javax.naming.NamingException; 
import java.util.Arrays; 
import java.util.Comparator; 

public class MailHostsLookup 
{ 
    public static void main(String args[]) 
    { 
     // explain what program does and how to use it 
     if (args.length != 1) 
     { 
      System.err.println("Print out a sorted list of mail exchange servers "); 
      System.err.println(" for a network domain name"); 
      System.err.println("USAGE: java MailHostsLookup domainName"); 
      System.exit(-1); 
     } 
     try 
     { // print the sorted mail exhchange servers 
      for (String mailHost: lookupMailHosts(args[0])) 
      { 
       System.out.println(mailHost);    
      } 
     } 
     catch (NamingException e) 
     { 
      System.err.println("ERROR: No DNS record for '" + args[0] + "'"); 
      System.exit(-2); 
     } 
    } 

    // returns a String array of mail exchange servers (mail hosts) 
    //  sorted from most preferred to least preferred 
    static String[] lookupMailHosts(String domainName) throws NamingException 
    { 
     // see: RFC 974 - Mail routing and the domain system 
     // see: RFC 1034 - Domain names - concepts and facilities 
     // see: http://java.sun.com/j2se/1.5.0/docs/guide/jndi/jndi-dns.html 
     // - DNS Service Provider for the Java Naming Directory Interface (JNDI) 

     // get the default initial Directory Context 
     InitialDirContext iDirC = new InitialDirContext(); 
     // get the MX records from the default DNS directory service provider 
     // NamingException thrown if no DNS record found for domainName 
     Attributes attributes = iDirC.getAttributes("dns:/" + domainName, new String[] {"MX"}); 
     // attributeMX is an attribute ('list') of the Mail Exchange(MX) Resource Records(RR) 
     Attribute attributeMX = attributes.get("MX"); 

     // if there are no MX RRs then default to domainName (see: RFC 974) 
     if (attributeMX == null) 
     { 
      return (new String[] {domainName}); 
     } 

     // split MX RRs into Preference Values(pvhn[0]) and Host Names(pvhn[1]) 
     String[][] pvhn = new String[attributeMX.size()][2]; 
     for (int i = 0; i < attributeMX.size(); i++) 
     { 
      pvhn[i] = ("" + attributeMX.get(i)).split("\\s+"); 
     } 

     // sort the MX RRs by RR value (lower is preferred) 
     Arrays.sort(pvhn, new Comparator<String[]>() 
      { 
       public int compare(String[] o1, String[] o2) 
       { 
        return (Integer.parseInt(o1[0]) - Integer.parseInt(o2[0])); 
       } 
      }); 

     // put sorted host names in an array, get rid of any trailing '.' 
     String[] sortedHostNames = new String[pvhn.length]; 
     for (int i = 0; i < pvhn.length; i++) 
     { 
      sortedHostNames[i] = pvhn[i][1].endsWith(".") ? 
       pvhn[i][1].substring(0, pvhn[i][1].length() - 1) : pvhn[i][1]; 
     } 
     return sortedHostNames; 
    } 
} 
0

https://stackoverflow.com/a/14042816

рода несчастный, чтобы ответить со ссылкой на этот же сайт ... Может быть, кто-то может организовать пространство более виртуозно ...

использование dnsjava.

И снова это может быть не совсем то, что вы ищете ... Это не дает точных результатов, что и MxToolbox.

+0

Было бы более полезно, если бы вы могли извлечь соответствующую информацию из ответа, на который вы ссылались (сохраняя ссылку). – cpburnz

+0

Существует определенное положение для этого: пометите вопрос как дубликат вопроса, на который вы ссылаетесь. Тогда этот вопрос можно закрыть как дубликат (если согласны пользователи с более высоким разрешением). Вы никогда не должны отвечать на вопрос, просто ссылаясь на другой вопрос SO. – joran

 Смежные вопросы

  • Нет связанных вопросов^_^