E-mail ellenőrzés php-ben
Korábban beszéltünk az adatvalidálásról, de sosem lehet elég a jóból. Még mindig akad olyan felhasználó, aki képes kijátszani az emberi értelem határait, és elköveti azt a galádságot, hogy helytelen e-mail címet ír be. Különösképp arra az esetre gondolunk, mikor (kimondva) halvány fingja nincs az e-mail címéről, stbstb. fremail.com, hotmail.hu, citrommail.com és sorolhatnánk.
Két féle megfejtés lehet erre a problémára (tehát az e-mail szintaktika jó, csak nem múkodik):
- bekérdezünk a felhasználó által adott e-mail címre például ezzel : Email address validation script, és mondjuk hogy nem jó, erre a felhasználó lefagy, mert nem érti miért nem jó a freemail.com, továbbá ha épp nem elérhető a felhasználó postafiókja, false eredményt ad
- bekérdezünk (vagy nem), ajánlunk neki egy alternatívát, hogy mit rontott el.
Nézzük meg működés közben, hogy mire is gondoltunk:
Node hogy működik?
Nem árulunk el nagy titkot, hogy 100%-ban felkészülni egyáltalán nem lehet a felhasználók ellen, de azonban csökkenteni lehet a “téves” elírásokat, ha bővíthetővé tesszük az ezt kezelő függvényünket.
Tehát az e-mail mezőn onblurkor egy ajax (Ajax.Update, prototype.js) hívást csinálunk, ha az nem üres, ellenőrizzük az emailt, majd egy választ adunk vissza. Mi az ellenőrzés?
function checkmail($email){
$wrongmails = array(
'gmail.com' => array('gmaill.com','gmail.co','gmail.hu','gamil.com'),
'citromail.hu' => array('cotromail.hu', 'citrmail.hu','citrmail.com','citromail.com','citromai.hu','cirtommail.hu'),
'freemail.hu' => array('fremail.hu','feemail.hu','freemil.hu','freemai.hu','freeemail.hu','freemail.com'),
'chello.hu' => array('cello.hu'),
'yahoo.com' => array('zahoo.com','yahho.com','jahoo.com'),
'hotmail.com' => array('hotmail.hu'),
'invitel.hu' => array('invitl.hu'),
'jodomain' => array('rosszdomain1','rosszdomain2'),
);
$mailparts = explode("@",$email);
foreach($wrongmails as $domain=>$wrongs){
if (in_array($mailparts[1],$wrongs)){
return array($domain,$mailparts[0],$mailparts[1]);
break;
}
}
return true;
}
Összességében a php:
$mailparts = explode("@",$email);
$validator = new validator();
$validator->item($email,array("email","required"),array("Az e-mail címed helytelen!","Nem adtál meg e-mail címet"));
if (preg_match("/^www\./i",$mailparts[0]) || preg_match("/^www\./i",$mailparts[1])){
//ilyen is sok van. horror.
$validator->set_valid(false,"Az e-mail címed vélhetően helytelen! A "www" biztos benne van?");
}
$uemail = checkmail($email);
if (is_array($uemail)){
$validator->set_valid(false,"A megadott e-mail cím ($email) vélhetően helytelen. Talán ".$uemail[1]."@".$uemail[0]." lett volna? Ha igen, kattints ide!");
}
$mysql->query("vane ilyen emailcímű júzer");
if ($mysql->num_rows()!=0){
$validator->set_valid(false,"Az általad megadott e-mail címmel ($email) már regisztráltak.");
}
//itt még esetleg egy Email address validation script
if ($validator->valid()){
//jónak tűnik
echo "A megadott $email cím helyesnek tűnik!";
} else {
echo $validator->message();
}
exit;
Lényegében manuálisan kell felépítgetni a hibákat, ergo “tanítjuk” a függvényünket. Lehetne regexpben is gondolkodni, de vélhetően a bonyolultság miatt nem biztos, hogy jobb lenne. Ööm é bodottá, e ööm é bodottá


A gmail.hu-ra szűrés nem feltétlen elírás, aki citro meg hasonló igényes postafiókokat használ, simán használhatja a gportal-os @gmail.hu-s címét is.
Ha lehet blogot “kérni”, majd a php-val való email validálásról írjatok (amikor a címzett szerveréről lekérdezi, hogy létezik-e olyan postafiók az adott címen), köszi
bekérdezünk a felhasználó által adott e-mail címre például ezzel : Email address validation script,…
http://www.howtocreate.co.uk/php/dnld.php?file=4&action=1 az egy link.
te cad, most őszintén, ez a fajta ellenőrzés miért került szerveroldalra? divatajaxos lettél? nem azt mondom, ott IS kell ellenőrizni, de ez pont kliensoldalon is eldönthető. szerintem. vagy várom a magyarázatot
sarki_roka: megnézi azt is, h regelt-e már vki azzal a címmel… meg amúgy ez a bekérdezős történet is csak szerveroldalon lehet, ha valaki kipróbálja, leírhatná, h mennyire megbízható
oké, értem én, irtam is hogy ott mármint szerver oldalon IS kell és jó ilyen. de konkrétan ez az elgépelős dolog nagyon kliensoldalra kivánkozik szerintem. és izé, bocsi tényleg átugrottam a többi részt, csak erre az egyre vonatkozott a kérdésem
Egy hasonlót fejlesztettem pár éve én is, ami azóta is nagyon jó szolgálatot tesz. Ami abban benne van és ebből hiányzik (általában nem fontos, de aki komolyan gondolja annak az lehet):
Kell bele egy olyan, hogy “jónak nézi, de ha visszapattan adott hibaüzenetettel automatikusan átírja”. Azaz a korábban említett gmail.hu lehet akár jó is. Feltételezzük, hogy a user tényleg foobar@gmail.hu, de ha visszapattan a levelünk “no user” hibával, akkor átírjuk automatikusan gmail.com-ra és újra próbáljuk.
BTW: a freemail userek nagyon nagy része (20%+) nem tudja helyesen leírni, hogy freemail. Az én szűrőmben már több, mint 100 “tipikus” elütés van. A gyakorlatban utólag szövegelemzéssel és domain gyakorisággal kellett volna megcsinálni.
volt egy bekérdezős scriptem, ami a mailserverek 90%ával ment, másik 10%ával nem. az bizonytalan volt. ezzel amit linkeltem, nem találtam olyan kiszolgálót, amivel nem ment volna.
annyi bug lehet, hogy ha nem elérhető a mailserver, akkor false eredményt adhat, illetve erre is fel lehet hívni a juzer figyelmét, bár vagy megérti vagy nem. lehet jobb ha nem tud rola… bár ha meg nem kapja meg a levelet, akkor meg téged néz hülyének… vagy hát a szolgáltatás a szar.
Robika: ha elérhető a mailszerver akkor 100%ban jo adatot kéne adnia.
róka: azért lett serveroldali, mert ugye közben nézem, hogy regeltek-e vele, igaz submit után is lefutnak ugyanezek az ellenőrzések, csak akkor már nem anyázok vissza, hogy biztos jó-e a mélcíme.
Benedek: hm, lehet rakok bele ilyent, jó ötlet.
egyébként nagyon szomoru ez a 20+….
Tóth Benedek: meg tudnád osztani számunkra azt a szűrőlistát? Vagy ha az egészet nem is: ízelítőt belőle?