switch getMailExchangerIPs() to DNSUtil
[org.ibex.mail.git] / src / org / ibex / mail / DNSUtil.java
index 7ad56c8..3e066c7 100644 (file)
@@ -2,8 +2,12 @@ package org.ibex.mail;
 import java.io.*;
 import java.util.*;
 import java.net.*;
+import org.ibex.util.*;
+import org.ibex.net.*;
 import org.xbill.DNS.*;
 import org.xbill.DNS.Message;
+import javax.naming.*;
+import javax.naming.directory.*;
 
 public class DNSUtil {
 
@@ -15,4 +19,43 @@ public class DNSUtil {
         return answers.length==0 ? null : answers[0].rdataToString();
     }
 
+    public static InetAddress[] getMailExchangerIPs(String hostName) {
+        InetAddress[] ret;
+        try {
+            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) {
+                ret = new InetAddress[1];
+                try {
+                    ret[0] = InetAddress.getByName(hostName);
+                    if (ret[0].equals(IP.getIP(127,0,0,1)) || ret[0].isLoopbackAddress()) throw new UnknownHostException();
+                    return ret;
+                } catch (UnknownHostException uhe) {
+                    Log.warn(DNSUtil.class, "no MX hosts or A record for " + hostName);
+                    return new InetAddress[0];
+                }
+            } else {
+                ret = new InetAddress[attr.size()];
+                NamingEnumeration ne = attr.getAll();
+                for(int i=0; ne.hasMore();) {
+                    String mx = (String)ne.next();
+                    // FIXME we should be sorting here
+                    mx = mx.substring(mx.indexOf(" ") + 1);
+                    if (mx.charAt(mx.length() - 1) == '.') mx = mx.substring(0, mx.length() - 1);
+                    InetAddress ia = InetAddress.getByName(mx);
+                    if (ia.equals(IP.getIP(127,0,0,1)) || ia.isLoopbackAddress()) continue;
+                    ret[i++] = ia;
+                }
+            }
+        } catch (Exception e) {
+            Log.warn(DNSUtil.class, "couldn't find MX host for " + hostName + " due to");
+            Log.warn(DNSUtil.class, e);
+            return new InetAddress[0];
+        }
+        return ret;
+    }
+
 }