2016-06-06 6 views
1

Ich bin jetzt mehr mit dem Senden von Massen-E-Mails mit SMTP. Bevor ich E-Mails sende, muss ich prüfen, ob diese E-Mail-Adressen gültig sind. Ich habe einen Code, um es zu überprüfen & Ich habe es unten hinzugefügt. Es ist von den Github. Ich brauche nur bestätigen mit Ihnen alles, dass mit diesem DNS-Port überprüft, macht es unseren Server in einem Problem wie Blacklisting etc .., beim Überprüfen viele Mails, die nicht gültig sind?E-Mail-Domain-Validierung mit DNS-Einchecken in PHP

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

Wenn Sie eine bessere Idee haben, mir zu helfen, schreiben Sie bitte & Hilfe. Ich danke Ihnen im Voraus.

Antwort

2

Ein DNS-Lookup führt nicht zur Blacklisting. Es wird jedoch sehr empfindlich auf die Qualität Ihres DNS-Dienstes reagieren - Ich habe kürzlich begonnen, net_dns2 anstelle von getmxrr() zu verwenden, da letzterer nicht zwischen Zeitüberschreitungen, NXDOMAIN und anderen Fehlern unterscheidet (leider sind die DNS-Server hier von uns konfiguriert). Experten ").

(es könnte auch hilfreich sein, zu wissen, dass ich die curl_multi verwenden _ * (Funktionen) gleichzeitige Abfragen ausgeführt werden - eine große Liste der Verarbeitung einer lange Zeit in Anspruch nehmen - beschrieben here).

Das Prüfen des MX kann dazu führen, dass Sie auf die schwarze Liste gesetzt werden - und das ist meistens eine Verschwendung von Zeit als Maß der Zustellbarkeit (und weil das verwendete Skript explizit eine IP-Adresse für jeden MX auflöst, etwas teuer in Bezug auf die Leistung)). Außerdem führt dies zu falsch negativen Ergebnissen, wenn das primäre MX nicht verfügbar ist (SMTP ist asynchron).

Eine alternative Lösung, die falsche Negative (und falsche Positive im Vergleich zu der von Ihnen beschriebenen Methode) zu reduzieren, besteht darin, eine bounce handler zu verwenden, obwohl dies eine gewisse Latenz bei der Bestimmung erfordert.

Ich würde auch (je nach legth Zeit, um die Liste zu verarbeiten, dauert es) deuten darauf hin, dass Sie die E-Mail-Adresse mit einem regex vorab validieren - aber passen gibt es eine viele schlechte Beispiele, wie um dies im Internet zu tun.

+0

Ty, für die Antwort. Ich werde es prüfen. – Sinto