Authentizität eines E-Mail Accounts per PHP(5) checken

#0
31.05.2006, 21:40
Member
Avatar Xeper

Beiträge: 5291
#1 Hi Ihr Webmaster ;)

Habe heute eine kleine Funktion geschrieben die, die Authentizität eines E-Mail Accounts sicherstellt

PHP Code


<?php
public function checkmail($email$tld) {

        if(
eregi("@"$email)) {

            
$parts explode("@"$email);
            
$domain $parts[1];

            if(isset(
$tld)) {

                
$count count($tld)-1;
                
$tldblock 0;

                for(
$i=0;$count >=$i;$i++) {

                    if(
eregi($tld[$i], $parts[1])) $tldblock++;

                }

                if(
$tldblock<1) return false;
                if(
$tldblock>1) return false;

            }

            if(!
checkdnsrr($domain)) return false;
            else return 
true;

        } else {

            return 
false;

        }

    }
?>

Oder zu finden unter:
http://coruscant.ninth-art.de/websvn/filedetails.php?repname=php&path=%2Fmaintenence.inc.php&rev=0&sc=0

Diese Funktion checkt einen bestimmten string (die E-Mail) und akzeptiert auch als zweites Argument ein array an TLDs.
Außerdem wird der String nach mehrdeutigen TLDs (.de.de oder .com.de oder derartiger Blödsinn) abgesucht.
Die domain selber wird auch noch auf einen bestehenden MX record hin überprüft.

Letztes Problem bleibt, hat hier jemand eine Idee wie ich auch abchecken kann ob ein Postfach bla@ existiert?
Dafür müßte ich mich ja erst auf dem bestehenden SMTP Server einloggen?

PS.: Code ist sowieso GPL deswegen klaut ihn ruhig ;)
__________
E-Mail: therion at ninth-art dot de
IRC: megatherion @ Freenode
Seitenanfang Seitenende
01.06.2006, 13:52
Member
Avatar Laserpointa

Beiträge: 2175
#2 vielen Dank, kann man immer gebrauchen ;)

Was das prüfen der Existenz des Postfachs per telnet befehlen angeht haben die Provider mitlerweile glaube ich einen Riegel auf Grund der Spammer vorgeschoben? - oder? (müsste man mal testen)

Greetz Lp
Dieser Beitrag wurde am 01.06.2006 um 14:05 Uhr von Laserpointa editiert.
Seitenanfang Seitenende
01.06.2006, 14:15
Member

Themenstarter
Avatar Xeper

Beiträge: 5291
#3 @Laserpointa

Code

public function checkmail($email, $tld) {

        if(eregi("@", $email) &&
        !eregi(" ", $email)) {

            $parts = explode("@", $email);
            $domain = $parts[1];

            if(isset($tld)) {

                $count = count($tld)-1;
                $tldblock = 0;

                for($i=0;$count >=$i;$i++) {

                    if(eregi($tld[$i], $domain)) $tldblock++;

                }

                if($tldblock<1) return false;
                if($tldblock>1) return false;

            }

            if(!checkdnsrr($domain)) return false;
            else return true;

        } else {

            return false;

        }

    }
Hier nochmal die editierte Version:
$email wird jetzt auch nach leerstellen gescannt.
Das "public" musst du natürlich wegnehmen wenn du das ganze nicht in einer Klasse benutzt.

Zitat

Was das prüfen der Existenz des Postfachs per telnet befehlen angeht haben die Provider mitlerweile glaube ich einen Riegel auf Grund der Spammer vorgeschoben? - oder? (müsste man mal testen)
Ne das kannst du nicht unterbinden, auch als Provider nicht.
Die Frage ist nur wie man sowas einfach und Ressourcen sparend umsetzt.
Man kann ja nicht bei jeder Mail die gecheckt werden soll sich über php per telnet auf den server (sofern vorhanden) einloggen und dann eine Test-Mail schreiben,
dass halte ich für zu übertrieben.
__________
E-Mail: therion at ninth-art dot de
IRC: megatherion @ Freenode
Seitenanfang Seitenende
02.06.2006, 13:39
Administrator
Avatar Lukas

