Problem mit fgets
alf013
- php
0 salt1 Sven Rautenberg0 Alf013
Hallo Leute :-)
ich habe folgenden Code für eMail-Verifizierung geschrieben
function CheckEmail( $eMail )
{
global $HTTP_HOST;
if (!eregi ("[1]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,})$", $eMail))
{
return array(false, "eMail-Format ist falsch");
}
list ($user,$domain) = split("@", $eMail, 2);
if ( ! getmxrr($domain, $mxlist) )
{
return array(false, "Keine gültige Mailadresse");
}
foreach ($mxlist as $mx)
{
echo $mx . '<br>';
$fp = fsockopen($mx, 25, $errno, $errstr, 20);
if (!$fp) continue; //nächster MX_Eintrag
socket_set_blocking($fp, false);
$s = 0; $c = 0;
$out = "";
do { // Auf Antwort warten
$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=="");
echo 'fp erreicht<br>';
if ( ($fp) && socket_set_blocking ($fp, true) )
{
echo 'HELO <br>';
fputs ($fp, 'HELO EBS\r\n' );
echo 'FGETS --> <br>';
$out = @fgets($fp, 1024 ); <<<<----------- hier
echo 'FGETS <-- ' . $out . ' <br>';
fputs ($fp, 'MAIL FROM: info@web.de' . '\r\n' );
$out = fgets($fp, 1024 );
fputs($fp, 'RCPT TO: ' . $eMail . '\r\n');
echo 'FGETS --> <br>';
$out = fgets($fp, 3000);
echo 'FGETS <-- ' . $out . ' <br>';
if (ereg("^250", $out)) $return = array(true,$out);
else $return = array(false,$out);
fputs ($fp, "quit\r\n");
fclose($fp);
}
else
return array(false, "Keine Verbindung zum Server");
if ($return[0]) break;
}
return $return;
}
Mein Problem ist, dass nach dem 1. fgets nichts mehr passiert!!!!
Was ist der Fehler?????
Danke vorab und Grüsse
Andreas
_a-z0-9- ↩︎
ich hatte mal was ähnliches (ne socketanfrage), wo weniger zurückkam, als ich erwartet habe (also 6 byte statt 8) - und da schien das auch zu hängen - ist aber lange her.
$out = fgets ( $fp, 2500 );
Moin!
ich habe folgenden Code für eMail-Verifizierung geschrieben
Dein Code ist leider schlecht - aus grundsätzlichen Überlegungen heraus.
Heutzutage ist es zwingend notwendig, dass Mailversand - und das betrifft auch den testweisen Versand zur Prüfung der Gültigkeit - sich absolut hundertprozentig an die einschlägigen RFCs für SMTP hält, und insbesondere Queuing beherrscht.
Dein Code hingegen wird bei sehr sehr vielen Spamfiltern schlichtweg scheitern.
Erstens: Du sendest kein gültiges HELO.
Zweitens: Du reagierst während des gesamten Sendevorgangs nicht auf serverseitige Fehlermeldungen.
Drittens: Du reagierst falsch auf temporäre Statusfehlercodes (4xx).
Viertens: Du denkst, dass ein gültiger Maillieferversuch auch auf eine gültige Mailadresse schließen läßt.
Fünftens: Du gehst davon aus, dass zu einer gültigen Mailadresse auch ein MX-Record existieren muß.
Alle diese Annahmen sind aber falsch.
Es gibt nur eine wirklich funktionierende Methode, die Gültigkeit einer Mailadresse zu prüfen:
1. Sende eine Mail über den einen voll funktionsfähigen Mailserver an die Adresse. In der Mail befindet sich ein nicht erratbarer Link.
2. Wenn der Link aufgerufen wird, ist die Mailadresse gültig.
- Sven Rautenberg
Moin!
ich habe folgenden Code für eMail-Verifizierung geschrieben
Dein Code ist leider schlecht - aus grundsätzlichen Überlegungen heraus.
Es gibt nur eine wirklich funktionierende Methode, die Gültigkeit einer Mailadresse zu prüfen:
- Sende eine Mail über den einen voll funktionsfähigen Mailserver an die Adresse. In der Mail befindet sich ein nicht erratbarer Link.
- Wenn der Link aufgerufen wird, ist die Mailadresse gültig.
- Sven Rautenberg
Danke für die Antwort.
Kannst du mir bitte ein konkretes Beispiel geben?
Danke vorab Andreas
Moin!
Kannst du mir bitte ein konkretes Beispiel geben?
Du speicherst die fragliche Mailadresse, und noch ein zusätzliches Merkmal wie z.B. einen String aus MD5 oder SHA1, in den diverse unterschiedliche Werte und Zufallsfaktoren eingehen.
Diesen String packst du in die Mail in einen Link zu einem Zielskript und schickst sie ganz simpel per mail()-Befehl. (Wobei vorher natürlich schon allgemeine Prüfungen auf Einhaltung des Formats für Mailadressen stattfinden können - also letztendlich in der auf ewig wartungsfreien Variante nur der Test, ob ein "@" und dahinter mindestens ein "." vorkommt.)
Das Zielskript erhält den String als Parameter, sucht ihn im Speicher und setzt dann das Flag "Mailadresse validiert". Mit diesem Vorgang ist die Mailadresse geprüft, als gültig und benutzbar bewiesen.
Das ganze System braucht natürlich noch etwas Eyecandy, damit der Benutzer schöne Optik erhält, aber der rein technische Vorgang ist nicht komplizierter.
Der entscheidende Faktor ist: Du kannst nicht live online direkt nach Eingabe der Mailadresse feststellen, ob diese tatsächlich gültig und benutzbar ist. Das geht nur und ausschließlich, indem der Inhaber der Mailadresse auf eine verschickte Mail positiv reagiert.
- Sven Rautenberg
echo $begrüßung;
Der entscheidende Faktor ist: Du kannst nicht live online direkt nach Eingabe der Mailadresse feststellen, ob diese tatsächlich gültig und benutzbar ist. Das geht nur und ausschließlich, indem der Inhaber der Mailadresse auf eine verschickte Mail positiv reagiert.
Das ganze System braucht natürlich noch etwas Eyecandy, damit der Benutzer schöne Optik erhält, aber der rein technische Vorgang ist nicht komplizierter.
Noch ein Hinweis rechtlicher Natur: Die Bestätigungsmail sollte wirklich nur den Bestätigungswunsch beinhalten und am besten nichts, das man als Werbung auffassen kann. Denn unverlangt zugesandte Werbung ist ja nicht gestattet und wird gern mal von den Rechtspflegern angeprangert. Auch sollte man darauf achten, möglichst wenige Mails an den selben Empfänger zu versenden, nicht dass sich das System unfreiwillig als Spamschleuder betätigt.
echo "$verabschiedung $name";