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.
Das HELO klappt einwandfrei.
Danke im Voraus für eure Hilfe & Gruss
DragonBreath
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.
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