Poprawność adresu e-mail
Trzeba sprawdzać na stronach poprawność adresu e-mail, bo a nuż ktoś wpisze nam alamakota@abrakadabra i nie dostaniemy jego danych i będzie źle dla nas i w ogóle. Dlatego też wymyśliliśmy, że musi być w adresie małpa, musi być kropka, musi być domena, a domena ma 2 lub trzy znaki… Wróć!
To właśnie przez takie testy, pisane przez webmasterów, którzy zapominają, że domena nie musi mieć trzech znaków maksymalnie, a może mieć więcej, zdarzyło mi się już, że nie mogłem zarejestrować się gdzieś, bądź skorzystać z jakiś usług. Teraz, przed chwilą, sobie o tym przypomniałem próbując skorzystać z subskrypcji serwisu PoradyKomputerowe.pl co było wymagane do pobrania bezpłatnego raportu. A kiedyś, o ile pamiętam, podobna sytuacja przytrafiła mi się na oGame.
Wyrażenie regularne postaci ^([0-9a-z._]{1,25})@([0-9a-z._]{1,25}.[a-z]{2,3})$ (chyba powinno działać, pisałem “na czuja”) nie jest dobre. Ze względu na to, że od jakiegoś czasu dostępne są domeny cztero- i więcej znakowe. Ot choćby właśnie moja .info. Podobnie niedobra .mobi, czy mało popularna .name. A absolutnym rekordzistą pod względem długości jest niedawno wprowadzona .travel. A sam, instalując jakieś aplikacje na wewnętrznym serwerze w sieci lokalnej, stosuję adresy e-mail administratora w postaci admin@costam.local. “Domena” .local jest u mnie w sieci lokalnej szeroko używana.
Podobnie też zastosowane tutaj sprawdzanie długości od jednego do 25 znaków (zaczerpnięte z pewnej książki), nie jest zbyt dobre, bo o ile tak długą część przed “małpą” ciężko mi sobie wyobrazić (najdłuższe znane mi imiona+nazwiska osiągają ledwo 22 znaki) o tyle nazwa serwera może być dłuższa. Ot, przed momentem wymyśliłem kompletnie idiotyczne mailserver.3141592653.travel ;-) Jednak bardziej denerwują mnie wspomniane ograniczenia co do długości domen. Jak się domyślam, to aplikacje były pisane w czasach, gdy .com było ledwo popularne i nikt się dłuższych rzeczy nie spodziewał.
PHP-owy framework, jaki bardzo lubię, CodeIgniter, posiada w swoich zasobach bibliotekę Validation, która posiada funkcję sprawdzającą poprawność adresu e-mail opierając się na znacznie bardziej złożonym wyrażeniu regularnym niż to, które napisałem wyżej. I jest odporne na domeny .info, .local i .travel.
/**
* Valid Email
*
* @access public
* @param string
* @return bool
*/
function valid_email($str)
{
return (!preg_match("/^([a-z0-9+_-]+)(.[a-z0-9+_-]+)
*@([a-z0-9-]+.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;
}
Złamanie linii dodane sztucznie, bez niego trochę wychodził kod poza stronę.
[tags]e-mail, validation, PHP, CodeIgniter, domains[/tags]
Luty 7, 2007 godzina 23:26
Ja jestem przeciwnikiem zbyt restrykcyjnej walidacji. Wymyślą, ci źe hasło musi mieć 7 znakłw, z czego 3 to cyfry, albo login musi mieć pięć liter i nie uźyjesz swojego ulubionego nicka.
Niektłrzy zapominają nawet, źe pierwszy człon adresu e-mail moźe mieć kropkę, podkreślenie, myślnik i być krłtszy niź 3 znaki…
PS. zmień kolejność tabulacji dla formularza, bo po wciśnięciu [tab] w polu openid, przeniosło mnie do linkłw “archiwum”
Luty 7, 2007 godzina 23:50
a adresy w postaci login@[66.66.66.66] przyjmuje?
kiedyś był ten problem rozwaźany w jakiejś ksiąźce do perla. bardzo trudno jest to zrobić 1 regexpem.
Luty 8, 2007 godzina 00:24
Hej,
Moźesz sie juź zapisać – skrypt przyjmuje 4 literowe domeny :-)
Pozdrawiam
Luty 8, 2007 godzina 01:15
.travel wprowadzono 4 lata po .museum i to museum było pierwszą (www.museum polecam :)
Luty 8, 2007 godzina 08:06
Tak chyba bedzie lepiej return (bool)preg_ …. – twoja konstrukcja z pytajnikiem jest pozbawiona sensu : )
Luty 8, 2007 godzina 09:42
Hmm… a kropka na końcu? Słyszałem kiedyś, źe domeny mają na końcu kropki (“www.ktos.info.”), ktłre przeglądarki dodają za leniwych uźytkownikłw. A z tego co widzę źaden z w/w regexpłw nie przepuści e-maila z kropką na końcu.
I zgadzam się z NuLL`em – konstrukcja z pytajnikiem jest przerostem formy nad treścią.
Pozdrawiam
Luty 8, 2007 godzina 11:14
Paweł: Rany, dziwię się sam jaki wpływ mają takie głupie notki. Niemniej jednak dzięki, skorzystam z rejestracji teraz :-)
x: Przyznaję, o .museum nie słyszałem. Cztery lata temu to mnie Internet zaczął dopiero interesować. Ale rekordem teź jest.
NuLL, MiB: To nie moja konstrukcja, to twłrcłw CI, ja osobiście nigdy nie stosuję ? : bo jest dla mnie okropnie nieczytelne.
Hmm, domeny na końcu kropek chyba nie mają.
Luty 8, 2007 godzina 11:38
prawda najgorsze sa takie sytuacje :/ a co o co.uk ? czy inne domiany com.pl idt
a z nickiem tez prawda juz wiele razy zrezygnowalem z czegos ze dyskryminuja strlen mojego nicka :P
Luty 8, 2007 godzina 19:19
Domeny kropkę na końcu *mają*. Oddziela ona Top Level Domain (com, net, org, biz, ws etc.) od tzw “namespace root” ktłre jest puste. Kropki efektywnie nie trzeba stosować ale nie moźna jej traktować jako błąd – zapuść np. ping onet.pl
Właśnie dałeś dokładny przykład “takiego” webmastera ktłry pisze o walidacji adresłw email a nie zna ich strktury, super :)
Luty 8, 2007 godzina 22:48
Kocureq: Fakt. Młj błąd. Aczkolwiek przyznaję, źe jak dotąd nigdy o tym nie słyszałem, aź do dzisiejszego dnia. Miło się dowiedzieć czegoś nowego o rzeczach znanych od dawna.
Więc wyraźenie z kodu powyźej powinno mieć zastąpione
$na.?$. Chyba.Chyba się popisałem, ale cłź – człowiek się na błędach uczy :-)
Luty 11, 2007 godzina 20:06
Mnie najbardziej denerwuje blokowanie możliwości podania adresu z plusem – uniemożliwia wpisanie Gmailowego aliasu :|
Luty 15, 2007 godzina 19:29
można i tak:
function verifyEmail($email) {
$wholeexp = ‘/^(.+?)@(([a-z0-9.-]+?).[a-z]{2,5})$/i’;
$userexp = “/^[a-z0-9~!#$\%&()-\_+=[];:\’”,./]+$/i”;
if(preg_match($wholeexp, $email, $regs)){
$username = $regs[1];
$host = $regs[2];
if(checkdnsrr($host, MX)){
if(preg_match($userexp, $username)){
return TRUE;
}else
return FALSE;
}else
return FALSE;
}else
return FALSE;
}
Luty 16, 2007 godzina 11:08
No to trochę nijak napisane. Ja bym to samo zrobił tak:
function verifyEmail($email)
{
$wholeexp = /^(.+?)@(([a-z0-9.-]+?).[a-z]{2,5})$/i;
$userexp = /^[a-z0-9~!#$\%&()-\_+=[];:,./]+$/i;
if(preg_match($wholeexp, $email, $regs))
{
$username = $regs[1];
$host = $regs[2];
if(checkdnsrr($host, MX) && preg_match($userexp, $username)) return TRUE;
else return FALSE;
}
else return FALSE;
}
Prawda, że krócej (że szybciej nie wspominając)?
Luty 16, 2007 godzina 11:47
P.S. To założenie, że TLD może się składać z max. 5 znaków jest BŁĘDNE!
Wrzesień 17, 2007 godzina 13:10
Shared Hosting Resources…
I couldn’t understand some parts of this article, but it sounds interesting…
Grudzień 17, 2007 godzina 11:44
no no no!!!!!!!!!!1
Maj 20, 2008 godzina 18:00
cześć!!! ja chciałabym się dowiedzieć jak się pisze poprawnie adres e-mail…??????!!!!
pozdrawiam:*
Listopad 9, 2008 godzina 18:33
świrtna stronka ale pokaz przykładowy prawdziwy adres E-mail!oki?
Listopad 9, 2008 godzina 18:36
czekam…
Lipiec 27, 2009 godzina 23:31
Czy ktoś mi poda wzór jak powinien wygladac prawidłowy adres E-mail bardzo prosze
Lipiec 27, 2009 godzina 23:36
Czy ktoś mi poda wzór jak powinien wygladac prawidłowy adres E-mail bardzo prosze