Java

javaでメールアドレスのMXレコードを調べてドメインチェックする

WEBでメール受付~とかやってると
正しいメールに混じってスパムメールが数多く飛んでくるかと思います。

メールを受け付けた後に「受付完了!」のメールを返信しようとしても
スパム相手だと
そんなアドレスないよ!とエラーリターンの山が積まれていくのを見ていく日々・・・
コレなんとかならないの?!

メールアドレスの@マークの前部分はユーザに該当しちゃうので
送ってみないと分からないのですが

少なくとも
@マークの後ろ部分は本当に存在するドメインなのかチェックしよう!

ということが昔あり、javaで組んだ感じです。

特に説明はないです。

import java.util.Hashtable;

import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;

public class MXLookup {
    public static void main(String[] args) {
        exec("yahoo.jp");
        exec("yahoo.co.jp");
        exec("126.com");
        exec("127.com");
    }
    private static void exec(String hostname) {
        System.out.println( hostname + " : " + doLookup( hostname ) + "" );
    }
    private static String doLookup( String hostName ) {
        try {
            Hashtable<String,String> env = new Hashtable<String,String>();
            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 ){
                return null;
            }
            StringBuilder sb = new StringBuilder();
            for(int i=0;i<attr.size();i++){
                if(sb.length() > 0){
                    sb.append(", ");
                }
                sb.append(attr.get(i));
            }
            return sb.toString();
        } catch (NamingException e) {
            return null;
        }
    }

}

ちなみに作成したシステムは
受信メールをシェルに食わせる
でメールを受信したタイミングでキックされるシェルからこのJavaが呼ばれ
メール送信者のフィルタリングをする感じです。

以上です
ご参考になれば。