最近很常研究 Email,由於是自己架設伺服器,比較麻煩,所以更深入研究了一下下。
今天想到就寫一篇,真實檢查 Email 的方法,因為這個不是驗證 Email 格式與否,而是直接驗證 此Email是否存在,並且無須寄信即可以檢查。
首先先查詢 Email @後域名的MX紀錄,再查此IP,得到 IP 後即可透過 TCP 連線至該 SMTP 伺服器驗證以確立此 Email 確實存在,而不是亂打的。
//Check email is exist
var_dump(check_is_email_real_exist("test@example.com"));
function check_is_email_real_exist($email_address){
if ((!filter_var($email_address, FILTER_VALIDATE_EMAIL)===false) and strlen($email_address)<=254){
$emailxx=explode('@',$email_address);
$dns_lookup_result=dns_get_record($emailxx[1],DNS_MX);
if (count($dns_lookup_result)==0){
return false;
}else{
$address=gethostbyname($dns_lookup_result[0]['target']);
if ($address!=''){
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
return false;
}
$result = socket_connect($socket, $address, 25);
if ($result === false) {
echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
return false;
}
$in = "HELO hi\r\n";
socket_write($socket, $in, strlen($in));
if(substr(socket_read($socket, 2048),0,3)=='220'){
$in = "MAIL FROM:<thisistest@gmail.com>\r\n";
socket_write($socket, $in, strlen($in));
if(substr(socket_read($socket, 2048),0,3)=='250'){
$in = "RCPT TO:<$email_address>\r\n";
socket_write($socket, $in, strlen($in));
if(substr(socket_read($socket, 2048),0,3)=='250'){
$in = "QUIT\r\n";
socket_write($socket, $in, strlen($in));
if(substr(socket_read($socket, 2048),0,3)=='250'){
return true;
}else{
return false;
}
}else{
return false;
}
}else{
return false;
}
}else{
return false;
}
}else{
return false;
}
}
}else{
return false;
}
}
代碼醜陋,請各位看官不要介意。