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ę.

Technorati Tags: , , , ,

Liczba komentarzy: 16

»
  1. #1 Speedy
    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”

  2. #2 =marcin
    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.

  3. #3 Paweł
    luty 8, 2007 godzina 00:24

    Hej,

    Moźesz sie juź zapisać - skrypt przyjmuje 4 literowe domeny :-)

    Pozdrawiam

  4. #4 x
    luty 8, 2007 godzina 01:15

    .travel wprowadzono 4 lata po .museum i to museum było pierwszą (www.museum polecam :)

  5. #5 NuLL
    luty 8, 2007 godzina 08:06

    Tak chyba bedzie lepiej return (bool)preg_ …. - twoja konstrukcja z pytajnikiem jest pozbawiona sensu : )

  6. #6 MiB
    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

  7. #7 Ktos
    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ą.

  8. #8 jiim
    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

  9. #9 Kocureq
    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 :)

  10. #10 Ktos
    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 :-)

  11. #11 Łukasz
    luty 11, 2007 godzina 20:06

    Mnie najbardziej denerwuje blokowanie możliwości podania adresu z plusem - uniemożliwia wpisanie Gmailowego aliasu :|

  12. #12 Wojtosz
    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;
    }

  13. #13 Dot
    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)?

  14. #14 Dot
    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!

  15. #15 Shared Hosting Resources
    wrzesień 17, 2007 godzina 13:10

    Shared Hosting Resources…

    I couldn’t understand some parts of this article, but it sounds interesting…

  16. #16 teoś
    grudzień 17, 2007 godzina 11:44

    no no no!!!!!!!!!!1

Wątek RSS dla komentarzy tego wpisu · Adres trackback

Zostaw komentarz

Dozwolone są niektóre znaczniki XHTML, jak: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Na tym blogu stosowana jest wtyczka antyspamowa Spam Karma. Jeżeli Twój komentarz nie pojawia się, lub po jego dodaniu otrzymujesz pustą stronę - poczekaj, komentarz został dodany, ale albo oczekuje w kolejce, albo został mylnie zakwalifikowany jako spam - spokojnie, gdy zajrzę do panelu administracyjnego to uratuję go.