MX-Records: Server antwortet nicht

  • Themenstarter Themenstarter DragonBreath
  • Beginndatum Beginndatum
D

DragonBreath

Hallo,

ich habe mich in PHP mal damit beschäftigt, wie man eine E-Mail überprüfen kann (Syntax über reguläre Ausdrücke) und habe nun eine Klasse geschrieben, in der der MX-Record geholt und direkt mit dem Server kommuniziert wird. Soweit klappt auch alles, nur nach dem Absenden der Empfängermailadresse müsste ich laut (meiner mir hier vorliegenden) Spezifikation ein Code 250 für "Operation abgeschlossen" vom Server bekommen. Der will aber einfach nicht antworten. :confused:

Das HELO klappt einwandfrei.

PHP:
public function checkServer($strEmail) {
    	
    	// Überprüfung des Betriebssystems...
    	// ...Windows (unterstützt die benötigte Funktion "getmxxr()" nicht)
		if(defined("PHP_OS")  && !strcmp(substr(PHP_OS,0,3),"WIN")) {
			return array(true, "Diese Funktion wird von Windows Systemen nicht angeboten");
		}

		// Splitten der E-Mail-Adresse in Domain und Benutzer
		list($strUser,$strDomain) = split("@",$strEmail,2);
		
		// Speicherung der MX-Datensätze aus dem DNS
		$arrMxListe = FALSE;
		
		// Überprüfung, ob eine Server-Prüfung gewünscht war...
		// ...ja, soll durchgeführt werden
		if ($this->bolCheckServer){
		
			// Abfrage der MX-Datensätze aus dem DNS für die Domain
			@getmxrr($strDomain,$arrMxListe);
			
			// Vorbelegen des Return Werts mit einem Fehler
			$arrReturn = array (FALSE, $strDomain . ': Mailserver konnte nicht gefunden werden.');
		
			// Überprüfung der MX-Datensätze...
			// ...es wurde einer oder mehrere Einträge gefunden
			if ($arrMxListe){
				
//				echo '<pre>';
//				print_r($arrMxListe);
//				echo '</pre>';
			
				// Durchgehen aller Einträge...
				foreach($arrMxListe as $strWert){
					
					// Es wird versucht eine Socket-Verbindung auf dem Port 25 (SMTP Port)
					// herzustellen (Timeout 20 Sekunden)
					$hndSocket = fsockopen($strWert, 25, $intErrorNummer, $strErrorNachricht, 20);
//					echo 'Es wird versucht eine Socket-Verbindung auf dem Port 25 (SMTP Port)<br />';
					
					// Überprüfung der Socket-Verbindung...
					// ...konnte nicht hergestellt werden
					if (!$hndSocket) {
						
						// Der Rest wird übersprungen und der nächste Wert wird
						// bearbeitet
						echo '<b>Fehler:</b>keine Verbindung<br />';
						continue;
					}
					
					// Hier wird der Modus des Sockets gesetzt. Wäre der zweite
					// Parameter TRUE, so würde das Skript auf eingehende Daten 
					// warten
					socket_set_blocking($hndSocket, TRUE);
					
					
					// Initialisierung
					$intServer = 0;
					$intClient = 0;
					$strOut = '';
					
					// Abfrage der eingehenden Daten...
					do{
						$strOut = fgets($hndSocket,2500);
						
//						echo 'OUT: ';
//						print_r($strOut);
//						echo '<br />';
					
						// Überprüfung der eingehenden Daten...
						// ...Status-Code 220 (Mail-Server ist bereit) erhalten
						if (ereg("^220",$strOut)){
							
							$intServer = 0;
							$strOut = '';
							$intClient++;
							
						}
						// ...kein Status-Code 220 erhalten
						else{
						
							// Überprüfung der eingegangenen Daten...
							// ...es wurde bereits ein Code 220 empfangen und die Anfrage ($strOut) ist leer
							if (($intClient > 0 && $strOut == '')) {
								
								break;
							}
							// ...kein Status-Code erhalten => weiter warten auf eingehenden 220 Status-Code und Server eins hochzählen
							else {
								$intServer++;
							}
							
							// Mehr als 9999 Anfragen an Server ohne den Status-Code 220 zu erhalten führt zum Abbruch
							if ($intServer > 9999) {
								break;
							}
							
						} // Ende IF-ELSE: Überprüfung der eingehenden Daten
						
					} while ($strOut == '');
					
					// Freischalten der Kommunikation mit dem Mail-Server
					socket_set_blocking($hndSocket, FALSE);
					
					// Anmelden am Server und abfragen der Antwort
//					echo 'anmelden am Server. <br />';
					fputs($hndSocket,"HELO 5thMediaMailLib\n");
					$strOut = fgets($hndSocket,3000);
				
					// Mail des Senders übergeben
					fputs($hndSocket, 'MAIL FROM: '. $this->SenderEmail . '\n');
					$strOut = fgets($hndSocket,3000);
					
					// Mail des Empfängers angeben
					fputs($hndSocket, 'RCPT TO: ' . $strEmail . '\n');
					$strOut = fgets($hndSocket,3000);
					
//					echo 'Test:<pre>';
//					print_r($strOut);
//					echo '</pre>';
					
					// Abfragen der eingegangenen Daten...
					// ...Status 250 (angefragte Operation abgeschlossen)
					if (ereg("^250",$strOut)) {
						$arrReturn = array(TRUE, $strOut);
					}
					// ...Fehler
					else {
						$arrReturn = array(FALSE, $strOut);
					}
					
					// Beenden der Verbindung mit dem Mail-Server
					fputs($hndSocket,"quit\n");
					
					// Schliessen der Socket-Verbindung
					fclose($hndSocket);
					
					// Überprüfung, ob bereits ein Erfolg verzeichnet wurde
					if ($arrReturn[0]) {
						break;
					}
				} // Ende FOREACH: Durchgehen aller Einträge
			}
			// ...es wurden keine Einträge gefunden
			else {
				$arrReturn = array(FALSE, $strEmail . ': Die Funktion getmxrr() wird nicht unterstütz oder der Mail-Server wurde nicht gefunden.');
			} // Ende IF-ELSE: Überprüfung der MX-Datensätze
		}
		// ...es soll keine Überprüfung stattfinden
		else {
			
			$arrReturn = array(TRUE, $strEmail . ': Mailserver wurde nicht überprüft');
			
		} // Ende IF-ELSE: Überprüfung, ob eine Server-Prüfung gewünscht war
		
	return $arrReturn;
    	
    }
    // Ende Funktion: checkServer($strEmail)

