На самом деле проверку доставки письма сделать можно, не 100% конечно, но все же. Делается это с помощью непосредственного взаимодействия с удаленным почтовиком, примерно так:
/**
* Запись в сокет
*/
private function sWrite( $socket, $data){
// отправляем команду в сокет
fputs( $socket, $data );
// получаем первый байт ответа от сервера
$answer = fread( $socket, 1 );
// узнаем информацию о состоянии потока
$remains = socket_get_status( $socket );
// и получаем оставшиеся байты ответа от сервера
if( $remains --> 0 ) $answer .= fread( $socket, $remains['unread_bytes'] );
// функция возвращает ответ от сервера на переданную команду
return $answer;
}
/**
* Соединение с почтовым сервером
*/
private function connectToServer($hostname, $port, $timeout){
$socket = fsockopen($hostname, $port, $errno, $errstr, $timeout );
if( !$socket ){
return false;
}
else return $socket;
}
/**
* Проверка e-mail
*/
private function checkEmail($email){
// получаем данные об MX-записи домена, указанного в email
$path = explode("@",$email);
$hostname = $path[1];
$mx = dns_get_record($hostname, DNS_MX );
$hostname = empty($mx) ? $hostname : $mx[0]['target'];
// открываем сокет и создаем поток
$socket = $this->connectToServer($hostname, 25, 10);
if(!$socket){
return false;
}
else{
// отправляем пустую строку, чтобы получить приветствие сервера
$this -> sWrite( $socket, "" );
// представляемся сами
$this -> sWrite( $socket, "EHLO sitename.ru\r\n" );
$ehlo = '<no-reply@sitename.ru>';
$rcpt = '<'.$email.'>';
$response = $this -> sWrite( $socket, "MAIL FROM: $ehlo\r\n" );
$response = $this -> sWrite( $socket, "RCPT TO: $rcpt\r\n" );
// закрываем соединение
$this -> sWrite( $socket, "QUIT\r\n" );
fclose( $socket );
// ниже идет простейшая обработка полученного ответа
if( substr_count( $response, "550" ) > 0 ) return false;
else
if( substr_count( $response, "250" ) > 0) return true;
}
}