Beiträge: 1742
#4 Hi ihr,

diese Funktion geht beim verifizieren der Emailadresse noch ein paar Schritte weiter:

Code

function checkEmail($email) {
// checks proper syntax
// preg_match needs improvement! - http://board.protecus.de/t23569.htm#227644
if(preg_match("/^( [a-zA-Z0-9] )+( [a-zA-Z0-9\._-] )*@( [a-zA-Z0-9_-] )+( [a-zA-Z0-9\._-] +)+$/" , $email)) {
  // gets domain name
  list($username,$domain)=split('@',$email);
  // checks for if MX records in the DNS
  if(!checkdnsrr($domain, 'MX')) {
   return false;
  }
  // attempts a socket connection to mail server
  if(!fsockopen($domain,25,$errno,$errstr,30)) {
   return false;
  }
  return true;
}
return false;
}
+

Code

$email = trim($_POST['email']);  
if(!checkEmail($email)) {
echo 'Invalid email address!';
}
else {
echo 'Email address is valid';
}
Quelle: folgende Anleitung

wie ich mich jetzt allerdings direkt mit dem Mailserver verbinde und frage ob der Account existiert ist mir auch noch ein Rätsel und würde mich auch interessieren! -> edit Lsg.
__________
Gruß Lukas :yo
Seitenanfang Seitenende
02.06.2006, 13:58
Member

Themenstarter
Avatar Xeper

Beiträge: 5291
#5 @Lukas

Zitat

if(preg_match("/^( [a-zA-Z0-9] )+( [a-zA-Z0-9\._-] )*@( [a-zA-Z0-9_-] )+( [a-zA-Z0-9\._-] +)+$/" , $email)) {
Ja hab ich auch schon dran gedact, aber sind nicht sowieso alle Zeichen in einer E-Mail (bis auf leerstellen und kommas) erlaubt?
Dann lohnt sich preg_match nicht.

Zitat

if(!fsockopen($domain,25,$errno,$errstr,30))
Ja ok fsockopen() ist natürlich nützlich um zuchecken ob man sich auch auf den SMTP Server verbinden kann.

Danke - ich werde das mal implementieren.

Edit:

Hmm preg_match() it langsamer und funktioniert nicht.
preg_match() gibt einen integer rückgabe Wert und kein boolean - hab versucht mit, if(preg_match("/^( [a-zA-Z0-9] )+( [a-zA-Z0-9\._-] )*@( [a-zA-Z0-9_-] )+( [a-zA-Z0-9\._-] +)+$/" , $email)>0) funktioniert aber auch nicht.

Zitat

list($username,$domain)=split('@',$email);
Ebenfalls langsamer als preg_split() aber wenn man perl regular expressions nicht benötigt ist explode() die bessere Wahl ;)
siehe: http://de3.php.net/manual/en/function.split.php

Nur fsockopen() ist hier von Vorteil.
__________
E-Mail: therion at ninth-art dot de
IRC: megatherion @ Freenode
Dieser Beitrag wurde am 02.06.2006 um 14:13 Uhr von Xeper editiert.
Seitenanfang Seitenende
02.06.2006, 14:31
Administrator
Avatar Lukas

Beiträge: 1742
#6

Zitat

Xeper postete
Ja hab ich auch schon dran gedact, aber sind nicht sowieso alle Zeichen in einer E-Mail (bis auf leerstellen und kommas) erlaubt?
Dann lohnt sich preg_match nicht.
gerade nochmal überflogen der preg_match bei dem Code aus Post #4 ist mangelhaft.

Wenn man das ganze perfektionieren möchte setzen die RFC Normen einige Grenzen bzw. Einschränkung der Zeichen:

Zitat

