Проверка почтовой электронной почты с использованием проверки DNS в переполнении стека

Я теперь больше с отправкой массовых писем с использованием SMTP. Перед отправкой почты мне нужно проверить, что эти почтовые идентификаторы действительны. У меня есть код, чтобы проверить это & Я добавил это ниже. Это из Github. Мне просто нужно подтвердить с вами все, что с помощью этой проверки DNS-портов, это делает наш сервер в таких проблемах, как черный список и т. Д., При проверке большого количества писем, которые не являются действительными?

<?php
function verifyEmail($toemail, $fromemail, $getdetails = false){
$email_arr = explode("@", $toemail);
$domain = array_slice($email_arr, -1);
$domain = $domain[0];
// Trim [ and ] from beginning and end of domain string, respectively
$domain = ltrim($domain, "[");
$domain = rtrim($domain, "]");
if( "IPv6:" == substr($domain, 0, strlen("IPv6:")) ) {
$domain = substr($domain, strlen("IPv6") + 1);
}
$mxhosts = array();
if( filter_var($domain, FILTER_VALIDATE_IP) )
$mx_ip = $domain;
else
getmxrr($domain, $mxhosts, $mxweight);
if(!empty($mxhosts) )
$mx_ip = $mxhosts[array_search(min($mxweight), $mxhosts)];
else {
if( filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) ) {
$record_a = dns_get_record($domain, DNS_A);
}
elseif( filter_var($domain, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) ) {
$record_a = dns_get_record($domain, DNS_AAAA);
}
if( !empty($record_a) )
$mx_ip = $record_a[0]['ip'];
else {
$result   = "invalid";
$details .= "No suitable MX records found.";
return ( (true == $getdetails) ? array($result, $details) : $result );
}
}

$connect = @fsockopen($mx_ip, 25);
if($connect){
if(preg_match("/^220/i", $out = fgets($connect, 1024))){
fputs ($connect , "HELO $mx_ip\r\n");
$out = fgets ($connect, 1024);
$details .= $out."\n";

fputs ($connect , "MAIL FROM: <$fromemail>\r\n");
$from = fgets ($connect, 1024);
$details .= $from."\n";
fputs ($connect , "RCPT TO: <$toemail>\r\n");
$to = fgets ($connect, 1024);
$details .= $to."\n";
fputs ($connect , "QUIT");
fclose($connect);
if(!preg_match("/^250/i", $from) || !preg_match("/^250/i", $to)){
$result = "invalid";
}
else{
$result = "valid";
}
}
}
else{
$result = "invalid";
$details .= "Could not connect to server";
}
if($getdetails){
return array($result, $details);
}
else{
return $result;
}
}
?>

Если у вас есть идея, чтобы помочь мне, пожалуйста, напишите & Помогите.
Заранее спасибо.

1

Решение

Поиск DNS не приведет к черным спискам. Однако это будет очень чувствительно к качеству вашего сервиса DNS — я недавно начал использовать net_dns2 вместо getmxrr (), поскольку последний не различает тайм-ауты, NXDOMAIN и другие ошибки (к сожалению, DNS-серверы здесь настраиваются нашими «экспертами»).

(также может быть полезно знать, что я использую функции curl_multi _ * () для одновременного поиска — обработка большого списка может занять долго время — описано Вот).

Проверка MX может привести к тому, что вы попадете в черный список — и это в основном пустая трата времени в качестве меры доставки (и поскольку используемый вами скрипт явно разрешает IP-адрес для каждого MX, что несколько дорого с точки зрения производительности). Кроме того, это приведет к ложным отрицаниям, если основной MX недоступен (SMTP спроектирован как асинхронный).

Альтернативное решение, уменьшающее ложные отрицания (и ложные положительные результаты по сравнению с методом, который вы описываете), заключается в использовании обработчик отказов, хотя это происходит за счет некоторой задержки в принятии решения.

Я бы также предложил (в зависимости от длительности обработки списка) предварительно проверить адрес электронной почты с помощью регулярного выражения — но остерегаться есть много плохих примеров о том, как это сделать в интернете.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]