Danke im Voraus für eure Hilfe & Gruss

DragonBreath
 
Hallo,

hab jetzt deinen Code nicht gelesen - bin aber vor ein paar Wochen über eine Funktion "gestolpert" welche genau das macht was du willst und die funktioniert (zumindest bei mir).
Ich habe mal eine Beispiel-eMail-Adresse (info@google.de) im Script angegeben - das Ganze kannst du ja aber auch über eine Variable machen (aber das brauche ich dir wahrscheinlich nicht erzählen).

So nun hier der Code - ich hoffe es hilft:
PHP:
  function CheckEmail($email) {
    $domain = NULL;
    $mxlist = NULL;
    list($user, $domain) = split("@", $email, 2);
    getmxrr($domain, $mxlist);
    $return = array(false, $out);
    foreach($mxlist as $mx) {
      $fp = fsockopen($mx, 25, $errno, $errstr, 20);
      if(!$fp) continue;
      socket_set_blocking($fp, false);
      $s = 0;
      $c = 0;
      $out = "";
      do {
        $out = fgets($fp, 2500);
        if(ereg("^220", $out)) {
          $s = 0;
          $out = "";
          $c++;
        } else {
          if(($c>0) && ($out=="")) break;
          else $s++;
        }
        if($s==9999) break;
      }
      while($out=="");
      socket_set_blocking ($fp, true);
      fputs ($fp, "HELO mrx\n" );
      $out = fgets($fp, 3000);
      fputs ($fp, "MAIL FROM: anonymous@doesnotexist.com\n" );
      $out = fgets($fp, 3000);
      fputs($fp, "RCPT TO: $email\n");
      $out = fgets($fp, 3000);
      if(ereg("^250", $out)) {
        $return = array(true,$out);
      } else {
        $return = array(false,$out);
      }
      fputs($fp, "quit\n");
      fclose($fp);
      if($return[0]) break;
    }
    return $return;
  }
Und hier eine "Abfrage" dafür - zur Erläuterung:
PHP:
  $ret = CheckEMail("info@google.de");
  if ($ret[0] == "1") { echo "Die eMail-Adresse ist korrekt!"; } else { echo "Die eMail-Adresse ist nicht korrekt"; }

  echo("$ret[0]");
 
Zuletzt bearbeitet:
Zurück