Der lokale Teil muss eine bezüglich "domain" eindeutige Zeichenkette sein. Diese Zeichenkette darf nach RFC 2822 nur Buchstaben und Zahlen sowie bestimmte weitere Zeichen enthalten: A-Za-z0-9.!#$%&'*+-/=?^_`{|}~. Andere Zeichen, wie z. B. Leerzeichen, können benutzt werden, wenn local-part in doppelte Anführungsstriche eingeschlossen wird oder das Zeichen durch einen umgekehrten Schrägstrich (\) maskiert ist (z. B. ", @, :, ;). Kommentare können innerhalb von runden Klammern ebenfalls eingefügt werden. Alle Zeichen oberhalb des ASCII-Codes 127, also auch Umlaute, sind generell verboten. Am Anfang und Ende der Zeichenkette darf sich kein Punkt befinden.

Sehr oft wird allerdings fälschlicherweise davon ausgegangen, dass in E-Mail-Adressen nur Buchstaben, Zahlen, Punkt und Binde- bzw. Unterstrich vorkommen dürfen − vor allem Webformulare weisen deshalb gültige Adressen häufig als ungültig zurück. Dies sollte bei der Wahl einer E-Mail-Adresse berücksichtigt werden. *siehe Post #4 oben Beispielfehler*

Es gibt keine definitive Längenbegrenzung für die E-Mail-Adresse. Da aber eine Überlänge der Adresse zu technischen Problemen führen kann, empfiehlt RFC 2821, dass der local-part maximal 64 Zeichen haben soll. Die Domain soll maximal 255 Zeichen lang sein. Daraus ergibt sich eine Maximallänge von 320 Zeichen einschließlich des @.

__________
Gruß Lukas :yo
Seitenanfang Seitenende
02.06.2006, 14:38
Member

Beiträge: 3306
#7 Ich denke eine einfache Möglichkeit zu überprüfen ob eine E-Mail Adresse existiert gibt es nicht. Gäbe es sie würde sie sofort von Spammern missbraucht werden. Ich hab auch schon oft nach so einer Möglichkeit gegoogelt aber nichts dazu gefunden.
__________
Bitte keine Anfragen per PM, diese werden nicht beantwortet.
Seitenanfang Seitenende
10.06.2006, 12:10
Administrator
Avatar Lukas

Beiträge: 1742
#8 um das Thema abzuschliessen:
hab mal ein wenig gestöbert, und die Befehle für die gewünscht Aktion gefunden.
Diese sind aber natürlich wie von Euch schon erwähnt bei den heutigen grossen Mailern deaktiviert.

Zitat

Das SMTP-Protokoll unterstützt einige weitere Befehl, die nicht im Rahmen einer E-Mail-Übertragung verwendet werden:

VRFY
Dieser Befehl überprüft, ob eine E-Mail-Adresse existiert, zum Beispiel:

Code

VRFY joe
252 joe
VRFY joe@example.net
252 joe@example.net
VRFY bob
550 <bob>: Recipient address rejected: User unknown in local recipient table
VRFY joe@foo.com
554 <joe@foo.com>: Relay access denied
In der heutigen »feindseligen« Internetumgebung ist ein solcher Befehl eher ein
Sicherheitsrisiko als ein Benutzerdienst. Normalerweise bietet der SMTP-Server
daher die Möglichkeit, ihn auszuschalten.


EXPN
Dieser Befehl gibt die Mitglieder einer Mailingliste aus. Er ist ebenfalls ein
Sicherheitsrisiko und in den meisten SMTP-Servern gar nicht implementiert.
PHP Coding Beispiele mit VRFY:
http://koders.com/?s=VRFY&_%3Ala=PHP
+ siehe Anhang

Test/Beweis das es bei den Mailern heute deaktiviert ist:
http://www.gaijin.at/olsmailcheck.php


__________
Gruß Lukas :yo
Seitenanfang Seitenende
Um auf dieses Thema zu ANTWORTEN
bitte erst » hier kostenlos registrieren!!

Folgende Themen könnten Dich auch interessieren: