如何根據域名得到 DNS 解析結果的 MX 節點的完整機器名 ?
舉例來說 :
知道一個郵件 xxx@sohu.com , 得到域名 sohu.com
現在如何知道 sohu.com 域中 mailserver 的機器名 ?
问题点数:100、回复次数:7Top
1 楼colors(第厘十秒)回复于 2002-12-17 18:25:48 得分 0
gzTop
2 楼LiGun(^_^ 中国心_HSK ^_^)回复于 2002-12-18 15:54:15 得分 0
mail.域名Top
3 楼fastmask(我心烦)回复于 2002-12-19 08:23:17 得分 0
机器名?dns的结果是一个ip地址,机器名是可选的,所以不一定能够成功,况且机器名对于远程访问没有用处阿。Top
4 楼jekend(jekend)回复于 2002-12-19 13:01:29 得分 0
比如, sohu.com 是一個域名,
但是 www.sohu.com 是 sohu.com 域下的 Web 服務器
sohumx.sohu.com 是 sohu.com 域下的 mail 服務器 .
那麼, 現在我知道一個郵件地址 xxx@sohu.com .
我就需要知道 sohu.com 域下的 mail 服務器的名稱, 才能夠連接 .
這些 服務器名是需要在 dns 中設定的,
但是, 我不知道 java 中可否直接從 DNS Server 獲得 sohu.com 的 mail 服務器的名稱 ?
Top
5 楼warmship(warmship)回复于 2002-12-19 18:27:03 得分 0
http://www.xbill.org/dnsjava
我用过。自己去查查吧。Top
6 楼warmship(warmship)回复于 2002-12-19 18:29:10 得分 50
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE file.
*/
package org.apache.james.dnsserver;
import org.apache.avalon.framework.activity.Initializable;
import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.phoenix.Block;
import org.xbill.DNS.*;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.*;
/**
* @version 1.0.0, 18/06/2000
* @author Serge Knystautas
*/
public class DNSServer
extends AbstractLogEnabled
implements Block, Configurable, Initializable,
org.apache.james.services.DNSServer {
private Resolver resolver;
private Cache cache;
private byte dnsCredibility;
private Collection servers = new Vector();
public void configure( final Configuration configuration )
throws ConfigurationException {
// Get this servers that this block will use for lookups
final Configuration serversConfiguration = configuration.getChild( "servers" );
final Configuration[] serverConfigurations =
serversConfiguration.getChildren( "server" );
for ( int i = 0; i < serverConfigurations.length; i++ )
{
servers.add( serverConfigurations[ i ].getValue() );
}
final boolean authoritative =
configuration.getChild( "authoritative" ).getValueAsBoolean( false );
dnsCredibility = authoritative ? Credibility.AUTH_ANSWER : Credibility.NONAUTH_ANSWER;
}
public void initialize()
throws Exception {
getLogger().info("DNSServer init...");
if (servers.isEmpty()) {
try {
servers.add( InetAddress.getLocalHost().getHostName() );
} catch ( UnknownHostException ue ) {
servers.add( "127.0.0.1" );
}
}
for (Iterator i = servers.iterator(); i.hasNext(); ) {
getLogger().info("DNS Servers is: " + i.next());
}
//Create the extended resolver...
final String serversArray[] = (String[])servers.toArray(new String[0]);
resolver = new ExtendedResolver( serversArray );
cache = new Cache (DClass.IN);
getLogger().info("DNSServer ...init end");
}
public Collection findMXRecords(String hostname) {
Record answers[] = lookup(hostname, Type.MX);
Collection servers = new Vector ();
try {
if (answers == null) {
return servers;
}
MXRecord mxAnswers[] = new MXRecord[answers.length];
for (int i = 0; i < answers.length; i++) {
mxAnswers[i] = (MXRecord)answers[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);
for (int i = 0; i < mxAnswers.length; i++) {
servers.add(mxAnswers[i].getTarget ().toString ());
}
return servers;
} finally {
//If we found no results, we'll add the original domain name if
//it's a valid DNS entry
if (servers.size () == 0) {
try {
InetAddress.getByName(hostname);
servers.add(hostname);
} catch (UnknownHostException uhe) {
}
}
}
}
public Record[] lookup(String name, short type) {
return rawDNSLookup(name,false,type);
}
private Record[] rawDNSLookup(String namestr, boolean querysent, short type) {
Name name = new Name(namestr);
short dclass = DClass.IN;
Record [] answers;
int answerCount = 0, n = 0;
Enumeration e;
SetResponse cached = cache.lookupRecords(name, type, dnsCredibility);
if (cached.isSuccessful()) {
RRset [] rrsets = cached.answers();
answerCount = 0;
for (int i = 0; i < rrsets.length; i++) {
answerCount += rrsets[i].size();
}
answers = new Record[answerCount];
for (int i = 0; i < rrsets.length; i++) {
e = rrsets[i].rrs();
while (e.hasMoreElements()) {
Record r = (Record)e.nextElement();
answers[n++] = r;
}
}
}
else if (cached.isNXDOMAIN() || cached.isNXRRSET()) {
return null;
}
else if (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 response;
try {
response = resolver.send(query);
}
catch (Exception ex) {
return null;
}
short rcode = response.getHeader().getRcode();
if (rcode == Rcode.NOERROR || rcode == Rcode.NXDOMAIN) {
cache.addMessage(response);
}
if (rcode != Rcode.NOERROR) {
return null;
}
return rawDNSLookup(namestr, true, Type.MX);
}
return answers;
}
}
上面是Jakarta/James的DNSServer的源码,仔细研究一下。Top
7 楼echou(岸边蚕豆)回复于 2002-12-23 13:03:38 得分 50
我用过dnsjava,和上面代码有些类似之处:
import org.xbill.DNS.*;
public class MXLookup {
public static String[] lookup(String domain) {
Record[] records = dns.getRecords(domain, Type.MX);
if (records == null || records.length == 0) return null;
//对records按照MX优先级进行排序,优先级高的在前面。
Arrays.sort(records, new Comparator() {
public int compare(Object o1, Object o2) {
MXRecord r1 = (MXRecord)o1;
MXRecord r2 = (MXRecord)o2;
return r2.getPriority() - r1.getPropertiy();
}
}
String [] hosts = new String[records.length];
for (int i=0; i hosts[i] = ((MXRecord)records[i]).getTarget().toString();
return hosts;
}
}
使用方法:
String[] hosts = MXLookup.lookup("21cn.com");
返回的不是IP地址,而是MX主机名。返回的hosts可能是无效的,比如21cn.com返回两个MX记录:
mta.21cn.com和
mta2.21cn.com,其中mta.21cn.com连接不上。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12617475/viewspace-374267/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/12617475/viewspace-374267/