Validación de dominio de correo electrónico mediante verificación de DNS en php

Ahora estoy más interesado en enviar correos masivos usando SMTP. Antes de enviar correos, necesito verificar que los ID de correo sean válidos. Tengo un código para verificarlo y lo he agregado a continuación. Es del Github. Solo necesito confirmar con todos ustedes que al usar las comprobaciones de este puerto DNS, ¿hace que nuestro server tenga problemas, como Blacklisting, etc., al revisar muchos correos que no son válidos?

<?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; } } ?> 

Si tienes alguna idea mejor para ayudarme, publica y ayuda. Agradeciendotelo de antemano.

Una búsqueda DNS no dará lugar a lists negras. Sin embargo, será muy sensible a la calidad de su service DNS: recientemente comencé a usar net_dns2 en lugar de getmxrr () ya que este último no diferencia entre timeouts, NXDOMAIN y otros errores (desafortunadamente los serveres DNS aquí están configurados por nuestro " expertos ").

(También podría ser útil saber que utilizo las funciones curl_multi _ * () para ejecutar búsquedas simultáneas; el procesamiento de una list grande puede llevar mucho time, como se describe aquí ).

Probando el MX bien puede resultar en su inclusión en la list negra, y es principalmente una pérdida de time como medida de capacidad de entrega (y como el script que está usando resuelve explícitamente una dirección IP para cada MX, algo costoso en términos de performance). Además, generará falsos negativos si el MX primario no está disponible (SMTP está diseñado para ser asíncrono).

Una solución alternativa, la networkingucción de los falsos negativos (y los falsos positivos en comparación con el método que describe) es utilizar un controller de rebote , aunque esto supone el costo de cierta latencia al tomar una determinación.

También sugeriría (dependiendo del time que lleva procesar la list) que valide previamente la dirección de correo electrónico con una expresión regular, pero tenga en count que hay muchos malos ejemplos de cómo hacerlo en Internet.