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