Javaはメールボックスの有効性と真実性を検証します.


Javaはメールボックスが本当に有効かどうかを検証します.
メールボックスの存在を確認するには、二つの知識が必要です.
1.MX記録、windowsのnslookup命令.勉強します
2.SMTPプロトコルは、どうやってtelnetを通じてメールを送るか.勉強します
検証できるウェブサイトがあります.http://verify-email.org/一時間に10回しか検証できません.
コードは以下の通りです.
import java.io.IOException;

import org.apache.commons.net.smtp.SMTPClient;
import org.apache.commons.net.smtp.SMTPReply;
import org.apache.log4j.Logger;
import org.xbill.DNS.Lookup;
import org.xbill.DNS.Record;
import org.xbill.DNS.Type;

/**
 * 
 *     :1、       2、           
 *   :
 * 1、 dns               SMTP     
 * 2、    Socket  
 * 3、         SMTP   
 * 4、       
 * 5、       
 * 6、        250( 250               )
 * @author Michael Ran
 *
 */
public class CheckEmailValidityUtil {
    private static final Logger logger = Logger
            .getLogger(CheckEmailValidityUtil.class);
    /**
     * @param email         
     * @return
     */
    public static boolean isEmailValid(String email) {
        if (!email.matches("[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+")) {
            logger.error("  ("+email+")     ,    !");
            return false;
        }
        String host = "";
        String hostName = email.split("@")[1];
        //Record: A generic DNS resource record. The specific record types 
        //extend this class. A record contains a name, type, class, ttl, and rdata.
        Record[] result = null;
        SMTPClient client = new SMTPClient();
        try {
            //   DNS       MX         
            Lookup lookup = new Lookup(hostName, Type.MX);
            lookup.run();
            if (lookup.getResult() != Lookup.SUCCESSFUL) {//    
                logger.error("  ("+email+")     ,      MX  !");
                return false;
            } else {//    
                result = lookup.getAnswers();
            }
            //   SMTP       Socket  
            for (int i = 0; i < result.length; i++) {
                host = result[i].getAdditionalName().toString();
                logger.info("SMTPClient try connect to host:"+host);
                
                // connect()    SMTPClient   :org.apache.commons.net.SocketClient
                //      :org.apache.commons.net.smtp.SMTPClient-->org.apache.commons.net.smtp.SMTP-->org.apache.commons.net.SocketClient
                //Opens a Socket connected to a remote host at the current default port and 
                //originating from the current host at a system assigned port. Before returning,
                //_connectAction_() is called to perform connection initialization actions. 
                //  Socket   SMTP   
                client.connect(host);
                //Determine if a reply code is a positive completion response(         ). 
                //All codes beginning with a 2 are positive completion responses(   2             ). 
                //The SMTP server will send a positive completion response on the final successful completion of a command. 
                if (!SMTPReply.isPositiveCompletion(client.getReplyCode())) {
                    //  socket  
                    client.disconnect();
                    continue;
                } else {
                    logger.info("  MX  :"+hostName);
                    logger.info("      :"+hostName);
                    break;
                }
            }
            logger.info("SMTPClient ReplyString:"+client.getReplyString());
            String emailSuffix="163.com";
            String emailPrefix="ranguisheng";
            String fromEmail = emailPrefix+"@"+emailSuffix; 
            //Login to the SMTP server by sending the HELO command with the given hostname as an argument. 
            //Before performing any mail commands, you must first login. 
            //   SMTP       ,       SMTP   
            client.login(emailPrefix);
            logger.info("SMTPClient login:"+emailPrefix+"...");
            logger.info("SMTPClient ReplyString:"+client.getReplyString());
            
            //Set the sender of a message using the SMTP MAIL command, 
            //specifying a reverse relay path. 
            //The sender must be set first before any recipients may be specified, 
            //otherwise the mail server will reject your commands. 
            //     ,                 
            client.setSender(fromEmail);
            logger.info("      :"+fromEmail);
            logger.info("SMTPClient ReplyString:"+client.getReplyString());

            //Add a recipient for a message using the SMTP RCPT command, 
            //specifying a forward relay path. The sender must be set first before any recipients may be specified, 
            //otherwise the mail server will reject your commands. 
            //     ,              ,  SMTP          
            client.addRecipient(email);
            logger.info("     :"+email);
            logger.info("SMTPClient ReplyString:"+client.getReplyString());
            logger.info("SMTPClient ReplyCode:"+client.getReplyCode()+"(250    )");
            if (250 == client.getReplyCode()) {
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                client.disconnect();
            } catch (IOException e) {
            }
        }
        return false;
    }
    public static void main(String[] args) {
        System.out.println(isEmailValid("[email protected]"));
    }
}
実行結果:
MX record about q.com.exists.Connection succeded to mx.3.q.com.220 newmx.21.1 q.com MX QQ Mail Server.HELO 163.com=250 newmx.21.0.com>MAIL FROM:<163.com@ranguisheng>=250 Ok>RCPT TO:<[email protected]>=250 Ok Outcome:true
検証されたメールボックスを以下に置き換えると、[email protected]を選択すると、認証に失敗します.
MX記録が見つからないOutcome:false
なお、躊躇検査の第一歩はDNSサーバからMXレコードを照会するので、ネットワークに接続しなければならない.  チェックが失効します.MXレコードが見つからないため、実際の有効住所も無効とチェックされますので、注意してください.
このコードは二つのjarパッケージが必要です.
1、Apache Commons Net  
maven住所:http://mvnrepository.com/artifact/commons-net/commons-net/
2、dnsjava
maven住所:http://mvnrepository.com/artifact/dnsjava/dnsjava/
PS:まだ検証メールを送っていません.後でこの問題を解決してからこの文章を更新します.
関連リソースのダウンロード>>
ダウンロード
Apple-commons-netダウンロード 
参考文献:
apache-commons-net API
dnsjava API